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&characterEncoding=UTF-8&useSSL=false
新:
jdbc:mysql://mysql1:3306/jt_ow_dbsync_src?useUnicode=true&characterEncoding=UTF-8&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变更后不会影响业务。