1. 副本数
cat replicas_test.yml
version: '3'
services:
replicas_test:
image: centos:7.9
restart: always
command: ["sh","-c","sleep 36000"]
deploy:
replicas: 2
healthcheck:
test: ["CMD-SHELL", "hostname"]
interval: 10s
timeout: 5s
retries: 3
通过配置
deploy.replicas
来控制创建服务容器的数量,但是并非所有场景都适用,b比如Hadoop的有些组件是不适用的,像要求设置主机名和容器名的时候,就不太适用通过这个参数来调整容器的数量。
2. 资源隔离
cat resources_test.yml
version: '3'
services:
resources_test:
image: centos:7.9
restart: always
command: ["sh","-c","sleep 36000"]
deploy:
replicas: 2
resources:
# 容器资源申请的最大值,容器最多能适用这么多资源
limits:
cpus: '1'
memory: 100M
# 所需资源的最小值,跟k8s里的requests一样,就是运行容器的最小值
reservations:
cpus: '0.5'
memory: 50M
healthcheck:
test: ["CMD-SHELL", "hostname"]
interval: 10s
timeout: 5s
retries: 3
# 检查验证
docker stats
3. 网络network
network 在容器中是非常重要的一个知识点,所以这里重点以示例讲解的方式来看看不同docker-compose项目之间如果通过名称访问,默认清楚下,每个docker-compose就是一个项目(不同目录,相同目录的多个compose属于一个项目),每个项目就会默认生成一个网络。注意,默认情况下只能在同一个网络中使用名称相互访问。那不同项目中如何通过名称访问呢,接下来就一示例讲解
cat test1/test1.yml
version: '3'
services:
test1:
image: centos:7.9
container_name: c_test1
hostname: h_test1
restart: always
command: ["sh","-c","sleep 36000"]
healthcheck:
test: ["CMD-SHELL", "hostname"]
interval: 10s
timeout: 5s
retries: 3
cat test2/test2.yml
version: '3'
services:
test2:
image: centos:7.9
container_name: c_test2
hostname: h_test2
restart: always
command: ["sh","-c","sleep 36000"]
healthcheck:
test: ["CMD-SHELL", "hostname"]
interval: 10s
timeout: 5s
retries: 3
docker-compose -f test1/test1.yml up -d
docker-compose -f test2/test2.yml up -d
# 查看network,会生成两个network,如果两个yaml文件在同一个目录下,只会生成一个,它们也就属于同一个network下,是可以通过名称相互访问的。这里是在不同的目录下,就会生成两个network,默认情况下,不同的network是隔离的,不能通过名称访问的。yaml文件所在的目录名就是项目名称。这个项目名称是可以通过参数指定的,下面会细讲。
docker network ls
# 互ping
docker exec -it c_test1 ping c_test2
docker exec -it c_test1 ping h_test2
docker exec -it c_test2 ping c_test1
docker exec -it c_test2 ping h_test1
# 卸载
docker-compose -f test1/test1.yml down
docker-compose -f test2/test2.yml down
接下来我们加上network再进行测试验证
在 test1/network_test1.yml
定义创建新network,在下面test2/network_test2.yml
引用test1创建的网络,那么这两个项目就在同一个网络中了,注意先后执行顺序
version: '3'
services:
network_test1:
image: centos:7.9
container_name: c_network_test1
hostname: h_network_test1
restart: always
command: ["sh","-c","sleep 36000"]
# 使用network
networks:
- test1_network
healthcheck:
test: ["CMD-SHELL", "hostname"]
interval: 10s
timeout: 5s
retries: 3
# 定义创建新网络
networks:
test1_network:
driver: bridge
version: '3'
services:
network_test2:
image: centos:7.9
container_name: c_network_test2
hostname: h_network_test2
restart: always
networks:
- test1_network
command: ["sh","-c","sleep 36000"]
healthcheck:
test: ["CMD-SHELL", "hostname"]
interval: 10s
timeout: 5s
retries: 3
# 引用test1的网络
networks:
# 项目名_网络名,可以通过docker network ls查看network名称
test1_test1_network:
external: true
docker-compose -f test1/network_test1.yml up -d
docker-compose -f test2/network_test2.yml up -d
# 查看网络
docker network ls
# 互ping
docker exec -it c_network_test1 ping -c3 c_network_test2
docker exec -it c_network_test1 ping -c3 h_network_test2
docker exec -it c_network_test2 ping -c3 c_network_test1
docker exec -it c_network_test2 ping -c3 h_network_test1
# 卸载,注意顺序,要先卸载应用方,要不然network被应用了是删除不了的
docker-compose -f test2/network_test2.yml down
docker-compose -f test1/network_test1.yml down
4. 项目
默认的项目名称就是当前yml文件所在的目录名称,上面讲解network的时候生成的网络名称也会最前面的项目名称,但是项目名称是可以自定义的,示例讲解如下:
# test.yaml
version: '3'
services:
test:
image: centos:7.9
restart: always
command: ["sh","-c","sleep 36000"]
healthcheck:
test: ["CMD-SHELL", "hostname"]
interval: 10s
timeout: 5s
retries: 3
# 先不加参数
docker-compose -f test.yaml up -d
# 查看网络
docker network ls
# 使用参数自定义项目名称,-p, --project-name,有四种写法
docker-compose -p=p001 -f test.yaml up -d
docker-compose -p p002 -f test.yaml up -d
docker-compose --project-name=p003 -f test.yaml up -d
docker-compose --project-name p004 -f test.yaml up -d
# 查看网络
docker network ls
# 查看所有项目
docker-compose ls