Docker实战(四)

一、持久化

  1. Dockerfile中能看到VOLUME这个关键字,先创建个container
    docker run -d --name=mysql01 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.21
    会返回一串编号:a0ff652112059926c5e82bda0a832948e1c4ce11294afb17481a278b4627d6b0
  2. mysql的Dockerfile中指定了 VOLUME /var/lib/mysql 文件挂载目录
  3. docker会在centos上生成一个当前挂载目录,未指定名字的话就是上面那一串编号
  4. 执行docker volume ls 会返回上面的编号
  5. 执行docker volume inspect <编号>可以查看文件在centos上挂载目录
  6. 编号不直观,我们自定义volume名称(作为一个有经验的开发人员 -v 这个指令应该看得懂)
    docker run -d --name=mysql02 -p 3307:3306 -v mysql02:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.21
  7. 再去执行第4步,name=mysql02的volume名称就是mysql02了
  8. 我们在container中所有操作都会同步到这个volume中,就算删了mysql02,下次新建时候 -v 指定volume名为mysql02就能恢复数据

二、Bind Mounts

  1. 我们新建一个tomcat的容器
    docker run -d --name=tomcat01 -v /opt/tomcat:/usr/local/tomcat/webapps/html -p 8080:8080 tomcat
  2. 我们在centos的/opt/tomcat 下新建一个 1.html文件 并写入 <div>DIV</div>
  3. 查看容器的/usr/local/tomcat/webapps/html目录下会出现1.html文件
  4. 浏览器http://localhost:8080/html/1.html 返回DIV

三、搭建mysql高可用集群

  1. Replication的高可用可能会丢失数据,事务提交后同步失败不会回滚,适合存储不重要数据
  2. PXC(Percona Xtradb Cluster)mysql高可用集群,保证每个节点数据一致,适合存储订单等重要数据
  3. 拉取pxc:docker pull percona/percona-xtradb-cluster:5.7.21
  4. 改个名:docker tag percona/percona-xtradb-cluster:5.7.21 percona
  5. 新建一个bridge网络:docker network create --subnet=172.22.0.0/24 pxc-net
  6. 创建第一个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:集群通信密码
  7. 创建第二个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中
  8. 创建第三个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
  9. 打开DataGrip,连接三个pxc,在第一个pxc中创建一个db, 其他两个都会有这个db
  10. 这时候又出现问题了,三个mysql 连哪个?此时可以用haproxy
  11. 拉取镜像docker pull haproxy
  12. 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
    
  13. 启动haproxy
    docker run -d -it --name=haproxy01 -p 8888:8888 -p 3306:3306 -v /opt/haproxy:/usr/local/etc/haproxy --network=pxc-net haproxy
  14. 进入容器执行:haproxy -f /usr/local/etc/haproxy/haproxy.cfg
  15. 浏览器请求 centos的ip:8888/dbs_monitor,就能看到监控界面
    在这里插入图片描述
  16. DataGrip连接centos的ip + 3306端口 + 账号root + 密码 123456 就能通过haproxy连接mysql集群了

四、搭建Nginx+SpringBoot项目+mysql

  1. 新建bridge网络:docker network create --subnet=172.25.0.0/24 project-A

  2. 启动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

  3. 在centos的/dockerfile/project-A下创建Dockerfile

  4. 上传jar包到/dockerfile/project-A下

  5. 编辑Dockerfile:

    FROM openjdk:8
    LABEL name="project" version="1.0" author="路人是妖怪"
    COPY project-A.jar project-A.jar
    ENTRYPOINT ["java", "-jar", "project-A.jar"]
    
  6. 构建镜像:docker build -t project .

  7. 启动三个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可以用容器名

  8. 新建文件/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;
    }
    
  9. 拉取nginx:docker pull nginx

  10. 启动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

  11. 浏览器请求 centos的ip/hello

  12. 因为同一个bridge网段中,项目的mysql 的url可以改成mysql容器名, nginx.conf 项目的ip也可以换成项目名

  13. 上面命令繁琐复杂,此时又出现新的解决方案 docker-compose 单机的容器编排工具

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值