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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/413968.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV绘图函数(7)从一个椭圆定义中提取出多边形的顶点坐标函数ellipse2Poly()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 近似一个椭圆弧为一个多边形线。 函数 ellipse2Poly 计算近似指定椭圆弧的多边形线的顶点。它被 ellipse 函数所使用。如果 arcStart 大于 arcEn…

景芯SoC A72实战反馈

先说结论: 内容非常全面,讲解到位,会有专门的工程师一对一答疑,整个项目跑下来提升非常大,绝对物超所值! 一些细节: 本人微电子专业研一在读,有过两次简单的数字芯片流片经历&…

spring security 相关过滤器

Spring Security 提供了 30 多个过滤器。默认情况下Spring Boot 在对 SpringSecurity 进入自动化配置时,会创建一个名为 SpringSecurityFilerChain 的过滤器,并注入到Spring容器中,这个过滤器将负责所有的安全管理,包括用户认证、…

Windows系统中批量管理Windows服务器远程桌面工具——RDCMan

一、背景 在公司没有部署对应的堡垒机系统之前,做运维测试工作的人员,需要管理大量的服务器,每天需要对服务器进行必要的巡检、系统更新发布等内容,特别是有很多Windows服务器的时候,如果我们使用Windows自带的“远程桌面连接”只能一台台连接,比较繁琐。并且不能知道那台…

十二星座男女、穿越到古代会成为什麽角色 。

白羊座( 大将军 ); 金牛座(财务大臣); 双子座( 奸臣 ); 巨蟹座(御厨太医); 狮子座(皇帝); …

虚幻5|按键触发学习

一,如图参考 1.下移 驱动阈值 越大按时间长才会触发,越小很快就可以触发 2.按下 当按下超出驱动阈值大小就会触发一次,这里的驱动阈值只能设置再0.1~1的大小 3.已松开 当按下的时候,先触发单次的started,如果按压…

精选算法编程题

一、有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: 输入:nums [-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后&am…

中国各城市金融科技公司数目数据集(2009-2023年)

金融科技(FinTech)是金融与科技深度融合的产物,它利用大数据、云计算、人工智能、区块链等现代信息技术手段,对传统金融产品、业务、流程及服务模式进行革新,从而实现金融服务效率的提升、风险管理的优化以及客户体验的…

《深入浅出WPF》读书笔记.8路由事件

《深入浅出WPF》读书笔记.8路由事件 背景 路由事件是直接响应事件的变种。直接响应事件,事件触发者和事件响应者必须显示订阅。而路由事件的触发者和事件响应者之间的没有显示订阅,事件触发后,事件响应者安装事件监听器,当事件传…

我熟悉你的NLP焦虑,只因没有它

大家好,我是凡人。 最近凡人被一个NLP(神经语言程序学[Neuro-Linguistic Programming]的英文缩写)学习内容给震惊到了,熟悉NLP的同学都知道,NLP知识不仅庞大而且很有深度。 比如:机器信息就包含下图内容 肝…

集成电路学习:什么是IDE集成开发环境

IDE:集成开发环境 IDE,全称“Integrated Development Environment”,即集成开发环境,是一种用于提供程序开发环境的应用程序。它集成了代码编写、分析、编译、调试等多种功能于一体的开发软件服务套,为开发者提供了一个…

mybatis-plus中Swagger 模式和Kotlin 模式是什么?

在 MyBatis-Plus 中,Swagger 模式和 Kotlin 模式是为了支持特定技术栈和开发需求的两种配置选项。它们分别针对 API 文档生成和 Kotlin 语言提供了更好的支持和集成。 Swagger 模式 Swagger 模式主要用于生成 API 文档。在 MyBatis-Plus 中启用 Swagger 模式后&am…

C语言 | Leetcode C语言题解之第378题有序矩阵中第K小的元素

题目&#xff1a; 题解&#xff1a; bool check(int **matrix, int mid, int k, int n) {int i n - 1;int j 0;int num 0;while (i > 0 && j < n) {if (matrix[i][j] < mid) {num i 1;j;} else {i--;}}return num > k; }int kthSmallest(int **matri…

CSAPP Data Lab

CSAPP 的第一个 Lab&#xff0c;对应知识点为书中的第 2 章&#xff08;信息的表示与处理&#xff09;&#xff0c;要求使用受限制的运算符和表达式实现一些位操作。主要分为两个部分&#xff1a;整数部分和浮点数部分。其中整数部分限制较多&#xff0c;比较偏重技巧性&#x…

点餐收银小程序

一、项目概述 Hi&#xff0c;大家好&#xff0c;今天分享的项目是《点餐收银小程序》。 系统含管理员/商家/用户三种角色&#xff0c;商家能维护菜式类别、维护菜品信息&#xff0c;用户在小程序能够选择门店&#xff0c;查看门店下各个分类的菜式信息&#xff0c;并进行加购…

C语言基础(三十一)

1、线性搜索&#xff1a; #include "date.h" #include <stdio.h> #include <stdlib.h> #include <time.h> // 希尔排序 void shellSort(int arr[], int n) { for (int gap n / 2; gap > 0; gap / 2) { for (int i gap; i < n; i…

智慧党建解决方案

1. 新时代党建工作背景 报告强调了新时代党建工作的重要性&#xff0c;提出要利用互联网、大数据等新兴技术推进智慧党建&#xff0c;提高党的执政能力和领导水平。 2. 基层党组织建设挑战 基层党组织在日常工作中面临组织管理难、过程监管难、宣传教育难等问题&#xff0c;…

2024年【四川省安全员B证】最新解析及四川省安全员B证考试资料

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 四川省安全员B证最新解析是安全生产模拟考试一点通总题库中生成的一套四川省安全员B证考试资料&#xff0c;安全生产模拟考试一点通上四川省安全员B证作业手机同步练习。2024年【四川省安全员B证】最新解析及四川省安…

【卡码网C++基础课 14.链表的基础操作2】

目录 题目描述与分析代码编写 题目描述与分析 题目描述&#xff1a; 请编写一个程序&#xff0c;实现以下操作&#xff1a; 构建一个单向链表&#xff0c;链表中包含一组整数数据&#xff0c;输出链表中的第 m 个元素&#xff08;m 从 1 开始计数&#xff09;。 要求&#xf…

苹果笔记本电脑能不能玩游戏?苹果电脑玩游戏咋样?

过去Mac玩不了游戏最大的问题&#xff0c;就是图形API自成一体&#xff0c;苹果既不支持微软的DirectX&#xff0c;同时为了推广自家的Metal图形API&#xff0c;又对OpenGL和Vulkan两大主流的通用API敬而远之。游戏生态、硬件瓶颈让苹果电脑不适合玩游戏。 不过说到底&#xf…