Docker Compose编排、重要参数详解及Portainer监控

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

0. 容器内问题排查命令

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

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

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

1、安装与卸载

  A.  下载docker-compose工具;

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

aarch64:curl -L https://github.com/docker/compose/releases/download/v2.0.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose,以下版本都不支持arm架构

  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命令来启动并运行整个应用程序,如:docker-compose -f file.yml up -d;

  D.  停止或重启服务:docker-compose -f file.yml 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介绍如下图:

  8. Portainer

    A. 生成密码工具:htpasswd -nb -B admin "your-password" | cut -d ":" -f 2,另 htpasswd是basic认证基于文件实现时,用到的账号密码生成工具,yum install -y httpd;

    B. 部署命令,注意$符号要转义,在每一个$前面再加一个$即可:

version: "3"

networks:
    rhxy-network:
        external: true

services:
    portainer:
        image: portainer/portainer
        container_name: portainer
        hostname: portainer
        restart: always
        command: --admin-password=$$1a$$05$$npdefc.1NzvQJL.gQ2whozusdf51TiaR0jk9fJa2YK2MS -H unix:///var/run/docker.sock
        ports:
            - 9000:9000
        networks:
            - rhxy-network
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
            - /data/portainer/data:/data
        environment:
            TZ: Asia/Shanghai

   9. 将docker容器里应用日志输出到控制台

    A. Docker将容器日志存储在默认位置/var/lib/docker中,每个容器都有一个特定其ID的JSON日志,如:/var/lib/docker/containers/iu622030.../iu622030...-json.log;

    B. 一般应用程序都有自己的日志,比如nginx的access_log,如果想在portainer里查看其日志,需要将日志转到标准输出(STDOUT)或错误输出(STDERR)中,docker打镜像操作如下:

# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
    && ln -sf /dev/stderr /var/log/nginx/error.log

      制作镜像时建立软连接,容器运行时,可将任何的自定义应用日志,转到标准输出和标准错误输出上,然后通过docker logs命令查看日志。

 

10. 容器健康检查health

  A. 健康检查是用来弥补之前进程级的检查策略restart的问题,如容器依赖服务未启动成功或容器内存溢出等仍无法工作,所以要引入细粒度的健康检查,比如端口级探测;

  B. 监控检查状态

    starting:容器仍在启动时的初始状态;

    healthy:如果命令成功,则容器是健康的;

              unhealthy:如果运行状态检查失败且超过重试次数就宣布容器是不健康的,但一旦后续有一次检查成功,容器就回到healthy状态。   

  C. 配置参数

    interval:两次健康检查的间隔,默认30s;

              timeout:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就视为失败,默认30s; 

              retries:当连续失败指定次数后,则将容器状态视为unhealthy,默认3次;

              start_period(3.4版本才支持):应用启动的初始化时间,在启动过程中的监控检查失效不会计入,默认0s,注意如果在启动期间健康检查成功,则认为容器已启动,所有连续失败的情况都将计入最大重试次数,而且如果上面三个参数设置不合理会导致服务一直重启。

  D. 使用方式

 

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

    docker volume目录挂载方式

    docker logs原理

    docker容器的health健康状态检查

 

posted @ 2020-06-04 20:31  如幻行云  阅读(535)  评论(0编辑  收藏  举报