培训第四十一天(docker-compose一键部署项目,haproxy容器代理多个web或java容器)

复制代码
 # 创建脚本,可以在java环境中运行任何的jar包或者war包
 #!/bin/bash
 /usr/local/jdk/bin/java -jar /java/src/*.?ar

一、思路分析:

(1)nginx

1、下载镜像,将本地的dist项目的目录挂载在容器的/usr/share/nginx/html/

2、启动容器

3、该项目是一个前后端分离的项目,并非所有的请求都是来自同一个位置,设置请求的时候还是需要在hosts文件中挟持域名

4、域名是固定的,但是,域名可以绑定不同的ip

5、所以我们设置前端请求发送给一个bu.yuanyu.zhangmin的域名,然后在本机中将域名劫持给我们的docker服务器,当我们发送请求给该域名时,docker服务器将给我们作出回应

(2)mysql

1、各个版本都有官方的镜像,直接下载docker pull mysql:5.7.44

2、启动容器的时候,挂载data目录

复制代码
 docker run -itd -p3306:3306 -v /root/pes/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql:5.7.44

3、制作data的时候,顺⼿删除auto.cnf

(3)tomcat

1、被war包集成,所以我们直接启动war

2、springboot可以直接集成tomcat,build一个jar包或者是war包

3、我们没有安装tomcat

4、application.properties(将tomcat连接数据库)

1、可以配置端口

2、配置数据库的访问

5、使用/usr/local/jdk/bin/java -jar Project_ExamSystem-V1.0.0.war启动,但是在启动这个任务时一定要跳转到application.properties文件所在目录,因为在启动的同时,还需要加载applicaiton.properties

二、制作docker-compose.yml文件,实现一键部署

1、基础准备(保证基础镜像无问题)

1)下载基础镜像
复制代码
 [root@docker ~]# docker images
 REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
 nginx        latest    5ef79149e0ec   2 weeks ago    188MB
 mysql        5.7.44    5107333e08a8   8 months ago   501MB
 centos       latest    5d0da3dc9764   2 years ago    231MB
2)创建nginx:v0镜像
复制代码
 [root@docker project_exam_system]# tree web/
 web/
 ├── dist
 │?? ├── assets
 │?? │?? ├── AdminView-yX0Ltz_1.js
 │?? │?? ├── CategoryView-Ca4t3JNT.js
 │?? │?? ├── CityView-0ESlUfo8.css
 │?? │?? ├── CityView-BJTl06GN.js
 ......
 │   ├── TeacherView-Cogr4CCq.js
 │   │   ├── TopicView-DFXgxSyC.js
 │   │   └── TopicView-Is6fJS__.css
 │   ├── favicon.ico
 │   └── index.html
 └── Dockerfile
 [root@docker web]# docker build -t nginx:v0 .
 [+] Building 0.2s (7/7) FINISHED                                                docker:default
 [root@docker ~]# docker images
 REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
 nginx        v0        13ccc573fe05   9 seconds ago   189MB
3)创建java:v0镜像
复制代码
 [root@docker project_exam_system]# tree java
 java
 ├── application.properties
 ├── Dockerfile
 ├── java.sh
 ├── jdk
 │   ├── bin
 │   │   ├── jar
 │   │   ├── jarsigner
 │   │   ├── java
 │   │   ├── javac
 ......
 │   │       ├── rmiregistry.1
 │   │       └── serialver.1
 │   ├── README
 │   └── release
 ├── jdk-17_linux-x64_bin.tar.gz
 └── Project_ExamSystem-V1.0.0.war
 [root@docker java]# docker build -t java:v0 .
 [+] Building 7.2s (9/9) FINISHED                                                docker:default
 [root@docker java]# docker images
 REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
 java         v0        7fae85c42cbe   36 seconds ago   591MB
4)创建mysql:v0镜像
复制代码
 [root@docker project_exam_system]# tree mysql/
 mysql/
 ├── Dockerfile
 └── project_exam_system.sql
 0 directories, 2 files
 [root@docker mysql]# docker build -t mysql:v0 .
 [+] Building 0.3s (7/7) FINISHED                                                docker:default
 [root@docker mysql]# docker images
 REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
 mysql        v0        258d8ed442ac   16 seconds ago   512MB
5)启动nginx容器
复制代码
 [root@docker ~]# docker run -itd -p80:80 nginx:v0
6)启动java容器
复制代码
 [root@docker ~]# docker run -itd --name java -p8080:8080 java:v0
7)启动mysql容器
复制代码
 [root@docker ~]# docker run -itd --name mysql -p3306:3306 mysql:v0 
8)查看容器状态
复制代码
 [root@docker ~]# docker ps
 CONTAINER ID   IMAGE            COMMAND                   CREATED             STATUS             PORTS                                                  NAMES
 79cc8614e967   mysql:v0         "docker-entrypoint.s…"   9 seconds ago       Up 6 seconds       0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql
 29d3ce68ceca   java:v0          "/usr/local/jdk/bin/…"   36 seconds ago      Up 34 seconds      0.0.0.0:8080->8080/tcp, :::8080->8080/tcp              java
 fed2633b259b   haproxy:latest   "docker-entrypoint.s…"   12 minutes ago      Up 11 minutes      0.0.0.0:5000->5000/tcp, :::5000->5000/tcp              wizardly_edison
 # 之后这些容器可以全部直接删除
 [root@docker ~]# docker rm -f 79(容器编号) 29(容器编号) fe(容器编号)

2、配置高可用的项目(使用haproxy调用web和java容器)

1)先创建三个前端项目(nginx容器)

容器在不映射端口时,在远程是无法访问nginx服务,而且现在也不希望外部直接访问nginx,希望创建nginx服务的集群,这个集群被haproxy代理,创建3个nginx容器,创建一个haproxy服务器,而且nginx容器还需要指定名称,web0、web1、web2。因为如果没有名称,那么容器就无法被haproxy link到。

复制代码
 # 端口不能映射80,并指定名称
 [root@docker ~]# docker run -itd --name web0 nginx:v0 
 45d83cda5bef619b937d25e581db31401841b955f9367dbffbc79a236e632612
 [root@docker ~]# docker run -itd --name web1 nginx:v0 
 b9c80deb9f08a4c2327c1784c8fdb3ab8044c48160ee29102f27e2b52495b9f4
 [root@docker ~]# docker run -itd --name web2 nginx:v0 
 5fbd082f529cdab21b3a2eb74ae6d9560c694fe2a5368e1ad63affe1ad1c93e8
 # 查看容器状态
 [root@docker ~]# docker ps 
 CONTAINER ID   IMAGE      COMMAND                   CREATED          STATUS          PORTS     NAMES
 5fbd082f529c   nginx:v0   "/docker-entrypoint.…"   4 seconds ago    Up 3 seconds    80/tcp    web2
 b9c80deb9f08   nginx:v0   "/docker-entrypoint.…"   8 seconds ago    Up 6 seconds    80/tcp    web1
 45d83cda5bef   nginx:v0   "/docker-entrypoint.…"   12 seconds ago   Up 11 seconds   80/tcp    web0
2)haproxy容器外部测试

在宿主机上安装了haproxy,编辑配置文件,代理三个nginx容器中的web服务,是直接添加容器的ip地址

复制代码
 # 安装haproxy
 [root@docker ~]# yum -y install haproxy
 # 查看三个nginx容器的IP地址
 [root@docker ~]# docker inspect 45 | grep IPA
             "SecondaryIPAddresses": null,
             "IPAddress": "172.17.0.2",
                     "IPAMConfig": null,
                     "IPAddress": "172.17.0.2",
 [root@docker ~]# docker inspect b9 | grep IPA
             "SecondaryIPAddresses": null,
             "IPAddress": "172.17.0.3",
                     "IPAMConfig": null,
                     "IPAddress": "172.17.0.3",
 [root@docker ~]# docker inspect 5f | grep IPA
             "SecondaryIPAddresses": null,
             "IPAddress": "172.17.0.4",
                     "IPAMConfig": null,
                     "IPAddress": "172.17.0.4",
 # 修改配置文件
 [root@docker ~]# vim /etc/haproxy/haproxy.cfg
 # 注释静态资源
    # use_backend static          if url_static
 # 修改轮询模块
 backend app
     balance     roundrobin
     server  app1 172.17.0.2:80 check
     server  app2 172.17.0.3:80 check
     server  app3 172.17.0.4:80 check
 # 启动服务
 [root@docker ~]# haproxy -f /etc/haproxy/haproxy.cfg 
 [root@docker ~]# netstat -lntup | grep 5000
 tcp        0      0 0.0.0.0:5000            0.0.0.0:*               LISTEN      1985/haproxy 
 # 测试访问过后可以直接删除进程来停止服务
 [root@docker ~]# kill -9 1985(进程号)
 [root@docker ~]# netstat -lntup | grep 5000
3)创建haproxy容器

创建一个haproxy容器,将配置文件导入到容器,在容器中启动haproxy,也是可以的

复制代码
 # 拉取haprxy镜像
 [root@docker ~]# docker pull haproxy
 [root@docker ~]# docker images
 REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
 haproxy      latest    4e5bebb0fd91   7 weeks ago    103MB
 # 该haproxy.cfg文件是在官方网站里下载下来的
 [root@docker ~]# vim haproxy.cfg 
 # 只修改web的轮询模块即可,默认是5000端口,也可修改
 listen proxy-web
         bind 0.0.0.0:5000
 ......
         server web0 172.17.0.2:80 check weight 1 maxconn 2000
         server web1 172.17.0.3:80 check weight 1 maxconn 2000
         server web2 172.17.0.4:80 check weight 1 maxconn 2000
 [root@docker ~]# docker run -itd -p5000:5000 haproxy:latest /bin/bash
 fed2633b259b96d3c0ed5e9ca51c031c36b1e21361cb3cf9d57b9d49a9ea1710
 [root@docker ~]# docker cp haproxy.cfg fed:/usr/local/etc/haproxy
 Successfully copied 5.12kB to fed:/usr/local/etc/haproxy
 [root@docker ~]# docker attach fed
 haproxy@fed2633b259b:~$ ls /usr/local/etc/haproxy/haproxy.cfg 
 /usr/local/etc/haproxy/haproxy.cfg
 # 启动服务
 haproxy@fed2633b259b:~$ haproxy -f /usr/local/etc/haproxy/haproxy.cfg 
4)使用haproxy容器调用web容器
复制代码
 # -itd 交互 终端  后台
 # link 锚定web容器
 # v 将配置文件挂载到容器中
 [root@docker ~]# docker run -itd --link web0 --link web1 --link web2 -p5000:5000 -v /root/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg haproxy:latest
 65466d3aef2566512b63690c02e4497ddb7594b8268a26136ec040e2cb858b3b
 [root@docker ~]# docker ps
 CONTAINER ID   IMAGE            COMMAND                   CREATED         STATUS         PORTS                                                  NAMES
 65466d3aef25   haproxy:latest   "docker-entrypoint.s…"   6 seconds ago   Up 4 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp              romantic_curie
 79cc8614e967   mysql:v0         "docker-entrypoint.s…"   2 hours ago     Up 2 hours     0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql
 29d3ce68ceca   java:v0          "/usr/local/jdk/bin/…"   3 hours ago     Up 3 hours     0.0.0.0:8080->8080/tcp, :::8080->8080/tcp              java
 5fbd082f529c   nginx:v0         "/docker-entrypoint.…"   4 hours ago     Up 4 hours     80/tcp                                                 web2
 b9c80deb9f08   nginx:v0         "/docker-entrypoint.…"   4 hours ago     Up 4 hours     80/tcp                                                 web1
 45d83cda5bef   nginx:v0         "/docker-entrypoint.…"   4 hours ago     Up 4 hours     80/tcp                                                 web0
 # 删除该haproxy容器(使用的是ip地址,要改为使用域名才可以进行link)
 [root@docker ~]# docker rm -f 65
5)调用haproxy的监控界面(并改ip轮询为域名轮询)
复制代码
 # 只查看即可,创建haproxy服务器容器时将相应端口映射出去就行,记得初始的账户和密码
 [root@docker ~]# vim haproxy.cfg 
 ######## 监控界面配置 #################
 listen admin_status
         # 监控界面访问信息
         bind 0.0.0.0:8888
         mode http
         # URI相对地址
         stats uri /dbs
         # 统计报告格式
         stats realm Global\ statistics
         # 登录账户信息
         stats auth admin:123456
 [root@docker ~]# vim haproxy.cfg
         server web0 web0:80 check weight 1 maxconn 2000
         server web1 web1:80 check weight 1 maxconn 2000
         server web2 web2:80 check weight 1 maxconn 2000
 [root@docker ~]# docker run -itd --link web0 --link web1 --link web2 -p5000:5000 -p8888:8888 -v /root/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg haproxy:latest
 # 删除该haproxy容器
 [root@docker ~]# docker rm -f 8af
6)使用haproxy容器调用java容器
复制代码
 [root@docker ~]# docker run -itd --name java0 java:v0
 283c87bcaea166b017160aa84ce5424dd9baf3ec8fd168a1406f7dc11be3e694
 [root@docker ~]# docker run -itd --name java1 java:v0
 e851f31c87f39c2d028e42b36bd77bcf818a8eb97c9a6cc002656fd1501c0ea6
 [root@docker ~]# docker run -itd --name java2 java:v0
 fb94c87c4fa87d08b0d621157aa33ed74ca459beb32a3c950a7703227ab2f031
 [root@docker ~]# vim haproxy.cfg 
 # 复制一份proxy-web的模块,修改为java模块
 listen proxy-java
 # 修改端口为8080
         bind 0.0.0.0:8080
         mode http
         # 负载均衡算法
         # static-rr 权重, leastconn 最少连接, source 请求IP, 轮询 roundrobin
         balance roundrobin
         # 日志格式
         option tcplog
         # 在 mysql 创建一个没有权限的haproxy用户,密码为空。 haproxy用户
         # create user 'haproxy'@'%' identified by ''; FLUSH PRIVILEGES;
         #option mysql-check user haproxy
          # 这里是容器中的IP地址,由于配置的是轮询roundrobin,weight 权重其实没有生效
 # 修改域名为java域名,端口为java端口
         server java0 java0:8080 check weight 1 maxconn 2000
         server java1 java1:8080 check weight 1 maxconn 2000
         server java2 java2:8080 check weight 1 maxconn 2000
         #server MYSQL_3 192.168.130.102:3306 check weight 1 maxconn 2000
         # 使用keepalive检测死链
         # option tcpka
 [root@docker ~]# docker run -itd --link web0 --link web1 --link web2 --link java0 --link java1 --link java2 -p8080:8080 -p5000:5000 -p8888:8888 -v /root/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg haproxy:latest
 e5ea894c0f30988604cfd6fe5a48b9a69f14c2c3f2e373fe775c0554f37f19db
复制代码
 # 下载http-tools,使用ab测试承载量
 [root@docker ~]# yum -y install http-tools
 [root@docker ~]# ab -n 100 -c 10 http://10.0.0.7:5000/

3、编辑docker-compose.yml文件,一键部署完整项目

新机子:

1)docker-compose环境准备
复制代码
 # 配置docker环境
 source docker.sh
 scp 10.0.0.7:/etc/docker/daemon.json /etc/docker/daemon.json
 vim /etc/docker/daemon.json 
 {       
         "registry-mirrors" : [
                 "https://do.nark.eu.org",
                 "https://dc.j8.work",
                 "https://docker.m.daocloud.io",
                 "https://dockerproxy.com",
                 "https://docker.mirrors.ustc.edu.cn",
                 "https://docker.nju.edu.cn"
         ]
 }  
 systemctl start docker
 # 安装pip(python包管理器)
 yum -y install python2-pip
 # 升级pip
 pip install --upgrade pip==20.3  -i https://mirrors.aliyun.com/pypi/simple
 # 安装docker-compose
 [root@compose ~]# pip install docker-compose --ignore-installed requests -i https://mirrors.aliyun.com/pypi/simple
2)使用compose构建自动化部署文件
复制代码
 # 创建项目目录
 [root@compose ~]# mkdir -p pes/{java,mysql,web}
 [root@compose ~]# tree pes/
 pes/
 ├── java
 ├── mysql
 └── web
 3 directories, 0 files
 [root@compose ~]# cd pes
 # 在项目目录中创建docker-compoce.yml文件
 [root@compose pes]# vim docker-compose.yml
 version: "3"
 services:
         web:
                 container_name: web0
                 image: nginx:latest
                 ports:
                 - "80:80"
                 volumes:
                 - ./web/src/dist/:/usr/share/nginx/html/
                 expose:
                 - 80
                 restart: "always"
 #        mysql:
 #                container_name: mysql0
 #                image: mysql:5.7.44
 #        java:
 #                container_name: java0
 #                image: java:v0
 [root@compose pes]# mkdir -p web/src/
 [root@compose pes]# scp -r 10.0.0.7:/root/project_exam_system/web/dist web/src/
 [root@compose pes]# ls web/src/
 dist
 # 拉取nginx镜像
 [root@compose pes]# docker pull nginx
 Using default tag: latest
 # 执行docker compose命令创建指定容器
 [root@compose pes]# docker compose up -d
 WARN[0000] /root/pes/docker-compose.yml: `version` is obsolete 
 [+] Running 1/1
  ✔ Container web0  Started                                                                0.9s 
  # 查看容器是否正常创建启动
 [root@compose pes]# docker ps
 CONTAINER ID   IMAGE          COMMAND                   CREATED              STATUS              PORTS                               NAMES
 5a007ca2fdbe   nginx:latest   "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp, :::80->80/tcp   web0
3)使用docker compose一次性创建多台完全一样的容器
bash 复制代码
# 查看docker-compose的帮助文档
[root@compose ~]# docker-compose --help
scale              Set number of containers for a service
# 查看docker-compose scale的帮助文档
[root@compose ~]# docker-compose scale --help
Usage: scale [options] [SERVICE=NUM...]
# 一次性创建多台相同容器时,不能为容器启相同的名称,映射相同的端口,所以需要在yml文件中将这两行注释掉
[root@compose pes]# vim docker-compose.yml 
version: "3"
services:
        web:
                #container_name: web0
                image: nginx:latest
                #ports:
                #- "80:80"
                volumes:
                - ./web/src/dist/:/usr/share/nginx/html/
                expose:
                - 80
                restart: "always"
# 使用scale选项创建3台相同的web容器
[root@compose pes]# docker compose up --scale web=3 -d
WARN[0000] /root/pes/docker-compose.yml: `version` is obsolete 
[+] Running 3/3
 ✔ Container pes-web-3  Started                                                           0.8s 
 ✔ Container pes-web-1  Started                                                           0.5s 
 ✔ Container pes-web-2  Started                                                           1.1s
# 查看容器列表
[root@compose ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS          PORTS     NAMES
dd63d63e1ced   nginx:latest   "/docker-entrypoint...."   29 minutes ago   Up 29 minutes   80/tcp    pes_web_2
12edb14dfae7   nginx:latest   "/docker-entrypoint...."   29 minutes ago   Up 29 minutes   80/tcp    pes_web_1
89fa62180f85   nginx:latest   "/docker-entrypoint...."   29 minutes ago   Up 29 minutes   80/tcp    pes_web_3
# docker-compose暂停集群
[root@compose ~]# cd pes/
[root@compose pes]# docker-compose stop
/usr/lib/python2.7/site-packages/paramiko/transport.py:33: CryptographyDeprecationWarning: Python 2 is no longer supported by the Python core team. Support for it is now deprecated in cryptography, and will be removed in the next release.
  from cryptography.hazmat.backends import default_backend
Stopping pes-web-1 ... done
Stopping pes-web-3 ... done
Stopping pes-web-2 ... done
[root@compose pes]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
# docker-compose移除集群
[root@compose pes]# docker-compose down
/usr/lib/python2.7/site-packages/paramiko/transport.py:33: CryptographyDeprecationWarning: Python 2 is no longer supported by the Python core team. Support for it is now deprecated in cryptography, and will be removed in the next release.
  from cryptography.hazmat.backends import default_backend
Removing pes-web-1 ... done
Removing pes-web-3 ... done
Removing pes-web-2 ... done
Removing network pes_default
[root@compose pes]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
相关推荐
无为扫地僧6 分钟前
三、ubuntu18.04安装docker
ubuntu·docker
谷莠子9051 小时前
hadoop实验之创业有感
hadoop·docker·团队开发
G丶AEOM1 小时前
Docker快速入门
docker
大熊程序猿2 小时前
airflow docker 安装
运维·docker·容器
带电的小王3 小时前
Docker在Ubuntu上安装
ubuntu·docker
fanruitian4 小时前
docker 为单个容器设置代理
运维·docker·容器
梁萌4 小时前
Docker快速安装Tomcat
docker·容器·tomcat·镜像
Doker 多克5 小时前
IntelliJ IDEA Docker集成
spring cloud·docker·intellij-idea
筏镜12 小时前
调整docker bridge地址冲突,通过bip调整 bridge地址
java·docker·eureka
韩俊强17 小时前
使用Docker部署一个Node.js项目
docker·容器·node.js