diff --git a/README.md b/README.md index 811ec5e..f78ebda 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ # Docker — 从入门到实践 -[![](https://img.shields.io/github/stars/yeasy/docker_practice.svg?style=social&label=Stars)](https://github.com/yeasy/docker_practice) [![](https://img.shields.io/github/release/yeasy/docker_practice/all.svg)](https://github.com/yeasy/docker_practice/releases) [![](https://img.shields.io/badge/Based-Docker%20CE%20v20.10-blue.svg)](https://github.com/docker/docker-ce) [![](https://img.shields.io/badge/Docker%20%E6%8A%80%E6%9C%AF%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E6%88%98-jd.com-red.svg)][1] +[![](https://img.shields.io/github/stars/yeasy/docker_practice.svg?style=social&label=Stars)](https://github.com/yeasy/docker_practice) [![](https://img.shields.io/github/release/yeasy/docker_practice/all.svg)](https://github.com/yeasy/docker_practice/releases) [![](https://img.shields.io/badge/Based-Docker%20CE%20v27.x-blue.svg)](https://github.com/docker/docker-ce) [![](https://img.shields.io/badge/Docker%20%E6%8A%80%E6%9C%AF%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E6%88%98-jd.com-red.svg)][1] -**v1.3.1** +**v1.4.0** -| 语言 | - | -| :------------- | :--- | -| [简体中文](https://github.com/yeasy/docker_practice) | [阅读](https://vuepress.mirror.docker-practice.com/) | +| 语言 | - | +| :----------------------------------------------- | :------------------------------------------------- | +| [简体中文](https://github.com/yeasy/docker_practice) | [阅读](https://vuepress.mirror.docker-practice.com/) | [Docker](https://www.docker.com) 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 Docker,可以让应用的部署、测试和分发都变得前所未有的高效和轻松! @@ -52,7 +52,9 @@ Docker 自身仍在快速发展中,生态环境也在蓬勃成长。建议初 * QQ 群 VII (已满):252403484 * QQ 群 VIII(已满):544818750 * QQ 群 IX (已满):571502246 -* QQ 群 X (可加):145983035 +* QQ 群 X (已满):145983035 + +建议前往 [Github Discussions](https://github.com/yeasy/docker_practice/discussions) 进行技术交流。 >如果有容器技术相关的疑问,请通过 [Issues](https://github.com/yeasy/docker_practice/issues/new/choose) 来提出。 diff --git a/SUMMARY.md b/SUMMARY.md index 23a39fb..e769355 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -6,6 +6,7 @@ * [Docker 简介](introduction/README.md) * [什么是 Docker](introduction/what.md) * [为什么要用 Docker](introduction/why.md) + * [基本概念](basic_concept/README.md) * [镜像](basic_concept/image.md) * [容器](basic_concept/container.md) @@ -18,7 +19,7 @@ * [Raspberry Pi](install/raspberry-pi.md) * [Linux 离线安装](install/offline.md) * [macOS](install/mac.md) - * [Windows 10](install/windows.md) + * [Windows 10/11](install/windows.md) * [镜像加速器](install/mirror.md) * [开启实验特性](install/experimental.md) * [使用镜像](image/README.md) @@ -63,24 +64,14 @@ * [数据卷](data_management/volume.md) * [挂载主机目录](data_management/bind-mounts.md) * [网络配置](network/README.md) - * [快速配置指南](network/quick_guide.md) - * [外部访问容器](network/port_mapping.md) - * [容器访问控制](network/access_control.md) - * [端口映射实现](network/port_mapping.md) - * [配置 docker0 网桥](network/docker0.md) - * [自定义网桥](network/bridge.md) - * [编辑网络配置文件](network/config_file.md) * [配置 DNS](network/dns.md) - * [配置 HTTP/HTTPS 网络代理](network/http_https_proxy.md) - * [工具和示例](network/example.md) - * [实例:创建一个点到点连接](network/ptp.md) + * [外部访问容器](network/port_mapping.md) * [Docker Buildx](buildx/README.md) * [BuildKit](buildx/buildkit.md) * [使用 buildx 构建镜像](buildx/buildx.md) * [使用 buildx 构建多种系统架构支持的 Docker 镜像](buildx/multi-arch-images.md) * [Docker Compose](compose/README.md) * [简介](compose/introduction.md) - * [Compose v2](compose/v2.md) * [安装与卸载](compose/install.md) * [使用](compose/usage.md) * [命令说明](compose/commands.md) diff --git a/appendix/best_practices.md b/appendix/best_practices.md index 371c94e..5ff5804 100644 --- a/appendix/best_practices.md +++ b/appendix/best_practices.md @@ -118,7 +118,7 @@ RUN apt-get update && apt-get install -y \ 将 `apt-get update` 放在一条单独的 `RUN` 声明中会导致缓存问题以及后续的 `apt-get install` 失败。比如,假设你有一个 `Dockerfile` 文件: ```docker -FROM ubuntu:18.04 +FROM ubuntu:24.04 RUN apt-get update @@ -128,7 +128,7 @@ RUN apt-get install -y curl 构建镜像后,所有的层都在 Docker 的缓存中。假设你后来又修改了其中的 `apt-get install` 添加了一个包: ```docker -FROM ubuntu:18.04 +FROM ubuntu:24.04 RUN apt-get update diff --git a/appendix/repo/mongodb.md b/appendix/repo/mongodb.md index 129e908..ec2cf45 100644 --- a/appendix/repo/mongodb.md +++ b/appendix/repo/mongodb.md @@ -14,19 +14,29 @@ $ docker run --name mongo -d mongo ``` -使用其他应用连接到容器,可以用 - +使用其他应用连接到容器,首先创建网络 ```bash -$ docker run --name some-app --link some-mongo:mongo -d application-that-uses-mongo +$ docker network create my-mongo-net +``` + +然后启动 MongoDB 容器 +```bash +$ docker run --name some-mongo -d --network my-mongo-net mongo +``` + +最后启动应用容器 +```bash +$ docker run --name some-app -d --network my-mongo-net application-that-uses-mongo ``` 或者通过 `mongo` ```bash $ docker run -it --rm \ - --link some-mongo:mongo \ + --network my-mongo-net \ mongo \ - sh -c 'exec mongo "$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT/test"' + sh -c 'exec mongo "some-mongo:27017/test"' +``` ``` ## Dockerfile diff --git a/appendix/repo/mysql.md b/appendix/repo/mysql.md index 1a38c9d..53ce97c 100644 --- a/appendix/repo/mysql.md +++ b/appendix/repo/mysql.md @@ -16,19 +16,31 @@ $ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql 之后就可以使用其它应用来连接到该容器。 +首先创建网络 ```bash -$ docker run --name some-app --link some-mysql:mysql -d application-that-uses-mysql +$ docker network create my-mysql-net +``` + +然后启动 MySQL 容器 +```bash +$ docker run --name some-mysql -d --network my-mysql-net -e MYSQL_ROOT_PASSWORD=mysecretpassword mysql +``` + +最后启动应用容器 +```bash +$ docker run --name some-app -d --network my-mysql-net application-that-uses-mysql ``` 或者通过 `mysql` 命令行连接。 ```bash $ docker run -it --rm \ - --link some-mysql:mysql \ + --network my-mysql-net \ mysql \ - sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"' + sh -c 'exec mysql -hsome-mysql -P3306 -uroot -pmysecretpassword' ``` + ## Dockerfile 请到 https://github.com/docker-library/docs/tree/master/mysql 查看 diff --git a/appendix/repo/redis.md b/appendix/repo/redis.md index d14a736..77a53f7 100644 --- a/appendix/repo/redis.md +++ b/appendix/repo/redis.md @@ -22,19 +22,28 @@ $ docker run --name some-redis -d -p 6379:6379 redis redis-server --appendonly y 默认数据存储位置在 `VOLUME/data`。可以使用 `--volumes-from some-volume-container` 或 `-v /docker/host/dir:/data` 将数据存放到本地。 -使用其他应用连接到容器,可以用 - +使用其他应用连接到容器,首先创建网络 ```bash -$ docker run --name some-app --link some-redis:redis -d application-that-uses-redis +$ docker network create my-redis-net +``` + +然后启动 redis 容器 +```bash +$ docker run --name some-redis -d --network my-redis-net redis +``` + +最后启动应用容器 +```bash +$ docker run --name some-app -d --network my-redis-net application-that-uses-redis ``` 或者通过 `redis-cli` ```bash $ docker run -it --rm \ - --link some-redis:redis \ + --network my-redis-net \ redis \ - sh -c 'exec redis-cli -h "$REDIS_PORT_6379_TCP_ADDR" -p "$REDIS_PORT_6379_TCP_PORT"' + sh -c 'exec redis-cli -h some-redis' ``` ## Dockerfile diff --git a/appendix/repo/wordpress.md b/appendix/repo/wordpress.md index 2e571c4..1989e6f 100644 --- a/appendix/repo/wordpress.md +++ b/appendix/repo/wordpress.md @@ -10,15 +10,28 @@ 启动容器需要 MySQL 的支持,默认端口为 `80`。 +首先创建网络 ```bash -$ docker run --name some-wordpress --link some-mysql:mysql -d wordpress +$ docker network create my-wordpress-net +``` + +启动 MySQL 容器 +```bash +$ docker run --name some-mysql -d --network my-wordpress-net -e MYSQL_ROOT_PASSWORD=mysecretpassword mysql +``` + +启动 WordPress 容器 +```bash +$ docker run --name some-wordpress -d --network my-wordpress-net -e WORDPRESS_DB_HOST=some-mysql -e WORDPRESS_DB_PASSWORD=mysecretpassword wordpress ``` 启动 WordPress 容器时可以指定的一些环境变量包括: -* `WORDPRESS_DB_USER` 缺省为 `root` -* `WORDPRESS_DB_PASSWORD` 缺省为连接 mysql 容器的环境变量 `MYSQL_ROOT_PASSWORD` 的值 -* `WORDPRESS_DB_NAME` 缺省为 `wordpress` +* `WORDPRESS_DB_HOST`: MySQL 服务的主机名 +* `WORDPRESS_DB_USER`: MySQL 数据库的用户名 +* `WORDPRESS_DB_PASSWORD`: MySQL 数据库的密码 +* `WORDPRESS_DB_NAME`: WordPress 要使用的数据库名 + ## Dockerfile diff --git a/appendix/resources.md b/appendix/resources.md index 9694d04..0f259e2 100644 --- a/appendix/resources.md +++ b/appendix/resources.md @@ -20,7 +20,8 @@ ## 技术交流 * Docker 邮件列表: https://groups.google.com/forum/#!forum/docker-user -* Docker 的 IRC 频道:https://chat.freenode.net#docker +* Docker 社区 Slack:https://dockercommunity.slack.com/ +* Docker Community Discord: https://discord.gg/docker * Docker 的 Twitter 主页:https://twitter.com/docker ## 其它 diff --git a/basic_concept/README.md b/basic_concept/README.md index b7b39e9..38f8884 100644 --- a/basic_concept/README.md +++ b/basic_concept/README.md @@ -1,8 +1,9 @@ # 基本概念 -**Docker** 包括三个基本概念 -* **镜像**(`Image`) -* **容器**(`Container`) -* **仓库**(`Repository`) +**Docker** 包括三个基本概念: + +* **镜像**(`Image`):Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。 +* **容器**(`Container`):镜像(`Image`)和容器(`Container`)的关系,就像是面向对象程序设计中的 `类` 和 `实例` 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。 +* **仓库**(`Repository`):镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。 理解了这三个概念,就理解了 **Docker** 的整个生命周期。 diff --git a/basic_concept/image.md b/basic_concept/image.md index d34fadb..740f885 100644 --- a/basic_concept/image.md +++ b/basic_concept/image.md @@ -1,6 +1,6 @@ # Docker 镜像 -我们都知道,操作系统分为 **内核** 和 **用户空间**。对于 `Linux` 而言,内核启动后,会挂载 `root` 文件系统为其提供用户空间支持。而 **Docker 镜像**(`Image`),就相当于是一个 `root` 文件系统。比如官方镜像 `ubuntu:18.04` 就包含了完整的一套 Ubuntu 18.04 最小系统的 `root` 文件系统。 +我们都知道,操作系统分为 **内核** 和 **用户空间**。对于 `Linux` 而言,内核启动后,会挂载 `root` 文件系统为其提供用户空间支持。而 **Docker 镜像**(`Image`),就相当于是一个 `root` 文件系统。比如官方镜像 `ubuntu:24.04` 就包含了完整的一套 Ubuntu 24.04 最小系统的 `root` 文件系统。 **Docker 镜像** 是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像 **不包含** 任何动态数据,其内容在构建之后也不会被改变。 diff --git a/basic_concept/repository.md b/basic_concept/repository.md index 29716c9..d0fcc3c 100644 --- a/basic_concept/repository.md +++ b/basic_concept/repository.md @@ -6,7 +6,7 @@ 通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 `<仓库名>:<标签>` 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 `latest` 作为默认标签。 -以 [Ubuntu 镜像](https://hub.docker.com/_/ubuntu) 为例,`ubuntu` 是仓库的名字,其内包含有不同的版本标签,如,`16.04`, `18.04`。我们可以通过 `ubuntu:16.04`,或者 `ubuntu:18.04` 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 `ubuntu`,那将视为 `ubuntu:latest`。 +以 [Ubuntu 镜像](https://hub.docker.com/_/ubuntu) 为例,`ubuntu` 是仓库的名字,其内包含有不同的版本标签,如,`22.04`, `24.04`。我们可以通过 `ubuntu:22.04`,或者 `ubuntu:24.04` 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 `ubuntu`,那将视为 `ubuntu:latest`。 仓库名经常以 *两段式路径* 形式出现,比如 `jwilder/nginx-proxy`,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务。 diff --git a/buildx/buildkit.md b/buildx/buildkit.md index e8300a0..2a2f08a 100644 --- a/buildx/buildkit.md +++ b/buildx/buildkit.md @@ -145,9 +145,9 @@ $ ssh-add ~/.ssh/id_rsa $ docker build -t test --ssh default=$SSH_AUTH_SOCK . ``` -## docker-compose build 使用 Buildkit +## docker compose build 使用 Buildkit -设置 `COMPOSE_DOCKER_CLI_BUILD=1` 环境变量即可使用。 +设置 `COMPOSE_DOCKER_CLI_BUILD=1` 和 `DOCKER_BUILDKIT=1` 环境变量即可使用。 ## 官方文档 diff --git a/cases/os/centos.md b/cases/os/centos.md index b972ba5..824c0e5 100644 --- a/cases/os/centos.md +++ b/cases/os/centos.md @@ -10,6 +10,8 @@ CentOS(Community Enterprise Operating System,中文意思是:社区企业 ### 使用 CentOS 官方镜像 +**注意:CentOS 8 已于 2021 年 12 月 31 日停止维护(EOL)。对于新部署,推荐使用 CentOS Stream,或 Rocky Linux、AlmaLinux 等替代发行版。** + 使用 `docker run` 直接运行 `CentOS 7` 镜像,并登录 `bash`。 ```bash @@ -33,7 +35,6 @@ CentOS Linux release 7.9.2009 (Core) 使用 `docker run` 命令直接运行 `Fedora` 官方镜像,并登录 `bash`。 -```bash $ docker run -it fedora bash Unable to find image 'fedora:latest' locally latest: Pulling from library/fedora @@ -41,8 +42,8 @@ latest: Pulling from library/fedora Digest: sha256:64a02df6aac27d1200c2572fe4b9949f1970d05f74d367ce4af994ba5dc3669e Status: Downloaded newer image for fedora:latest [root@196ca341419b /]# cat /etc/redhat-release -Fedora release 24 (Twenty Four) -``` +Fedora release 39 (Thirty Nine) + ## 相关资源 diff --git a/cloud/intro.md b/cloud/intro.md index ceffdf1..e084b1b 100644 --- a/cloud/intro.md +++ b/cloud/intro.md @@ -1,7 +1,22 @@ # 简介 -目前与容器相关的云计算主要分为两种类型。 +随着容器技术的普及,目前主流的云计算服务商都提供了成熟的容器服务。与容器相关的云计算服务主要分为以下几种类型: -一种是传统的 IaaS 服务商提供对容器相关的服务,包括镜像下载、容器托管等。 +## 1. 容器编排托管服务 (Managed K8s) -另一种是直接基于容器技术对外提供容器云服务,所谓 Container as a Service(CaaS)。 +这是目前最主流的形式。云厂商托管 Kubernetes 的控制平面(Master节点),用户只需管理工作节点(Worker Node)。 +* **优势**:降低了 Kubernetes 集群的维护成本,高可用性由厂商保证。 +* **典型服务**:AWS EKS, Azure AKS, Google GKE, 阿里云 ACK, 腾讯云 TKE。 + +## 2. 容器实例服务 (Serverless Containers) + +这一类服务通常被称为 CaaS (Container as a Service)。用户无需管理底层服务器(EC2/CVM),只需提供镜像和配置即可运行容器。 +* **优势**:极致的弹性,按秒计费,零运维。 +* **典型服务**:AWS Fargate, Azure Container Instances, Google Cloud Run, 阿里云 ECI。 + +## 3. 镜像仓库服务 (Container Registry) + +提供安全、可靠的私有 Docker 镜像存储服务,通常与云厂商的 CI/CD 流水线深度集成。 +* **典型服务**:AWS ECR, Azure ACR, Google GCR/GAR, 阿里云 ACR。 + +本章将介绍如何在几个主流云平台上使用 Docker 和 Kubernetes 服务。 diff --git a/compose/commands.md b/compose/commands.md index e18e7a7..8351fce 100644 --- a/compose/commands.md +++ b/compose/commands.md @@ -4,12 +4,12 @@ 对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。 -执行 `docker-compose [COMMAND] --help` 或者 `docker-compose help [COMMAND]` 可以查看具体某个命令的使用格式。 +执行 `docker compose [COMMAND] --help` 或者 `docker compose help [COMMAND]` 可以查看具体某个命令的使用格式。 -`docker-compose` 命令的基本的使用格式是 +`docker compose` 命令的基本的使用格式是 ```bash -docker-compose [-f=...] [options] [COMMAND] [ARGS...] +docker compose [-f=...] [options] [COMMAND] [ARGS...] ``` ## 命令选项 @@ -26,13 +26,13 @@ docker-compose [-f=...] [options] [COMMAND] [ARGS...] ### `build` -格式为 `docker-compose build [options] [SERVICE...]`。 +格式为 `docker compose build [options] [SERVICE...]`。 构建(重新构建)项目中的服务容器。 服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db。 -可以随时在项目目录下运行 `docker-compose build` 来重新构建服务。 +可以随时在项目目录下运行 `docker compose build` 来重新构建服务。 选项包括: @@ -64,19 +64,19 @@ docker-compose [-f=...] [options] [COMMAND] [ARGS...] ### `kill` -格式为 `docker-compose kill [options] [SERVICE...]`。 +格式为 `docker compose kill [options] [SERVICE...]`。 通过发送 `SIGKILL` 信号来强制停止服务容器。 支持通过 `-s` 参数来指定发送的信号,例如通过如下指令发送 `SIGINT` 信号。 ```bash -$ docker-compose kill -s SIGINT +$ docker compose kill -s SIGINT ``` ### `logs` -格式为 `docker-compose logs [options] [SERVICE...]`。 +格式为 `docker compose logs [options] [SERVICE...]`。 查看服务容器的输出。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 `--no-color` 来关闭颜色。 @@ -84,13 +84,13 @@ $ docker-compose kill -s SIGINT ### `pause` -格式为 `docker-compose pause [SERVICE...]`。 +格式为 `docker compose pause [SERVICE...]`。 暂停一个服务容器。 ### `port` -格式为 `docker-compose port [options] SERVICE PRIVATE_PORT`。 +格式为 `docker compose port [options] SERVICE PRIVATE_PORT`。 打印某个容器端口所映射的公共端口。 @@ -102,7 +102,7 @@ $ docker-compose kill -s SIGINT ### `ps` -格式为 `docker-compose ps [options] [SERVICE...]`。 +格式为 `docker compose ps [options] [SERVICE...]`。 列出项目中目前的所有容器。 @@ -112,7 +112,7 @@ $ docker-compose kill -s SIGINT ### `pull` -格式为 `docker-compose pull [options] [SERVICE...]`。 +格式为 `docker compose pull [options] [SERVICE...]`。 拉取服务依赖的镜像。 @@ -126,7 +126,7 @@ $ docker-compose kill -s SIGINT ### `restart` -格式为 `docker-compose restart [options] [SERVICE...]`。 +格式为 `docker compose restart [options] [SERVICE...]`。 重启项目中的服务。 @@ -136,9 +136,9 @@ $ docker-compose kill -s SIGINT ### `rm` -格式为 `docker-compose rm [options] [SERVICE...]`。 +格式为 `docker compose rm [options] [SERVICE...]`。 -删除所有(停止状态的)服务容器。推荐先执行 `docker-compose stop` 命令来停止容器。 +删除所有(停止状态的)服务容器。推荐先执行 `docker compose stop` 命令来停止容器。 选项: @@ -147,14 +147,14 @@ $ docker-compose kill -s SIGINT * `-v` 删除容器所挂载的数据卷。 ### `run` -格式为 `docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]`。 +格式为 `docker compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]`。 在指定服务上执行一个命令。 例如: ```bash -$ docker-compose run ubuntu ping docker.com +$ docker compose run ubuntu ping docker.com ``` 将会启动一个 ubuntu 服务容器,并执行 `ping docker.com` 命令。 @@ -172,7 +172,7 @@ $ docker-compose run ubuntu ping docker.com 如果不希望自动启动关联的容器,可以使用 `--no-deps` 选项,例如 ```bash -$ docker-compose run --no-deps web python manage.py shell +$ docker compose run --no-deps web python manage.py shell ``` 将不会启动 web 容器所关联的其它容器。 @@ -201,14 +201,14 @@ $ docker-compose run --no-deps web python manage.py shell ### `scale` -格式为 `docker-compose scale [options] [SERVICE=NUM...]`。 +格式为 `docker compose scale [options] [SERVICE=NUM...]`。 设置指定服务运行的容器个数。 通过 `service=num` 的参数来设置数量。例如: ```bash -$ docker-compose scale web=3 db=2 +$ docker compose scale web=3 db=2 ``` 将启动 3 个容器运行 web 服务,2 个容器运行 db 服务。 @@ -221,15 +221,15 @@ $ docker-compose scale web=3 db=2 ### `start` -格式为 `docker-compose start [SERVICE...]`。 +格式为 `docker compose start [SERVICE...]`。 启动已经存在的服务容器。 ### `stop` -格式为 `docker-compose stop [options] [SERVICE...]`。 +格式为 `docker compose stop [options] [SERVICE...]`。 -停止已经处于运行状态的容器,但不删除它。通过 `docker-compose start` 可以再次启动这些容器。 +停止已经处于运行状态的容器,但不删除它。通过 `docker compose start` 可以再次启动这些容器。 选项: @@ -241,13 +241,13 @@ $ docker-compose scale web=3 db=2 ### `unpause` -格式为 `docker-compose unpause [SERVICE...]`。 +格式为 `docker compose unpause [SERVICE...]`。 恢复处于暂停状态中的服务。 ### `up` -格式为 `docker-compose up [options] [SERVICE...]`。 +格式为 `docker compose up [options] [SERVICE...]`。 该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。 @@ -255,13 +255,13 @@ $ docker-compose scale web=3 db=2 可以说,大部分时候都可以直接通过该命令来启动一个项目。 -默认情况,`docker-compose up` 启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。 +默认情况,`docker compose up` 启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。 当通过 `Ctrl-C` 停止命令时,所有容器将会停止。 -如果使用 `docker-compose up -d`,将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项。 +如果使用 `docker compose up -d`,将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项。 -默认情况,如果服务容器已经存在,`docker-compose up` 将会尝试停止容器,然后重新创建(保持使用 `volumes-from` 挂载的卷),以保证新启动的服务匹配 `docker-compose.yml` 文件的最新内容。如果用户不希望容器被停止并重新创建,可以使用 `docker-compose up --no-recreate`。这样将只会启动处于停止状态的容器,而忽略已经运行的服务。如果用户只想重新部署某个服务,可以使用 `docker-compose up --no-deps -d ` 来重新创建服务并后台停止旧服务,启动新服务,并不会影响到其所依赖的服务。 +默认情况,如果服务容器已经存在,`docker compose up` 将会尝试停止容器,然后重新创建(保持使用 `volumes-from` 挂载的卷),以保证新启动的服务匹配 `docker-compose.yml` 文件的最新内容。如果用户不希望容器被停止并重新创建,可以使用 `docker compose up --no-recreate`。这样将只会启动处于停止状态的容器,而忽略已经运行的服务。如果用户只想重新部署某个服务,可以使用 `docker compose up --no-deps -d ` 来重新创建服务并后台停止旧服务,启动新服务,并不会影响到其所依赖的服务。 选项: @@ -281,7 +281,7 @@ $ docker-compose scale web=3 db=2 ### `version` -格式为 `docker-compose version`。 +格式为 `docker compose version`。 打印版本信息。 diff --git a/compose/compose_file.md b/compose/compose_file.md index 1b866c0..a10c739 100644 --- a/compose/compose_file.md +++ b/compose/compose_file.md @@ -5,7 +5,7 @@ 默认的模板文件名称为 `docker-compose.yml`,格式为 YAML 格式。 ```yaml -version: "3" +version: "3" # 在 Compose V2 中,version 字段已成为可选,且推荐不再使用。 services: webapp: @@ -306,7 +306,7 @@ labels: ## `links` ->注意:不推荐使用该指令。 +>注意:不推荐使用该指令。容器之间应通过 Docker 网络(networks)进行互联。 ## `logging` diff --git a/compose/django.md b/compose/django.md index 16a588f..a094a92 100644 --- a/compose/django.md +++ b/compose/django.md @@ -49,10 +49,10 @@ services: 查看 [`docker-compose.yml` 章节](compose_file.md) 了解更多详细的工作机制。 -现在我们就可以使用 `docker-compose run` 命令启动一个 `Django` 应用了。 +现在我们就可以使用 `docker compose run` 命令启动一个 `Django` 应用了。 ```bash -$ docker-compose run web django-admin startproject django_example . +$ docker compose run web django-admin startproject django_example . ``` 由于 web 服务所使用的镜像并不存在,所以 Compose 会首先使用 `Dockerfile` 为 web 服务构建一个镜像,接着使用这个镜像在容器里运行 `django-admin startproject django_example` 指令。 @@ -85,10 +85,10 @@ DATABASES = { } ``` -这些信息是在 [postgres](https://hub.docker.com/_/postgres/) 镜像固定设置好的。然后,运行 `docker-compose up` : +这些信息是在 [postgres](https://hub.docker.com/_/postgres/) 镜像固定设置好的。然后,运行 `docker compose up` : ```bash -$ docker-compose up +$ docker compose up django_db_1 is up-to-date Creating django_web_1 ... @@ -113,8 +113,8 @@ web_1 | Quit the server with CONTROL-C. 这个 `Django` 应用已经开始在你的 Docker 守护进程里监听着 `8000` 端口了。打开 `127.0.0.1:8000` 即可看到 `Django` 欢迎页面。 -你还可以在 Docker 上运行其它的管理命令,例如对于同步数据库结构这种事,在运行完 `docker-compose up` 后,在另外一个终端进入文件夹运行以下命令即可: +你还可以在 Docker 上运行其它的管理命令,例如对于同步数据库结构这种事,在运行完 `docker compose up` 后,在另外一个终端进入文件夹运行以下命令即可: ```bash -$ docker-compose run web python manage.py syncdb +$ docker compose run web python manage.py syncdb ``` diff --git a/compose/install.md b/compose/install.md index 468a1a5..9582bf4 100644 --- a/compose/install.md +++ b/compose/install.md @@ -1,59 +1,46 @@ # 安装与卸载 +`Compose` 是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。 + +从 `v2` 版本开始,`Compose` 作为 `docker` 的子命令存在,例如 `docker compose up`。 + `Compose` 支持 Linux、macOS、Windows 10 三大平台。 -`Compose` 可以通过 Python 的包管理工具 `pip` 进行安装,也可以直接下载编译好的二进制文件使用,甚至能够直接在 Docker 容器中运行。 - -`Docker Desktop for Mac/Windows` 自带 `docker-compose` 二进制文件,安装 Docker 之后可以直接使用。 - -```bash -$ docker-compose --version - -docker-compose version 1.27.4, build 40524192 -``` +`Docker Desktop for Mac/Windows` 自带 `docker compose` 命令。 Linux 系统请使用以下介绍的方法安装。 -## 二进制包 +## Linux -在 Linux 上的也安装十分简单,从 [官方 GitHub Release](https://github.com/docker/compose/releases) 处直接下载编译好的二进制文件即可。 +在 Linux 上,你可以通过下载 `docker-compose` 二进制包来安装。 + +从 [官方 GitHub Release](https://github.com/docker/compose/releases) 处直接下载编译好的二进制文件即可。 例如,在 Linux 64 位系统上直接下载对应的二进制包。 ```bash -$ sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose - -# 国内用户可以使用以下方式加快下载 -$ sudo curl -L https://download.fastgit.org/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose - -$ sudo chmod +x /usr/local/bin/docker-compose +$ DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker} +$ mkdir -p $DOCKER_CONFIG/cli-plugins +$ curl -SL https://github.com/docker/compose/releases/download/v2.29.1/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose ``` -## PIP 安装 - -*注:* `x86_64` 架构的 Linux 建议按照上边的方法下载二进制包进行安装,如果您计算机的架构是 `ARM` (例如,树莓派),再使用 `pip` 安装。 - -这种方式是将 Compose 当作一个 Python 应用来从 pip 源中安装。 - -执行安装命令: +之后,执行 ```bash -$ sudo pip install -U docker-compose +$ chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose ``` -可以看到类似如下输出,说明安装成功。 +## 测试安装 ```bash -Collecting docker-compose - Downloading docker-compose-1.27.4.tar.gz (149kB): 149kB downloaded -... -Successfully installed docker-compose cached-property requests texttable websocket-client docker-py dockerpty six enum34 backports.ssl-match-hostname ipaddress +$ docker compose version +Docker Compose version v2.29.1 ``` ## bash 补全命令 ```bash -$ curl -L https://raw.githubusercontent.com/docker/compose/1.27.4/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose +$ curl -L https://raw.githubusercontent.com/docker/compose/v2.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose ``` ## 卸载 @@ -61,11 +48,5 @@ $ curl -L https://raw.githubusercontent.com/docker/compose/1.27.4/contrib/comple 如果是二进制包方式安装的,删除二进制文件即可。 ```bash -$ sudo rm /usr/local/bin/docker-compose -``` - -如果是通过 `pip` 安装的,则执行如下命令即可删除。 - -```bash -$ sudo pip uninstall docker-compose -``` +$ rm $DOCKER_CONFIG/cli-plugins/docker-compose +``` \ No newline at end of file diff --git a/compose/rails.md b/compose/rails.md index af8517b..22528dd 100644 --- a/compose/rails.md +++ b/compose/rails.md @@ -47,10 +47,10 @@ services: - "3000:3000" ``` -所有文件就绪后,我们就可以通过使用 `docker-compose run` 命令生成应用的骨架了。 +所有文件就绪后,我们就可以通过使用 `docker compose run` 命令生成应用的骨架了。 ```bash -$ docker-compose run web rails new . --force --database=postgresql --skip-bundle +$ docker compose run web rails new . --force --database=postgresql --skip-bundle ``` `Compose` 会先使用 `Dockerfile` 为 web 服务创建一个镜像,接着使用这个镜像在容器里运行 `rails new ` 和它之后的命令。一旦这个命令运行完后,应该就可以看一个崭新的应用已经生成了。 @@ -73,7 +73,7 @@ gem 'therubyracer', platforms: :ruby 现在我们已经有一个新的 `Gemfile` 文件,需要再重新创建镜像。(这个会步骤会改变 Dockerfile 文件本身,所以需要重建一次)。 ```bash -$ docker-compose build +$ docker compose build ``` 应用现在就可以启动了,但配置还未完成。Rails 默认读取的数据库目标是 `localhost` ,我们需要手动指定容器的 `db` 。同样的,还需要把用户名修改成和 postgres 镜像预定的一致。 @@ -97,7 +97,7 @@ test: 现在就可以启动应用了。 ```bash -$ docker-compose up +$ docker compose up ``` 如果一切正常,你应该可以看到 PostgreSQL 的输出,几秒后可以看到这样的重复信息: @@ -111,7 +111,7 @@ myapp_web_1 | [2014-01-17 17:16:29] INFO WEBrick::HTTPServer#start: pid=1 port= 最后, 我们需要做的是创建数据库,打开另一个终端,运行: ```bash -$ docker-compose run web rake db:create +$ docker compose run web rake db:create ``` 这个 web 应用已经开始在你的 docker 守护进程里面监听着 3000 端口了。 diff --git a/compose/usage.md b/compose/usage.md index ec0479b..7871e0a 100644 --- a/compose/usage.md +++ b/compose/usage.md @@ -68,7 +68,67 @@ services: ### 运行 compose 项目 ```bash -$ docker-compose up +$ docker compose up ``` 此时访问本地 `5000` 端口,每次刷新页面,计数就会加 1。 + + +按下 `Ctrl-C` 停止项目。 + +### 后台运行 + +```bash +$ docker compose up -d +``` + +### 停止 + +```bash +$ docker compose stop +``` + +### 进入服务 + +```bash +$ docker compose exec redis sh +/data # redis-cli +127.0.0.1:6379> get hits +"9" +``` + +### 查看日志 + +```bash +$ docker compose logs -f +``` + +### 构建镜像 + +```bash +$ docker compose build +``` + +### 启动服务 + +```bash +$ docker compose start +``` + +### 运行一次性命令 + +```bash +$ docker compose run web python app.py +``` + +### 验证 `docker-compose.yml` + +```bash +$ docker compose config +``` + +### 删除项目 + +```bash +$ docker compose down +``` diff --git a/compose/v2.md b/compose/v2.md deleted file mode 100644 index d098db2..0000000 --- a/compose/v2.md +++ /dev/null @@ -1,7 +0,0 @@ -# Compose V2 - -目前 Docker 官方用 GO 语言 [重写](https://github.com/docker/compose-cli) 了 Docker Compose,并将其作为了 docker cli 的子命令,称为 `Compose V2`。你可以参照官方文档安装,然后将熟悉的 `docker-compose` 命令替换为 `docker compose`,即可使用 Docker Compose。 - -## 官方文档 - -* [Compose V2 beta](https://docs.docker.com/compose/cli-command/) diff --git a/compose/wordpress.md b/compose/wordpress.md index 170e54d..3425dc7 100644 --- a/compose/wordpress.md +++ b/compose/wordpress.md @@ -48,4 +48,4 @@ volumes: ## 构建并运行项目 -运行 `docker-compose up -d` Compose 就会拉取镜像再创建我们所需要的镜像,然后启动 `wordpress` 和数据库容器。 接着浏览器访问 `127.0.0.1:8000` 端口就能看到 `WordPress` 安装界面了。 +运行 `docker compose up -d` Compose 就会拉取镜像再创建我们所需要的镜像,然后启动 `wordpress` 和数据库容器。 接着浏览器访问 `127.0.0.1:8000` 端口就能看到 `WordPress` 安装界面了。 diff --git a/etcd/cluster.md b/etcd/cluster.md index 305e78e..3b565b5 100644 --- a/etcd/cluster.md +++ b/etcd/cluster.md @@ -119,7 +119,7 @@ networks: subnet: 172.16.238.0/24 ``` -使用 `docker-compose up` 启动集群之后使用 `docker exec` 命令登录到任一节点测试 `etcd` 集群。 +使用 `docker compose up` 启动集群之后使用 `docker exec` 命令登录到任一节点测试 `etcd` 集群。 ```bash / # etcdctl member list diff --git a/image/build.md b/image/build.md index 64ad73d..5372b0e 100644 --- a/image/build.md +++ b/image/build.md @@ -57,7 +57,7 @@ RUN echo '

Hello, Docker!

' > /usr/share/nginx/html/index.html 既然 `RUN` 就像 Shell 脚本一样可以执行命令,那么我们是否就可以像 Shell 脚本一样把每个命令对应一个 RUN 呢?比如这样: ```docker -FROM debian:stretch +FROM debian:bookworm RUN apt-get update RUN apt-get install -y gcc libc6-dev make wget @@ -78,7 +78,7 @@ RUN make -C /usr/src/redis install 上面的 `Dockerfile` 正确的写法应该是这样: ```docker -FROM debian:stretch +FROM debian:bookworm RUN set -x; buildDeps='gcc libc6-dev make wget' \ && apt-get update \ diff --git a/image/pull.md b/image/pull.md index f9d29a4..1fdda46 100644 --- a/image/pull.md +++ b/image/pull.md @@ -16,17 +16,17 @@ $ docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签] 比如: ```bash -$ docker pull ubuntu:18.04 +$ docker pull ubuntu:24.04 18.04: Pulling from library/ubuntu 92dc2a97ff99: Pull complete be13a9d27eb8: Pull complete c8299583700a: Pull complete Digest: sha256:4bc3ae6596938cb0d9e5ac51a1152ec9dcac2a1c50829c74abd9c4361e321b26 -Status: Downloaded newer image for ubuntu:18.04 -docker.io/library/ubuntu:18.04 +Status: Downloaded newer image for ubuntu:24.04 +docker.io/library/ubuntu:24.04 ``` -上面的命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub (`docker.io`)获取镜像。而镜像名称是 `ubuntu:18.04`,因此将会获取官方镜像 `library/ubuntu` 仓库中标签为 `18.04` 的镜像。`docker pull` 命令的输出结果最后一行给出了镜像的完整名称,即: `docker.io/library/ubuntu:18.04`。 +上面的命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub (`docker.io`)获取镜像。而镜像名称是 `ubuntu:24.04`,因此将会获取官方镜像 `library/ubuntu` 仓库中标签为 `24.04` 的镜像。`docker pull` 命令的输出结果最后一行给出了镜像的完整名称,即: `docker.io/library/ubuntu:24.04`。 从下载过程中可以看到我们之前提及的分层存储的概念,镜像是由多层存储所构成。下载也是一层层的去下载,并非单一文件。下载过程中给出了每一层的 ID 的前 12 位。并且下载结束后,给出该镜像完整的 `sha256` 的摘要,以确保下载一致性。 @@ -36,33 +36,33 @@ docker.io/library/ubuntu:18.04 ## 运行 -有了镜像后,我们就能够以这个镜像为基础启动并运行一个容器。以上面的 `ubuntu:18.04` 为例,如果我们打算启动里面的 `bash` 并且进行交互式操作的话,可以执行下面的命令。 +有了镜像后,我们就能够以这个镜像为基础启动并运行一个容器。以上面的 `ubuntu:24.04` 为例,如果我们打算启动里面的 `bash` 并且进行交互式操作的话,可以执行下面的命令。 ```bash -$ docker run -it --rm ubuntu:18.04 bash +$ docker run -it --rm ubuntu:24.04 bash root@e7009c6ce357:/# cat /etc/os-release NAME="Ubuntu" -VERSION="18.04.1 LTS (Bionic Beaver)" +VERSION="24.04 LTS (Noble Numbat)" ID=ubuntu ID_LIKE=debian -PRETTY_NAME="Ubuntu 18.04.1 LTS" -VERSION_ID="18.04" +PRETTY_NAME="Ubuntu 24.04 LTS" +VERSION_ID="24.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" -VERSION_CODENAME=bionic -UBUNTU_CODENAME=bionic +VERSION_CODENAME=noble +UBUNTU_CODENAME=noble ``` `docker run` 就是运行容器的命令,具体格式我们会在 [容器](../container) 一节进行详细讲解,我们这里简要的说明一下上面用到的参数。 * `-it`:这是两个参数,一个是 `-i`:交互式操作,一个是 `-t` 终端。我们这里打算进入 `bash` 执行一些命令并查看返回结果,因此我们需要交互式终端。 * `--rm`:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 `docker rm`。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 `--rm` 可以避免浪费空间。 -* `ubuntu:18.04`:这是指用 `ubuntu:18.04` 镜像为基础来启动容器。 +* `ubuntu:24.04`:这是指用 `ubuntu:24.04` 镜像为基础来启动容器。 * `bash`:放在镜像名后的是 **命令**,这里我们希望有个交互式 Shell,因此用的是 `bash`。 -进入容器后,我们可以在 Shell 下操作,执行任何所需的命令。这里,我们执行了 `cat /etc/os-release`,这是 Linux 常用的查看当前系统版本的命令,从返回的结果可以看到容器内是 `Ubuntu 18.04.1 LTS` 系统。 +进入容器后,我们可以在 Shell 下操作,执行任何所需的命令。这里,我们执行了 `cat /etc/os-release`,这是 Linux 常用的查看当前系统版本的命令,从返回的结果可以看到容器内是 `Ubuntu 24.04 LTS` 系统。 最后我们通过 `exit` 退出了这个容器。 diff --git a/install/centos.md b/install/centos.md index 690cb99..03b9857 100644 --- a/install/centos.md +++ b/install/centos.md @@ -6,7 +6,7 @@ ### 系统要求 -Docker 支持 64 位版本 CentOS 7/8,并且要求内核版本不低于 3.10。 CentOS 7 满足最低内核的要求,但由于内核版本比较低,部分功能(如 `overlay2` 存储层驱动)无法使用,并且部分功能可能不太稳定。 +Docker 支持 64 位版本 CentOS 7/8/9,以及 Rocky Linux/AlmaLinux 8/9,并且要求内核版本不低于 3.10。 CentOS 7 满足最低内核的要求,但由于内核版本比较低,部分功能(如 `overlay2` 存储层驱动)无法使用,并且部分功能可能不太稳定。对于 CentOS 8 及更高版本,以及 Rocky Linux/AlmaLinux,推荐使用 `dnf` 包管理器。 ### 卸载旧版本 @@ -22,7 +22,9 @@ $ sudo yum remove docker \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ - docker-engine + docker-engine \ + docker-ce-cli \ + containerd.io ``` ## 使用 yum 安装 @@ -30,7 +32,7 @@ $ sudo yum remove docker \ 执行以下命令安装依赖包: ```bash -$ sudo yum install -y yum-utils +$ sudo dnf install -y dnf-utils ``` 鉴于国内网络问题,强烈建议使用国内源,官方源请在注释中查看。 @@ -38,14 +40,14 @@ $ sudo yum install -y yum-utils 执行下面的命令添加 `yum` 软件源: ```bash -$ sudo yum-config-manager \ +$ sudo dnf config-manager \ --add-repo \ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -$ sudo sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo +$ sudo sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/dnf.repos.d/docker-ce.repo # 官方源 -# $ sudo yum-config-manager \ +# $ sudo dnf config-manager \ # --add-repo \ # https://download.docker.com/linux/centos/docker-ce.repo ``` @@ -53,15 +55,15 @@ $ sudo sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.r 如果需要测试版本的 Docker 请执行以下命令: ```bash -$ sudo yum-config-manager --enable docker-ce-test +$ sudo dnf config-manager --enable docker-ce-test ``` ### 安装 Docker -更新 `yum` 软件源缓存,并安装 `docker-ce`。 +更新 `dnf` 软件源缓存,并安装 `docker-ce`。 ```bash -$ sudo yum install docker-ce docker-ce-cli containerd.io +$ sudo dnf install docker-ce docker-ce-cli containerd.io ``` ## CentOS8 额外设置 diff --git a/install/mac.md b/install/mac.md index 2253bb9..53c8697 100644 --- a/install/mac.md +++ b/install/mac.md @@ -2,7 +2,7 @@ ## 系统要求 -[Docker Desktop for Mac](https://docs.docker.com/docker-for-mac/) 要求系统最低为 macOS 必须是 10.15 或更高版本, Catalina、Big Sur 或者 Monterey,建议升级到最新版本的 macOS。 +[Docker Desktop for Mac](https://docs.docker.com/docker-for-mac/) 要求系统最低为 macOS Monterey 12.0 或更高版本,建议升级到最新版本的 macOS(如 Sonoma 或 Ventura)。 ## 安装 @@ -42,7 +42,7 @@ $ brew install --cask docker ```bash $ docker --version -Docker version 20.10.0, build 7287ab3 +Docker version 27.2.1, build 9e34c9b ``` 如果 `docker version`、`docker info` 都正常的话,可以尝试运行一个 [Nginx 服务器](https://hub.docker.com/_/nginx/): diff --git a/install/ubuntu.md b/install/ubuntu.md index c44734d..49ff4d7 100644 --- a/install/ubuntu.md +++ b/install/ubuntu.md @@ -24,7 +24,6 @@ $ for pkg in docker \ docker-engine \ docker.io \ docker-doc \ - docker-compose \ podman-docker \ containerd \ runc; diff --git a/install/windows.md b/install/windows.md index 5951067..eb88097 100644 --- a/install/windows.md +++ b/install/windows.md @@ -1,4 +1,4 @@ -# Windows 10 +# Windows 10/11 ## 系统要求 diff --git a/introduction/README.md b/introduction/README.md index 61aec6a..45a0f90 100644 --- a/introduction/README.md +++ b/introduction/README.md @@ -2,8 +2,22 @@ 本章将带领你进入 **Docker** 的世界。 -什么是 **Docker**? +## 本章内容 -用它会带来什么样的好处? +* [什么是 Docker](what.md) + * 介绍 Docker 的起源、发展历程以及其背后的核心技术(Cgroups, Namespaces, UnionFS)。 + * 了解 Docker 是如何改变软件交付方式的。 + +* [为什么要用 Docker](why.md) + * 对比传统虚拟机技术,阐述 Docker 在启动速度、资源利用率、交付效率等方面的巨大优势。 + * 探讨 Docker 在 DevOps、微服务架构中的关键作用。 + +## 学习目标 + +通过本章的学习,你将能够: + +1. 理解 Docker 的核心概念与架构。 +2. 明白 Docker 解决了现代软件开发与运维中的哪些痛点。 +3. 建立起对容器技术的初步认知,为后续的实战操作打下基础。 好吧,让我们带着问题开始这神奇之旅。 diff --git a/kubernetes/setup/kubeadm.md b/kubernetes/setup/kubeadm.md index 6176d6c..b1848ec 100644 --- a/kubernetes/setup/kubeadm.md +++ b/kubernetes/setup/kubeadm.md @@ -107,7 +107,7 @@ oom_score = 0 stream_idle_timeout = "4h0m0s" enable_selinux = false selinux_category_range = 1024 - sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.5" + sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9" stats_collect_period = 10 # systemd_cgroup = false enable_tls_streaming = false @@ -377,7 +377,7 @@ $ kubectl get node -o yaml | grep CIDR ``` ```bash -$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.11.0/Documentation/kube-flannel.yml +$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.24.0/Documentation/kube-flannel.yml ``` ## master 节点默认不能运行 pod diff --git a/network/README.md b/network/README.md index e6f0c7e..336aa74 100644 --- a/network/README.md +++ b/network/README.md @@ -45,4 +45,4 @@ PING busybox2 (172.19.0.3): 56 data bytes 使用自定义网络,容器之间可以通过容器名直接进行通信,这比使用 `--link` 更加灵活和强大。 -接下来的部分将介绍在一些场景中,Docker 所有的网络定制配置。以及通过 Linux 命令来调整、补充、甚至替换 Docker 默认的网络配置。 +接下来的部分将介绍 Docker 的一些高级网络配置,包括 DNS 配置和端口映射等内容。 diff --git a/podman/README.md b/podman/README.md index 1930d04..dd4630b 100644 --- a/podman/README.md +++ b/podman/README.md @@ -1,16 +1,39 @@ # podman -[`podman`](https://github.com/containers/podman) 是一个无守护程序与 docker 命令兼容的下一代 Linux 容器工具。 +[`podman`](https://github.com/containers/podman) 是一个无守护进程、与 Docker 命令高度兼容的下一代 Linux 容器工具。它由 Red Hat 开发,旨在提供一个更安全的容器运行环境。 + +## Podman vs Docker + +| 特性 | Docker | Podman | +| :--- | :--- | :--- | +| **架构** | C/S 架构,依赖守护进程 (`dockerd`) | 无守护进程 (Daemonless) | +| **权限** | 默认需要 root 权限 (虽有 Rootless 模式) | 默认支持 Rootless (非 root 用户运行) | +| **生态** | 完整的生态系统 (Compose, Swarm) | 专注单机容器,配合 Kubernetes 使用 | +| **镜像构建** | `docker build` | `podman build` 或 `buildah` | ## 安装 +### CentOS / RHEL + ```bash $ sudo yum -y install podman ``` +### macOS + +macOS 上需要安装 Podman Desktop 或通过 Homebrew 安装: + +```bash +$ brew install podman +$ podman machine init +$ podman machine start +``` + ## 使用 -`podman` 与 docker 命令完全兼容,只需将 `docker` 替换为 `podman` 即可,例如运行一个容器: +`podman` 的命令行几乎与 `docker` 完全兼容,大多数情况下,你只需将 `docker` 替换为 `podman` 即可。 + +### 运行容器 ```bash # $ docker run -d -p 80:80 nginx:alpine @@ -18,6 +41,39 @@ $ sudo yum -y install podman $ podman run -d -p 80:80 nginx:alpine ``` +### 列出容器 + +```bash +$ podman ps +``` + +### 构建镜像 + +```bash +$ podman build -t myimage . +``` + +## Pods 的概念 + +与 Docker 不同,Podman 支持 "Pod" 的概念(类似于 Kubernetes 的 Pod),允许你在同一个网络命名空间中运行多个容器。 + +```bash +# 创建一个 Pod +$ podman pod create --name mypod -p 8080:80 + +# 在 Pod 中运行容器 +$ podman run -d --pod mypod --name webbing nginx +``` + +## 迁移到 Podman + +如果你习惯使用 `docker` 命令,可以简单地设置别名: + +```bash +$ alias docker=podman +``` + ## 参考 -* https://developers.redhat.com/blog/2019/02/21/podman-and-buildah-for-docker-users/ +* [Podman 官方网站](https://podman.io/) +* [Podman GitHub 仓库](https://github.com/containers/podman) diff --git a/repository/dockerhub.md b/repository/dockerhub.md index cf05693..17ae8d9 100644 --- a/repository/dockerhub.md +++ b/repository/dockerhub.md @@ -1,6 +1,6 @@ # Docker Hub -目前 Docker 官方维护了一个公共仓库 [Docker Hub](https://hub.docker.com/),其中已经包括了数量超过 [2,650,000](https://hub.docker.com/search/?type=image) 的镜像。大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。 +目前 Docker 官方维护了一个公共仓库 [Docker Hub](https://hub.docker.com/),其中已经包括了数量超过 [10,000,000](https://hub.docker.com/search/?type=image) 的镜像。大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。 ## 注册 diff --git a/repository/registry_auth.md b/repository/registry_auth.md index 2776bfe..c0e2789 100644 --- a/repository/registry_auth.md +++ b/repository/registry_auth.md @@ -166,7 +166,7 @@ volumes: ## 启动 ```bash -$ docker-compose up -d +$ docker compose up -d ``` 这样我们就搭建好了一个具有权限认证、TLS 的私有仓库,接下来我们测试其功能是否正常。 diff --git a/swarm_mode/stack.md b/swarm_mode/stack.md index fb6ce10..7f11dd8 100644 --- a/swarm_mode/stack.md +++ b/swarm_mode/stack.md @@ -1,8 +1,8 @@ -# 使用 compose 文件 +# 使用 Compose 文件 -正如之前使用 `docker-compose.yml` 来一次配置、启动多个容器,在 `Swarm` 集群中也可以使用 `compose` 文件 (`docker-compose.yml`) 来配置、启动多个服务。 +正如之前使用 `compose.yml` 来一次配置、启动多个容器,在 `Swarm` 集群中也可以使用 `compose` 文件 (`compose.yml`) 来配置、启动多个服务。 -上一节中,我们使用 `docker service create` 一次只能部署一个服务,使用 `docker-compose.yml` 我们可以一次启动多个关联的服务。 +上一节中,我们使用 `docker service create` 一次只能部署一个服务,使用 `compose.yml` 我们可以一次启动多个关联的服务。 我们以在 `Swarm` 集群中部署 `WordPress` 为例进行说明。 @@ -58,14 +58,14 @@ networks: 在 `Swarm` 集群管理节点新建该文件,其中的 `visualizer` 服务提供一个可视化页面,我们可以从浏览器中很直观的查看集群中各个服务的运行节点。 -在 `Swarm` 集群中使用 `docker-compose.yml` 我们用 `docker stack` 命令,下面我们对该命令进行详细讲解。 +在 `Swarm` 集群中使用 `compose.yml` 我们用 `docker stack` 命令,下面我们对该命令进行详细讲解。 ## 部署服务 部署服务使用 `docker stack deploy`,其中 `-c` 参数指定 compose 文件名。 ```bash -$ docker stack deploy -c docker-compose.yml wordpress +$ docker stack deploy -c compose.yml wordpress ``` 现在我们打开浏览器输入 `任一节点IP:8080` 即可看到各节点运行状态。如下图所示: