简介
定义和运行多个 Docker 容器的应用,一个项目往往包含多个容器,每次重启都需要手动重启多个容器,显得太不简洁,而docker-compose就是一个完美的解决方案。
两个重要的概念
- 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例
- 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
安装
$pip install docker-compose
$docker-compose --version
命令
因为docker-compose 是根据docker提供的api进行的一层封装,因此,只需要我们熟练掌握docker的命令,docker-compose的命令我想只需要记住如下两个即可。
$docker-compose up
该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。
链接的服务都将会被自动启动,除非已经处于运行状态。
可以说,大部分时候都可以直接通过该命令来启动一个项目。
默认情况,docker-compose up 启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。
当通过 Ctrl-C 停止命令时,所有容器将会停止。
如果使用 docker-compose up -d,将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项。
$docker-compose down
此命令将会停止 up 命令所启动的容器,并移除网络.
Compose模板文件
模板文件是使用 Compose 的核心,涉及到的指令关键字也比较多。但大家不用担心,这里面大部分指令跟 docker run 相关参数的含义都是类似的。
默认的模板文件名称为 docker-compose.yml,格式为 YAML 格式。
先举一个mysql的小栗子
version: '3'
services:
db:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=root
volumes:
- /data/mysql:/var/lib/mysql
ports:
- 3306:3306
restart: always
下面介绍几个关键的指令,指令太多,生产环境下也不是都用得上,遵循二八原则嘛。
build
指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。
version: '3'
services:
webapp:
build: ./dir
command
覆盖容器启动后默认执行的命令。
command: echo "hello world"
depends_on
解决容器的依赖、启动先后的问题。以下栗子会先启动db,redis,再启动web
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
image
指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像
ports
暴露端口信息。
使用宿主端口:容器端口
volumes
数据卷所挂载路径设置,但这里可以有两个选择:
- 绝对路径(见上述小栗子)
- 卷标
version: '3'
services:
db:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=root
volumes:
- mysql:/var/lib/mysql
ports:
- 3306:3306
...
volumes:
mysql:
container_name
指定容器名称
networks
$docker network create myNet # 新建网络
version: "3"
services:
some-service:
networks:
- some-network
- other-network
networks:
some-network:
other-network:
随着 Docker 网络的完善,强烈建议大家将容器加入自定义的 Docker 网络来连接多个容器,多容器间通过容器名-DNS解析进行互联。
restart
重启机制
- no,默认策略,在容器退出时不重启容器
- on-failure,在容器非正常退出时(退出状态非0),才会重启容器
- on-failure:3,在容器非正常退出时重启容器,最多重启3次
- always,在容器退出时总是重启容器
- unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
version: '2'
services:
web:
image: apache
restart: always
environment
设置环境变量,语法有如下两种
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET