• docker使用2


    04 Docker数据持久化

    4.1 以myql容器创建为例

    (1)创建mysql数据库的container

           》需要下载mysql镜像image【docker images----如果有,不再pull】

    >docker images

    >doker run创建【先查看docker ps -a】

           > docker run -d --name test_mysql -e MYSQL_ROOT_PASSWORD=wffix mysql

    >进入容器

           >docker exec -it test_mysql bash

    注意:

           运行mysql容器,所有的数据都在容器中进行保存,如果我一不小心,把它删除了【数据就没了】======所以,需要对数据进行永久【持久化】保存。

           我们要知道,当mysql容器创建成功了,它的数据是如何保存的?保存在什么地方的?

           通过docker官网,mysql的dockerfile定义,有一个关键字Volumn,定义如下:

    Volume /var/lib/mysql        //这就是定义mysql保存数据的地方

     

           》linux下登录mysql【需要先进入mysql容器】

    root@2ad920548df9:/#  mysql -uroot -pwffix    //登录成功

    (2)docker查看volume

    >docker volume ls

    [root@localhost ~]# docker volume ls

    DRIVER              VOLUME NAME

    local               2fe372cdcf2fe2c13592c81bde62bce81f379acc915a666b8f1c7eece60a4942

    local               c893e32240f3677625da23167bbe4f3000f7c60938c2eed4868c1db71b06bcb1

    volume删除:

    >docker volume rm -f $(docker volume ls)           //当在使用中,则无法删除

    (3)具体查看该volume详情://后面很一串id【它代表centos物理机上数据挂载地址】

     docker volume inspect 2fe372cdcf2fe2c13592c81bde62bce81f379acc915a666b8f1c7eece60a4942

    [

        {

            "CreatedAt": "2020-01-07T03:36:10Z",

            "Driver": "local",

            "Labels": null,

            "Mountpoint": "/var/lib/docker/volumes/2fe372cdcf2fe2c13592c81bde62bce81f379acc915a666b8f1c7eece60a4942/_data",

            "Name": "2fe372cdcf2fe2c13592c81bde62bce81f379acc915a666b8f1c7eece60a4942",

            "Options": null,

            "Scope": "local"

        }

    ]

    (4)自定义存储id,创建第二个容器

           当使用docker run mysql时,自动生成的id很长,难辨识【可以自己定义,使用-v】

    docker run -d --name mysql01 -v mysql01_volume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=wffix mysql

     "-v mysql01_volume:/var/lib/mysql"表示给上述的volume起一个能识别的名字.

    (5)查看volume docker volume ls

    [root@localhost ~]# docker run -d --name mysql01 -v mysql01_volume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=wffix mysql

    70c86bccfc63a3233dc32635dcd2d895f47d758d52faa8530f5b8bcfef1ce6fc

    [root@localhost ~]# docker volume ls

    DRIVER              VOLUME NAME

    local               2fe372cdcf2fe2c13592c81bde62bce81f379acc915a666b8f1c7eece60a4942

    local               mysql01_volume

    》查看详情docker volume inspect mysql01_volume

    4.1.1.mysql容器存储数据的理解

           docker run mysql=======

                  》容器:指定临时存储目录 volume /var/lib/mysql

                  》宿主机centos:   volume id【很长】,目录如下:

    /var/lib/docker/volumes/2fe372cdcf2fe2c13592c81bde62bce81f379acc915a666b8f1c7eece60a4942/_data

           查看下centos里面的数据:

    [root@localhost ~]# cd /var/lib/docker/volumes/2fe372cdcf2fe2c13592c81bde62bce81f379acc915a666b8f1c7eece60a4942/_data

    [root@localhost _data]# ll

    total 178184

    -rw-r-----. 1 polkitd input       56 Jan  7 03:36 auto.cnf

    -rw-r-----. 1 polkitd input  3084516 Jan  7 03:36 binlog.000001

    -rw-r-----. 1 polkitd input      155 Jan  7 03:36 binlog.000002

    -rw-r-----. 1 polkitd input       32 Jan  7 03:36 binlog.index

    -rw-------. 1 polkitd input     1676 Jan  7 03:36 ca-key.pem

    -rw-r--r--. 1 polkitd input     1112 Jan  7 03:36 ca.pem

    -rw-r--r--. 1 polkitd input     1112 Jan  7 03:36 client-cert.pem

    -rw-------. 1 polkitd input     1680 Jan  7 03:36 client-key.pem

    -rw-r-----. 1 polkitd input     5431 Jan  7 03:36 ib_buffer_pool

    -rw-r-----. 1 polkitd input 12582912 Jan  7 03:36 ibdata1

    -rw-r-----. 1 polkitd input 50331648 Jan  7 03:36 ib_logfile0

    -rw-r-----. 1 polkitd input 50331648 Jan  7 03:35 ib_logfile1

    -rw-r-----. 1 polkitd input 12582912 Jan  7 03:36 ibtmp1

    drwxr-x---. 2 polkitd input      187 Jan  7 03:36 #innodb_temp

    drwxr-x---. 2 polkitd input      143 Jan  7 03:36 mysql

    -rw-r-----. 1 polkitd input 30408704 Jan  7 03:36 mysql.ibd

    drwxr-x---. 2 polkitd input     8192 Jan  7 03:36 performance_schema

    -rw-------. 1 polkitd input     1676 Jan  7 03:36 private_key.pem

    -rw-r--r--. 1 polkitd input      452 Jan  7 03:36 public_key.pem

    -rw-r--r--. 1 polkitd input     1112 Jan  7 03:36 server-cert.pem

    -rw-------. 1 polkitd input     1676 Jan  7 03:36 server-key.pem

    drwxr-x---. 2 polkitd input       28 Jan  7 03:36 sys

    -rw-r-----. 1 polkitd input 12582912 Jan  7 03:36 undo_001

    -rw-r-----. 1 polkitd input 10485760 Jan  7 03:36 undo_002

    这样的一种设计方式,它的目的是防止数据删除。

    当我们不小心把docker容器时,还可以根据centos中数据对container进行恢复。

    4.1.1.1.验证删除容器后mysql数据是否还存在

    》查看mysql容器

           >docker ps -a【存储mysql01和test_mysql,这里删除前者】

           >docker rm -f mysql01【删除】

           > docker volume ls

    [root@localhost ~]# docker rm -f mysql01              //删除

    mysql01

    [root@localhost ~]# docker volume ls

    DRIVER              VOLUME NAME

    local               2fe372cdcf2fe2c13592c81bde62bce81f379acc915a666b8f1c7eece60a4942

    local               mysql01_volume    //volume还存在

    注意:

           当我们删除container后,它对应的volume还存在。

    4.1.1.2.验证恢复的实时

    》进入test_mysql容器里面 ,进入volume目录

           >docker exec -it test_mysql bash

           >cd /var/lib/mysql

    》在volume中增加一个文件yihangqinlu

           >touch yinhangqinlu

    root@2ad920548df9:/var/lib/mysql# ls

    #innodb_temp   binlog.index         client-key.pem            ibdata1    performance_schema  server-key.pem

    auto.cnf       ca-key.pem  ib_buffer_pool              ibtmp1                 private_key.pem     sys

    binlog.000001  ca.pem                      ib_logfile0       mysql     public_key.pem      undo_001

    binlog.000002  client-cert.pem      ib_logfile1       mysql.ibd  server-cert.pem     undo_002

    root@2ad920548df9:/var/lib/mysql# touch yinhangqinlu

    root@2ad920548df9:/var/lib/mysql# ls

    #innodb_temp   ca-key.pem           ib_logfile0  mysql.ibd                         server-key.pem

    auto.cnf       ca.pem                         ib_logfile1  performance_schema  sys

    binlog.000001  client-cert.pem      ibdata1      private_key.pem        undo_001

    binlog.000002  client-key.pem      ibtmp1                   public_key.pem undo_002

    binlog.index   ib_buffer_pool           mysql       server-cert.pem            yinhangqinlu

    》退出volume,查看volume及详情

           >docker volume ls

           >docker volume inspect

    [root@localhost ~]# docker volume ls

    DRIVER              VOLUME NAME

    local               2fe372cdcf2fe2c13592c81bde62bce81f379acc915a666b8f1c7eece60a4942

    local               mysql01_volume

    [root@localhost ~]# docker volume inspect 2fe372cdcf2fe2c13592c81bde62bce81f379acc915a666b8f1c7eece60a4942

    [

        {

            "CreatedAt": "2020-01-07T05:18:28Z",

            "Driver": "local",

            "Labels": null,

            "Mountpoint": "/var/lib/docker/volumes/2fe372cdcf2fe2c13592c81bde62bce81f379acc915a666b8f1c7eece60a4942/_data",

            "Name": "2fe372cdcf2fe2c13592c81bde62bce81f379acc915a666b8f1c7eece60a4942",

            "Options": null,

            "Scope": "local"

        }

    ]

    》进入宿主机centos的物理目录,查看新增文件是否已实时同步

           >cd /var/lib/docker/volumes/2fe372cdcf2fe2c13592c81bde62bce81f379acc915a666b8f1c7eece60a4942/_data

                  >ls

    [root@localhost _data]# ls

    auto.cnf       ca.pem           ib_logfile0   mysql.ibd           server-key.pem

    binlog.000001  client-cert.pem  ib_logfile1   performance_schema  sys

    binlog.000002  client-key.pem   ibtmp1        private_key.pem     undo_001

    binlog.index   ib_buffer_pool   #innodb_temp  public_key.pem      undo_002

    ca-key.pem     ibdata1          mysql         server-cert.pem     yinhangqinlu

    结论:数据是实时同步的。

     

     

    》创建一个数据库

           >docker exec -it test_mysql bash

           >mysql -uroot -pwffix

           >create database db_test;

           show databases;

    》退出容器,删除容器----------------发现:删除container之后,volume还存在

           > docker rm -f test_mysql

           >docker volume ls

    4.1.2.常用的创建容器的方式

    原有的容器创建方式:

    docker run -d --name test_mysql -e MYSQL_ROOT_PASSWORD=wffix mysql

    这种方式,会默认生成一串很长id,id用于映射volume地址。

    指定volume创建container:

    docker run -d --name test_mysql -v my_volume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=wffix mysql

    指定:volume别名----my_volume

    引申:

           既然volume名字可以自己指定。那么,它的存储路径我们也可以指定【如果让它指向中间件,是不是就可以达到持久化的目的了呢?】

           同样,在docker的帮助下,我们能够把数据存储到想要的任何地方。【如:磁盘上】

    [root@localhost ~]# docker volume inspect mysql01_volume

    [

        {

            "CreatedAt": "2020-01-07T04:58:36Z",

            "Driver": "local",

            "Labels": null,

            "Mountpoint": "/var/lib/docker/volumes/mysql01_volume/_data",               //这个就是指定存储目录的关键

            "Name": "mysql01_volume",

            "Options": null,

            "Scope": "local"

        }

    ]

    对于数据的持久化存储,只需要关注Mountpoint。

    再度引申:

           我们想达到:

           >docker run -d 宿主机的任意目录:容器的任意目录   //这样的一一映射

    4.1.2.1.实现创建tomcat容器,并把项目布署到tomcat中

    》创建tomcat容器

    >docker run -d --name tomcat01 -p 9090:8080 -v /temp/test:/usr/local/tomcat/webapps/test tomcat

    说明:

           创建tomcat容器的同时,还希望把项目test[宿主机centos的/temp目录下],布署到tomcat的webapp下,名称还是test.【tomcat的目录/usr/local/tomcat】

    >查看两个目录是否创建成功

           >项目目录:/tmp/test

    [root@localhost ~]# cd /temp/test

    [root@localhost test]# ll

    total 0

           >tomcat容器的目录:

                  >docker exec -it tomcat01 bash

                  >cd webapps

    root@e7fa8b9965ad:/usr/local/tomcat/webapps# ls

    ROOT  docs  examples  host-manager  manager  test

    4.1.2.2.对项目升级维护

    说明:

           现在项目已经布署成功了,现在更新一个文件,想要升级项目,重新布署。

           我需要在宿主机centos中,修改文件【因为我不可能在容器中修改文件】

    》宿主机项目中增加test.html文件

           》进入项目目录:cd /temp/test

    》vi test.html【只需要新建一个p标签】

          

    》查看宿主机内容

           >ls /temp/test

    》进入tomcat,查看

    [root@localhost test]# docker exec -it tomcat01 bash

    root@e7fa8b9965ad:/usr/local/tomcat# cd webapps/test/

    root@e7fa8b9965ad:/usr/local/tomcat/webapps/test# ls

    test.html          //容器中数据直接同步

    》浏览器访问

           》访问tomcat: http://30.50.34.2:9090/

           》访问test项目:http://30.50.34.2:9090/test/test.html

     

    修改文件后,会自动同步到容器。

    05.Docker实战

    5.1.mysql集群布署

    需求:

           布署3个mysql集群,还需要考虑数据同步性的问题。

    5.1.1.解决方案:
    5.1.1.1.Replication

    原理如下:

     

    特点:

           弱一致性,速度较快。无需所有节点都同步数据成功,只保证主节点同步成功。

           异步复制方案,无法保证集群中每个节点的数据是一致的。

    使用场景:

           存储低价值的数据。

    5.1.1.2.PXC【Percona XtraDB Custer】

           一种强一致性高可用数据库集群搭建方案。

           速度较慢。

    使用场景:

           保存一些高价值的数据,如:订单,抢红包。

    原理图解如下:

     

      

    5.1.2.搭建Pxc方案集群

    注意:

           布署之前,和编写代码一样,一定要先分析需求。

           布署规划:

           》网络怎么操作?

                  专门设置一个网络pxc-net:127.18.0.0/24

           》持久化存储怎么做?

                  Docker volume create --name v1 --mysql v2 --mysql02 v3 –mysql03

           》容器该如何创建?

                                docker run -d -p 3301:3306 -v v1:/var/lib/mysql -e -e MYSQL_ROOT_PASSWORD=wffix    -e CLUSTER_NAME=PXC    -e XTRABACKUP_PASSWORD=wffix --privileged --name=node1 --net=pxc-net --ip 172.18.0.2 pxc

    XTRABACKUP_PASSWORD=wffix【同步密码,保证节点数据一致性】

           Pxc这种方案,已经有人给我们做好了,并且做成了docker image。可以到dockerhub上搜索percona-xtradb-cluster【它是对mysql的封装】

    1.拉取image

           >docker pull percona/percona-xtradb-cluster:5.7.21

    2.复制【重命名】image

           > docker tag percona/percona-xtradb-cluster:5.7.21 pxc      //重命名为pxc

    3.删除原来的pxc镜像

           > docker rmi percona/percona-xtradb-cluster:5.7.21

    4. 创建一个单独的网段,给mysql数据库集群使用  

           >docker network ls      //查看网络

          >docker network create --subnet=172.18.0.0/24 pxc-net   

    [root@localhost ~]# docker network create --subnet=172.18.0.0/24 pxc-net

    bb421728de8c23c29f956da20221eeefb71cf6769da4b1d3131f3276270b7c91

    >docker network inspect pxc-net   [查看详情]   

    [root@localhost ~]# docker network inspect pxc-net

    [

        {

            "Name": "pxc-net",

            "Id": "bb421728de8c23c29f956da20221eeefb71cf6769da4b1d3131f3276270b7c91",

            "Created": "2020-01-07T13:39:41.191768706Z",

            "Scope": "local",

            "Driver": "bridge",

            "EnableIPv6": false,

            "IPAM": {

                "Driver": "default",

                "Options": {},

                "Config": [

                    {

                        "Subnet": "172.18.0.0/24"

                    }

                ]

            },

            "Internal": false,

            "Attachable": false,

            "Ingress": false,

            "ConfigFrom": {

                "Network": ""

            },

            "ConfigOnly": false,

            "Containers": {},

            "Options": {},

            "Labels": {}

        }

    ]

    >docker network rm pxc-net        [删除]      //暂时不执行

    5 创建3个volume---v1,v2,v3,给容器使用

    和删除volume

    >创建:docker volume create --name v1   

    [root@localhost ~]# docker volume create --name v1

    v1

    [root@localhost ~]# docker volume create --name v2

    v2

    [root@localhost ~]# docker volume create --name v3

    v3

    >创建结束后,查看:

           >ls查看:docker volume ls

           >查看详情:docker volume inspect v1

    [root@localhost ~]# docker volume ls

    DRIVER              VOLUME NAME

    local               2fe372cdcf2fe2c13592c81bde62bce81f379acc915a666b8f1c7eece60a4942

    local               mysql01_volume

    local               v1

    local               v2

    local               v3

    [root@localhost ~]# docker volume inspect v1

    [

        {

            "CreatedAt": "2020-01-07T13:43:28Z",

            "Driver": "local",

            "Labels": {},

            "Mountpoint": "/var/lib/docker/volumes/v1/_data",

            "Name": "v1",

            "Options": {},

            "Scope": "local"

        }

    ]

    >删除:docker volume rm v1  【暂不执行】

    06 创建PXC【集群】容器demo

        [CLUSTER_NAME PXC集群名字]   

    [XTRABACKUP_PASSWORD数据库同步需要用到的密码]

    》创建第一个容器

    docker run -d -p 3301:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=wffix -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=wffix --privileged --name=node1 --net=pxc-net --ip 172.18.0.2 pxc   

    >查看container

           >docker ps

           >进入mysql容器:docker exec -it node1 bash

           >登录mysql:mysql -uroot -pwffix

    》再创建两个容器

           端口:volume:name:网段----3302:v2 :node2: 172.18.0.3

           端口:volume:name:网段----3303:v3: node3: 172.18.0.4

    docker run -d -p 3302:3306 -v v2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=wffix -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=wffix --privileged --name=node2 --net=pxc-net --ip 172.18.0.3 pxc  

          

    docker run -d -p 3303:3306 -v v3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=wffix -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=wffix --privileged --name=node3 --net=pxc-net --ip 172.18.0.4 pxc    

    07.使用mysql客户端进行连接测试

           这里使用navcat或使用idea

     

    测试第三个mysql:

    当都连接成功后,需要验证是否是集群:

    在node1中新建库db_test,然后查看node2,node3是否同步创建?

     

    可以发现,并没有同步。原因是:当创建容器时,3个节点并没有进行集群设置,它们只是3个独立的节点,3个容器是不通的,没有融入到一个集群中。

    所以,当创建容器时,需要设置让node2,node3加入到node1容器中。

    现在,删掉3个节点,重新创建节点:

    [root@localhost ~]# docker rm -f node2

    [root@localhost ~]# docker rm -f node3

    8.真正集群布署

    >创建第一个节点

    docker run -d -p 3301:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=wffix -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=wffix --privileged --name=node1 --net=pxc-net --ip 172.18.0.2 pxc

    >创建第二个节点,加入node1

    docker run -d -p 3302:3306 -v v2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=wffix -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=wffix -e CLUSTER_JOIN=node1 --privileged --name=node2 --net=pxc-net --ip 172.18.0.3 pxc                

    >创建第三个节点,加入node1

    docker run -d -p 3303:3306 -v v3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=wffix -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=wffix -e CLUSTER_JOIN=node1 --privileged --name=node3 --net=pxc-net --ip 172.18.0.4 pxc   

     (3)MySQL工具连接测试       

    Jetbrains Datagrip-

     

    说明:

           可以发现,集群布署成功。

    5.1.3.数据库的负载均衡

           负载均衡器:ngnix 或haproxy

    (1)拉取haproxy的镜像

           >docker pull haproxy

    (2)创建haproxy配置文件,这里使用bind mounting的方式

           > touch /tmp/haproxy/haproxy.cfg

           》如果目录不存在,先创建目录,再touch

           >mkdir -p /tmp/haproxy

           > cd /tmp/haproxy/

           >touch haproxy.cfg

    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.18.0.2:3306 check weight 1 maxconn 2000     

    server MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000     

    server MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000    

    #使用keepalive检测死链   

    option tcpka

    (3)创建haproxy容器

           > docker run -it -d -p 8888:8888 -p 3306:3306 -v /tmp/haproxy:/usr/local/etc/haproxy --name haproxy01 --privileged --net=pxc-net haproxy

     

    (4)浏览器访问:

           >访问haproxy的监控平台:http://centos_ip:8888/dbs_monitor

           用户名密码都是:admin

     

     

    http://30.50.36.30:8888/dbs_monitor

     

    >连接代理数据库【虚假的数据库】

    连接失败,原因是:

     

    Haproxy需要配置文件haproxy.cfg没有生效,因为它没有启动。

     

    》进入haproxy容器,查看配置文件:

    [root@localhost haproxy]# docker exec -it haproxy01 bash

    root@e4929c87912c:/# cd /usr/local/etc/haproxy/

    root@e4929c87912c:/usr/local/etc/haproxy# ls

    haproxy.cfg

    root@e4929c87912c:/usr/local/etc/haproxy# haproxy -f /usr/local/etc/haproxy/haproxy.cfg      //启动配置文件

     

    再次启动,仍然连接不成功,就需要进行问题排查:

    》docker inspect haproxy01-----检查存储

    》docker exec -it haproxy01 ping 172.18.0.2             //ping网络

    》需要给用户一个授权:

    (5)在MySQL数据库上创建用户,用于心跳检测

    CREATE USER 'haproxy'@'%' IDENTIFIED BY '';

     [小技巧[如果创建失败,可以先输入一下命令]:  

                  drop user 'haproxy'@'%';   

    flush privileges;    

    CREATE USER 'haproxy'@'%' IDENTIFIED BY '';

    ]

    (6)连接代理数据库【虚假的数据库】

    ip:centos_ip

    port:3306

    user:root

    password:wffix

    5.2. Nginx+Spring Boot项目+MySQL

    5.2.1 网络

    (1)网络 docker network create --subnet=172.18.0.0/24 pro-net

    (2)网络划分

    mysql--172.18.0.6

    spring boot--172.18.0.11/12/13

    nginx--172.18.0.10

     

    5.2.2 MySQL

    (1)创建volume

    >docker volume create v1

    (2)创建mysql容器

    > docker run -d --name my-mysql -v v1:/var/lib/mysql -p 3301:3306 -e MYSQL_ROOT_PASSWORD=jack123 --net=pro-net --ip 172.18.0.6 mysql

    (3)datagrip连接,执行.mysql文件

    name:my-mysql

    ip:centos-ip

    端口:3301

    User:root

    password:wffix

    create schema db_gupao_springboot collate utf8mb4_0900_ai_ci;

    use db_gupao_springboot; create table t_user (   

    id int not null       

    primary key,   

    username varchar(50) not null,  

    password varchar(50) not null,   

    number varchar(100) not null

    );

    5.2.3 Spring Boot项目

    Spring Boot+MyBatis实现CRUD操作,名称为“springboot-mybatis”

    (1)在本地测试该项目的功能   

    主要是修改application.yml文件中数据库的相关配置

    (2)在项目根目录下执行mvn clean package打成一个jar包

    [记得修改一下application.yml文件数据库配置]

    mvn clean package -Dmaven.test.skip=true   

    在target下找到"springboot-mybatis-0.0.1-SNAPSHOT.jar.jar"

    (3)在docker环境中新建一个目录"springboot-mybatis"

    (4)上传"springboot-mybatis-0.0.1-SNAPSHOT.jar"到该目录下,并且在此目录创建Dockerfile

    (5)编写Dockerfile内容   

    FROM openjdk:8-jre-alpine    

    MAINTAINER itcrazy2016   

    LABEL name="springboot-mybatis" version="1.0" author="itcrazy2016"    

    COPY springboot-mybatis-0.0.1-SNAPSHOT.jar springboot-mybatis.jar    

    CMD ["java","-jar","springboot-mybatis.jar"]    

    (6)基于Dockerfile构建镜像   

    docker build -t sbm-image .

    (7)基于image创建container   

    docker run -d --name sb01 -p 8081:8080 --net=pro-net --ip 172.18.0.11 sbmimage   

    (8)查看启动日志

    docker logs sb01   

    (9)在win浏览器访问http://192.168.8.118:8081/user/listall

    5.2.3.1 网络问题

    因为sb01和my-mysql在同一个bridge的网段上,所以是可以互相ping通,比如:

    docker exec -it sb01 ping 172.18.0.6

    or

    docker exec -it sb01 ping my-mysql

    so? application.yml文件不妨这样修改一下?也就是把ip地址直接换成容器的名字

    url: jdbc:mysql://my-mysql/db_gupao_springboot?

    5.2.3.2 创建多个项目容器

    docker run -d --name sb01 -p 8081:8080 --net=pro-net --ip 172.18.0.11 sbm-image

    docker run -d --name sb02 -p 8082:8080 --net=pro-net --ip 172.18.0.12 sbm-image

    docker run -d --name sb03 -p 8083:8080 --net=pro-net --ip 172.18.0.13 sbm-image

    5.2.4 Nginx

    (1)在centos的/tmp/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.18.0.11:8080;      

     server 172.18.0.12:8080;       

    server 172.18.0.13:8080;  

     }   

    include /etc/nginx/conf.d/*.conf;

     }

    (2)创建nginx容器 注意 :先在centos7上创建/tmp/nginx目录,并且创建nginx.conf文件,写上内容

    docker run -d --name my-nginx -p 80:80 -v /tmp/nginx/nginx.conf:/etc/nginx/nginx.conf --network=pro-net --ip 172.18.0.10 nginx

    (3)win浏览器访问: ip[centos]/user/listall

    思考 :若将172.18.0.11/12/13改成sb01/02/03是否可以?

  • 相关阅读:
    html5图片异步上传/ 表单提交相关
    node 常用命令
    windows下 nvm下载node被墙了解决办法
    36.迷宫(广度优先搜索)
    36.迷宫(广度优先搜索)
    35.大质数
    35.大质数
    35.大质数
    35.大质数
    35.大质数
  • 原文地址:https://www.cnblogs.com/wfdespace/p/12671655.html
Copyright © 2020-2023  润新知