目录
- docker pull swoft/swoft
- docker tag docker.io/swoft/swoft swoft
- docker rmi docker.io/swoft/swoft
- docker pull haveyb/nginx
- docker tag docker.io/haveyb/nginx nginx1.21
- docker rmi docker.io/haveyb/nginx
- docker pull consul:1.10
- docker tag docker.io/consul:1.10 consul1.10
- docker rmi docker.io/consul:1.10
- [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
- # 升级 pip
- pip3 install --upgrade pip
- # 指定 docker-compose 版本安装
- pip install docker-compose==1.22
- # 验证是否安装成功
- docker-compose -v
- # 编排时会用到
- docker volume create --name=swoft_volume
- docker volume create --name=nginx_volume
这里之所以映射目录到数据卷而非本地目录是因为我懒 ( ̄▽ ̄)~*
在docker-compose编排swoft和nginx时,如果指定的是宿主机目录,则需要先在本地创建并处理相应swoft项目文件和nginx项目文件,且必须保证容器和宿主机两个目录的用户名名称和用户组名称一致才可以不出问题,非常麻烦。
但如果映射的是数据卷volume,则只需要在docker-compose.yml中指定
- volumes:
- swoft_volume:
- external:
- true
- nginx_volume:
- external:
- true
即可,不用再去费劲巴拉的处理swoft项目文件和nginx项目文件了。
- [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"
- }
- ]
可以很容易的看到,我们挂载的目录都在/var/lib/docker/volumes下,可以实现本地编辑同步到容器内部了,和-v 到目录的结果是一样的。
正常如果不是使用docker-compose编排的话,映射文件目录到宿主机目录是一个好的选择,但如果是使用docker-compose编排,则更建议映射到数据卷,关于docker中的数据卷volume,可以查看文章 docker-volume数据卷。
| 容器名 | 使用的镜像 | 映射端口号 | 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中定义的相应数据卷
- 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 的步骤)
上面我们定义了编排文件,在该编排文件内定义了一组容器服务,下面我们需要将这一组容器服务同时启动。
- # 进入docker-compose.yml文件所在目录,然后执行该命令
- docker-compose up -d
-
- # 如果有报错,再执行一次docker-compose up -d即可
注:类似命令有 docker-compose stop/down/restart
- [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
访问192.168.78.104:81,访问的是nginx容器,应该出现如下页面:

访问192.168.78.104:18110、192.168.78.104:18120、192.168.78.104:18130,均应出现如下页面:

访问192.168.78.104:8500,应该出现如下页面:

到此,说明基础分布式架构搭建成功,一个Nginx服务,一个Consul服务,三个swoft服务均已可以正常提供服务。