Docker极简入门系列(五):服务编排Docker compose
本系列为Docker的学习笔记,内容比较精简,主要用于快速复习和随时查询。计划分六个章节内容:
- 安装、常用命令和基本概念理解
- 常用应用程序的容器部署
- 制作镜像的两种方式(容器转镜像和Dockerfile)
- 布署一个ASP.NET Core项目
- 服务编排Docker compose
一、服务编排
和Dockerfile一样,Docker-compose也是一个配置文件。区别在于,Dockerfile用于制作镜像,而Docker-compose用于批量编排容器的启动、停止、删除及配置相互关系等,甚至在yml中还可以基于Dockerfile自动构建镜像并启动容器。在单机微服务中,我们可以使用Docker-compose,进行多个微服务的自动部署和管理。而分布式微服务,推荐使用k8s。
二、使用步骤
1、安装docker-compose(2022年8月16日,最新版已是2.9.0)
1)方法1:从github上下载docker-compose二进制文件安装
- 下载二进制文件到指定位置:curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
- 文件权限设置:chmod +x /usr/local/bin/docker-compose
- 测试是否安装成功:docker-compose -v
- 卸载方法:rm /usr/local/bin/docker-compose
2)方法2:通过pip安装(此方法没有验证过,自行尝试)
- 安装指定PHP版本:yum -y install epel-release
- 安装pip:yum -y install python-pip
- 安装docker-compose:pip install docker-compose
2、使用docker-compose(以nginx+ASP.NET Core项目为例)
#在root目录下,创建docker-compose目录 mkdir ~/docker-compose cd ~/docker-compose #创建和编写docker-compose.yml文件 vim docker-compose.yml ===进入VIM编辑器======================= version: '3' services: nginx: image: nginx ports: - 80:80 links: - weather_c1 volumes: - ./nginx/conf.d:/etc/nginx/conf.d
weather_c1: image: weather_image:1 expose: - "8080" #保存退出 :wq ===================================== #配置nginx #创建并进入配置目录,创建配置文件(-p创建多层目录) mkdir -p ./nginx/conf.d cd ./nginx/conf.d vim weather.conf ===进入VIM编辑器======================= server { listen 80; access_log off; location / { proxy_pass http://weather_c1:8080; } } ====================================== #返回到docker-compose.yml所在文件夹,并运行compose cd ../../ docker compose up
3、docker-compose的常用配置说明
#一级配置,指定docker-compose的版本号 version: '3'
#一级配置,配置具体服务,即容器 services: #************************************************* #第1个服务:web服务 web: #----------------------------------------------- #启动服务方式①(推荐):从指定镜像启动服务 #指定服务的镜像名称或镜像ID(先从本地拉取,如没有则远程拉取) image: ubuntu/ubuntu:18.04 #----------------------------------------------- #启动服务方式②:从指定Dockerfile启动服务 #build方式1,通过绝对路径,指定Dockerfile build:/path/to/build/dir #build方式方式2,设定上下文根目录context build: context: ../ dockerfile: path/of/Dockerfile #在 Dockerfile 中设置的选项(CMD, EXPOSE, VOLUME, ENV等) args: #使用 arg 指令指定构建镜像时的变量 buildno: 1 cache_from: #使用 cache_from指定构建镜像的缓存 - alpine:latest - corp/web_app:3.14 #-------------------------------------------------------- #自定义容器名称 container_name: app #向容器添加元数据,和Dockerfile的LABEL用法一样 labels: - "com.example.author=weiyigeek" - "com.example.description=Accounting webapp" - "com.example.department=Finance" - "com.example.lrelease=rc3 for v1.0" #设置容器的依赖和启动先后的问题 #例如下面容器先启动 redis 和 db 两个服务,最后才启动 web 服务 depends_on: - db - redis #配置日志选项 #driver配置驱动,目前支持三种类型,none、json-file、syslog #options配置日志驱动的相关参数 logging: driver: syslog options: syslog-address: "tcp://192.168.0.42:123" max-size: "200k" max-file: "10" #配置映射端口 #如只是指定容器的端口,宿主机会随机映射端口,如 - 80
#引用可加可不加,推荐加引号
ports: - "8080:80" #管理全部服务的标签值,比较少用。 #比如设置全部服务的user标签值为USER,role标签值为ROLE security_opt: - label:user:USER - label:role:ROLE #设置另一个信号来停止容器,默认情况下是使用SIGTERM停止容器。比较少用 stop_signal: SIGUSR1 #配置容器连接的网络,相当于给网络分组 #需要和networks一级配置项配合使用 #以下设置为:属于front-tier和back-tier两个网络分组 networks: - front-tier - back-tier #设置网络模式使用 #和docker run 的 --network 参数一样 network_mode: "bridge" #和--dns 参数一样用途,格式如下: dns: - 8.8.8.8 - 9.9.9.9 #此外 dns_search 的配置也类似 dns_search: - dc1.example.com - dc2.example.com #************************************************* #第2个服务,redis服务 redis: #指定镜像 image: redis #挂载临时目录到容器内部 #挂载单个 tmpfs: /run #挂载多个 tmpfs: - /run - /tmp #.env 文件来存放设置的 Compose 的变量。可以防止使用明码,暴露机密信息。 #./表示当前目录,即docker-compose所在目录 env_file: - ./common.env - ./apps/web.env - /opt/secrets.env #设置镜像变量,而且它可以保存变量到镜像/容器里面 #类似 docker run -e 的效果) #如果有变量名称与 environment 指令冲突,以后者为准。 environment: - RACK_ENV=development - SHOW=true - MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password #存储敏感数据,需要和一级配置项secrets配合使用。比较少用 secrets: - db_root_password - my_other_secret #与Dockerfile中的EXPOSE指令一样,用于指定暴露的端口 #实际上,常用ports就可以 expose: - "6379" #配置容器连接,可以连接到其它服务容器,比较少用。 #使用的别名将会自动在服务容器中的/etc/hosts里创建 links: - web #使用 command 可以覆盖容器启动后默认执行的命令 #也可以写成这样:command: ["bundle", "exec", "thin", "-p", "3000"] command: bundle exec thin -p 3000 #设置接入点 entrypoint: /code/entrypoint.sh entrypoint: - php - -d - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so - -d - memory_limit=-1 - vendor/bin/phpunit #************************************************* #第3个服务,lb服务 lb: #设置镜像 image: dockercloud/haproxy #设置宿主机和容器的端口映射 ports: - 80:80 #添加主机名的标签,就是往/etc/hosts文件中添加下面的一些记录。比较少用 #与Docker client的--add-host类似: extra_hosts: - "somehost:162.242.195.82" - "otherhost:50.31.209.229" #链接到 docker-compose.yml 外部的容器,甚至并非 Compose 管理的外部容器。比较少用 external_links: - redis_1 - project_db_1:mysql - project_db_1:postgresql #连接到web服务 links: - web #指定父 cgroup 组,意味着将继承该组的资源限制。比较少用 cgroup_parent: cgroups_1 #使用主机网络模式 network_mode: "host" #加入指定网络,相同的服务可以在不同的网络有不同的别名。 networks: - front-tier - back-tier #挂载一个目录或者一个已存在的数据卷容器格式 #路径可以是相对路径,使用 . 或者 .. 来指定相对目录。 #可以宿主机的 $PWD 常量 volumes: #绝对路径 - /var/run/docker.sock:/var/run/docker.sock #相对路径 - ~/configs:/etc/configs/:ro #已经存在的命名的数据卷,和一级配置项volumes配合使用 - datavolume:/var/lib/mysql #目录映射权限设置 - './nginx/log:/var/log/nginx:rw' #从其它容器或者服务挂载数据卷可选的参数是 :ro或者 :rw(默认)。比较少用 volumes_from: - service_name - service_name:ro - container:container_name - container:container_name:rw #添加或删除容器的内核功能。比较少用 #指定容器的内核能力(capacity)分配 cap_add: 。 - ALL #去掉 NET_ADMIN 能力可以指定为。比较少用 cap_drop: - NET_ADMIN - SYS_ADMIN #设备映射列表。比较少用 devices: - "/dev/ttyUSB0:/dev/ttyUSB0" #通过命令检查容器是否健康运行。比较少用 healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 1m30s timeout: 10s retries: 3 #跟主机系统共享进程命名空间。比较少用 #打开后,容器之间、以及容器和宿主机之间可以通过 ID 相互访问 pid: "host" #配置容器内核参数。比较少用 sysctls: - net.core.somaxconn=32768 - net.ipv4.tcp_syncookies=0 - net.ipv4.ip_forward=1 #指定容器的 ulimits 限制值。比较少用 #nproc,指定最大进程数为 65535 #nofile:soft,指定文件句柄数为 20000(软限制,可修改,但不能超过硬限制) #nofile:hard, 指定文件句柄数为 40000(硬限制,只能 root 用户提高) ulimits: nproc: 65535 nofile: soft: 20000 hard: 40000
#一级配置,在 volumes 中绑定本地目录。如果volumes没有使用绝对目录,服务中又使用了,且在docker环境中不存在,则需要先创建volume #等同于`docker volume create --driver local --name esdata1` #配合服务使用 volumes: esdata1: driver: local datavolume: driver: local driver_opts: type: none device: $PWD/logs o: bind
#一级配置,配置网络分组。如果服务指定了network,而docker环境中不存在,则需要先创建network #子标签aliases,这是一个用来设置服务别名的标签 #配合服务使用 networks: front-tier: driver: bridge back-tier: driver: bridge aliases: - alias1
#一级配置,放在最后,保存敏感数据,如密码等 #配合服务使用 secrets: my_secret: file: ./my_secret.txt my_other_secret: external: true
4、docker-compose的常用命令
docker-compose -h # 查看帮助 docker-compose up # 创建并运行所有容器 docker-compose up -d # 创建并后台运行所有容器 docker-compose ps # 显示所用容器信息 docker-compose -f docker-compose.yml up -d # 指定模板 docker-compose down # 停止并删除容器、网络、卷、镜像。 docker-compose rm # 删除容器 docker-compose logs # 查看容器输出日志 docker-compose pull # 拉取依赖镜像 dokcer-compose config # 检查配置 dokcer-compose config -q # 验证yaml配置文件是否正确,有问题才有输出 docker-compose pause # 暂停容器 docker-compose unpause # 恢复暂停 docker-compose restart # 重启服务 docker-compose start # 启动服务 docker-compose stop # 停止服务
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!