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


    目录

    一、准备工作

    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镜像

    1. docker pull swoft/swoft
    2. docker tag docker.io/swoft/swoft swoft
    3. docker rmi docker.io/swoft/swoft

    2、拉取nginx镜像

    1. docker pull haveyb/nginx
    2. docker tag docker.io/haveyb/nginx nginx1.21
    3. docker rmi docker.io/haveyb/nginx

    3、拉取consul镜像

    1. docker pull consul:1.10
    2. docker tag docker.io/consul:1.10 consul1.10
    3. docker rmi docker.io/consul:1.10

    4、查看当前镜像列表

    1. [root@v3 ~]# docker images
    2. REPOSITORY TAG IMAGE ID CREATED SIZE
    3. nginx1.21 latest 822b7ec2aaf2 4 days ago 133 MB
    4. consul1.10 latest b74a0a01afc4 7 days ago 116 MB
    5. swoft latest 7452cc908d73 4 months ago 552 MB

    5、安装docker-compose编排工具

    1. # 升级 pip
    2. pip3 install --upgrade pip
    3. # 指定 docker-compose 版本安装
    4. pip install docker-compose==1.22
    5. # 验证是否安装成功
    6. docker-compose -v

    6、创建数据卷目录

    1. # 编排时会用到
    2. docker volume create --name=swoft_volume
    3. docker volume create --name=nginx_volume

    7、为什么选择映射到数据卷,而不是目录

    (1)说明

    这里之所以映射目录到数据卷而非本地目录是因为我懒 ( ̄▽ ̄)~*

    在docker-compose编排swoft和nginx时,如果指定的是宿主机目录,则需要先在本地创建并处理相应swoft项目文件和nginx项目文件,且必须保证容器和宿主机两个目录的用户名名称和用户组名称一致才可以不出问题,非常麻烦。

    但如果映射的是数据卷volume,则只需要在docker-compose.yml中指定

    1. volumes:
    2. swoft_volume:
    3. external:
    4. true
    5. nginx_volume:
    6. external:
    7. true

    即可,不用再去费劲巴拉的处理swoft项目文件和nginx项目文件了。

    (2)查看数据卷在宿主机的位置

    1. [root@v3 docker-compose]# docker volume inspect swoft_volume
    2. [
    3. {
    4. "Driver": "local",
    5. "Labels": {},
    6. "Mountpoint": "/var/lib/docker/volumes/swoft_volume/_data",
    7. "Name": "swoft_volume",
    8. "Options": {},
    9. "Scope": "local"
    10. }
    11. ]
    12. [root@v3 docker-compose]# docker volume inspect nginx_volume
    13. [
    14. {
    15. "Driver": "local",
    16. "Labels": {},
    17. "Mountpoint": "/var/lib/docker/volumes/nginx_volume/_data",
    18. "Name": "nginx_volume",
    19. "Options": {},
    20. "Scope": "local"
    21. }
    22. ]

    (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文件

    1. mkdir docker-compose
    2. cd docker-compose/
    1. vi docker-compose.yml
    2. version: "3.6"
    3. services:
    4. swoft_110:
    5. image: swoft
    6. container_name: swoft_110
    7. ports:
    8. - "18110:18306"
    9. - "18111:18307"
    10. - "18112:18308"
    11. networks:
    12. swoft_consul:
    13. ipv4_address: 172.22.22.110
    14. privileged: true
    15. volumes:
    16. - swoft_volume:/var/www/swoft
    17. command: php /var/www/swoft/bin/swoft http:start
    18. swoft_120:
    19. image: swoft
    20. container_name: swoft_120
    21. ports:
    22. - "18120:18306"
    23. - "18121:18307"
    24. - "18122:18308"
    25. networks:
    26. swoft_consul:
    27. ipv4_address: 172.22.22.120
    28. privileged: true
    29. volumes:
    30. - swoft_volume:/var/www/swoft
    31. command: php /var/www/swoft/bin/swoft http:start
    32. swoft_130:
    33. image: swoft
    34. container_name: swoft_130
    35. ports:
    36. - "18130:18306"
    37. - "18131:18307"
    38. - "18132:18308"
    39. networks:
    40. swoft_consul:
    41. ipv4_address: 172.22.22.130
    42. privileged: true
    43. volumes:
    44. - swoft_volume:/var/www/swoft
    45. command: php /var/www/swoft/bin/swoft http:start
    46. nginx:
    47. image: nginx1.21
    48. ports:
    49. - "81:80"
    50. networks:
    51. swoft_consul:
    52. ipv4_address: 172.22.22.20
    53. container_name: nginx1.21
    54. volumes:
    55. - nginx_volume:/etc/nginx
    56. consul:
    57. image: consul1.10
    58. ports:
    59. - "8500:8500"
    60. networks:
    61. swoft_consul:
    62. ipv4_address: 172.22.22.30
    63. container_name: consul1.10
    64. command: consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=ali -bind=172.22.22.30 -ui -client=0.0.0.0
    65. volumes:
    66. swoft_volume:
    67. external:
    68. true
    69. nginx_volume:
    70. external:
    71. true
    72. networks:
    73. swoft_consul:
    74. driver: bridge
    75. ipam:
    76. config:
    77. - subnet: "172.22.22.0/24"

    这里,在每一个swoft容器服务内都定义了一个command,该命令会在容器启动时自动执行(省去了还得进入容器执行php ./bin/swoft http:start 的步骤)

     

    3、执行编排

    上面我们定义了编排文件,在该编排文件内定义了一组容器服务,下面我们需要将这一组容器服务同时启动。

    1. # 进入docker-compose.yml文件所在目录,然后执行该命令
    2. docker-compose up -d
    3. # 如果有报错,再执行一次docker-compose up -d即可

    注:类似命令有 docker-compose stop/down/restart

     

    4、查看结果

    (1)查看当前镜像

    1. [root@v3 _data]# docker ps -a
    2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    3. 9ea6d1a9053e nginx1.21 "/docker-entrypoin..." 23 minutes ago Up 23 minutes 0.0.0.0:81->80/tcp nginx1.17
    4. 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
    5. 24b9ed996f77 swoft "docker-php-entryp..." 23 minutes ago Up 23 minutes 18307-18308/tcp, 0.0.0.0:18130->18306/tcp swoft_130
    6. d32f4b77d916 swoft "docker-php-entryp..." 23 minutes ago Up 23 minutes 18307-18308/tcp, 0.0.0.0:18120->18306/tcp swoft_120
    7. 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服务均已可以正常提供服务。

  • 相关阅读:
    练习用信号量的方式,创建两个线程A B1. A线程读取文件中的内容2. B线程打印A读取到的内容到终端,3.全部打印完毕后,结束进程;4.现象类似cat个文件
    centos8常见报错处理
    氢氧化铝佐剂,完美替代进口品牌明矾佐剂
    光引擎、光模块、光器件之间的关系和区别
    # DWD层及DIM层构建## ,220801 ,
    时间序列建模三部曲
    day7_C++
    【redisson学习笔记】
    「高效程序员的修炼」快速上手高效开发利器 Visual Studio Code (VS Code)
    R语言ggplot2可视化:使用ggpubr包的ggmaplot函数可视化MA图(MA-plot)、font.label参数设置图中标签字体类型、字体大小
  • 原文地址:https://blog.csdn.net/qq_27229113/article/details/126005331