一、持久化
- Dockerfile中能看到VOLUME这个关键字,先创建个container
docker run -d --name=mysql01 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.21
会返回一串编号:a0ff652112059926c5e82bda0a832948e1c4ce11294afb17481a278b4627d6b0
- mysql的Dockerfile中指定了
VOLUME /var/lib/mysql
文件挂载目录 - docker会在centos上生成一个当前挂载目录,未指定名字的话就是上面那一串编号
- 执行
docker volume ls
会返回上面的编号 - 执行
docker volume inspect <编号>
可以查看文件在centos上挂载目录 - 编号不直观,我们自定义volume名称(作为一个有经验的开发人员 -v 这个指令应该看得懂)
docker run -d --name=mysql02 -p 3307:3306 -v mysql02:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.21
- 再去执行第4步,name=mysql02的volume名称就是mysql02了
- 我们在container中所有操作都会同步到这个volume中,就算删了mysql02,下次新建时候 -v 指定volume名为mysql02就能恢复数据
二、Bind Mounts
- 我们新建一个tomcat的容器
docker run -d --name=tomcat01 -v /opt/tomcat:/usr/local/tomcat/webapps/html -p 8080:8080 tomcat
- 我们在centos的/opt/tomcat 下新建一个 1.html文件 并写入
<div>DIV</div>
- 查看容器的/usr/local/tomcat/webapps/html目录下会出现1.html文件
- 浏览器http://localhost:8080/html/1.html 返回DIV
三、搭建mysql高可用集群
- Replication的高可用可能会丢失数据,事务提交后同步失败不会回滚,适合存储不重要数据
- PXC(Percona Xtradb Cluster)mysql高可用集群,保证每个节点数据一致,适合存储订单等重要数据
- 拉取pxc:
docker pull percona/percona-xtradb-cluster:5.7.21
- 改个名:
docker tag percona/percona-xtradb-cluster:5.7.21 percona
- 新建一个bridge网络:
docker network create --subnet=172.22.0.0/24 pxc-net
- 创建第一个pxc节点
docker run -d --name=pxc-mysql01 -v pxc-v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -p 3306:3306 --network=pxc-net --ip 172.22.0.2 percona
CLUSTER_NAME:集群名
XTRABACKUP_PASSWORD:集群通信密码 - 创建第二个pxc节点
docker run -d --name=pxc-mysql02 -v pxc-v2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pxc-mysql01 -p 3307:3306 --network=pxc-net --ip 172.22.0.3 percona
CLUSTER_JOIN:将pxc-mysql02加入到pxc-mysql01中 - 创建第三个pxc节点
docker run -d --name=pxc-mysql03 -v pxc-v3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pxc-mysql01 -p 3308:3306 --network=pxc-net --ip 172.22.0.4 percona
- 打开DataGrip,连接三个pxc,在第一个pxc中创建一个db, 其他两个都会有这个db
- 这时候又出现问题了,三个mysql 连哪个?此时可以用haproxy
- 拉取镜像
docker pull haproxy
- touch一个文件:
vim /opt/haproxy/haproxy.cfg
并写入:global #工作目录,这边要和创建容器指定的目录对应 chroot /usr/local/etc/haproxy #日志文件 log 127.0.0.1 local5 info #守护进程运行 daemon defaults log global mode http #日志格式 option httplog #日志中不记录负载均衡的心跳检测记录 option dontlognull #连接超时(毫秒) timeout connect 5000 #客户端超时(毫秒) timeout client 50000 #服务器超时(毫秒) timeout server 50000 #监控界面 listen admin_stats #监控界面的访问的IP和端口 bind 0.0.0.0:8888 #访问协议 mode http #URI相对地址 stats uri /dbs_monitor #统计报告格式 stats realm Global\ statistics #登陆帐户信息 stats auth admin:admin #数据库负载均衡 listen proxy-mysql #访问的IP和端口,haproxy开发的端口为3306 #假如有人访问haproxy的3306端口,则将请求转发给下面的数据库实例 bind 0.0.0.0:3306 #网络协议 mode tcp #负载均衡算法(轮询算法) #轮询算法:roundrobin #权重算法:static-rr #最少连接算法:leastconn #请求源IP算法:source balance roundrobin #日志格式 option tcplog #在MySQL中创建一个没有权限的haproxy用户,密码为空 #Haproxy使用这个账户对MySQL数据库心跳检测 option mysql-check user haproxy server MySQL_1 172.22.0.2:3306 check weight 1 maxconn 2000 server MySQL_2 172.22.0.3:3306 check weight 1 maxconn 2000 server MySQL_3 172.22.0.4:3306 check weight 1 maxconn 2000 #使用keepalive检测死链 option tcpka
- 启动haproxy
docker run -d -it --name=haproxy01 -p 8888:8888 -p 3306:3306 -v /opt/haproxy:/usr/local/etc/haproxy --network=pxc-net haproxy
- 进入容器执行:
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
- 浏览器请求 centos的ip:8888/dbs_monitor,就能看到监控界面
- DataGrip连接centos的ip + 3306端口 + 账号root + 密码 123456 就能通过haproxy连接mysql集群了
四、搭建Nginx+SpringBoot项目+mysql
-
新建bridge网络:
docker network create --subnet=172.25.0.0/24 project-A
-
启动mysql容器:
docker run -d --name=mysql-A -p 4401:3306 -e MYSQL_ROOT_PASSWORD=123456 -v mysql-A:/var/lib/mysql --network=project-A --ip=172.25.0.2 mysql:5.7.28
-
在centos的/dockerfile/project-A下创建Dockerfile
-
上传jar包到/dockerfile/project-A下
-
编辑Dockerfile:
FROM openjdk:8 LABEL name="project" version="1.0" author="路人是妖怪" COPY project-A.jar project-A.jar ENTRYPOINT ["java", "-jar", "project-A.jar"]
-
构建镜像:
docker build -t project .
-
启动三个project-A:
docker run -d --name=project01 -p 9090:8080 --network=project-A --ip=172.25.0.3 project
docker run -d --name=project02 -p 9091:8080 --network=project-A --ip=172.25.0.4 project
docker run -d --name=project03 -p 9092:8080 --network=project-A --ip=172.25.0.5 project
项目的yml配置文件mysql的ip可以用容器名 -
新建文件/opt/nginx/nginx.conf
user nginx; worker_processes 1; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; location / { proxy_pass http://balance; } } upstream balance{ server 172.25.0.3:8080; server 172.25.0.4:8080; server 172.25.0.5:8080; } include /etc/nginx/conf.d/*.conf; }
-
拉取nginx:
docker pull nginx
-
启动nginx:
docker run -d --name=nginx-A -p 80:80 -v /opt/nginx/nginx.conf:/etc/nginx/nginx.conf --network=project-A --ip=172.25.0.6 nginx
-
浏览器请求 centos的ip/hello
-
因为同一个bridge网段中,项目的mysql 的url可以改成mysql容器名, nginx.conf 项目的ip也可以换成项目名
-
上面命令繁琐复杂,此时又出现新的解决方案
docker-compose
单机的容器编排工具