mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-10 20:04:36 +00:00
Fix words
This commit is contained in:
10
README.md
10
README.md
@@ -1,11 +1,11 @@
|
||||
# Docker — 从入门到实践
|
||||
|
||||
[](https://github.com/yeasy/docker_practice) [](https://github.com/yeasy/docker_practice/releases) [](https://github.com/docker/docker-ce) [][1]
|
||||
[](https://github.com/yeasy/docker_practice) [](https://github.com/yeasy/docker_practice/releases) [](https://github.com/docker/docker-ce) [][1]
|
||||
|
||||
**v1.3.1**
|
||||
**v1.4.0**
|
||||
|
||||
| 语言 | - |
|
||||
| :------------- | :--- |
|
||||
| :----------------------------------------------- | :------------------------------------------------- |
|
||||
| [简体中文](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) 来提出。
|
||||
|
||||
|
||||
15
SUMMARY.md
15
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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 查看
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
## 其它
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
# 基本概念
|
||||
|
||||
**Docker** 包括三个基本概念
|
||||
* **镜像**(`Image`)
|
||||
* **容器**(`Container`)
|
||||
* **仓库**(`Repository`)
|
||||
**Docker** 包括三个基本概念:
|
||||
|
||||
* **镜像**(`Image`):Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
|
||||
* **容器**(`Container`):镜像(`Image`)和容器(`Container`)的关系,就像是面向对象程序设计中的 `类` 和 `实例` 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
|
||||
* **仓库**(`Repository`):镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
|
||||
|
||||
理解了这三个概念,就理解了 **Docker** 的整个生命周期。
|
||||
|
||||
@@ -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 镜像** 是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像 **不包含** 任何动态数据,其内容在构建之后也不会被改变。
|
||||
|
||||
|
||||
@@ -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 的软件或服务。
|
||||
|
||||
|
||||
@@ -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` 环境变量即可使用。
|
||||
|
||||
## 官方文档
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
## 相关资源
|
||||
|
||||
|
||||
@@ -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 服务。
|
||||
|
||||
@@ -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=<arg>...] [options] [COMMAND] [ARGS...]
|
||||
docker compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
|
||||
```
|
||||
|
||||
## 命令选项
|
||||
@@ -26,13 +26,13 @@ docker-compose [-f=<arg>...] [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=<arg>...] [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 <SERVICE_NAME>` 来重新创建服务并后台停止旧服务,启动新服务,并不会影响到其所依赖的服务。
|
||||
默认情况,如果服务容器已经存在,`docker compose up` 将会尝试停止容器,然后重新创建(保持使用 `volumes-from` 挂载的卷),以保证新启动的服务匹配 `docker-compose.yml` 文件的最新内容。如果用户不希望容器被停止并重新创建,可以使用 `docker compose up --no-recreate`。这样将只会启动处于停止状态的容器,而忽略已经运行的服务。如果用户只想重新部署某个服务,可以使用 `docker compose up --no-deps -d <SERVICE_NAME>` 来重新创建服务并后台停止旧服务,启动新服务,并不会影响到其所依赖的服务。
|
||||
|
||||
选项:
|
||||
|
||||
@@ -281,7 +281,7 @@ $ docker-compose scale web=3 db=2
|
||||
|
||||
### `version`
|
||||
|
||||
格式为 `docker-compose version`。
|
||||
格式为 `docker compose version`。
|
||||
|
||||
打印版本信息。
|
||||
|
||||
|
||||
@@ -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`
|
||||
|
||||
|
||||
@@ -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
|
||||
```
|
||||
|
||||
@@ -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
|
||||
```
|
||||
@@ -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 端口了。
|
||||
|
||||
@@ -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
|
||||
```
|
||||
|
||||
@@ -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/)
|
||||
@@ -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` 安装界面了。
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -57,7 +57,7 @@ RUN echo '<h1>Hello, Docker!</h1>' > /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 \
|
||||
|
||||
@@ -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` 退出了这个容器。
|
||||
|
||||
@@ -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 额外设置
|
||||
|
||||
@@ -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/):
|
||||
|
||||
@@ -24,7 +24,6 @@ $ for pkg in docker \
|
||||
docker-engine \
|
||||
docker.io \
|
||||
docker-doc \
|
||||
docker-compose \
|
||||
podman-docker \
|
||||
containerd \
|
||||
runc;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Windows 10
|
||||
# Windows 10/11
|
||||
|
||||
## 系统要求
|
||||
|
||||
|
||||
@@ -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. 建立起对容器技术的初步认知,为后续的实战操作打下基础。
|
||||
|
||||
好吧,让我们带着问题开始这神奇之旅。
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -45,4 +45,4 @@ PING busybox2 (172.19.0.3): 56 data bytes
|
||||
|
||||
使用自定义网络,容器之间可以通过容器名直接进行通信,这比使用 `--link` 更加灵活和强大。
|
||||
|
||||
接下来的部分将介绍在一些场景中,Docker 所有的网络定制配置。以及通过 Linux 命令来调整、补充、甚至替换 Docker 默认的网络配置。
|
||||
接下来的部分将介绍 Docker 的一些高级网络配置,包括 DNS 配置和端口映射等内容。
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 中直接下载镜像来实现。
|
||||
|
||||
## 注册
|
||||
|
||||
|
||||
@@ -166,7 +166,7 @@ volumes:
|
||||
## 启动
|
||||
|
||||
```bash
|
||||
$ docker-compose up -d
|
||||
$ docker compose up -d
|
||||
```
|
||||
|
||||
这样我们就搭建好了一个具有权限认证、TLS 的私有仓库,接下来我们测试其功能是否正常。
|
||||
|
||||
@@ -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` 即可看到各节点运行状态。如下图所示:
|
||||
|
||||
Reference in New Issue
Block a user