目录

docker创建专有网卡

docker创建专有网卡

需求:

tomcat容器需要通过jdbc模块连接数据库mysql,配置文件如果指定IP地址mysql容器一旦损坏,IP地址就会更改,需要将mysql容器IP固定。这样就不用每次更改tomcat配置文件了。

专有网卡创建

新创建一个名为myapp的桥接网卡

1
docker network create myapp

使用--network-alias参数给网卡起别名,启动MySQL容器。

1
2
3
4
5
6
7
8
9
docker run -d \
     --network myapp --network-alias mysql1 \
     --name=mysql57-test \
     -p 33306:3306 \
     -v /tmpdisk/test2:/var/lib/mysql \
     -v /etc/localtime:/etc/localtime:ro \
     -e MYSQL_ROOT_PASSWORD=123456 \
     -e MYSQL_DATABASE=todos \
     mysql:5.7

注意:这里创建的mysql容器使用myapp 网卡,分配的IP自动和mysql1 网卡别名绑定,后面创建的容器只要使用同一个网卡创建的,都可以和mysql容器互通。

如何证明呢?

使用nicolaka/netshoot镜像创建一个测试容器

1
docker run -it --name test --network myapp nicolaka/netshoot

可以直接和mysql容器通信

1
2
3
4
62337a7ad7f1# ping mysql1 
PING mysql1 (172.20.0.5) 56(84) bytes of data.
64 bytes from mysql57-test.myapp (172.20.0.5): icmp_seq=1 ttl=64 time=0.042 ms
64 bytes from mysql57-test.myapp (172.20.0.5): icmp_seq=2 ttl=64 time=0.020 ms

查看解析,发现一条A记录。正是这条记录将myapp网卡自动分配的ip和网卡别名mysql1绑定。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
62337a7ad7f1# dig mysql1 

; <<>> DiG 9.18.11 <<>> mysql1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10768
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;mysql1.				IN	A

;; ANSWER SECTION:
mysql1.			600	IN	A	172.20.0.5

;; Query time: 0 msec
;; SERVER: 127.0.0.11#53(127.0.0.11) (UDP)
;; WHEN: Wed Feb 22 01:36:59 UTC 2023
;; MSG SIZE  rcvd: 46

创建tomcat容器

1
2
3
4
5
6
7
8
docker run -itd \
    -p 28080:8080 \
    --restart=always \ 
    --name tomcat-test \ 
    --network myapp \
    -v /tmpdisk/tomcat-test2/webapps:/usr/local/tomcat/webapps \
    -v /etc/localtime:/etc/localtime:ro \
    tomcat:9.0.56

更改jdbc连接配置,将localhost改成mysql1

1
2
3
4
旧:
jdbc:mysql://localhost:3306/jt_ow_dbsync_src?useUnicode=true&amp;characterEncoding=UTF-8&amp;useSSL=false
新:
jdbc:mysql://mysql1:3306/jt_ow_dbsync_src?useUnicode=true&amp;characterEncoding=UTF-8&amp;useSSL=false

测试

测试内容:mysql容器IP更改后,会不会影响业务访问。

**查看当前mysql 容器IP**

1
2
3
4
[root@HZ ~]$ docker inspect mysql57-test | grep -i ipaddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.20.0.5",

删除容器

1
docker rm -f mysql57-test

重新创建新容器

1
docker run -itd --name test2 --network myapp busybox

再创建mysql容器

1
2
3
4
5
6
7
8
9
docker run -d \
     --network myapp --network-alias mysql1 \
     --name=mysql57-test \
     -p 33306:3306 \
     -v /tmpdisk/test2:/var/lib/mysql \
     -v /etc/localtime:/etc/localtime:ro \
     -e MYSQL_ROOT_PASSWORD=123456 \
     -e MYSQL_DATABASE=todos \
     mysql:5.7

再次查看mysql容器IP

1
2
3
4
[root@HZ ~]$ docker inspect mysql57-test | grep -i ipaddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.20.0.6",

访问业务,发现业务访问正常。所以完美实现了mysql容器内部IP变更后不会影响业务。

警告
本文最后更新于 February 22, 2023,文中内容可能已过时,请谨慎使用。