Docker Compose学习手札
Docker Compose介绍
Compose
定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig。
通过第一部分中的介绍,我们知道使用一个 Dockerfile
模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose
恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml
模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Compose
中有两个重要的概念:
- 服务 (
service
):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。 - 项目 (
project
):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml
文件中定义。
Compose
的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
Compose
项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose
来进行编排管理。
官方docker-compost.yml
是这样的:
Docker Compose 安装与卸载
Compose 安装
1. 下载
在 Linux 上的也安装十分简单,从 官方 GitHub Release 处直接下载编译好的二进制文件即可。
例如,在 Linux 64 位系统上直接下载对应的二进制包。
2.授权并做软连接到/usr/bin
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
测试是否安装成功:
3.bash 补全提示命令
$ curl -L https://raw.githubusercontent.com/docker/compose/1.29.2/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
Compose卸载
如果是二进制包方式安装的,删除二进制文件即可:
sudo rm -f /usr/local/bin/docker-compose
rm -f /usr/bin/docker-compose
Docker Compose 官方例子初体验
参考:https://yeasy.gitbook.io/docker_practice/compose/usage
web 应用
1. 新建文件夹,在该目录中编写 app.py
文件
app.py
内容为:
2. 创建 Dockerfile 文件:
创建 Dockerfile 文件 中使用的requirements.txt
(python 依赖包):
3.编写 docker-compose.yml
文件:
4.运行 compose 项目,并测试
docker-compose up
or docker-compose up -d
后台运行
curl http://127.0.0.1:5000
Docker Compose 命令的介绍
常用命令:
build
格式为 docker-compose build [options] [SERVICE...]
。
构建(重新构建)项目中的服务容器。
服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db。
可以随时在项目目录下运行 docker-compose build
来重新构建服务。
config
验证 Compose 文件格式是否正确,若正确则显示配置,若格式错误显示错误原因。
docker-compose config
down
此命令将会停止 up
命令所启动的容器,并移除网络
docker-compose down
images
列出 Compose 文件中包含的镜像。
kill
格式为 docker-compose kill [options] [SERVICE...]
。
通过发送 SIGKILL
信号来强制停止服务容器。
支持通过 -s
参数来指定发送的信号,例如通过如下指令发送 SIGINT
信号。
logs
格式为 docker-compose logs [options] [SERVICE...]
。
查看服务容器的输出。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 --no-color
来关闭颜色。
该命令在调试问题的时候十分有用。
pause
格式为 docker-compose pause [SERVICE...]
。
暂停一个服务容器。
pull
格式为 docker-compose pull [options] [SERVICE...]
。
拉取服务依赖的镜像。
选项:
--ignore-pull-failures
忽略拉取镜像过程中的错误。
push
推送服务依赖的镜像到 Docker 镜像仓库。
rm
格式为 docker-compose rm [options] [SERVICE...]
。
删除所有(停止状态的)服务容器。推荐先执行 docker-compose stop
命令来停止容器。
选项:
-f, --force
强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。-v
删除容器所挂载的数据卷。
run
格式为 docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]
。
在指定服务上执行一个命令。
例如:
docker-compose run centos ping baidu.com
将会启动一个 centos 服务容器,并执行 ping baidu.com
命令。
start
格式为 docker-compose start [SERVICE...]
。
启动已经存在的服务容器。
stop
格式为 docker-compose stop [options] [SERVICE...]
。
停止已经处于运行状态的容器,但不删除它。通过 docker-compose start
可以再次启动这些容器。
选项:
-t, --timeout TIMEOUT
停止容器时候的超时(默认为 10 秒)。
top
查看各个服务容器内运行的进程。
unpause
格式为 docker-compose unpause [SERVICE...]
。
恢复处于暂停状态中的服务。
up
格式为 docker-compose up [options] [SERVICE...]
。
该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。
链接的服务都将会被自动启动,除非已经处于运行状态。
可以说,大部分时候都可以直接通过该命令来启动一个项目。
参考资料:官方文档
Docker Compose yml 配置常用指令介绍
version
指定本 yml 依从的 compose 哪个版本制定的。
build
指定 Dockerfile
所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。
Compose
将会利用它自动构建这个镜像,然后使用这个镜像。
如果是要指定Dockerfile
名称可:
command
覆盖容器启动后默认执行的命令。
command: echo "hello world"
command: bundle exec thin -p 3000
command: ["bundle", "exec", "thin", "-p", "3000"]
container_name
指定容器名称。默认将会使用 项目名称_服务名称_序号
这样的格式。
container_name: docker-web-container
注意: 指定容器名称后,该服务将无法进行扩展(scale),因为 Docker 不允许多个容器具有相同的名称。
depends_on
容器中服务之间的依赖关系,依赖关系会导致以下行为:
- docker-compose up以依赖顺序启动服务。在以下示例中,db并redis在之前启动web。
- docker-compose up SERVICE自动包含SERVICE依赖项。在以下示例中,docker-compose up web还创建并启动db和redis。
- docker-compose stop按依赖顺序停止服务。在以下示例中,web在db和之前停止redis
注意:
web
服务不会等待redis
db
「完全启动」之后才启动。
dns
自定义 DNS
服务器。可以是一个值,也可以是一个列表。
dns_search
配置 DNS
搜索域。可以是一个值,也可以是一个列表。
image
指定容器运行的镜像。以下格式都可以:
logging
服务的日志记录配置。
driver:指定服务容器的日志记录驱动程序,默认值为json-file。有以下三个选项
network_mode
网络模式,用法类似于 Docke 客户端的 –net 选项,格式为:service:[service name],可以指定使用服务或者容器的网络。
networks
aliases :同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务。
ports
暴露端口信息。
使用宿主端口:容器端口 (HOST:CONTAINER)
格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。
注意:当使用 HOST:CONTAINER 格式来映射端口时,如果使用的容器端口小于60可能会得到错误得结果,因为YAML 将会解析 xx:yy 这种数字格式为 60 进制,所以建议采用字符串格式。
secrets
存储敏感数据,例如 mysql
服务密码。
sysctls
配置容器内核参数。
ulimits
指定容器的 ulimits 限制值。
例如,指定最大进程数为 65535,指定文件句柄数为 20000(软限制,应用可以随时修改,不能超过硬限制) 和 40000(系统硬限制,只能 root 用户提高)。
volumes
数据卷所挂载路径设置。可以设置为宿主机路径(HOST:CONTAINER
)或者数据卷名称(VOLUME:CONTAINER
),并且可以设置访问模式 (HOST:CONTAINER:ro
)。
该指令中路径支持相对路径。
参考:官方文档:https://docs.docker.com/compose/compose-file/compose-file-v3/