1.4 Docker网络并自己的项目部署流程

Dcoker默认网络模式

image-20211230201743852

Docker默认提供了四个网络模式,说明:

  1. bridge:容器默认的网络是桥接模式(自己搭建的网络默认也是使用桥接模式,启动容器默认也是使用桥接模式)。此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。
  2. none:不配置网络,容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。
  3. host:容器和宿主机共享Network namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
  4. container:创建的容器不会创建自己的网卡,配置自己的IP容器网络连通。容器和另外一个容器共享Network namespace(共享IP、端口范围)。

容器默认使用bridge网络模式,我们使用该docker run --network=选项指定容器使用的网络:

bridge模式:使用 --net=bridge 指定,默认设置。

none模式:使用 --net=none 指定。

host模式:使用 --net=host 指定。

container模式:使用 --net=container:NAME_or_ID 指定。

host模式

如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。Host模式的模型图,如下图所示:

在这里插入图片描述

container模式

这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。Container模式模型示意图如下:

在这里插入图片描述

none模式

使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。

这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过–network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。

None模式示意图:

在这里插入图片描述

bridge模式

当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。

bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。bridge模式如下图所示:

在这里插入图片描述

Docker容器完成bridge网络配置的过程如下:

  1. 在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。
  2. Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在主机中,以veth65f9这样类似的名字命名,并将这个网络设备加入到docker0网桥中。
  3. 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。

示例见下自定义网络

自定义网络

在这里插入图片描述

  1. 创建自己的网络
[root@iZ70eyv5ttqkcsZ ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
ee8ffcd2dc2705d5979ee85b4fead8774f240b056e04d9572f7cbd2d63a67b21
[root@iZ70eyv5ttqkcsZ ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
b8ea21e99b8a        bridge              bridge              local
92d4ae51b461        host                host                local
ee8ffcd2dc27        mynet               bridge              local
fb8882d50635        none                null                local

#网络类型
--driver bridge
#创建一个子网掩码为
--subnet 192.168.0.0/16  
#设置网关
--gateway 192.168.0.1


#查看网络配置
[root@iZ70eyv5ttqkcsZ ~]# docker network inspect ee8ffcd2dc27
[
    {
        "Name": "mynet",
        "Id": "ee8ffcd2dc2705d5979ee85b4fead8774f240b056e04d9572f7cbd2d63a67b21",
        "Created": "2021-12-30T18:22:07.420759386+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

  1. 运行两个容器之后查看自定义网络mynet的属性变化
[root@iZ70eyv5ttqkcsZ ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
f3b437f89894a651fc44be699eebea62ef30de68e6ea1119dd4bb55f438e1118
[root@iZ70eyv5ttqkcsZ ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat
e1be42d908939a183d2032cb03d96b05bdcc1d7ec2c5ff527ad8e3cc27911c07

[root@iZ70eyv5ttqkcsZ ~]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "ee8ffcd2dc2705d5979ee85b4fead8774f240b056e04d9572f7cbd2d63a67b21",
        "Created": "2021-12-30T18:22:07.420759386+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Containers": {
            "e1be42d908939a183d2032cb03d96b05bdcc1d7ec2c5ff527ad8e3cc27911c07": {
                "Name": "tomcat-net-02",
                "EndpointID": "42f3b8a0435805129aeb3af77a92a61878d688338433feb319f52b97fa90ce33",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            },
            "f3b437f89894a651fc44be699eebea62ef30de68e6ea1119dd4bb55f438e1118": {
                "Name": "tomcat-net-01",
                "EndpointID": "c5e0099c3c1006c413bcc94567bebfd792445ce24c17c3ffb43e0f892327eb37",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

说明:

Tomcat01和Tomcat02都使用公用的路由器docker0。所有的容器不指定网络下,都是由docker0路由的,Docker会给我们容器默认分配一个随机的可用IP地址。

通过容器名进行ping命令

[root@iZ70eyv5ttqkcsZ ~]# docker exec -it tomcat-net-01  ping tomcat-net-02
PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.064 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.062 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.061 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.079 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=5 ttl=64 time=0.077 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=6 ttl=64 time=0.067 ms

容器网络互联的通用模型,如下图所示:

在这里插入图片描述

当Docker的容器被删除,对应网桥也会被删除

Docker网络之间的互联

没有设置的情况下,不同网络间的容器是无法进行网络连接的。如图,两个不同的网络docker0和自定义网络mynet的网络模型图:

在这里插入图片描述

两个不同网段下的容器通信

我们下面创建两个tomcat容器tomcat-01和tomcat-02使用默认网卡Docker0

 docker run -d -P --name tomcat-01 tomcat
 docker run -d -P --name tomcat-02 tomcat

在这里插入图片描述

可以看到是无法网络连接的。不同Docker网络之间的容器需要连接的话需要把作为调用方的容器注册一个ip到被调用方所在的网络上。需要使用docker connect命令。

[root@iZ70eyv5ttqkcsZ ~]# docker network connect mynet tomcat-01
#将tomcat-01链接到mynet上


[root@iZ70eyv5ttqkcsZ ~]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "ee8ffcd2dc2705d5979ee85b4fead8774f240b056e04d9572f7cbd2d63a67b21",
        "Created": "2021-12-30T18:22:07.420759386+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Containers": {
            "3138d21c6e47d7727eb6c3982b19ca0573d7f8d8fc960f3592d160003cbb177e": {
                "Name": "tomcat-01",
                "EndpointID": "b45309e7f4da448a8d188bb014d6362445ca5cddcef1698b646e9a39740a8b40",
                "MacAddress": "02:42:c0:a8:00:04",
                "IPv4Address": "192.168.0.4/16",
                "IPv6Address": ""
            },#可以看出来给tomcat-01分配了一个ip地址
            "819770bc3e10810985d1e858053d9a2101a4afd42664216789649c3c41f9dd6b": {
                "Name": "tomcat01",
                "EndpointID": "36d468dd2c0eb4eb780471f98307a6d176d10304835c511751f32b316d03a3f5",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            },
            "921599eef5da0b4eeb61d095f8e4b163c68b02af7ae51050071bc3cef1c2ad77": {
                "Name": "tomcat02",
                "EndpointID": "c664d5b38824527d1def4dde262bb3180ad2ad2283af09a836a22a3a77f9f359",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

redis集群部署

  1. 创建一个redis网络
docker network create redis_net --subnet 172.38.0.0/16

[root@iZ70eyv5ttqkcsZ ~]# docker network inspect 779f547ec0e9
[
    {
        "Name": "redis_net",
        "Id": "779f547ec0e9b34a319e8519b9c22ec6e2f8c71638976adeddfd47f3890a882e",
        "Created": "2021-12-30T21:26:02.452272681+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.38.0.0/16"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

  1. 通过以下脚本创建6个redis集群:
for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379 
bind 0.0.0.0
cluster-enabled yes 
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

  1. 创建6个redis容器
#第1个Redis容器
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
    -v /mydata/redis/node-1/data:/data \
    -v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
    -d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#第2个Redis容器
docker run -p 6372:6379 -p 16372:16379 --name redis-2 \
    -v /mydata/redis/node-2/data:/data \
    -v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
    -d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#第3个Redis容器
docker run -p 6373:6379 -p 16373:16379 --name redis-3 \
    -v /mydata/redis/node-3/data:/data \
    -v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
    -d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#第4个Redis容器
docker run -p 6374:6379 -p 16374:16379 --name redis-4 \
    -v /mydata/redis/node-4/data:/data \
    -v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
    -d --net redis --ip 172.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#第5个Redis容器
docker run -p 6375:6379 -p 16375:16379 --name redis-5 \
    -v /mydata/redis/node-5/data:/data \
    -v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
    -d --net redis --ip 172.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#第6个Redis容器
docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
    -v /mydata/redis/node-6/data:/data \
    -v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
    -d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

  1. 进入redis-1容器进行设置集群
#进入redis-1容器,通过/bin/sh进入 没有bin/bash
docker exec -it redis-1 /bin/sh

/data # redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1

>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.38.0.15:6379 to 172.38.0.11:6379
Adding replica 172.38.0.16:6379 to 172.38.0.12:6379
Adding replica 172.38.0.14:6379 to 172.38.0.13:6379
M: e4222a3c94850bd1bd059d3c3d723d7b506889c4 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
M: 4e73d13b08b002656b98c5469708499af4b063ec 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
M: 44bd724d0004ffd7224279a6cd6c79711cb11616 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
S: c7f852962a48a82287f84b0f3b7a5e0c1388e598 172.38.0.14:6379
   replicates 44bd724d0004ffd7224279a6cd6c79711cb11616
S: f047a2ac74d6edbdec4cdddf1cc021474fdc24ae 172.38.0.15:6379
   replicates e4222a3c94850bd1bd059d3c3d723d7b506889c4
S: 10e6b9572c964c5e4d52e1a77f5fa89bcfaae4c8 172.38.0.16:6379
   replicates 4e73d13b08b002656b98c5469708499af4b063ec
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
...
>>> Performing Cluster Check (using node 172.38.0.11:6379)
M: e4222a3c94850bd1bd059d3c3d723d7b506889c4 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 4e73d13b08b002656b98c5469708499af4b063ec 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 10e6b9572c964c5e4d52e1a77f5fa89bcfaae4c8 172.38.0.16:6379
   slots: (0 slots) slave
   replicates 4e73d13b08b002656b98c5469708499af4b063ec
S: c7f852962a48a82287f84b0f3b7a5e0c1388e598 172.38.0.14:6379
   slots: (0 slots) slave
   replicates 44bd724d0004ffd7224279a6cd6c79711cb11616
M: 44bd724d0004ffd7224279a6cd6c79711cb11616 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: f047a2ac74d6edbdec4cdddf1cc021474fdc24ae 172.38.0.15:6379
   slots: (0 slots) slave
   replicates e4222a3c94850bd1bd059d3c3d723d7b506889c4
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
  1. 进入redis查看集群信息
/data # redis-cli -c
127.0.0.1:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6 //六个集群
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:141
cluster_stats_messages_pong_sent:145
cluster_stats_messages_sent:286
cluster_stats_messages_ping_received:140
cluster_stats_messages_pong_received:141
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:286

  1. 查看集群节点的主从关系
127.0.0.1:6379> cluster nodes
4e73d13b08b002656b98c5469708499af4b063ec 172.38.0.12:6379@16379 master - 0 1640871895601 2 connected 5461-10922
10e6b9572c964c5e4d52e1a77f5fa89bcfaae4c8 172.38.0.16:6379@16379 slave 4e73d13b08b002656b98c5469708499af4b063ec 0 1640871896635 6 connected
c7f852962a48a82287f84b0f3b7a5e0c1388e598 172.38.0.14:6379@16379 slave 44bd724d0004ffd7224279a6cd6c79711cb11616 0 1640871895000 4 connected
44bd724d0004ffd7224279a6cd6c79711cb11616 172.38.0.13:6379@16379 master - 0 1640871896000 3 connected 10923-16383
f047a2ac74d6edbdec4cdddf1cc021474fdc24ae 172.38.0.15:6379@16379 slave e4222a3c94850bd1bd059d3c3d723d7b506889c4 0 1640871897151 5 connected
e4222a3c94850bd1bd059d3c3d723d7b506889c4 172.38.0.11:6379@16379 myself,master - 0 1640871896000 1 connected 0-5460

  1. 设置一个key a 值为 b
127.0.0.1:6379> set a b
-> Redirected to slot [15495] located at 172.38.0.13:6379
OK
  1. 停止对应主节点的redis容器,验证集群效果
[root@iZ70eyv5ttqkcsZ conf]# docker stop redis-3
redis-3

#可以看出是从172.38.0.14:6379他的子节点取出的数据
127.0.0.1:6379> get a
-> Redirected to slot [15495] located at 172.38.0.14:6379
"b"
#172.38.0.13:6379主节点已经被判定为fail状态,经过选举他的子节点172.38.0.14:6379成为了master,从中查询出了
172.38.0.14:6379> cluster nodes
c7f852962a48a82287f84b0f3b7a5e0c1388e598 172.38.0.14:6379@16379 myself,master - 0 1640872271000 8 connected 10923-16383
44bd724d0004ffd7224279a6cd6c79711cb11616 172.38.0.13:6379@16379 master,fail - 1640872163186 1640872162568 3 connected
e4222a3c94850bd1bd059d3c3d723d7b506889c4 172.38.0.11:6379@16379 master - 0 1640872271000 1 connected 0-5460
4e73d13b08b002656b98c5469708499af4b063ec 172.38.0.12:6379@16379 master - 0 1640872272539 2 connected 5461-10922
f047a2ac74d6edbdec4cdddf1cc021474fdc24ae 172.38.0.15:6379@16379 slave e4222a3c94850bd1bd059d3c3d723d7b506889c4 0 1640872272000 5 connected
10e6b9572c964c5e4d52e1a77f5fa89bcfaae4c8 172.38.0.16:6379@16379 slave 4e73d13b08b002656b98c5469708499af4b063ec 0 1640872272130 2 connected

SpringBoot微服务打包Docker发布

  1. 创建一个SpringBoot项目

image-20211230224233488

  1. 编写contorller类
package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello(){
        return "hello,world";
    }
}
  1. 编写Dcokerfile
FROM java:8

COPY *.jar /app.jar

CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
  1. 打包为jar包并将jar包和Dockerfile文件一起放在linux某一个文件夹中,我放在了/home/idea中

    image-20211230224546078

  2. build一个镜像并运行

docker build -t demo .

docker run -d -p 8080:8080 --name demo-springboot-web demo


[root@iZ70eyv5ttqkcsZ idea]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
86dab60c2b20        demo                "java -jar /app.ja..."   3 seconds ago       Up 2 seconds        0.0.0.0:8080->8080/tcp   demo-springboot-web

运行结果

image-20211230225050666

测试:tomcat+mysql+jdk1.8部署成语接龙项目;

创建一个docker网络用于容器通信

#前文创建过了子网掩码为192.168.0.0/16
#网关为192.168.0.1
[root@iZ70eyv5ttqkcsZ ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

#下面mynet详细信息中可以看出mysql容器的ip为192.168.0.2,tomcat的为192.168.0.3

[root@iZ70eyv5ttqkcsZ classes]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
b8ea21e99b8a        bridge              bridge              local
92d4ae51b461        host                host                local
ee8ffcd2dc27        mynet               bridge              local
fb8882d50635        none                null                local
c619a62c8c7b        redis               bridge              local
[root@iZ70eyv5ttqkcsZ classes]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "ee8ffcd2dc2705d5979ee85b4fead8774f240b056e04d9572f7cbd2d63a67b21",
        "Created": "2021-12-30T18:22:07.420759386+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Containers": {
            "2ca9d202e2bd62144d5d8761469bde5dad3c7fa9c39f80123006e793a649085b": {
                "Name": "yjwtomcat",
                "EndpointID": "8f8e4efb39041394e3813c0588babee32adfec236ba55280a73f34554ab9928d",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            },
            "60c29708128ae9633b6af4a3d052cf40a5fb683da52a5c20ba10882d7f11f00d": {
                "Name": "mysqltest",
                "EndpointID": "73cd7e30a7638375fb9f30bcebdf1904267eee2bbacc38217991ba3ded736c4b",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

mysql的dockerfile编写

FROM mysql:5.7
MAINTAINER yjw_mysql:5.7

VOLUME /home/mysql/conf:/etc/mysql/conf
VOLUME /home/mysql/data:/var/lib/mysql

ENV MYSQL_ROOT_PASSWORD 1234

EXPOSE 3306

tomcat的Dockerfile文件的编写

FROM centos
MAINTAINER yjw

COPY readme.txt /usr/local/readme.txt
ADD jdk-8u181-linux-x64.tar.gz.gz /usr/local
ADD apache-tomcat-8.5.73.tar.gz /usr/local
RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_181

ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.73
ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.73
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080
CMD /usr/local/apache-tomcat-8.5.73/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.73/logs/catalina.out

#docker build
docker build -t yjwtomcat:1.0 .
docker run -d -p3306:3306 -v /home/mysql/conf:/etc/mysql/conf -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 --name mysqltest --net mynet mysql:5.7


docker run -d -p 8080:8080 --name yjwtomcat --net mynet -v /home/newtomcat/webapps:/usr/local/apache-tomcat-8.5.73/webapps/ -v /home/newtomcat/logs/:/usr/local/apache-tomcat-8.5.73/logs yjwtomcat

数据库的导入

mysql sql.db语句版本 5.1.47

通过mysql -u用户名 -p 密码 < 数据库文件.sql进行数据库的导入

因为数据库编码为Latin1中文会出现编码,需要将数据库的默认编码改为utf-8

  1. 首先登录数据库
  2. show variables like ‘character%’; 查询数据库编码
+--------------------------+----------------------------+

| Variable_name | Value |

+--------------------------+----------------------------+

| character_set_client | latin1 |

| character_set_connection | latin1 |

| character_set_database | latin1 |

| character_set_filesystem | binary |

| character_set_results | latin1 |

| character_set_server | latin1 |

| character_set_system | utf8 |

| character_sets_dir | /usr/share/mysql/charsets/ |

+--------------------------+----------------------------+
  • character_set_client为客户端编码方式;
  • character_set_connection为建立连接使用的编码;
  • character_set_database数据库的编码;
  • character_set_results结果集的编码;
  • character_set_server数据库服务器的编码

要保证其中四个采用的编码都相同,就不会出现乱码问题

2、linux系统下,修改MySQL数据库默认编码的步骤为:

  • 停止MySQL的运行

/etc/init.d/mysql start (stop) 为启动和停止服务器

  • MySQL主配置文件为my.cnf,一般目录为/etc/mysql

  • var/lib/mysql/ 放置的是数据库表文件夹,这里的mysql相当于windows下mysql的date文件夹

当我们需要修改MySQL数据库的默认编码时,需要编辑my.cnf文件进行编码修改,在linux下修改mysql的配置文件my.cnf,文件位置默认/etc/my.cnf文件

  • 找到客户端配置[client] 在下面添加

default-character-set=utf8 默认字符集为utf8

  • 在找到[mysqld] 添加

default-character-set=utf8 默认字符集为utf8

init_connect=‘SET NAMES utf8’ (设定连接mysql数据库时使用utf8编码,以让mysql数据库为utf8运行)

  • 修改好后,重新启动mysql 即可,重新查询数据库编码可发现编码方式的改变:
show variables like 'character%';

+--------------------------+----------------------------+

| Variable_name | Value |

+--------------------------+----------------------------+

| character_set_client | utf8 |

| character_set_connection | utf8 |

| character_set_database | utf8 |

| character_set_filesystem | binary |

| character_set_results | utf8 |

| character_set_server | utf8 |

| character_set_system | utf8 |

| character_sets_dir | /usr/share/mysql/charsets/ |

项目文件打包

通过maven打包为war文件

放在挂载的文件夹/home/newtomcat/webapps,容器就可以解压缩,

修改项目中的数据库连接池配置文件

/home/newtomcat/webapps/jielong/WEB-INF/classes路径下的c3p0-config.xml jdbcUrl字段中的ip地址需要修改为mysql容器的地址

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <!--默认配置-->
    <default-config>
        <property name="initialPoolSize">10</property>
        <property name="maxIdleTime">30</property>
        <property name="maxPoolSize">100</property>
        <property name="minPoolSize">10</property>
        <property name="maxStatements">200</property>
    </default-config>

    <!--配置连接池mysql-->
    <named-config name="mysql">
        <property name="driverClass">com.mysql.jdbc.Driver</property>
<!--        <property name="jdbcUrl">jdbc:mysql://localhost/jielong?useUnicode=true&amp;characterEncoding=UTF-8</property>-->
        <property name="jdbcUrl">jdbc:mysql://192.168.0.2:3306/jielong?useUnicode=true&amp;characterEncoding=UTF-8</property>
        <property name="useUnicode">true</property>
        <property name="characterEncoding">UTF-8</property>
        <property name="user">root</property>
        <property name="password">1234</property>
        <property name="initialPoolSize">10</property>
        <property name="maxIdleTime">30</property>
        <property name="maxPoolSize">100</property>
        <property name="minPoolSize">10</property>
        <property name="maxStatements">200</property>
        <property name="testConnectionOnCheckin">true</property>
    </named-config>

    <!--配置连接池2-->
    ......
</c3p0-config>

image-20211231112144043

参考:(2条消息) mysql 修改编码方式_查看修改mysql编码方式_一枚老徐的博客-CSDN博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值