目录
一、Docker Compose概述
1、主要功能
2、工作原理
二、常用命令参数
1、服务管理
2、构建和重新构建服务
三、Docker Compose的yml文件
1、服务
2、网络
3、存储卷
四、容器编排实现haproxy和nginx负载均衡
一、Docker Compose概述
1、主要功能
-
定义服务: 使用 YAML 格式的配置文件来定义一组相关的容器服务。每个服务可以指定镜像、端口映射、 环境变量、存储卷等参数。 例如,可以在配置文件中定义一个 Web 服务和一个数据库服务,以及它们之间的连接关系。
-
一键启动和停止: 通过一个简单的命令,可以启动或停止整个应用程序所包含的所有容器。这大大简化了多容器 应用的部署和管理过程。 例如,使用 docker-compose up 命令可以启动配置文件中定义的所有服务,使用 dockercompose down 命令可以停止并删除这些服务。
-
服务编排: 可以定义容器之间的依赖关系,确保服务按照正确的顺序启动和停止。例如,可以指定数据库 服务必须在 Web 服务之前启动。 支持网络配置,使不同服务的容器可以相互通信。可以定义一个自定义的网络,将所有相关的 容器连接到这个网络上。
-
环境变量管理: 可以在配置文件中定义环境变量,并在容器启动时传递给容器。这使得在不同环境(如开发、 测试和生产环境)中使用不同的配置变得更加容易。 例如,可以定义一个数据库连接字符串的环境变量,在不同环境中可以设置不同的值。
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