Docker镜像之Docker Compose讲解

Posted 爱吃牛肉的大老虎

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker镜像之Docker Compose讲解相关的知识,希望对你有一定的参考价值。

文章目录

1 docker-compose

1.1 compose编排工具简介

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务

Compose 使用的三个步骤:

  • 使用 Dockerfile 定义应用程序的环境
  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行
  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序

1.2 安装docker-compose

安装docker-compose

# 下载pip软件
yum install -y python2-pip
# 下载 docker-compose
pip install docker-compose

国内开启pip 下载加速:http://mirrors.aliyun.com/help/pypi

mkdir ~/.pip/
cat > ~/.pip/pip.conf <<'EOF'
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
EOF

1.3 编排启动镜像

1、创建文件目录

[root@docker01 ~]# mkdir /opt/my_wordpress/
[root@docker01 ~]# cd /opt/my_wordpress/

2、编写编排文件

[root@docker01 my_wordpress]# vim docker-compose.yml
version: '3'
services:
   db:
     image: mysql:5.7
     volumes:
       - /data/db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress
   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     volumes:
       - /data/web_data:/var/www/html
     ports: 
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress

3、启动

启动方法:docker-compose up
后台启动方法:docker-compose up -d

4、浏览器上访问http://10.0.0.100:8000
进行wordpress的安装即可

1.4 haproxy代理后端docker容器

1、修改编排脚本

[root@docker01 my_wordpress]# cat docker-compose.yml 
version: '3'
services:
   db:
     image: mysql:5.7
     volumes:
       - /data/db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress
   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     volumes:
       - /data/web_data:/var/www/html
     ports: 
       - "80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress

2、同时启动两台wordpress

[root@docker01 my_wordpress]# docker-compose scale wordpress=2 
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
Starting mywordpress_wordpress_1 ... done
Creating mywordpress_wordpress_2 ... done

3、安装haproxy

[root@docker01 ~]# yum install haproxy -y

4、修改haproxy配置文件

关于配置文件的详细说明,参考:https://www.cnblogs.com/MacoLee/p/5853413.html

[root@docker01 ~]#cp /etc/haproxy/haproxy.cfg,.bak
[root@docker01 ~]# vim /etc/haproxy/haproxy.cfg
global
    log127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats level admin  #支持命令行控制
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000
listen stats
    mode http
    bind 0.0.0.0:8888
    stats enable
    stats uri     /haproxy-status 
    stats auth    admin:123456
frontend frontend_www_example_com
    bind 10.0.0.100:8000
    mode http
    option httplog
    log global
    default_backend backend_www_example_com
backend backend_www_example_com
    option forwardfor header X-REAL-IP
    option httpchk HEAD / HTTP/1.0
    balance roundrobin
    server web-node1  10.0.0.100:32768 check inter 2000 rise 30 fall 15
    server web-node2  10.0.0.100:32769 check inter 2000 rise 30 fall 15

5、启动haproxy

systemctl start haproxy
systemctl enable haproxy

6、使用浏览器访问hapeoxy监听的8000端口可以看到负载的情况

7、使用浏览器访问 http://10.0.0.100:8888/haproxy-status

可以看到后端节点的监控状况,

1.5 安装socat 直接操作socket控制haproxy

1、安装软件

yum install socat.x86\\_64 -y

2、查看帮助

[root@docker01 web_data]# echo "help"|socat stdio /var/lib/haproxy/stats

3、下线后端节点

echo "disable server backend_www_example_com/web-node2"|socat stdio /var/lib/haproxy/stats

4、上线后端节点

echo "enable server backend_www_example_com/web-node3"|socat stdio /var/lib/haproxy/stats

5、编写php测试页,放到/data/web_data下,在浏览器中访问可以查看当前的节点

[root@docker01 web_data]# vim check.php
<html>
    <head>
        <title>PHP测试</title>
    </head>
    <body>
        <?php  echo '<p>Hello World </p>'; ?>
        <?php  echo "访问的服务器地址是:"."<fontcolor=red>".$_SERVER['SERVER_ADDR']."</font>"."<br>";
        echo"访问的服务器域名是:"."<fontcolor=red>".$_SERVER['SERVER_NAME']."</font>"."<br>";
        ?>
    </body>
</html>

1.6 compose中yml 配置指令参考

1.6.1 简单命令

  • version:指定本 yml 依从的 compose 哪个版本制定的
  • cap_add,cap_drop:添加或删除容器拥有的宿主机的内核功能
  • cgroup_parent:为容器指定父 cgroup 组,意味着将继承该组的资源限制
  • command:覆盖容器启动的默认命令
  • container_name:指定自定义容器名称,而不是生成的默认名称
  • devices:指定设备映射列表
  • dns:自定义 DNS 服务器,可以是单个值或列表的多个值
  • dns_search:自定义 DNS 搜索域。可以是单个值或列表
  • entrypoint:覆盖容器默认的 entrypoint
  • env_file:从文件添加环境变量。可以是单个值或列表的多个值
  • environment:添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False
  • expose:暴露端口,但不映射到宿主机,只被连接的服务访问。
  • extra_hosts:添加主机名映射。类似 docker client --add-host
  • healthcheck:用于检测 docker 服务是否健康运行
  • image:指定容器运行的镜像。
    以下格式都可以:
    • image: redis
    • image: ubuntu:14.04
    • image: tutum/influxdb
    • image: example-registry.com:4000/postgresql
    • image: a4bc65fd # 镜像id
  • restart
    • no:是默认的重启策略,在任何情况下都不会重启容器。
    • always:容器总是重新启动。
    • on-failure:在容器非正常退出时(退出状态非0),才会重启容器。
    • unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
  • security_opt:修改容器默认的 schema 标签。
security-opt:
  - label:user:USER   # 设置容器的用户标签
  - label:role:ROLE   # 设置容器的角色标签
  - label:type:TYPE   # 设置容器的安全策略标签
  - label:level:LEVEL  # 设置容器的安全等级标签
  • stop_grace_period:指定在容器无法处理 SIGTERM (或者任何 stop_signal 的信号),等待多久后发送 SIGKILL 信号关闭容器。默认的等待时间是 10 秒
stop_grace_period: 1s # 等待 1 秒
stop_grace_period: 1m30s # 等待 1 分 30 秒 
  • stop_signal:设置停止容器的替代信号。默认情况下使用 SIGTERM 。
    以下示例,使用 SIGUSR1 替代信号 SIGTERM 来停止容器。
    stop_signal: SIGUSR1
  • sysctls:设置容器中的内核参数,可以使用数组或字典格式
sysctls:
  net.core.somaxconn: 1024
  net.ipv4.tcp_syncookies: 0

sysctls:
  - net.core.somaxconn=1024
  - net.ipv4.tcp_syncookies=0
  • tmpfs:在容器内安装一个临时文件系统。可以是单个值或列表的多个值。
tmpfs: /run

tmpfs:
  - /run
  - /tmp
  • ulimits:覆盖容器默认的 ulimit
ulimits:
  nproc: 65535
  nofile:
    soft: 20000
    hard: 40000
  • volumes:将主机的数据卷或着文件挂载到容器里
version: "3.7"
services:
  db:
    image: postgres:latest
    volumes:
      - "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
      - "/localhost/data:/var/lib/postgresql/data"

1.6.2 build

build:指定为构建镜像上下文路径
其中可选项:

  • context:上下文路径。
  • dockerfile:指定构建镜像的 Dockerfile 文件名。
  • args:添加构建参数,这是只能在构建过程中访问的环境变量。
  • labels:设置构建镜像的标签。
  • target:多层构建,可以指定构建哪一层

例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像:

version: "3.7"
services:
  webapp:
    build: ./dir

或者,作为具有在上下文指定的路径的对象,以及可选的 Dockerfile 和 args:

version: "3.7"
services:
  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1
      labels:
        - "com.example.description=Accounting webapp"
        - "com.example.department=Finance"
        - "com.example.label-with-empty-value"
      target: prod

1.6.3 depends_on

depends_on:设置依赖关系

  • docker-compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis ,才会启动 web。
  • docker-compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,docker-compose up web 还将创建并启动 db 和 redis。
  • docker-compose stop :按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止
version: "3.7"
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

注意:web 服务不会等待 redis db 完全启动 之后才启动。

1.6.4 deploy

指定与服务的部署和运行有关的配置。只在 swarm 模式下才会有用

version: "3.7"
services:
  redis:
    image: redis:alpine
    deploy:
      mode:replicated
      replicas: 6
      endpoint_mode: dnsrr
      labels: 
        description: "This redis service label"
      resources:
        limits:
          cpus: '0.50'
          memory: 50M
        reservations:
          cpus: '0.25'
          memory: 20M
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s

可以选参数:

  • endpoint_mode:访问集群服务的方式。
    • endpoint_mode: vip
      Docker 集群服务一个对外的虚拟 ip。所有的请求都会通过这个虚拟 ip 到达集群服务内部的机器。
    • endpoint_mode: dnsrr
      DNS 轮询(DNSRR)。所有的请求会自动轮询获取到集群 ip 列表中的一个 ip 地址。
  • labels:在服务上设置标签。可以用容器上的 labels(跟 deploy 同级的配置) 覆盖 deploy 下的 labels。
  • mode:指定服务提供的模式。
    • replicated:复制服务,复制指定服务到集群的机器上。
    • global:全局服务,服务将部署至集群的每个节点。
  • replicasmodereplicated 时,需要使用此参数配置具体运行的节点数量。
  • resources:配置服务器资源使用的限制,例如上例子,配置 redis 集群运行需要的 cpu 的百分比 和 内存的占用。避免占用资源过高出现异常。
  • restart_policy:配置如何在退出容器时重新启动容器。
    • condition:可选 none,on-failure 或者 any(默认值:any)。
    • delay:设置多久之后重启(默认值:0)。
    • max_attempts:尝试重新启动容器的次数,超出次数,则不再尝试(默认值:一直重试)。
    • window:设置容器重启超时时间(默认值:0)。
  • rollback_config:配置在更新失败的情况下应如何回滚服务。
    • parallelism:一次要回滚的容器数。如果设置为0,则所有容器将同时回滚。
    • delay:每个容器组回滚之间等待的时间(默认为0s)。
    • failure_action:如果回滚失败,该怎么办。其中一个 continue 或者 pause(默认pause)。
    • monitor:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。
    • max_failure_ratio:在回滚期间可以容忍的故障率(默认为0)。
    • order:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认 stop-first )。
  • update_config:配置应如何更新服务,对于配置滚动更新很有用。
    • parallelism:一次更新的容器数。
    • delay:在更新一组容器之间等待的时间。
    • failure_action:如果更新失败,该怎么办。其中一个 continue,rollback 或者pause (默认:pause)。
    • monitor:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。
    • max_failure_ratio:在更新过程中可以容忍的故障率。
    • order:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认stop-first)

1.6.5 logging

服务的日志记录配置
driver:指定服务容器的日志记录驱动程序,默认值为json-file。有以下三个选项

driver: "json-file"
driver: "syslog"
driver: "none"

仅在 json-file 驱动程序下,可以使用以下参数,限制日志得数量和大小。

logging:
  driver: json-file
  options:
    max-size: "200k" # 单个文件大小为200k
    max-file: "10" # 最多10个文件

当达到文件限制上限,会自动删除旧得文件。

syslog 驱动程序下,可以使用 syslog-address 指定日志接收地址。

logging:
  driver: syslog
  options:
    syslog-address: "tcp://192.168.0.42:123"

1.6.6 network_mode

设置网络模式

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

networks:配置容器连接的网络,引用顶级 networks 下的条目 。

services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
      other-network:
        aliases:
         - alias2
networks:
  some-network:
    # Use a custom driver
    driver: custom-driver-1
  other-network:
    # Use a custom driver which takes special options
    driver: custom-driver-2

aliases :同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务。

1.6.7 secrets

存储敏感数据,例如密码:

version: "3.1"
services:

mysql:
  image: mysql
  environment:
    MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my_secret
  secrets:
    - my_secret

secrets:
  my_secret:
    file: ./my_secret.txt

云原生之使用Docker部署docker-compose-ui工具

云原生之使用Docker部署docker-compose-ui工具

一、Docker Compose UI介绍

Docker Compose UI是Docker Compose的web界面。这个项目的目标是在Docker Compose之上提供一个最小的HTTP API,同时保持与Docker Compose CLI的完全互操作性。

二、检查本地docker环境

1.检查系统版本

[root@node ~]# cat /etc/os-release 
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

2.检查docker状态

[root@node ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2022-10-31 03:28:51 CST; 1 day 20h ago
     Docs: https://docs.docker.com
 Main PID: 11884 (dockerd)
    Tasks: 44
   Memory: 2.8G
   CGroup: /system.slice/docker.service
           ├─ 11884 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
           ├─ 34936 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8080 -container-ip 172.27.0.3 -container-port 80
           ├─ 34950 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 8080 -container-ip 172.27.0.3 -container-port 80
           ├─114721 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 9000 -container-ip 172.17.0.2 -container-port 9000
           └─114726 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 9000 -container-ip 172.17.0.2 -container-port 9000

Nov 01 21:17:48 node dockerd[11884]: time="2022-11-01T21:17:48.427273067+08:00" level=warning msg="Health check for container b5103772dd...xceeded"
Nov 01 21:21:48 node dockerd[11884]: time="2022-11-01T21:21:48.529083655+08:00" level=info msg="Download failed, retrying (4/5): read tc...med out"
Nov 01 21:21:49 node dockerd[11884]: time="2022-11-01T21:21:49.296992135+08:00" level=error msg="Download failed after 6 attempts: read ...med out"
Nov 01 21:21:49 node dockerd[11884]: time="2022-11-01T21:21:49.425397176+08:00" level=info msg="Download failed, retrying (5/5): read tc...med out"
Nov 01 21:22:21 node dockerd[11884]: time="2022-11-01T21:22:21.029219138+08:00" level=info msg="Download failed, retrying (5/5): Get \\"https://p...
Nov 01 21:37:54 node dockerd[11884]: time="2022-11-01T21:37:54.734620680+08:00" level=error msg="Not continuing with pull after error: c...anceled"
Nov 01 21:37:54 node dockerd[11884]: time="2022-11-01T21:37:54.794229257+08:00" level=info msg="Layer sha256:a852daa2e2446c73035f696e296...aned up"
Nov 01 21:37:54 node dockerd[11884]: time="2022-11-01T21:37:54.794928818+08:00" level=info msg="Layer sha256:7c34f968f461da4902fc8d2701a...aned up"
Nov 01 21:37:54 node dockerd[11884]: time="2022-11-01T21:37:54.877304029+08:00" level=info msg="Layer sha256:cc75e066235799f16c60bcbb60f...aned up"
Nov 01 21:37:54 node dockerd[11884]: time="2022-11-01T21:37:54.887066340+08:00" level=info msg="Layer sha256:26313e93e01f00837688ac6674e...aned up"
Hint: Some lines were ellipsized, use -l to show in full.



三、下载Docker Compose UI镜像

[root@node ~]# docker pull francescou/docker-compose-ui:1.13.0
1.13.0: Pulling from francescou/docker-compose-ui
81033e7c1d6a: Pull complete 
f7b44c57b95f: Pull complete 
e7d127e5acc6: Pull complete 
100078176fbd: Pull complete 
a7af2069f244: Pull complete 
df34fa004e36: Pull complete 
3afbb4cd8f6c: Pull complete 
c330a147c107: Pull complete 
d13383bf9258: Pull complete 
b5ecad9aaf9f: Pull complete 
Digest: sha256:280598d201e4cb1215ec3c4ca043fddb377a5e2d4729e2c9ab23b34be510e5b6
Status: Downloaded newer image for francescou/docker-compose-ui:1.13.0
docker.io/francescou/docker-compose-ui:1.13.0


四、部署Docker Compose UI服务

1.新建安装目录

[root@node ~]# mkdir -p /data/compose-ui
[root@node ~]# cd /data/compose-ui/

2.创建Docker Compose UI容器

[root@node compose-ui]# docker run -d --restart always --name docker-compose-ui -p 5000:5000 -w /opt/docker-compose-projects/ -v /var/run/docker.sock:/var/run/docker.sock francescou/docker-compose-ui:1.13.0
df6c0a3d1190d6743ff0b0b8ce1f40c21aa7d38f5a606a7aedc7286161b81627

3.检查Docker Compose UI容器状态

[root@node compose-ui]# docker ps
CONTAINER ID   IMAGE                                 COMMAND                  CREATED         STATUS                  PORTS                                             NAMES
df6c0a3d1190   francescou/docker-compose-ui:1.13.0   "/env/bin/python /ap…"   2 minutes ago   Up About a minute       0.0.0.0:5000->5000/tcp, :::5000->5000/tcp         docker-compose-ui

4.查看Docker Compose UI容器日志

[root@node compose-ui]# docker logs docker-compose-ui 
INFO:root:docker-compose version 1.20.1, build 5d8c71b
docker-py version: 3.3.0
CPython version: 2.7.15
OpenSSL version: OpenSSL 1.0.2n  7 Dec 2017
INFO:root:'node-redis': '/opt/docker-compose-projects/./node-redis', 'volumes-relative-paths': '/opt/docker-compose-projects/./volumes-relative-paths', 'env-demo': '/opt/docker-compose-projects/./env-demo', 'volumes-demo': '/opt/docker-compose-projects/./volumes-demo', 'hello-node': '/opt/docker-compose-projects/./hello-node'
INFO:werkzeug: * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

五、访问Docker Compose UI首页

六、Docker Compose UI基本使用

1.编写docker-compose.yaml文件

2.运行docker-compose.yaml文件

3.查看测试容器运行日志

4.在宿主机查看容器运行状态

[root@node compose-ui]# docker ps -a
CONTAINER ID   IMAGE                                  COMMAND                  CREATED          STATUS                    PORTS                                             NAMES
5a86a960f2e4   ghcr.io/linuxserver/dillinger:latest   "/init"                  19 seconds ago   Up 16 seconds             0.0.0.0:8015->8080/tcp, :::8015->8080/tcp         dillinger


以上是关于Docker镜像之Docker Compose讲解的主要内容,如果未能解决你的问题,请参考以下文章

docker之docker-compose——容器管理

使用Docker Compose编排微服务

小白学Docker之Compose

云原生之使用Docker部署docker-compose-ui工具

Docker私有仓库部署之Compose搭建consul集群

云原生之Docker实战使用Docker部署jpress开源网站