容器编排工具Docker Compose

目录

一、Docker Compose概述

        1、主要功能

        2、工作原理

二、常用命令参数

1、服务管理

2、构建和重新构建服务

三、Docker Compose的yml文件

1、服务

2、网络

3、存储卷

四、容器编排实现haproxy和nginx负载均衡


一、Docker Compose概述

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

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

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

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

2、工作原理

Docker Compose 的工作原理是通过一个 YAML 配置文件定义一组相关的 Docker 容器服务,它读取配置文件后,根据其中指定的服务信息,如镜像、端口映射、环境变量、依赖关系等,依次创建和启动各个容器,并管理容器之间的网络连接和数据共享,确保整个应用系统按照预定的配置协同工作。

二、常用命令参数

[root@docker-node1 ~]# vim ~/.vimrc
set ts=2 ai sw=2 et
#yml有严格缩进
[root@docker-node1 ~]# vim  /root/test/docker-compose.yml
version: "1.0"
services:
  web:
    image: nginx
    ports:
      - "80:80"


  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: leo

1、服务管理

docker compose up 

启动配置文件中定义的所有服务。

可以使用 -d 参数在后台启动服务。

可以使用-f 来指定yml文件。

例如: docker-compose up -d

[root@docker-node1 test]# docker compose up -d
[root@docker-node1 test]# docker compose -f /root/test/docker-compose.yml up -d

停止并删除配置文件中定义的所有服务以及相关的网络和存储卷

[root@docker-node1 test]# docker compose down

docker compose start : 启动已经存在的服务,但不会创建新的服务

[root@docker test]# docker compose start

docker compose stop : 停止正在运行的服务

[root@docker test]# docker compose stop

docker compose restart : 重启服务

[root@docker test]# docker compose restart

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

docker compose logs : 查看服务的日志输出。可以指定服务名称来查看特定服务的日志

2、构建和重新构建服务

“docker compose up” 用于创建并启动由 Compose 文件定义的服务,而 “docker compose build” 用于构建服务所使用的镜像。

[root@docker-node1 test]# vim /root/docker/Dockerfile
FROM busybox:latest
RUN touch /file1
[root@docker-node1 test]# vim /root/docker/leo
FROM busybox:latest
RUN touch /file2

[root@docker-node1 test]# vim docker-compose.yml
  services:
  test1:
    image: test1
    build:
      context: /root/docker
      dockerfile: Dockerfile
    command: ["/bin/sh","-c","sleep 100000"]
    container_name: leo1
  test2:
    image: test2
    build:
      context: /root/docker
      dockerfile: leo
    command: ["/bin/sh","-c","sleep 100000"]
    container_name: leo2
[root@docker-node1 test]# docker compose up -d
[+] Running 2/2
 ✔ Container leo1  Started                                                                   0.4s
 ✔ Container leo2  Started                                                                   0.4s

[root@docker-node1 test]# docker compose build
#提前构建镜像,但镜像不运行
[root@docker-node1 test]# docker compose build test1
[root@docker-node1 test]# docker compose build test2
#可以分开构建

docker compose up build 
启动服务并在启动前重新构建镜像


[root@docker-node1 test]# docker compose exec -it test1 /bin/sh
在正在运行的服务容器中执行命令

docker-compose pull
拉取配置文件中定义的服务所使用的镜像

docker compose config 
验证并查看解析后的 Compose 文件内容,无语法错误则打印输出,加-q不输出

三、Docker Compose的yml文件

Docker Compose 的 YAML 文件用于定义和配置多容器应用程序的各个服务。

1、服务

服务名称

services:
 web:
   # 服务1的配置
 mysql:
   # 服务2的配置

镜像

services:
 web:
   images:nginx
 mysql:
   images:mysql:5.7

端口映射

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

services:
  test1:
    image: test1
    build:
      context: /root/docker
      dockerfile: Dockerfile
    command: ["/bin/sh","-c","sleep 100000"]
    container_name: leo1
    expose:
      - 1234
[root@docker-node1 test]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED         STATUS         PORTS      NAMES
c7c6fa09dad9   test1     "/bin/sh -c 'sleep 1…"   4 seconds ago   Up 3 seconds   1234/tcp   leo1

services:
  test1:
    image: nginx
    container_name: webserver
    expose:
      - 1234
    ports:
      - "80:80"
[root@docker-node1 test]# curl 172.25.254.100

环境变量

services:
 web:
   images:mysql:5.7
   environment:
     MYSQL_ROOT_PASSWORD: leo
     
docker inspect

存储卷

将主机上的目录或文件挂载到容器中,以实现数据持久化或共享。例如, - /host/data:/container/data 将主机上的 /host/data 目录挂载到容器内的 /container/data 路径。

services:
 test:
   image: busybox
   command: ["/bin/sh","-c","sleep 3000"]
   restart: always
   container_name: busybox1
   volumes:
     - /etc/passwd:/tmp/passwd:ro #只读挂在本地文件到指定位置

网络

将服务连接到特定的网络,以便不同服务的容器可以相互通信。

services:
  test1:
    image: busybox:latest
    container_name: leo
    command: ["/bin/sh","-c","sleep 100000"]
[root@docker-node1 test]# docker compose up -d
[+] Running 2/2
 ✔ Network test_default  Created                                                             0.1s
 ✔ Container leo         Started                                                             0.3s
#默认网络

指定使用bridge网络

services:
  test1:
    image: busybox:latest
    container_name: leo
    command: ["/bin/sh","-c","sleep 100000"]
    network_mode: bridge #还可以指定none网络

 test1:
    image: busybox:latest
    container_name: leo
    command: ["/bin/sh","-c","sleep 100000"]
    networks:
      - mynet1
      - mynet2

networks:
  mynet1:
    driver: bridge

  mynet2:
    driver: bridge
[root@docker-node1 test]# docker exec -it leo sh

命令

覆盖容器启动时默认执行的命令。例如, command: python app.py 指定容器启动时运行 python app.py 命令。

[root@docker test]# vim busybox.yml
services:
 web:
   image: busybox
   container_name: busybox
   #network_mode: mynet2
   command: ["/bin/sh","-c","sleep10000000"]

2、网络

定义 Docker Compose 应用程序中使用的网络。可以自定义网络名称和驱动程序等属性。 默认情况下docker compose 在执行时会自动建立网络。

services:
  test:
    image: busybox:latest
    container_name: tset
    command: ["/bin/sh","-c","sleep 100000"]
    network_mode: default

networks:
  default:
    external: true
    name: bridge
容器建立后会使用宿主机上的默认 “bridge” 网络进行通信
services:
  test:
    image: busybox:latest
    container_name: tset
    command: ["/bin/sh","-c","sleep 100000"]
    network_mode: default

  test2:
    image: busybox:latest
    container_name: tset2
    command: ["/bin/sh","-c","sleep 100000"]
    networks:
      - mynet1


networks:
  default:
    external: true
    name: bridge

  mynet1:
    driver: bridge

services:
  test:
    image: busybox:latest
    container_name: tset
    command: ["/bin/sh","-c","sleep 100000"]
    network_mode: default

  test2:
    image: busybox:latest
    container_name: tset2
    command: ["/bin/sh","-c","sleep 100000"]
    networks:
      - mynet1
      - mynet2


networks:
  default:
    external: true
    name: bridge

  mynet1:
    driver: bridge

  mynet2:
    ipam:
      driver: default
      config:
        - subnet: 172.26.0.0/24
          gateway: 172.26.0.254

3、存储卷

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

services:
 test:
   image: busybox
   command: ["/bin/sh","-c","sleep 3000"]
   restart: always
   container_name: busybox1
   volumes:
     - data:/test #挂在data卷
     - /etc/passwd:/tmp/passwd:ro #只读挂在本地文件到指定位置
volumes:
 data:
   name: leoma #指定建立卷的名字

四、容器编排实现haproxy和nginx负载均衡

容器编排实现 HAProxy 和 Nginx 负载均衡的工作原理如下:通过容器编排工具将 Nginx 容器实例和 HAProxy 容器部署在同一环境中。Nginx 容器作为后端服务器提供服务,HAProxy 容器处于前端,接收外部请求,根据预设的负载均衡策略将请求分发到不同的 Nginx 容器上,从而实现高效、可靠的流量分配,提高系统的整体性能和可用性。

HAProxy 服务: 作用:作为负载均衡器,负责将外部请求分发到后端的 Nginx 服务器(web1 和 web2)

web1 和 web2 服务(Nginx 服务器): 作用:作为后端服务器,提供实际的网页服务

internel 网络: 作用:用于连接内部的服务,即 web1 和 web2。这个网络使得这两个后端服务器可以相互通信,并且与 HAProxy 进行内部通信

extrnal 网络: 作用:连接外部世界和 HAProxy,使得外部客户端可以访问到负载均衡器,进而访问后端的 Nginx 服务器

data_web1 和 data_web2: 作用:用于存储 Nginx 服务器的网页数据,确保数据的持久性和可移植性

[root@docker-node1 test]# mkdir /var/lib/docker/volumes/conf

[root@docker-node1 mnt]# rpm2cpio haproxy-2.4.17-3.el9.x86_64.rpm  | cpio -id

[root@docker-node1 haproxy]# cp haproxy.cfg /var/lib/docker/volumes/conf/
[root@docker-node1 haproxy]# pwd
/mnt/etc/haproxy

[root@docker-node1 conf]# vim haproxy.cfg
listen webserver
  bind *:80
  balance roundrobin
  server web1 webserver1:80 check inter 3 fall 3 rise 5
  server web2 webserver2:80 check inter 3 fall 3 rise 5
[root@docker-node1 test]# docker compose -f haproxy.yml config
name: test
services:
  haproxy:
    container_name: haproxy
    image: haproxy:2.3
    networks:
      extrnal: null
      internel: null
    ports:
      - mode: ingress
        target: 80
        published: "80"
        protocol: tcp
    restart: always
    volumes:
      - type: bind	# 卷的类型为绑定主机目录
        source: /var/lib/docker/volumes/conf/haproxy.cfg	# 主机上的源文件路径
        target: /usr/local/etc/haproxy/haproxy.cfg	# 容器内的目标路径
        bind:
          create_host_path: true
  web1:
    container_name: webserver1
    expose:
      - "80"
    image: nginx:latest
    networks:
      internel: null
    restart: always
    volumes:
      - type: volume
        source: data_web1
        target: /usr/share/nginx/html
        volume: {}
  web2:
    container_name: webserver2
    expose:
      - "80"
    image: nginx:latest
    networks:
      internel: null
    restart: always
    volumes:
      - type: volume
        source: data_web2
        target: /usr/share/nginx/html
        volume: {}
networks:
  extrnal:
    name: test_extrnal
    driver: bridge
  internel:
    name: test_internel
    driver: bridge
volumes:
  data_web1:
    name: data_web1
  data_web2:
    name: data_web2
[root@docker-node1 test]# docker compose -f haproxy.yml up -d
[+] Running 7/7
 ✔ Network test_internel  Created                                                                                                                                              0.1s
 ✔ Network test_extrnal   Created                                                                                                                                              0.1s
 ✔ Volume "data_web1"     Created                                                                                                                                              0.0s
 ✔ Volume "data_web2"     Created                                                                                                                                              0.0s
 ✔ Container webserver2   Started                                                                                                                                              1.2s
 ✔ Container haproxy      Started                                                                                                                                              1.1s
 ✔ Container webserver1   Started                                                                                                                                              1.2s
[root@docker-node1 test]# docker compose -f haproxy.yml ps
NAME         IMAGE          COMMAND                   SERVICE   CREATED              STATUS                          PORTS
haproxy      haproxy:2.3    "docker-entrypoint.s…"   haproxy   About a minute ago   Restarting (1) 19 seconds ago
webserver1   nginx:latest   "/docker-entrypoint.…"   web1      About a minute ago   Up About a minute               80/tcp
webserver2   nginx:latest   "/docker-entrypoint.…"   web2      About a minute ago   Up About a minute               80/tcp

测试访问

[root@docker-node1 ~]# echo webserver2 > /var/lib/docker/volumes/data_web2/_data/index.html
[root@docker-node1 ~]# echo webserver1 > /var/lib/docker/volumes/data_web1/_data/index.html
[root@docker-node1 ~]# for i in {1..10};
> do
> curl 172.25.254.100
> done
webserver1
webserver2
webserver1
webserver2
webserver1
webserver2
webserver1
webserver2
webserver1
webserver2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值