使用docker-compose 编排基础分布式架构

一、准备工作

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服务均已可以正常提供服务。