docker-compose是基于docker的编排工具,能够更方便定义,管理容器,这个工具可以使用yml格式来定义,通过一条命令就可以根据编写的yml文件来创建,管理容器
为什么使用docker-compose
熟悉docker的伙伴就一定听说过docker-compose,在某些特定情况下我们要写dockerfile,构建镜像,再通过构建好的镜像 使用docker run 指定端口或者文件映射,如果只是几个容器的话,运行 管理不会很乱(规则上和使用上),一旦容器增多,你和你的同事小伙伴一起维护,因为我们每次运行的时候都要加上-v -p 这些参数,难免会有缺少参数的情况
docker-compose就很好的解决了这个问题,可以在yml文件中提前定义好容器的镜像,数据卷,网络,端口映射等等,只需要 docker-compose up指定文件启动容器,方便维护管理
安装 docker-compose
docker-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 --version
docker-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 本期内容就到这里啦,如果这个文章写的有什么问题欢迎指正,也可以留言一起讨论,最后最后最后,如果觉得我的文对你有帮助的话,也欢迎 一键三连支持一下~
如果觉得我的文对你有帮助的话 可以关注下我的公众号 一般写文第一时间发布到公众号中
公众号名称 咕咕崽
二维码: