一、准备工作
1、拉取swoft镜像
docker pull swoft/swoft
docker tag docker.io/swoft/swoft swoft
docker rmi docker.io/swoft/swoft
2、拉取nginx镜像
docker pull haveyb/nginx
docker tag docker.io/haveyb/nginx nginx1.21
docker rmi docker.io/haveyb/nginx
3、拉取consul镜像
docker pull consul:1.10
docker tag docker.io/consul:1.10 consul1.10
docker rmi docker.io/consul:1.10
4、查看当前镜像列表
[root@v3 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx1.21 latest 822b7ec2aaf2 4 days ago 133 MB
consul1.10 latest b74a0a01afc4 7 days ago 116 MB
swoft latest 7452cc908d73 4 months ago 552 MB
5、安装docker-compose编排工具
# 升级 pip
pip3 install --upgrade pip
# 指定 docker-compose 版本安装
pip install docker-compose==1.22
# 验证是否安装成功
docker-compose -v
6、创建数据卷目录
# 编排时会用到
docker volume create --name=swoft_volume
docker volume create --name=nginx_volume
7、为什么选择映射到数据卷,而不是目录
(1)说明
这里之所以映射目录到数据卷而非本地目录是因为我懒 ( ̄▽ ̄)~*
在docker-compose编排swoft和nginx时,如果指定的是宿主机目录,则需要先在本地创建并处理相应swoft项目文件和nginx项目文件,且必须保证容器和宿主机两个目录的用户名名称和用户组名称一致才可以不出问题,非常麻烦。
但如果映射的是数据卷volume,则只需要在docker-compose.yml中指定
volumes:
swoft_volume:
external:
true
nginx_volume:
external:
true
即可,不用再去费劲巴拉的处理swoft项目文件和nginx项目文件了。
(2)查看数据卷在宿主机的位置
[root@v3 docker-compose]# docker volume inspect swoft_volume
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/swoft_volume/_data",
"Name": "swoft_volume",
"Options": {},
"Scope": "local"
}
]
[root@v3 docker-compose]# docker volume inspect nginx_volume
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/nginx_volume/_data",
"Name": "nginx_volume",
"Options": {},
"Scope": "local"
}
]
(3)额外说明
可以很容易的看到,我们挂载的目录都在/var/lib/docker/volumes下,可以实现本地编辑同步到容器内部了,和-v 到目录的结果是一样的。
正常如果不是使用docker-compose编排的话,映射文件目录到宿主机目录是一个好的选择,但如果是使用docker-compose编排,则更建议映射到数据卷,关于docker中的数据卷volume,可以查看文章 docker-volume数据卷。
二、使用docker-compose编排基础分布式架构
1、基础分布式架构规划
容器名 | 使用的镜像 | 映射端口号 | IP地址 | 映射文件夹 |
---|---|---|---|---|
swoft_110 | swoft | 18110:18306,18111:18307,18112:18308 | 172.22.22.110 | /var/lib/docker/volumes/swoft_volume/_data : /var/www/swoft |
swoft_120 | swoft | 18120:18306,18121:18307,18122:18308 | 172.22.22.120 | /var/lib/docker/volumes/swoft_volume/_data : /var/www/swoft |
swoft_130 | swoft | 18130:18306,18131:18307,18132:18308 | 172.22.22.113 | /var/lib/docker/volumes/swoft_volume/_data : /var/www/swoft |
nginx1.21 | nginx1.21 | 81:80 | 172.22.22.20 | /var/lib/docker/volumes/nginx_volume/_data : /etc/nginx |
consul1.10 | consul1.10 | 8500:8500 | 172.22.22.30 |
宿主机IP:192.168.78.104
注:这里的映射文件夹中写的就是宿主机实际目录,对应的是docker-compose.yml中定义的相应数据卷
2、创建docker-compose.yml文件
mkdir docker-compose
cd docker-compose/
vi docker-compose.yml
version: "3.6"
services:
swoft_110:
image: swoft
container_name: swoft_110
ports:
- "18110:18306"
- "18111:18307"
- "18112:18308"
networks:
swoft_consul:
ipv4_address: 172.22.22.110
privileged: true
volumes:
- swoft_volume:/var/www/swoft
command: php /var/www/swoft/bin/swoft http:start
swoft_120:
image: swoft
container_name: swoft_120
ports:
- "18120:18306"
- "18121:18307"
- "18122:18308"
networks:
swoft_consul:
ipv4_address: 172.22.22.120
privileged: true
volumes:
- swoft_volume:/var/www/swoft
command: php /var/www/swoft/bin/swoft http:start
swoft_130:
image: swoft
container_name: swoft_130
ports:
- "18130:18306"
- "18131:18307"
- "18132:18308"
networks:
swoft_consul:
ipv4_address: 172.22.22.130
privileged: true
volumes:
- swoft_volume:/var/www/swoft
command: php /var/www/swoft/bin/swoft http:start
nginx:
image: nginx1.21
ports:
- "81:80"
networks:
swoft_consul:
ipv4_address: 172.22.22.20
container_name: nginx1.21
volumes:
- nginx_volume:/etc/nginx
consul:
image: consul1.10
ports:
- "8500:8500"
networks:
swoft_consul:
ipv4_address: 172.22.22.30
container_name: consul1.10
command: consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=ali -bind=172.22.22.30 -ui -client=0.0.0.0
volumes:
swoft_volume:
external:
true
nginx_volume:
external:
true
networks:
swoft_consul:
driver: bridge
ipam:
config:
- subnet: "172.22.22.0/24"
这里,在每一个swoft容器服务内都定义了一个command,该命令会在容器启动时自动执行(省去了还得进入容器执行php ./bin/swoft http:start 的步骤)
3、执行编排
上面我们定义了编排文件,在该编排文件内定义了一组容器服务,下面我们需要将这一组容器服务同时启动。
# 进入docker-compose.yml文件所在目录,然后执行该命令
docker-compose up -d
# 如果有报错,再执行一次docker-compose up -d即可
注:类似命令有 docker-compose stop/down/restart
4、查看结果
(1)查看当前镜像
[root@v3 _data]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9ea6d1a9053e nginx1.21 "/docker-entrypoin..." 23 minutes ago Up 23 minutes 0.0.0.0:81->80/tcp nginx1.17
c74c869069ef consul1.10 "docker-entrypoint..." 23 minutes ago Up 23 minutes 8300-8302/tcp, 8301-8302/udp, 8600/tcp, 8600/udp, 0.0.0.0:8500->8500/tcp consul1.10
24b9ed996f77 swoft "docker-php-entryp..." 23 minutes ago Up 23 minutes 18307-18308/tcp, 0.0.0.0:18130->18306/tcp swoft_130
d32f4b77d916 swoft "docker-php-entryp..." 23 minutes ago Up 23 minutes 18307-18308/tcp, 0.0.0.0:18120->18306/tcp swoft_120
2ba3153aab75 swoft "docker-php-entryp..." 23 minutes ago Up 23 minutes 18307-18308/tcp, 0.0.0.0:18110->18306/tcp swoft_110
(2)验证Nginx是否正常提高服务
访问192.168.78.104:81,访问的是nginx容器,应该出现如下页面:
(3)验证swoft是否正常提供服务
访问192.168.78.104:18110、192.168.78.104:18120、192.168.78.104:18130,均应出现如下页面:
(4)验证consul是否正常提供服务
访问192.168.78.104:8500,应该出现如下页面:
到此,说明基础分布式架构搭建成功,一个Nginx服务,一个Consul服务,三个swoft服务均已可以正常提供服务。