目录
一、准备工作
1、拉取swoft镜像
2、拉取nginx镜像
3、拉取consul镜像
4、查看当前镜像列表
5、安装docker-compose编排工具
6、创建数据卷目录
7、为什么选择映射到数据卷,而不是目录
(1)说明
(2)查看数据卷在宿主机的位置
(3)额外说明
二、使用docker-compose编排基础分布式架构
1、基础分布式架构规划
2、创建docker-compose.yml文件
3、执行编排
4、查看结果
(1)查看当前镜像
(2)验证Nginx是否正常提高服务
(3)验证swoft是否正常提供服务
(4)验证consul是否正常提供服务
一、准备工作
1、拉取swoft镜像
docker pull swoft/swoftdocker tag docker.io/swoft/swoft swoftdocker rmi docker.io/swoft/swoft
2、拉取nginx镜像
docker pull haveyb/nginxdocker tag docker.io/haveyb/nginx nginx1.21docker rmi docker.io/haveyb/nginx
3、拉取consul镜像
docker pull consul:1.10docker tag docker.io/consul:1.10 consul1.10docker rmi docker.io/consul:1.10
4、查看当前镜像列表
[root@v3 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnginx1.21 latest 822b7ec2aaf2 4 days ago 133 MBconsul1.10 latest b74a0a01afc4 7 days ago 116 MBswoft latest 7452cc908d73 4 months ago 552 MB
5、安装docker-compose编排工具
# 升级 pippip3 install --upgrade pip# 指定 docker-compose 版本安装pip install docker-compose==1.22# 验证是否安装成功docker-compose -v
6、创建数据卷目录
# 编排时会用到docker volume create --name=swoft_volumedocker 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-composecd docker-compose/
vi docker-compose.ymlversion: "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.0volumes: swoft_volume: external: true nginx_volume: external: truenetworks: 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 -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES9ea6d1a9053e nginx1.21 "/docker-entrypoin..." 23 minutes ago Up 23 minutes 0.0.0.0:81->80/tcp nginx1.17c74c869069ef 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.1024b9ed996f77 swoft "docker-php-entryp..." 23 minutes ago Up 23 minutes 18307-18308/tcp, 0.0.0.0:18130->18306/tcp swoft_130d32f4b77d916 swoft "docker-php-entryp..." 23 minutes ago Up 23 minutes 18307-18308/tcp, 0.0.0.0:18120->18306/tcp swoft_1202ba3153aab75 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服务均已可以正常提供服务。