简介: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;

Portainer关系 docker docker compose portainer_应用程序

  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设置规则多样:

Portainer关系 docker docker compose portainer_Portainer关系 docker_02

Portainer关系 docker docker compose portainer_docker_03

  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介绍如下图:

Portainer关系 docker docker compose portainer_docker_04

  8. Portainer

htpasswd -nb -B admin "your-password" | cut -d ":" -f 2,另

    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命令查看日志。