Docker 容器编排之 Docker Compose

2024-09-02 03:12
文章标签 docker compose 编排 容器

本文主要是介绍Docker 容器编排之 Docker Compose,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1 Docker Compose 概述

1.1 主要功能

1.2 工作原理

1.3 Docker Compose 中的管理层

2 Docker Compose 的常用命令参数

2.1 服务管理

2.1.1 docker-compose up :

2.1.2 docker-compose down :

2.1.3 docker-compose start :

2.1.4 docker-compose stop :

2.1.5 docker-compose start :

2.1.6 docker-compose restart :

2.2 服务状态查看

2.2.1 docker-compose ps :

2.2.2 docker-compose logs :

2.3 构建和重新构建服务

2.3.1 docker-compose build :

2.3.2 docker-compose up --build :

2.4 其他操作

2.4.1 docker-compose exec :

2.4.2 docker-compose pull :

3 Docker Compose 的yml文件

3.1 服务(services)

3.1.1 服务名称(service1_name/service2_name 等):

3.1.2 镜像(image):

3.1.3 端口映射(ports):

3.1.4 环境变量(environment): 

3.1.5 存储卷(volumes):

3.1.6 网络(networks):

3.2 网络(networks)

3.3 存储卷(volumes)

4 利用容器编排完成haproxy和nginx负载均衡架构实施

4.1 实验的思路:

4.2 准备haproxy的配置文件

4.3 编写 yml 文件

4.4 启动容器 

4.5 查看容器服务是否起来 

4.6 修改默认挂载点的数据文件 

4.7 实现效果


1 Docker Compose 概述

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。

其是官方的一个开源项目,托管到github

docker/compose: Define and run multi-container applications with Docker (github.com)icon-default.png?t=N7T8https://github.com/docker/compose

1.1 主要功能

1. 定义服务

  • 使用 YAML 格式的配置文件来定义一组相关的容器服务。每个服务可以指定镜像、端口映射、环境变量、存储卷等参数。
  • 例如,可以在配置文件中定义一个 Web 服务和一个数据库服务,以及它们之间的连接关系。

2. 一键启动和停止

  • 通过一个简单的命令,可以启动或停止整个应用程序所包含的所有容器。这大大简化了多容器 应用的部署和管理过程。
  • 例如,使用 docker-compose up 命令可以启动配置文件中定义的所有服务,使用 docker compose down 命令可以停止并删除这些服务。

3. 服务编排

  • 可以定义容器之间的依赖关系,确保服务按照正确的顺序启动和停止。例如,可以指定数据库 服务必须在 Web 服务之前启动。
  • 支持网络配置,使不同服务的容器可以相互通信。可以定义一个自定义的网络,将所有相关的 容器连接到这个网络上。

4. 环境变量管理

  • 可以在配置文件中定义环境变量,并在容器启动时传递给容器。这使得在不同环境(如开发、 测试和生产环境)中使用不同的配置变得更加容易。
  • 例如,可以定义一个数据库连接字符串的环境变量,在不同环境中可以设置不同的值。

1.2 工作原理

1. 读取配置文件

Docker Compose 读取 YAML 配置文件,解析其中定义的服务和参数。

2. 创建容器

  • 根据配置文件中的定义,Docker Compose 调用 Docker 引擎创建相应的容器。它会下载所需 的镜像(如果本地没有),并设置容器的各种参数。

3. 管理容器生命周期

  • Docker Compose 监控容器的状态,并在需要时启动、停止、重启容器。
  • 它还可以处理容器的故障恢复,例如自动重启失败的容器。

1.3 Docker Compose 中的管理层

1. 服务 (service) 一个应用的容器,实际上可以包括若干运行相同镜像的容器实例

2. 项目 (project) 由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中 定义

3. 容器(container)容器是服务的具体实例,每个服务可以有一个或多个容器。容器是基于服务定义 的镜像创建的运行实例

2 Docker Compose 的常用命令参数

[root@node-3 ~]# mkdir test[root@node-3 test]# vim shuyan.yml
services:web:image: nginx:latestports:- "80:80"db:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: shuyan

以下是一些 Docker Compose 常用命令

2.1 服务管理

2.1.1 docker-compose up

  • 启动配置文件中定义的所有服务。
  • 可以使用 -d 参数在后台启动服务。
  • 可以使用-f 来指定yml文件
  • 例如: docker-compose up -d
[root@node-3 test]# docker compose -f /root/test/shuyan.yml up -d [+] Running 2/2✔ Container test-db-1   Started                                                             0.6s ✔ Container test-web-1  Started  [root@node-3 test]# docker ps 
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS         PORTS                               NAMES
079e08d735e0   mysql:5.7      "docker-entrypoint.s…"   6 seconds ago    Up 5 seconds   3306/tcp, 33060/tcp                 test-db-1
70f7e8854800   nginx:latest   "/docker-entrypoint.…"   47 seconds ago   Up 5 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   test-web-1

也可以使用默认名称docker-compose up --不需要指定路径

[root@node-3 ~]# docker compose -f test/docker-compose.yml up -d
[+] Running 3/3
✔ Network test_default Created 0.1s
✔ Container test-web-1 Started 0.9s
✔ Container test-db-1 Started

2.1.2 docker-compose down

  • 停止并删除配置文件中定义的所有服务以及相关的网络和存储卷。
[root@node-3 test]# docker compose -f /root/test/shuyan.yml down
[+] Running 3/3✔ Container test-web-1  Removed                                                             0.4s ✔ Container test-db-1   Removed                                                             1.5s ✔ Network test_default  Removed                                                             0.2s [root@node-3 test]# docker ps -a 
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

2.1.3 docker-compose start

[root@node-3 test]# docker compose -f /root/test/shuyan.yml up -d 
[+] Running 3/3✔ Network test_default  Created                                                             0.1s ✔ Container test-web-1  Started                                                             0.7s ✔ Container test-db-1   Started                                                             0.6s [root@node-3 test]# docker ps 
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS                               NAMES
7a1a9d11dd5d   nginx:latest   "/docker-entrypoint.…"   4 seconds ago   Up 3 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   test-web-1
7274f6be5dab   mysql:5.7      "docker-entrypoint.s…"   4 seconds ago   Up 3 seconds   3306/tcp, 33060/tcp                 test-db-1

2.1.4 docker-compose stop :

  • 停止正在运行的服务
[root@node-3 test]# docker compose -f /root/test/shuyan.yml stop 
[+] Stopping 2/2✔ Container test-web-1  Stopped                                                             0.4s ✔ Container test-db-1   Stopped                                                             1.9s 

2.1.5 docker-compose start :

  • 启动已经存在的服务,但不会创建新的服务。
[root@node-3 test]# docker compose -f /root/test/shuyan.yml start 
[+] Running 2/2✔ Container test-web-1  Started                                                             0.5s ✔ Container test-db-1   Started                                                             0.6s 

2.1.6 docker-compose restart :

  • 重启服务。
[root@node-3 test]# docker compose -f /root/test/shuyan.yml restart 
[+] Restarting 2/2✔ Container test-db-1   Started                                                             2.0s ✔ Container test-web-1  Started    

2.2 服务状态查看

2.2.1 docker-compose ps

列出正在运行的服务以及它们的状态,包括容器 ID、名称、端口映射等信息。

[root@node-3 test]# docker compose -f  /root/test/shuyan.yml ps 
NAME         IMAGE          COMMAND                   SERVICE   CREATED             STATUS             PORTS
test-db-1    mysql:5.7      "docker-entrypoint.s…"   db        About an hour ago   Up About an hour   3306/tcp, 33060/tcp
test-web-1   nginx:latest   "/docker-entrypoint.…"   web       About an hour ago   Up About an hour   0.0.0.0:80->80/tcp, :::80->80/tcp[root@node-3 test]# docker compose -f  /root/test/shuyan.yml ps db
NAME        IMAGE       COMMAND                   SERVICE   CREATED             STATUS             PORTS
test-db-1   mysql:5.7   "docker-entrypoint.s…"   db        About an hour ago   Up About an hour   3306/tcp, 33060/tcp[root@node-3 test]# docker compose -f  /root/test/shuyan.yml ps web
NAME         IMAGE          COMMAND                   SERVICE   CREATED             STATUS             PORTS
test-web-1   nginx:latest   "/docker-entrypoint.…"   web       About an hour ago   Up About an hour   0.0.0.0:80->80/tcp, :::80->80/tcp

2.2.2 docker-compose logs

[root@node-3 test]# docker compose -f shuyan.yml logs web[root@node-3 test]# docker compose -f shuyan.yml logs db

2.3 构建和重新构建服务

将之前的给删掉

[root@node-3 test]# docker compose -f shuyan.yml down 
[+] Running 3/3✔ Container test-db-1   Removed                                                             1.3s ✔ Container test-web-1  Removed                                                             0.3s ✔ Network test_default  Removed       

2.3.1 docker-compose build

  • 构建配置文件中定义的服务的镜像。可以指定服务名称来只构建特定的服务。
# 创建存放Dockerfile文件的目录
[root@node-3 ~]# mkdir docker# 创建Dockerfile[root@node-3 ~]# vim docker/Dockerfile 
FROM nginx:latest
RUN echo this is docker contain > /usr/share/nginx/html/index.html
CMD ["nginx","-g","daemon off;"]# 创建nginx.yml 来对容器进行编排
[root@node-3 ~]# vim test/nginx.yml
services:nginx_web:image: nginx_v1build:context: /root/dockerdockerfile: Dockerfile     container_name: nginx-1ports:- "80:80"~]# docker compose -f test/nginx.yml build nginx_web #构建build 中的nginx_web~]# docker compose -f test/nginx.yml build  # 构建yml文件中的所有服务[root@node-3 ~]# docker compose -f test/nginx.yml build nginx_web 
[+] Building 0.1s (7/7) FINISHED                                                   docker:default=> [nginx_web internal] load build definition from Dockerfile                               0.0s=> => transferring dockerfile: 182B                                                         0.0s=> [nginx_web internal] load metadata for docker.io/library/nginx:latest                    0.0s=> [nginx_web internal] load .dockerignore                                                  0.0s=> => transferring context: 2B                                                              0.0s=> [nginx_web 1/2] FROM docker.io/library/nginx:latest                                      0.0s=> CACHED [nginx_web 2/2] RUN echo this is docker contain > /usr/share/nginx/html/index.ht  0.0s=> [nginx_web] exporting to image                                                           0.0s=> => exporting layers                                                                      0.0s=> => writing image sha256:7600d8405fde409386a09f6e7989a3e0e29f57e8cef87296ede8dc6ba3b2996  0.0s=> => naming to docker.io/library/nginx_v1                                                  0.0s=> [nginx_web] resolving provenance for metadata file                                       0.0s
[root@node-3 ~]# docker images 
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
nginx_v1     latest    7600d8405fde   27 minutes ago   188MB
nginx        latest    5ef79149e0ec   2 weeks ago      188MB
phpmyadmin   latest    2b39e17532a1   2 weeks ago      562MB
ubuntu       latest    edbfe74c41f8   4 weeks ago      78.1MB
mysql        5.7       5107333e08a8   8 months ago     501MB
busybox      latest    65ad0d468eb1   15 months ago    4.26MB
centos       7         eeb6ee3f44bd   2 years ago      204MB

构建并启动

第一种构建方式,提前在Dockerfile中写好

# 创建存放Dockerfile文件的目录
[root@node-3 ~]# mkdir docker# 创建Dockerfile################## 第一种构建方式
[root@node-3 ~]# vim docker/Dockerfile 
FROM nginx:latest
RUN echo this is docker contain > /usr/share/nginx/html/index.html
CMD ["nginx","-g","daemon off;"]# 创建nginx.yml 来对容器进行编排
[root@node-3 ~]# vim test/nginx.yml
services:nginx_web:image: nginx_v1build:context: /root/dockerdockerfile: Dockerfile     container_name: nginx-1ports:- "80:80"[root@node-3 test]# docker compose -f nginx.yml up -d 
[+] Running 1/1   #会去仓库拉去镜像! nginx_web Warning pull access denied for nginx_v1, repository does ...                    6.2s 
[+] Building 0.1s (7/7) FINISHED                                                   docker:default=> [nginx_web internal] load build definition from Dockerfile                               0.0s=> => transferring dockerfile: 215B                                                         0.0s=> [nginx_web internal] load metadata for docker.io/library/nginx:latest                    0.0s=> [nginx_web internal] load .dockerignore                                                  0.0s=> => transferring context: 2B                                                              0.0s=> [nginx_web 1/2] FROM docker.io/library/nginx:latest                                      0.0s=> CACHED [nginx_web 2/2] RUN echo this is docker contain > /usr/share/nginx/html/index.ht  0.0s=> [nginx_web] exporting to image                                                           0.0s=> => exporting layers                                                                      0.0s=> => writing image sha256:ce37b64a2aacc61505d78a3ef89f805a22a8ddc92ddd5449effb3dc79a91f7c  0.0s=> => naming to docker.io/library/nginx_v1                                                  0.0s=> [nginx_web] resolving provenance for metadata file                                       0.0s
[+] Running 2/2✔ Network test_default  Created                                                             0.1s ✔ Container nginx-1     Started      [root@node-3 ~]# curl localhost
this is docker contain[root@node-3 ~]# docker rm -f nginx-1 
[root@node-3 ~]# docker rmi nginx_v1:latest 

第二种方式

[root@node-3 ~]# docker compose -f test/nginx.yml up -d 
[+] Running 1/1! nginx_web Warning pull access denied for nginx_v1, repository does ...                   11.1s 
[+] Building 0.1s (7/7) FINISHED                                                   docker:default=> [nginx_web internal] load build definition from Dockerfile                               0.0s=> => transferring dockerfile: 182B                                                         0.0s=> [nginx_web internal] load metadata for docker.io/library/nginx:latest                    0.0s=> [nginx_web internal] load .dockerignore                                                  0.0s=> => transferring context: 2B                                                              0.0s=> [nginx_web 1/2] FROM docker.io/library/nginx:latest                                      0.0s=> CACHED [nginx_web 2/2] RUN echo this is docker contain > /usr/share/nginx/html/index.ht  0.0s=> [nginx_web] exporting to image                                                           0.0s=> => exporting layers                                                                      0.0s=> => writing image sha256:7600d8405fde409386a09f6e7989a3e0e29f57e8cef87296ede8dc6ba3b2996  0.0s=> => naming to docker.io/library/nginx_v1                                                  0.0s=> [nginx_web] resolving provenance for metadata file                                       0.0s
[+] Running 1/1✔ Container nginx-1  Started                                                                0.4s [root@node-3 ~]# docker ps 
CONTAINER ID   IMAGE      COMMAND                   CREATED          STATUS          PORTS                               NAMES
c95467a0ada9   nginx_v1   "/docker-entrypoint.…"   16 seconds ago   Up 16 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   nginx-1[root@node-3 ~]# docker images 
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
nginx_v1     latest    7600d8405fde   11 minutes ago   188MB
nginx        latest    5ef79149e0ec   2 weeks ago      188MB
phpmyadmin   latest    2b39e17532a1   2 weeks ago      562MB
ubuntu       latest    edbfe74c41f8   4 weeks ago      78.1MB
mysql        5.7       5107333e08a8   8 months ago     501MB
busybox      latest    65ad0d468eb1   15 months ago    4.26MB
centos       7         eeb6ee3f44bd   2 years ago      204MB[root@node-3 ~]# curl localhost
this is docker contain[root@node-3 ~]# docker rm -f nginx-1 
[root@node-3 ~]# docker rmi nginx_v1:latest 

无论是哪种方式使用启动都会先去仓库拉取镜像

2.3.2 docker-compose up --build

  • 启动服务并在启动前重新构建镜像
[root@node-3 ~]# docker compose -f test/nginx.yml up --build -d 
[+] Building 0.1s (7/7) FINISHED                                                   docker:default=> [nginx_web internal] load build definition from Dockerfile                               0.0s=> => transferring dockerfile: 182B                                                         0.0s=> [nginx_web internal] load metadata for docker.io/library/nginx:latest                    0.0s=> [nginx_web internal] load .dockerignore                                                  0.0s=> => transferring context: 2B                                                              0.0s=> [nginx_web 1/2] FROM docker.io/library/nginx:latest                                      0.0s=> CACHED [nginx_web 2/2] RUN echo this is docker contain > /usr/share/nginx/html/index.ht  0.0s=> [nginx_web] exporting to image                                                           0.0s=> => exporting layers                                                                      0.0s=> => writing image sha256:7600d8405fde409386a09f6e7989a3e0e29f57e8cef87296ede8dc6ba3b2996  0.0s=> => naming to docker.io/library/nginx_v1                                                  0.0s=> [nginx_web] resolving provenance for metadata file                                       0.0s
[+] Running 1/1✔ Container nginx-1  Started                                                                0.4s [root@node-3 ~]# docker ps 
CONTAINER ID   IMAGE      COMMAND                   CREATED          STATUS          PORTS                               NAMES
f3e0975a7593   nginx_v1   "/docker-entrypoint.…"   32 seconds ago   Up 10 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   nginx-1[root@node-3 ~]# curl localhost
this is docker contain

2.4 其他操作

2.4.1 docker-compose exec

  • 在正在运行的服务容器中执行命令。
[root@node-3 ~]# docker ps 
CONTAINER ID   IMAGE      COMMAND                   CREATED         STATUS         PORTS                               NAMES
99d93d3ef475   nginx_v1   "/docker-entrypoint.…"   5 minutes ago   Up 5 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp   nginx-1[root@node-3 ~]# docker exec -it nginx-1 sh
# ls
bin   dev                  docker-entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
boot  docker-entrypoint.d  etc                   lib   media  opt  root  sbin  sys  usr

2.4.2 docker-compose pull

拉取配置文件中定义的服务所使用的镜像。

services:busybox_v1:image: busyboxcommand: ["/bin/sh","-c","sleep 3000"]restart: alwayscontainer_name: busybox1
[root@node-3 ~]# docker compose -f test/busybox.yml pull
[+] Pulling 2/2✔ busybox_v1 Pulled                                                                         6.5s ✔ 3d1a87f2317d Pull complete                                                              1.5s

3 Docker Compose yml文件

Docker Compose YAML 文件用于定义和配置多容器应用程序的各个服务。以下是一个基本的 Docker Compose YAML 文件结构及内容解释:

3.1 服务(services

3.1.1 服务名称(service1_name/service2_name 等)

  • 每个服务在配置文件中都有一个唯一的名称,用于在命令行和其他部分引用该服务。

services:

web:

        # 服务1的配置

mysql:

        # 服务2的配置

3.1.2 镜像(image

  • 指定服务所使用的 Docker 镜像名称和标签。例如, image: nginx:latest 表示使用 nginx 镜像的最新版本

services:

    web:

         images:nginx

    mysql:

         images:mysql:5.7

3.1.3 端口映射(ports

将容器内部的端口映射到主机的端口,以便外部可以访问容器内的服务。例如, - "8080:80" 表示将主机的 8080 端口映射到容器内部的 80 端口。

services:web:image: nginxcontainer_name: game     #指定容器名称restart: always     #docekr容器自动启动expose:- 1234 #指定容器暴露那些端口,些端口仅对链接的服务可见,不会映射到主机的端口ports:- "80:80"

3.1.4 环境变量(environment 

  • 为容器设置环境变量,可以在容器内部的应用程序中使用。例如, VAR1: value1 设置环境变 量 VAR1 的值为 value1
services:web:images:mysql:5.7environment:MYSQL_ROOT_PASSWORD: shuyan

3.1.5 存储卷(volumes

  • 将主机上的目录或文件挂载到容器中,以实现数据持久化或共享。例如, - /host/data:/container/data 将主机上的 /host/data 目录挂载到容器内的 /container/data 路径。
services:test:image: busyboxcommand: ["/bin/sh","-c","sleep 3000"]restart: alwayscontainer_name: busybox1volumes:- /etc/passwd:/tmp/passwd:ro #只读挂在本地文件到指定位置

3.1.6 网络(networks

  • 将服务连接到特定的网络,以便不同服务的容器可以相互通信
services:web:image: nginxcontainer_name: webservernetwork_mode: bridge #使用本机自带bridge网络
services:busybox_v1:image: busyboxcontainer_name: busybox_01command: ["/bin/sh","-c","sleep 10000000"]#network_mode: mynet2networks:- mynet1  # 引用自定义的mynet1桥接网络- mynet2  # 引用自定义的mynet2桥接网络networks:mynet1:driver: bridgemynet2:driver: bridge

3.2 网络(networks

  • 定义 Docker Compose 应用程序中使用的网络。可以自定义网络名称和驱动程序等属性。
  • 默认情况下docker compose 在执行时会自动建立网路
[root@node-3 ~]# vim test/busybox.yml 
services:busybox_v1:image: busyboxcommand: ["/bin/sh","-c","sleep 3000"]restart: alwayscontainer_name: busyboxnetwork_mode: defaultbusybox_v2:image: busyboxcommand: ["/bin/sh","-c","sleep 3000"]restart: alwayscontainer_name: busybox1networks:- mynet1- mynet2networks:mynet1:driver: bridge    # 使用自定义桥接网络mynet2:driver: bridge   ipam:        # 自定义网络config:- subnet: 192.168.0.0/24  gateway: 192.168.0.2default:external: truename: bridge# default 网络:
# external: true 表示使用一个已经存在的外部网络。
# name: bridge 指定这个外部网络的名字为 bridge。

启动容器

[root@node-3 ~]# docker compose -f test/busybox.yml up -d 
[+] Running 4/4✔ Network test_mynet2  Created                                                              0.2s ✔ Network test_mynet1  Created                                                              0.2s ✔ Container busybox    Started                                                              1.5s ✔ Container busybox1   Started                                                              1.5s 
[root@node-3 ~]# docker ps 
CONTAINER ID   IMAGE     COMMAND                   CREATED         STATUS         PORTS     NAMES
c834b2f17f40   busybox   "/bin/sh -c 'sleep 3…"   5 seconds ago   Up 4 seconds             busybox1
41e5d5c145b0   busybox   "/bin/sh -c 'sleep 3…"   5 seconds ago   Up 4 seconds             busybox

进入容器查看

[root@node-3 ~]# docker compose -f test/busybox.yml  exec -it busybox_v1 sh
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02  inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:19 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:2422 (2.3 KiB)  TX bytes:0 (0.0 B)lo        Link encap:Local Loopback  inet addr:127.0.0.1  Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)/ # exit
[root@node-3 ~]# docker compose -f test/busybox.yml  exec -it busybox_v2 sh
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:13:00:02  inet addr:172.19.0.2  Bcast:172.19.255.255  Mask:255.255.0.0UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:40 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:5626 (5.4 KiB)  TX bytes:0 (0.0 B)eth1      Link encap:Ethernet  HWaddr 02:42:C0:A8:00:01  inet addr:192.168.0.1  Bcast:192.168.0.255  Mask:255.255.255.0UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:40 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:5628 (5.4 KiB)  TX bytes:0 (0.0 B)lo        Link encap:Local Loopback  inet addr:127.0.0.1  Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

3.3 存储卷(volumes

  • 定义 Docker Compose 应用程序中使用的存储卷。可以自定义卷名称和存储位置等属性。

停掉之前的yml

[root@node-3 ~]# docker compose -f test/busybox.yml down
[root@node-3 ~]# vim /root/test/volume.yml
services:busybox_v1:image: busyboxcommand: ["/bin/sh","-c","sleep 30000"]restart: alwayscontainer_name: busybox1volumes:- data:/test     # 默认逻辑卷,路径在 /var/lib/docker/volumes- /root:/backup:rw  # 指定路径挂载 # 定义逻辑卷的名称
volumes:data:name: shuyan

 启动容器并在挂载点建立文件查看效果

[root@node-3 ~]# docker compose -f test/volume.yml up -d 
[+] Running 2/2✔ Volume "shuyan"     Created                                                               0.0s ✔ Container busybox1  Started                                                               0.5s 
[root@node-3 ~]# ls /var/lib/docker/volumes/
backingFsBlockDev  metadata.db  shuyan  shuyanvol1[root@node-3 ~]# cd  /var/lib/docker/volumes/shuyan/_data/[root@node-3 _data]# touch shuyanfile{1..10}

进入容器查看效果

[root@node-3 _data]# docker compose -f /root/test/volume.yml exec -it busybox_v1 sh
/ # ls
backup  bin     dev     etc     home    lib     lib64   proc    root    sys     test    tmp     usr     var
/ # ls backup/
anaconda-ks.cfg       script                ubuntu-latest.tar.gz  ??                    ??                    ??
cpu.cfs_quota_us~     shuyan                uncontain.sh          ??                    ??
docker                test                  ??                    ??                    ??
/ # ls test/
shuyanfile1   shuyanfile10  shuyanfile2   shuyanfile3   shuyanfile4   shuyanfile5   shuyanfile6   shuyanfile7   shuyanfile8   shuyanfile9

4 利用容器编排完成haproxynginx负载均衡架构实施

4.1 实验的思路:

  • 挂载特定目录到haproxy的配置文件目录与NGINX网站发布目录
  • 需要挂载的配置文件目录可以直接覆盖
  • 数据文件比如说NGINX的html 中需要复制挂载使用 docker managed 方式挂载
  • 配置文件如haproxy.cfg可以直接使用bind mount 将原有的文件进行覆盖
  • 仅暴露haproxy的端口,NGINX的端口不做暴露,这样可以直接访问自己的地址访问到haproxy再由haproxy进行容器之间的数据交换

4.2 准备haproxy的配置文件

[root@node-3 ~]# mkdir haproxy/
[root@node-3 haproxy]# cd haproxy
[root@node-3 haproxy]# yum install haproxy --downloaddir /root --downloadonly# 将haproxy所有文件安装到本目录下
[root@node-3 haproxy]# rpm2cpio haproxy-2.4.22-3.el9_3.x86_64.rpm | cpio -idmv[root@node-3 haproxy]# ls
etc  haproxy-2.4.22-3.el9_3.x86_64.rpm  usr  var[root@node-3 haproxy]# cd etc/haproxy/
[root@node-3 haproxy]# ls
conf.d  haproxy.cfg[root@node-3 haproxy]# mkdir -p /docker/conf/ [root@node-3 haproxy]# cp haproxy.cfg /docker/conf/[root@node-3 ~]# vim  /docker/conf/haproxy.cfg
listen webclusterbind *:80balance roundrobinserver web1 webserver1:80 check inter 3 fall 3 rise 5server web2 webserver2:80 check inter 3 fall 3 rise 5

4.3 编写 yml 文件

[root@node-3 ~]# vim test/haproxy.yml services:web1:image: nginx:latestcontainer_name: webserver1   # 容器主机名需要写对,与haproxy里面写得一样。不然无法通讯restart: alwaysnetworks:- mynet1expose:- 80volumes:- data_web1:/usr/share/nginx/htmlweb2:image: nginx:latestcontainer_name: webserver2restart: alwaysnetworks:- mynet1expose:- 80    # expose 在这里只是一个标识符,它仅仅标记了容器内部监听的端口,并不会直接影响容器的实际运行或端口映射volumes:- data_web2:/usr/share/nginx/html# 引用定义了的数据卷haproxy:image: haproxy:2.3container_name: haproxyrestart: alwaysnetworks:- mynet1- mynet2volumes:- /docker/conf/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfgports:- 80:80# 定义网络组,因为在一台机子上为了省事,直接使用自定义桥接
# 假如说使用的是不同主机之间的容器通讯,需要使用 macvlan
networks:mynet1:driver: bridgemynet2:driver: bridgevolumes:data_web1:name: nginx_v1data_web2:name: nginx_v2

4.4 启动容器 

[root@node-3 ~]# docker compose -f test/haproxy.yml up -d 
[+] Running 5/5✔ Network test_mynet1   Created                                                                                                                                                 0.1s ✔ Network test_mynet2   Created                                                                                                                                                 0.1s ✔ Container webserver2  Started                                                                                                                                                 2.0s ✔ Container haproxy     Started                                                                                                                                                 2.0s ✔ Container webserver1  Started 

4.5 查看容器服务是否起来 

[root@node-3 ~]# docker compose -f test/haproxy.yml ps 
NAME         IMAGE          COMMAND                   SERVICE   CREATED         STATUS         PORTS
haproxy      haproxy:2.3    "docker-entrypoint.s…"   haproxy   8 minutes ago   Up 8 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp
webserver1   nginx:latest   "/docker-entrypoint.…"   web1      8 minutes ago   Up 8 minutes   80/tcp
webserver2   nginx:latest   "/docker-entrypoint.…"   web2      8 minutes ago   Up 8 minutes   80/tcp

4.6 修改默认挂载点的数据文件 

[root@node-3 ~]# echo this is web1 > /var/lib/docker/volumes/nginx_v1/_data/index.html 
[root@node-3 ~]# echo this is web2 > /var/lib/docker/volumes/nginx_v2/_data/index.html 

4.7 实现效果

尝试curl自己 

[root@node-3 ~]# curl 192.168.239.30:80
this is web2
[root@node-3 ~]# curl 192.168.239.30:80
this is web1
[root@node-3 ~]# curl 192.168.239.30:80
this is web2
[root@node-3 ~]# curl 192.168.239.30:80
this is web1

这篇关于Docker 容器编排之 Docker Compose的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1128840

相关文章

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

容器编排平台Kubernetes简介

目录 什么是K8s 为什么需要K8s 什么是容器(Contianer) K8s能做什么? K8s的架构原理  控制平面(Control plane)         kube-apiserver         etcd         kube-scheduler         kube-controller-manager         cloud-controlle

禅道Docker安装包发布

禅道Docker安装包发布 大家好, 禅道Docker安装包发布。 一、下载地址 禅道开源版:   /dl/zentao/docker/docker_zentao.zip  备用下载地址:https://download.csdn.net/download/u013490585/16271485 数据库用户名: root,默认密码: 123456。运行时,可以设置 MYSQL_ROOT_P

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求,一定不要错过这个机会。赶紧去看看吧! 什么是华为云Flexus X实例 华为云Flexus X实例云服务是新一代开箱即用、体

docker-compose安装和简单使用

本文介绍docker-compose的安装和使用 新版docker已经默认安装了docker-compose 可以使用docker-compose -v 查看docker-compose版本 如果没有的话可以使用以下命令直接安装 sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-c

01 Docker概念和部署

目录 1.1 Docker 概述 1.1.1 Docker 的优势 1.1.2 镜像 1.1.3 容器 1.1.4 仓库 1.2 安装 Docker 1.2.1 配置和安装依赖环境 1.3镜像操作 1.3.1 搜索镜像 1.3.2 获取镜像 1.3.3 查看镜像 1.3.4 给镜像重命名 1.3.5 存储,载入镜像和删除镜像 1.4 Doecker容器操作 1.4

Windows与linux中docker的安装与使用

windos中安装使用docker 下载Docker_Desktop 安装包进入docker官网下载Docker_Desktop: https://www.docker.com/ 启用wsl 我们搜索“启用或关闭Windows功能”,打开后勾选适用于Linux的Windows 子系统 Docker_Desktop设置 出现Docker Engine stopped的解决