Docker-docker-compose
参考文献
安装
-
通过https://github.com/docker/compose/releases下载
docker-compose
二进制文件 -
下载完成后手动上传到linux指定目录/usr/local/bin,将其文件名修改成docker-compose.然后给其加上可执行权限
1
2# 因为下载后的docker-compose文件是一个可执行脚本,所以要开放其权限
chmod +x /usr/local/bin/docker-compose -
创建软链
1
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
Docker Compose
Docker Compose
的前身是 Orchard 公司开发的 Fig,2014 年 Docker 收购了 Orchard 公司,然后将 Fig 重命名为Docker Compose
.现阶段Docker Compose
是 Docker 官方的单机多容器管理系统,它本质是一个 Python 脚本,它通过解析用户编写的 yaml 文件,调用 Docker API 实现动态的创建和管理多个容器.
Docker Compose
模版文件
-
在使用
Docker Compose
启动容器时,Docker Compose
会默认使用 docker-compose.yml 文件, docker-compose.yml 文件的格式为 yaml(类似于 json,一种标记语言). -
Docker Compose
模板文件一共有三个版本: v1、v2 和 v3.目前最新的版本为 v3,也是功能最全面的一个版本,下面主要围绕 v3 版本介绍一下如何编写Docker Compose
文件. -
Docker Compose
文件主要分为三部分: services(服务)、networks(网络) 和 volumes(数据卷).-
services
(服务):服务定义了容器启动的各项配置,就像我们执行docker run命令时传递的容器启动的参数一样,指定了容器应该如何启动,例如容器的启动参数,容器的镜像和环境变量等. -
networks
(网络):网络定义了容器的网络配置,就像我们执行docker network create命令创建网络配置一样. -
volumes
(数据卷):数据卷定义了容器的卷配置,就像我们执行docker volume create命令创建数据卷一样.
-
services
常用配置
-
build
: 用于构建 Docker 镜像,类似于docker build命令,build 可以指定 Dockerfile 文件路径,然后根据 Dockerfile 命令来构建文件.使用方法如下:1
2
3
4
5build:
## 构建执行的上下文目录
context: .
## Dockerfile 名称
dockerfile: Dockerfile-name -
command
: 用于覆盖容器默认的启动命令,它和 Dockerfile 中的 CMD 用法类似,也有两种使用方式:1
2
3command: sleep 3000
command: ["sleep", "3000"] -
container_name
: 用于指定容器启动时容器的名称.使用格式如下:1
container_name: nginx
-
depends_on
: 用于指定服务间的依赖关系,这样可以先启动被依赖的服务.例如,我们的服务依赖数据库服务 db,可以指定 depends_on 为 db.使用格式如下:1
2
3
4
5
6
7
8version: "3.8"
services:
my-web:
build: .
depends_on:
- db
db:
image: mysql-
长语法
-
restart
:当true
Compose 实现必须在更新依赖服务后重新启动此服务时.这适用于由 Compose 操作控制的显式重启,不包括容器运行时在容器死亡后自动重启. -
condition
: 满足依赖性的条件service_started
: 等同于上面描述的短语法service_healthy
: 指定在启动依赖服务之前依赖项应该是“健康的”service_completed_successfully
: 指定在启动依赖服务之前,依赖项应该运行到成功完成
1
2
3
4
5
6
7
8
9
10
11
12
13services:
web:
build: .
depends_on:
db:
condition: service_healthy
restart: true
redis:
condition: service_started
redis:
image: redis
db:
image: postgres -
-
-
devices
: 挂载主机的设备到容器中.使用格式如下:1
2devices:
- "/dev/sba:/dev/sda" -
s
: 自定义容器中的 s 配置.1
2
3s:
- 8.8.8.8
- 114.114.114.114 -
s_search
: 配置 s 的搜索域.1
2
3s_search:
- svc.cluster.com
- svc1.cluster.com -
entrypoint
: 覆盖容器的entrypoint
命令.1
2
3entrypoint: sleep 3000
entrypoint: ["sleep", "3000"] -
env_file
: 指定容器的环境变量文件,启动时会把该文件中的环境变量值注入容器中.1
2env_file:
- ./dbs.env- env 文件的内容格式如下:
KEY_ENV=values
- env 文件的内容格式如下:
-
environment
: 指定容器启动时的环境变量.1
2environment:
- KEY_ENV=values -
image
: 指定容器镜像的地址.1
image: busybox:latest
-
pid
: 共享主机的进程命名空间,像在主机上直接启动进程一样,可以看到主机的进程信息.1
pid: "host"
-
ports
: 暴露端口信息,使用格式为 HOST:CONTAINER,前面填写要映射到主机上的端口,后面填写对应的容器内的端口.- 端口映射不得与一起使用
network_mode: host
,这样做会导致运行时错误.
1
2
3
4
5
6
7
8
9ports:
- "1000"
- "1000-1005"
- "8080:8080"
- "8888-8890:8888-8890"
- "2222:22"
- "127.0.0.1:9999:9999"
- "127.0.0.1:3000-3005:3000-3005"
- "6789:6789/udp" - 端口映射不得与一起使用
-
healthcheck
:healthcheck
声明运行的检查以确定此服务的容器是否“健康”1
2
3
4
5
6healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 40s -
links
:links
定义到另一个服务中容器的网络链接.要么指定服务名称和链接别名()SERVICE:ALIAS
),要么只指定服务名称1
2
3
4
5web:
links:
- db
- db:database
- redis- 链接服务的容器必须可以通过与别名相同的主机名访问,或者如果没有指定别名则为服务名称.
-
network_mode
: 设置服务容器网络模式none
禁用所有容器网络host
这使容器可以原始访问主机的网络接口- host模式可以用于所有应用和中间件部署在同一台机器的情况下,应用在容器中连接中间件只需指定ip为localhost即可,因为此时localhost就是代表了宿主机
service:{name}
这使容器只能访问指定的服务
1
2
3network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]" -
restart
: 定义平台将应用于容器终止的策略no
:默认重启策略.在任何情况下都不会重新启动容器.always
:该策略总是重新启动容器,直到它被删除.on-failure
:如果退出代码指示错误,该策略将重新启动容器.unless-stopped
:无论退出代码如何,该策略都会重新启动容器,但会在服务停止或删除时停止重新启动.
-
networks
这是服务要使用的网络名称,对应顶级的 networks 中的配置.1
2
3
4
5
6
7
8services:
my-service:
networks:
- hello-network
- hello1-network
networks:
hello-network: # 定义网络.定义后才能在上面使用,否则报错
hello1-network: # 定义网络.定义后才能在上面使用,否则报错 -
volumes
: 不仅可以挂载主机数据卷到容器中,也可以直接挂载主机的目录到容器中,使用方式类似于使用docker run启动容器时添加 -v 参数.1
2
3
4
5
6
7
8version: "3"
services:
db:
image: mysql:5.6
volumes:
- type: volume
source: /var/lib/mysql
target: /var/lib/mysqlvolumes
除了上面介绍的长语法外,还支持短语法的书写方式,例如上面的写法可以精简为:
1
2
3
4
5
6version: "3"
services:
db:
image: mysql:5.6
volumes:
- /var/lib/mysql:/var/lib/mysql1
2
3
4
5
6
7
8
9
10
11version: "3"
services:
db:
image: mysql:5.6
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data: # 声明上面所使用的数据卷
# 使用外部已存在的数据卷mysql_data,该数据卷必须存在,不存在的话必须先手动创建,否则报错
external: true -
限制,添加完成后,命令行需要添加
--compatibility
1
2
3
4
5
6
7
8
9version: "3"
services:
tools:
image: tools:latest
container_name: tools
deploy:
resources:
limits:
memory: 2048M
networks
默认网络
-
例如, 假设有一个项目,目录名
myapp
,docker-compose.yml
配置如下:1
2
3
4
5
6
7
8
9
10version: "3"
services:
web:
build: .
ports:
- "8000:8000"
db:
image: mysql
ports:
- "13306:3306"- 当执行
docker-compose up
的时候.会发生以下事情:- **会创建一个名字是 **
myapp_default
的网络(networks) web
这个容器会加入到myapp_default
网络中,并且在网络中的名称为:web
.db
这个容器会加入到myapp_default
网络中,并且在网络中的名称为:db
.
- **会创建一个名字是 **
- 当执行
自定义网络
-
可能通过一级配置
networks
来自定义网络,可以创建更复杂的网络选项和配置,也可以用来连接已经存在的网络(不是通过compose创建的,如docker network create custom_net
)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25services:
proxy:
build: ./proxy
networks:
- frontend
app:
build: ./app
networks:
- frontend
- backend
db:
image: postgres
networks:
- backend
networks:
frontend:
# Use a custom driver
driver: custom-driver-1
backend:
# Use a custom driver which takes special options
driver: custom-driver-2
driver_opts:
foo: "1"
bar: "2"
指定一个已经存在的网络
-
多个容器,不在相同的配置中,也会有网络通讯的需求 .那么就可以使用公共的网络配置.
-
容器可以加入到已经存在的网络.
1
2
3
4
5
6services:
# ...
networks:
network1:
name: my-pre-existing-network
external: true
示例
1 | version: '3.5' |
使用GPU
-
命令行:
docker run --rm --gpus all nvidia/cuda nvidia-smi
-
docker-compose.yaml
1
2
3
4
5
6
7
8
9version: '2.3'
services:
nvsmi:
image: ubuntu:16.04
runtime: nvidia
environment:
- NVIDIA_VISIBLE_DEVICES=all
command: nvidia-smi- NVIDIA 容器运行时使用容器映像中的环境变量来指定 GPU 加速容器.
NVIDIA_VISIBLE_DEVICES
: controls which GPUs will be accessible inside the container. By default,all
GPUs are accessible to the container.NVIDIA_DRIVER_CAPABILITIES
: controls which driver features (e.g.compute
,graphics
) are exposed to the container.NVIDIA_REQUIRE_*
: a logical expression to define the constraints (e.g. minimum CUDA, driver or compute capability) on the configurations supported by the container.
- NVIDIA 容器运行时使用容器映像中的环境变量来指定 GPU 加速容器.
Docker Compose
操作命令
1 | docker-compose [-f <arg>...] [options] [--] [COMMAND] [ARGS...] |
1 | # 更新服务镜像 |
Docker
和docker-compose
版本关系
Compose file format | Docker Engine release |
---|---|
Compose specification | 19.03.0+ |
3.8 | 19.03.0+ |
3.7 | 18.06.0+ |
3.6 | 18.02.0+ |
3.5 | 17.12.0+ |
3.4 | 17.09.0+ |
3.3 | 17.06.0+ |
3.2 | 17.04.0+ |
3.1 | 1.13.1+ |
3.0 | 1.13.0+ |
2.4 | 17.12.0+ |
2.3 | 17.06.0+ |
2.2 | 1.13.0+ |
2.1 | 1.12.0+ |
2.0 | 1.10.0+ |