目录

一、准备工作

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_110swoft18110:18306,18111:18307,18112:18308172.22.22.110/var/lib/docker/volumes/swoft_volume/_data : /var/www/swoft
swoft_120swoft18120:18306,18121:18307,18122:18308172.22.22.120/var/lib/docker/volumes/swoft_volume/_data : /var/www/swoft
swoft_130swoft18130:18306,18131:18307,18132:18308172.22.22.113/var/lib/docker/volumes/swoft_volume/_data : /var/www/swoft
nginx1.21nginx1.2181:80172.22.22.20/var/lib/docker/volumes/nginx_volume/_data : /etc/nginx
consul1.10consul1.108500:8500172.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服务均已可以正常提供服务。