docker-compose是基于docker的编排工具,能够更方便定义,管理容器,这个工具可以使用yml格式来定义,通过一条命令就可以根据编写的yml文件来创建,管理容器
为什么使用docker-compose
熟悉docker的伙伴就一定听说过docker-compose,在某些特定情况下我们要写dockerfile,构建镜像,再通过构建好的镜像 使用docker run 指定端口或者文件映射,如果只是几个容器的话,运行 管理不会很乱(规则上和使用上),一旦容器增多,你和你的同事小伙伴一起维护,因为我们每次运行的时候都要加上-v -p 这些参数,难免会有缺少参数的情况
docker-compose就很好的解决了这个问题,可以在yml文件中提前定义好容器的镜像,数据卷,网络,端口映射等等,只需要 docker-compose up指定文件启动容器,方便维护管理
安装 docker-composedocker-compose的安装非常的简单,只需要下载可执行的二进制文件,把他放到/use/local/bin 目录 给一个可执行权限就可以 我网盘里面有1.2版本和2.5版本,微信公众号后台回复docker-compose获取二进制包(linux的)
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # 给权限 chmod +x /usr/local/bin/docker-compose # 查看版本 docker-compose --versiondocker-compose 参数
docker-compose通过yml文件来配置容器规则的,需要遵循yml的规则:
綾 大小写敏感
綾 缩进表示层级管理
綾不支持制表符tab,缩进要使用空格键,缩进一般是两个空格
綾 字符后缩进1个空格 如 冒号 逗号
看一个我们使用的docker-compose 下面我们也会围绕这两段看内容
先看第一段 使用官方镜像的:
version: '3.0' services: test-redis: image: redis:7.0.0 restart: always container_name: test-redis ports: - 6379:6379 volumes: - ./data/init-data/redis/redis.conf:/etc/redis.conf - ./data/init-data/redis/data:/var/lib/redis command: redis-server /etc/redis.conf
可以通过上面的这个例子看出 每一行的缩进都是二的倍数
下面我们来看他的参数
索 version
version字段表明使用了哪个版本的compose,不同的compose支持不同docker版本,可以在这个连接中查看版本对应关系:
https://docs.docker.com/compose/compose-file/compose-file-v3/
一般使用的是2.0,2.2,3.3 等等版本
索 services
services标签定义所有的service信息,services下面的第一级是service的名字 上面的例子中 test-redis就是一个services的名称,也可以称之为子服务名
一个docker-compose文件中 version和services 这两行是必填在最开头的
索 image
image标签是指定服务的镜像 可以填写镜像的名称 或者是镜像:版本,也可以填写镜像的ID。镜像在本地不存在,会尝试拉取这个镜像
格式如下:
image: redis # 默认pull laster镜像 image: redis:7.0.0 # 指定镜像版本 image: 镜像仓库/redis # 在镜像仓库中pull (个人或公司) image: 6854c25e2674 # 通过镜像id pull
索 restart
restart标签 定义了启动容器的参数 就等同于 docker run中 --restart=always 一般经常使用的是always 在容器退出时总是重启容器,他还有其他参数:
no 默认策略,在容器退出时,不重启容器
on-failure 在容器非正常退出时(退出状态非0),才会重启
om-failure:3 在容器非正常退出时重启容器,最多重启三次
always 在容器退出时总是重启容器
格式如下:
test-redis: image: redis:7.0.0 restart: always # 在容器退出时总是重启容器
索 container_name
container_name标签是定义容器的名字,自定义
格式如下:
test-redis: image: redis:7.0.0 restart: always container_name: test-redis # 启动容器的名字
索 ports
ports标签是定义容器映射的端口,注意 容器端口要大于60 因为小于60你可能会得到一个错误的结果,yaml将会解析xx:yy这种数字格式为60进制,建议使用字符串格式
格式如下:
ports: - 6379 # 容器内部6379,外部端口随机分配为主机未占用的端口 - "6379" # 上同 - 6379:6379 # 容器内部6379映射容器外部6379 - 7000-7010:7000-7010 # 这个范围的端口做映射 - 6379:6379/udp # 限制为指定的协议
索 volumes
volumes标签 挂载一个目录,文件或一个已存在的数据卷容器,compose的数据卷指定路径可以是相对目录,使用 . 或者 .. 来指定相对目录。
格式如下:
volumes: # 只是指定一个容器内部的路径,docker会自动创建一个逻辑卷 - /data/redis/data # 使用绝对路径挂载 容器外:容器内 - /data/redis/data:/var/lib/redis # 相对路径 以docker-compose文件所在的目录为相对路径 - ./data/init-data/redis/redis.conf:/etc/redis.conf # 使用用户的相对路径 root用户 相对路径/root - ~/data/redis:/var/lib/redis # 使用已存在命名的数据卷 - redisvolume:/var/lib/redis
索 command
command标签 类似于dockerfile中的cmd ,entrypoint 它会覆盖容器启动后默认执行的命令
格式如下:
command: redis-server /etc/redis.conf command: ["redis-server","/etc/redis.conf"]
看第二段 通过使用dockerfile构建完成的镜像运行容器
test-minio: build: context: ./ dockerfile: ./minio/Dockerfile image: minio restart: always container_name: test-minio ports: - 9000:9000 - 8888:8888 volumes: - ./data/init-data/minio:/data/minio
索 build
build标签 可以指定dockerfile所在的路径,也可以通过context和dockerfile配合使用指定路径 上面的例子中既有build标签,也有image标签 这个是说 build构建完成的镜像命名为image标签的内容
格式如下:
build: ./minio image: minio
索 context
context标签设置上下文根目录,以该目录为准来指定dockerfile
格式如下
test-minio: build: context: ./ # 指定当前目录为指定目录 dockerfile: minio/Dockerfile # 以context为当前目录 指定dockerfile目录
索 dockerfile
dockerfile标签是指定dockerfile文件路径 注意 以dockerfile结尾 例子
下面是经常会使用的一些参数
索 extra_hosts
extra_hosts标签作用是 往容器内/etc/hosts文件中添加记录,注意格式是相反的
格式如下:
test-smartid: build: context: ./ dockerfile: ./smartid/Dockerfile restart: always container_name: test-smartid image: test-smartid extra_hosts: # 在这里噢 - "test-mysql:192.168.8.241" # 添加主机名
索 hostname
hostname标签是设置容器的主机名
格式如下:
test-mq: hostname: test-mq # 设置容器主机名为test-mq image: rabbitmq:3.8.30
索 environment
environment设置环境变量 和dockerfile中ENV作用一致
格式如下:
test-mq: hostname: test-mq image: rabbitmq:3.8.30-management restart: always container_name: test-mq environment: # 设置环境变量 RABBITMQ_DEFAULT_VHOST: "/" RABBITMQ_DEFAULT_USER: "guest" RABBITMQ_DEFAULT_PASS: "guest
索 depends_on
depends_on标签解决了容器间依赖的问题,启动容器的先后顺序 ,假设我写了两个自服务 redis 和 mq 我在mq服务中设置 depends_on redis ,那就要等 redis启动之后 mq在启动
格式如下:
test-mq: hostname: test-mq image: rabbitmq:3.8.30-management restart: always container_name: test-mq environment: RABBITMQ_DEFAULT_VHOST: "/" RABBITMQ_DEFAULT_USER: "guest" RABBITMQ_DEFAULT_PASS: "guest" ports: - 5672:5672 - 15672:15672 - 25672:25672 depends_on: # 等待 test-redis容器启动之后 再启动mq - test-redis
:ok 本期内容就到这里啦,如果这个文章写的有什么问题欢迎指正,也可以留言一起讨论,最后最后最后,如果觉得我的文对你有帮助的话,也欢迎 一键三连支持一下~
如果觉得我的文对你有帮助的话 可以关注下我的公众号 一般写文第一时间发布到公众号中
公众号名称 咕咕崽
二维码:



