首页 > 技术文章 > Docker Compose编排工具

ruhuanxingyun 2020-06-04 20:31 原文

简介:Compose是用于定义和运行多容器Docker应用程序的工具,通过Compose,使用yml文件来配置应用程序所需要的所有服务,对多服务应用进行统一部署。

0. 容器内问题排查命令

  先进入容器:docker exec -it container-id sh/bash;

  A. 测试网络是否互通:ping ip;

  B. 测试容器端口是否开通:nc -zv ip port;

1、安装与卸载

  A.  下载docker-compose工具;

curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

  B.  设置docker-compose可执行文件权限:chmod +x /usr/local/bin/docker-compose;

  C.  测试是否安装成功:docker-compose --version;

  D.  卸载:rm /usr/local/bin/docker-compose。

 

2、三个步骤

  A.  使用Dockerfile定义应用程序的环境,为每个服务构建需要的镜像;

  B.  使用docker-compose.yml定义构成应用程序的服务,他们在隔离环境中一起运行;

  C.  执行docker-compose up命令来启动并运行整个应用程序;

  D.  停止或重启服务:docker-compose stop/restart。

 

3、docker-compose.yml配置文件

# 版本
version: '3'
# Network配置
networks:
  # network名
  my-net:
    # 此网络是在compose之外建立的,docker-compose up不会创建它
    external: true
my-host:
external: true
# 与主机共享host网路
name: host

# 全局挂载卷
volumes:
  fdfs-data-1:

# 服务 services:
  # 服务名 web:
     # 镜像名:仓库/标签:版本 image: ruhuanxingyun.com:8701/fastdfs-nginx:latest
     # 服务发布模式
     deloy:
      # global:每个集群每个服务实例启动一个容器,replicated:指定集群中实例的副本数量
      mode: global
      # 限制服务部署节点
      placement:
        constraints:
          # docker node update --label-add role=标签名称 主机名
          - node.labels.rabbitmq == true
      restart_poicy:
     # 容器启动后默认执行命令
     command: tracker
     # 端口信息(宿主机端口:容器内部端口) ports:
       # TCP端口映射   
- "22122:22122"
       # UDP端口映射
       - "22123:22123/udp"
     # 指定使用的虚拟网络
     networks:
      - my-net
     cap_add:
- ALL
# 设置docker容器linux参数
     sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=1
# 设置最大打开文件数
     ulimits:
nproc: 65535
nofile:
soft: 65535
hard: 65535
     # 挂载目录(宿主机目录:容器内部目录) 
     volumes:
      - /etc/localtime:/etc/localtime
      - /data/fastdfs:/etc/fdfs
     # 环境变量
     environment:
      TRACKER_SERVER: fdfs-tracker:22122
      GROUP_NAME: group

   ports设置规则多样:

  4. 重用配置

    &  <<:*的用法后续补充

    B. 服务编排要想按照指定启动顺序的话,docker提供的depends_on或links,只能保证服务依赖也相应启动,但是无法保证启动成功后,再启动其他服务,目前比较好的就是wait-for-it.sh脚本实现;

  5. 服务远程调试参数

-Xdebug -Xrunjdwp:transport=dt_socket,address=28080,suspend=n,server=y

  6. 重启策略(restart_policy):restart_policy判断依据是进程退出(Container process exited)或内存溢出(killed by out of memory);

    A. 参数condition的三种状态

      none:要容器退出就重启容器;

      on-failure:在容器非正常退出时(退出状态非0),才会重启容器;

      any:默认策略,在容器退出时不重启容器;

     B. docker容器的退出状态码

      0:表示容器正常退出,例如 stop 容器;

      非0:表示容器退出异常(退出状态码采用 chroot 标准),例如执行 docker run 失败后的容器退出;

      125:Docker 守护进程本身有错误;

      126:容器启动后,要执行的默认命令无法调用;

      127:容器启动后,要执行的默认命令不存在;

      其他状态码:容器启动后在容器内部执行命令,该命令退出时的返回状态码,就作为容器的退出状态码;

      查看容器状态码:docker inspect container-id -f "{{.State.ExitCode}}";

  7. docker多服务依赖关系

    A. 比如Nacos服务启动依赖于MySQL正常启动,虽然version2中提供depends_on来解决依赖问题,但是容器启动后不代表容器里应用准备好了,所以需要通过额外的手段来判断,一种是写wait-for-it.sh脚本,另一种就是dockerize工具判断;

    B. dockerize介绍如下图:

 

可参考:docker-compose.yml配置参数详解

    docker volume目录挂载方式

 

推荐阅读