likes
comments
collection
share

Docker 容器编排

作者站长头像
站长
· 阅读数 15

一、基本概念

容器编排:就是针对容器生命周期的管理,对容器的生命周期进行更快速方便的方式进行管理

  • 依赖管理,当一个容器必须在另一个容器运行完成后,才能运行时,就需要进行依赖管理
  • 副本数控制,容器有时候也需要集群,快的对容器集群进行弹性伸缩
  • 配置共享,通过配置文件统一描述需要运行的服务相关信息,自动化的解析配置内容,并构建对应的服务

二、Docker Compose(单机)

有的时候我们会需要涉及到在一台机器部署多个容器,那么此时再手动的每次输入相关的一堆配置命令再来启动容器,还是产生了很多无意义的重复性劳动。针对单机的多容器部署的情况,Docker 为我们提供了一个单机版本的服务编排工具 docker-compose

Docker-Compose 可以高效便捷的管理单机上运行的所有容器,它通过 yaml 配置文件的方式完成之前执行 docker run 命令所设置的所有参数,你可以先针对单机上的所有容器进行相关配置,配置完成后即可使用 docker-compose 对单机多容器进行高效的管理

Docker 容器编排

三、Docker compose 安装

1、安装Docker compse

看安装文档

--restart=always参数能够使我们在重启docker时,自动启动相关容器。

2、Docker容器的重启策略

no:默认策略,在容器退出时不重启容器 on-failure:在容器非正常退出时(退出状态非0),才会重启容器 on-failure:3:在容器非正常退出时重启容器,最多重启3次 always:在容器退出时总是重启容器 unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

四、Docker compose 配置文件

主要意义:

我们起一个容器,会有诸多配置,如果光靠命令执行,不太现实,包括容器网络等

需要通过docker-compose 通过配置来启动容器提升销量

配置语法可看官网

Compose file version 2 reference (docker.com)

服务、网络和数据卷

那么对于我们普通镜像的配置最关键的就是,服务、网络和数据卷

1、服务service

需要运行的容器配置,可以理解为原先用 docker run 命令后面跟的一系列配置信息,都陪在这个下面

2、网络

docker-compose 公共自定义网络管理,配置好以后,可以直接在 services 中引用该网络配置,这个配置可以多个 service 使用

3、数据卷

docker-compose 下的统一数据卷管理,可以给多个 service 使用

所以我们要使用docker-compose 需要先创建一个配置文件:我在/opt/docker 下创建配置文件

Docker 容器编排

[root@iZwz936bbexlrZ docker]# touch docker-compose.yml
[root@iZwz936bbexlrZ docker]# ls
docker-compose.yml  nexus

编辑配置文件

version: "2.1"
services:
  #其中的一个service配置
  nginx-demo:
    image: "nginx"
    container_name: "docker-compose-test"
    restart: "always"
    networks:
      - liuqing_net
    volumes:
      - /www/liuqing.cn:/usr/share/nginx/html
    environment:
      APP_ENV: dev
    dns: 114.114.115.115
networks:
  liuqing_net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 188.18.0.0/16
          gateway: 188.18.0.1
#volumes:
#  liuqing_volume:
#    - nginx_volume:/usr/share/nginx/html

Depends_on : 设置容器启动顺序

Docker 容器编排 可以看到是先是db,然后是redis

五、Docker compose 常用命令和弹性伸缩

Define and run multi-container applications with Docker.

Usage:
  docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE             Specify an alternate compose file (default: docker-compose.yml)
  -p, --project-name NAME     Specify an alternate project name (default: directory name)
  --verbose                   Show more output
  -v, --version               Print version and exit
  -H, --host HOST             Daemon socket to connect to

  --tls                       Use TLS; implied by --tlsverify
  --tlscacert CA_PATH         Trust certs signed only by this CA
  --tlscert CLIENT_CERT_PATH  Path to TLS certificate file
  --tlskey TLS_KEY_PATH       Path to TLS key file
  --tlsverify                 Use TLS and verify the remote
  --skip-hostname-check       Don't check the daemon's hostname against the name specified
                              in the client certificate (for example if your docker host
                              is an IP address)

Commands:
  build              构建或重新构建一个服务
  bundle             Generate a Docker bundle from the Compose file
  config             验证并查看 compose 文件
  create             创建一个服务
  down               停止并删除容器、网络、镜像和数据卷
  events             Receive real time events from containers
  exec               在一个运行中的容器执行命令
  help               获取帮助信息
  kill               关闭一个容器
  logs               显示服务的日志信息
  pause              暂停一个服务
  port               打印一个端口绑定的公开端口
  ps                 查看容器列表
  pull               拉取镜像
  push               推送镜像
  restart            重启容器
  rm                 删除已经停止的容器
  run                运行一个一次性执行的命令
  scale              设置服务的容器数量
  start              启动服务
  stop               停止服务
  unpause            恢复一个暂停的服务
  up                 创建并启动一个容器
  version            显示 compose 的版本信息
  • 构建服务

    • 可以选择基于已有的镜像或者 Dockerfile 进行重新构建,利用 docker-compose build 可进行构建操作,也可以指定 docker-compose build 来构建指定服务
  • 创建服务

    • 配置好 yml 文件后,通过 docker-compose create 创建配置文件中的所有服务,通过指定服务名来创建具体服务
  • 拉取镜像

    • docker-compose pull 服务名,可以拉取指定服务的镜像
  • 容器的运行/启动/停止

    docker-compose run 服务名:运行服务 docker-compose start 服务名:启动服务 docker-compose stop 服务名:停止服务 docker-compose restart 服务名:重启服务

  • 查看管理的容器列表

    docker-compose ps 查看服务列表

  • 查看日志

    • docker-compose logs 服务名:查看指定服务的日志信息

启动

 docker-compose config -f /opt/docker/"docker-compose.yml的文件目录
 
 如果刚好是在 docker-compose.yml 文件目录下,可直接启动不用文件路径,docker-compose会自动扫描当前目录喜爱的yml文件

[root@iZwz93bbexlrZ docker]# docker-compose config
networks:
  liuqing_net:
    driver: bridge
    ipam:
      config:
      - gateway: 188.18.0.1
        subnet: 188.18.0.0/16
      driver: default
services:
  nginx-demo:
    container_name: docker-compose-test
    dns:
    - 114.114.115.115
    environment:
      APP_ENV: dev
    image: nginx
    networks:
      liuqing_net: null
    restart: always
    volumes:
    - /www/liuqing.cn:/usr/share/nginx/html:rw
version: '2.1'

Docker 容器编排

rw 表示权限可读可写

如果一个docker-compose.yml中有多个service

如果没有指定启动那个服务,就会启动全部,可也指定启动那个服务

docker-composr create "yml中配置的服务名"

docker-composr create nginx-test

创建容器

[root@iZwz936bbexlrZ docker]# docker-compose ps
Name   Command   State   Ports
------------------------------
[root@iZwz936bbexlrZ docker]# docker-compose create nginx-demo
WARNING: The create command is deprecated. Use the up command with the --no-start flag instead.
Creating docker-compose-test ... done
[root@iZwz936bbexlrZ docker]# docker-compose ps
       Name                      Command               State    Ports
---------------------------------------------------------------------
docker-compose-test   /docker-entrypoint.sh ngin ...   Exit 0 //处于退出状态 

启动容器

[root@iZwz936bbexlrZ docker]# docker-compose up -d
Creating network "docker_liuqing_net" with driver "bridge"
Starting docker-compose-test ... done
[root@iZwz936bbexlrZ docker]# docker-compose ps
       Name                      Command               State   Ports 
---------------------------------------------------------------------
docker-compose-test   /docker-entrypoint.sh ngin ...   Up      80/tcp
[root@iZwz936bbexlrZ docker]# 

此时80/tcp是容器里面的端口,可以在docker-compose.yml文件中配置端口映射,也可以在外边直接使用命令

docker-compose.yml文件中配置端口映射

version: "2.1"
services:
  #其中的一个service配置
  nginx-demo:
    image: "nginx"
    container_name: "docker-compose-test"
    restart: "always"
    networks:
      - liuqing_net
    volumes:
      - /www/liuqing.cn:/usr/share/nginx/html
    environment:
      APP_ENV: dev
    dns: 114.114.115.115
    ports:
      - 80:80  //这里
networks:
  liuqing_net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 188.18.0.0/16
          gateway: 188.18.0.1
#volumes:
#  liuqing_volume:
#    - nginx_volume:/usr/share/nginx/html

修改后重启

[root@iZwz936bbexlrZ docker]# docker-compose up -d
Recreating docker-compose-test ... done
[root@iZwz936bbexlrZ docker]# docker-compose ps
       Name                      Command               State                Ports              
-----------------------------------------------------------------------------------------------
docker-compose-test   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:80->80/tcp,:::80->80/tcp
[root@iZwz936bbexlrZ docker]# 

每次 docker-compose up -d的时候都是去加载docker-compose.yml

创建多个容器

[root@iZwz936bbexlrZ docker]# docker-compose scale nginx-demo=3
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
WARNING: The "nginx-demo" service is using the custom container name "docker-compose-test". Docker requires each container to have a unique name. Remove the custom name to scale the service.
WARNING: The "nginx-demo" service specifies a port on the host. If multiple containers for this service are created on a single host, the port will clash.
Starting docker-compose-test ... done
Creating docker-compose-test ... error
Creating docker-compose-test ... 

ERROR: for docker-compose-test  Cannot create container for service nginx-demo: Conflict. The container name "/docker-compose-test" is already in use by container "b9fba1ab1ed3e4f85c68451c764eecb2902049410f4de52ec61dca0a881e9fdf". You have to remove (or rename) that container to be able to reuse that name.
ERROR: Cannot create container for service nginx-demo: Conflict. The container name "/docker-compose-test" is already in use by container "b9fba1ab1ed3e4f85c68451c764eecb2902049410f4de52ec61dca0a881e9fdf". You have to remove (or rename) that container to be able to reuse that name.
[root@iZwz936bbexlrZ docker]# 

因为yml中指定了容器的名称,导致无法创建多个容器,需要删除yml中的容器中指定的容器的名称

此是在去创建多个容器

[root@iZwz936bbexlrZ docker]# docker-compose scale nginx-demo=3
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
WARNING: The "nginx-demo" service specifies a port on the host. If multiple containers for this service are created on a single host, the port will clash.
Starting docker-compose-test ... done
Creating docker_nginx-demo_2 ... error
Creating docker_nginx-demo_3 ... error

ERROR: for docker_nginx-demo_3  Cannot start service nginx-demo: driver failed programming external connectivity on endpoint docker_nginx-demo_3 (c567c7b887abc760bec41477479ca9aa809ca7e14538cc91c19a8ee741fe239e): Bind for 0.0.0.0:80 failed: port is already allocated

ERROR: for docker_nginx-demo_2  Cannot start service nginx-demo: driver failed programming external connectivity on endpoint docker_nginx-demo_2 (ea085256f61784a066f31cdec921d628eb7b933c11b282768330ada9d3807e70): Bind for 0.0.0.0:80 failed: port is already allocated
ERROR: Cannot start service nginx-demo: driver failed programming external connectivity on endpoint docker_nginx-demo_3 (c567c7b887abc760bec41477479ca9aa809ca7e14538cc91c19a8ee741fe239e): Bind for 0.0.0.0:80 failed: port is already allocated
[root@iZwz936bbexlrZ docker]# 

会发现有端口冲突,同一个80端口不可被多个容器绑定,还要去修改配置端口映射

Docker 容器编排

如图指定容器暴露80端口,但是不指定主机的端口,主机端口随机,这就会有冲突了

看结果

[root@iZwz936bbexlrZ docker]# docker-compose scale nginx-demo=3
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
Starting docker-compose-test ... done
Creating docker_nginx-demo_2 ... done
Creating docker_nginx-demo_3 ... done
[root@iZwz936bbexlrZ docker]# docker-compose ps
       Name                      Command               State                   Ports                 
-----------------------------------------------------------------------------------------------------
docker-compose-test   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:80->80/tcp,:::80->80/tcp      
docker_nginx-demo_2   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:32784->80/tcp,:::32784->80/tcp
docker_nginx-demo_3   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:32785->80/tcp,:::32785->80/tcp
[root@iZwz936bbexlrZ docker]# 

这样我们就可以看到创建了3容器,当访问量还在继续增加我们可以继续增加

docker-compose scale nginx-demo=5

这样容器就会变成5个

如果当访问压力没那那么大时候,我们减少容器数量

docker-compose scale nginx-demo=1

此时容器数量就剩下一个了

其他命令没有细说,可以自己试试