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        # 停止服务
复制代码

 

posted @   functionMC  阅读(489)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示