docker-compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 docker-compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务
1、docker-compose 下载安装
# 1、下载(此例下载的是1.25.1版本,可以换成其他版本)
1)GitHub镜像
curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
2)、国内镜像
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 2、添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 3、测试
docker-compose --version
2、docker-compose.yml 文件详解
一份标准的 docker-compose.yml 文件应该包含 version、services、networks 三大部分,其中最关键的就是 services 和 networks 两个部分。
2.1、总体配置文件
version "3" # 指定 compose 文件的版本
services:
testname: # 定义所有的 service 信息, services 下面的第一级别的 testname 即是一个 service 的名称
image: test:1.0 # build 的镜像名和tag
build: # 指定包含构建上下文的路径, 或作为一个对象,该对象具有 context 和指定的 dockerfile 文件以及 args 参数值
context: /path/to/build/dir # context: 指定 Dockerfile 文件所在的路径
dockerfile: dockerfile # dockerfile: 指定 context 指定的目录下面的 Dockerfile 的名称(默认为 Dockerfile)
args: # args: Dockerfile 在build过程中需要的参数 (等同于docker container build --build-arg的作用)
key: value
name: my_app
cache_from: # v3.2中新增的参数, 指定缓存的镜像列表 (等同于 docker container build --cache_from 的作用)
- my_app: 1.0
labels: # v3.3中新增的参数, 设置镜像的元数据 (等同于 docker container build --labels 的作用)
version: 2.0
released: true
shm_size: 2gb # v3.5中新增的参数, 设置容器 /dev/shm分区的大小(等同于 docker container build --shm-size的作用)
command: redis-server /etc/redis/redis.conf # 覆盖容器启动后默认执行的命令, 支持 shell 格式和 [] 格式
container_name: # 指定容器的名称 (等同于 docker run --name 的作用)
depends_on:
networks:
# - app_net
app_net:
ipv4_address: 192.168.0.5 # 指定服务IP地址,这个在使用scale扩容的时候不适用
ports:
- 8080:8080 # 这个在使用scale扩容的时候不适用
deploy: # 布署配置
replicas: 2 # 创建两个副本
resources: #设置容器占用资源
limits:
cpus: "2.00"
memory: 5G
reservations:
memory: 200M
restart: always|on-failure|no|unless-stopped
# always:无论什么状态,容器停了就会重启
# on-failure:退出容器,返回值不是0就重启
# unless-stopped:docker服务停止,然后重启docker服务容器不会自动重启,always会
volumes:
- /opt/docker/:/tmp/
environment:
RACK_ ENV : development # 或者 - RACK_ENV=development
TZ: Asia/Shanghai # 设置时区
expose: # 暴露端口, 但是不能和宿主机建立映射关系, 类似于 Dockerfile 的 EXPOSE 指令
- 80
configs:
2.2、各部分配置详情
# 自定义网络
networks:
app_net:
driver: bridge
ipam:
driver: default # IPAM 驱动程序, bridge 或者 default
config:
- subnet: 172.28.0.0/16
ip_range: 172.28.5.0/24
gateway: 172.28.5.254
external: true # 外部网络, 如果设置为 true 则 docker-compose up 不会尝试创建它, 如果它不存在则引发错误
# 端口映射两种方式
ports: # 建立宿主机和容器之间的端口映射关系, ports 支持两种语法格式
- "3000" # 暴露容器的 3000 端口, 宿主机的端口由 docker 随机映射一个没有被占用的端口
- "3000-3005" # 暴露容器的 3000 到 3005 端口, 宿主机的端口由 docker 随机映射没有被占用的端口
- "8000:8000" # 容器的 8000 端口和宿主机的 8000 端口建立映射关系
- "9090-9091:8080-8081"
- "127.0.0.1:8001:8001" # 指定映射宿主机的指定地址的
- "127.0.0.1:5000-5010:5000-5010"
- "6060:6060/udp" # 指定协议
#### 注:当使用HOST:CONTAINER格式来映射端口时,如果你使用的容器端口小于60并且没放到引号里,可能会得到错误结果,因为YAML会自动解析xx:yy这种数字格式为60进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式。
ports:
- target: 80 # 容器端口
published: 8080 # 宿主机端口
protocol: tcp # 协议类型
mode: host # host 在每个节点上发布主机端口, ingress 对于群模式端口进行负载均衡
# 数据卷挂载:两种方式
volumes:
- type: volume # mount 的类型, 必须是 bind、volume 或 tmpfs
source: mydata # 宿主机目录
target: /data # 容器目录
volume: # 配置额外的选项, 其 key 必须和 type 的值相同
nocopy: true # volume 额外的选项, 在创建卷时禁用从容器复制数据
- type: bind # volume 模式只指定容器路径即可, 宿主机路径随机生成; bind 需要指定容器和数据机的映射路径
source: ./static
target: /opt/app/static
read_only: true # 设置文件系统为只读文件系统
volumes:
- /var/lib/mysql # 映射容器内的 /var/lib/mysql 到宿主机的一个随机目录中
- /opt/data:/var/lib/mysql # 映射容器内的 /var/lib/mysql 到宿主机的 /opt/data
- ./cache:/tmp/cache # 映射容器内的 /var/lib/mysql 到宿主机 compose 文件所在的位置
- ~/configs:/etc/configs/:ro # 映射容器宿主机的目录到容器中去, 权限只读
- datavolume:/var/lib/mysql # datavolume 为 volumes 顶级键定义的目录, 在此处直接调用
3、docker-compose 常用命令
docker-compose -f docker-compose.yml up -d # 指定文件构建镜像,启动容器,后台运行
docker-compose exec 容器名 bash # 进入指定的容器中
docker-compose logs -f 容器名 # 查看实时日志
docker-compose config -q #验证docker-compose.yml文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息。
docker-compose pause 服务名 # 暂停服务的所有容器
docker-compose unpause 服务名 # 恢复服务的所有容器
docker-compose rm/stop/start/kill/restart 服务名 # 操作服务的所有容器
docker-compose down 容器名 # 删除容器
docker-compose build 服务名 # 构建服务
docker-compose run 服务名 # 运行服务
docker-compose scale <service1>=3 <service2>=3 # 设置某个服务要启动的容器的个数
总结:docker-compose 使用主要是统一容器管理,对对应的服务进行容器化部署,可以指定容器个数(通过副本数指定),其中主要掌握 docker 网络和数据卷挂载相关的内容。
本人是一个从小白自学计算机技术,对运维、后端、各种中间件技术、大数据等有一定的学习心得,想获取自学总结资料(pdf版本)或者希望共同学习,关注微信公众号:it自学社团。后台回复相应技术名称/技术点即可获得。(本人学习宗旨:学会了就要免费分享)