docker 容器使用dns方式替代ip部署springcloud项目
- docker 容器使用dns方式替代ip部署springcloud项目
- docker网络模式
- 通过host模式部署
- 网络配置
- 部署服务
- 通过桥接模式部署
项目需求:
目前开发的项目都是使用ip地址进行服务部署,实施人员反馈,该种方式增加他们在客户现场部署的困难,每次客户现场ip改动需要调整所有服务,对于不太熟悉的同事,部署一个项目设计到N多服务需要启动及查看,不容易排查服务问题,故我们修改为通过dns方式部署。同时兼容客户现场部署场景,例如我们只需要在公司部署好服务,直接将服务器安装到客户现场,链接网络后启动服务即可使用,减少施工人员困难。
本文以开发springcloud项目实际部署为例,记录原有通过ip方式进行各服务组件直接的链接修改为通过域名方式,该种方式将改变原有项目ip部署带来的不便,提高项目部署及维护成本。
docker 容器使用dns方式替代ip部署springcloud项目
官网:https://docs.docker.com
docker命令:https://docs.docker.com/engine/reference/commandline/commit/
docker网络模式
docker安装后,默认有 bridge、host、Container、none 四种模式
Bridge:该模式启动容器后,会为每一个容器自动分配IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。
host:该模式启动容器不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
Container:该模式启动容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。
None:该模式关闭了容器的网络功能,适用于自定义网络协议开发等。
这里我们使用host、bridge模式分别以实际项目中使用redis为例介绍两种不同使用方式。
通过host模式部署
以上已经说明,host模式是和宿主机使用同一个网络,即相当于在宿主机直接部署,但是又有一些不同,网络是共享,其他是容器特有。以下以部署redis为例介绍。
网络配置
1、配置网络ip地址
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.0.87
PREFIX=24
GATEWAY=192.168.0.1
DNS1=8.8.8.8
IPV6_PRIVACY=no
UUID=c96bc909-188e-ec64-3a96-6a90982b08ad
2、修改主机名
vim /etc/sysconfig/network
[root@daison ~]# cat /etc/sysconfig/network
# Created by anaconda
NETWORKING_IPV6=no
PEERNTP=no
HOSTNAME=daison
[root@daison ~]#
hostnamectl set-hostname daison #立即生效
3、修改ip域名映射
vim /etc/hosts
部署服务
1、原有部署:
sudo docker run -dit --hostname redis --name redis -p 6379:6379 \
-v /home/data/redis/redis.conf:/etc/redis/redis.conf \
-v /home/data/redis/data:/data \
--restart=always --privileged=true \
redis:6.0.9 redis-server /etc/redis/redis.conf --appendonly yes
参数说明:
–hostname: 指定域名
-p 6379:6379:把容器内的6379端口映射到宿主机6379端口
-v /home/data/redis/redis.conf:/etc/redis/redis.conf:把宿主机配置好的redis.conf放到容器内的这个位置中
-v /home/data/redis/data:/data:把redis持久化的数据在宿主机内显示,做数据备份
redis-server /etc/redis/redis.conf:这个是关键配置,让redis不是无配置启动,而是按照这个redis.conf的配置启动
–appendonly yes:redis启动后数据持久化
该种方式模式使用bridge桥接模式,是不能直接访问宿主机网络,通过docker0桥接方式访问宿主机网络。例如要使用域名,宿主机就不能实现,故修改为通过host模式。
2、host网络模式部署
sudo docker run -dit --net=host --name redis \
-v /home/data/redis/redis.conf:/etc/redis/redis.conf \
-v /home/data/redis/data:/data \
--restart=always --privileged=true \
redis:6.0.9 redis-server /etc/redis/redis.conf --appendonly yes
host模式使用宿主机统一网络,不用声明端口映射,即使用的是宿主机的端口,该中方式使用域名可以直接访问容器。
参数说明:
–net=host:表示使用网络和宿主机共享,即和宿主机一个网络,该模式不需要声明端口
-p 6379:6379:把容器内的6379端口映射到宿主机6379端口
-v /home/data/redis/redis.conf:/etc/redis/redis.conf:把宿主机配置好的redis.conf放到容器内的这个位置中
-v /home/data/redis/data:/data:把redis持久化的数据在宿主机内显示,做数据备份
redis-server /etc/redis/redis.conf:这个是关键配置,让redis不是无配置启动,而是按照这个redis.conf的配置启动
–appendonly yes:redis启动后数据持久化
登录服务器验证:
[root@daison rabbitmq]#
[root@daison rabbitmq]# sudo docker exec -it redis bash
root@daison:/data#
#通过域名链接redis容器
root@daison:/data# redis-cli -h daison -p 6379 -a Dszn@2020
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
daison:6379>
daison:6379> keys *
(empty array)
daison:6379> quit
root@daison:/data#
#通过ip地址链接redis容器
root@daison:/data# redis-cli -h 192.168.0.87 -p 6379 -a Dszn@2020
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.0.87:6379>
192.168.0.87:6379> keys *
(empty array)
192.168.0.87:6379> set name wangwu
OK
192.168.0.87:6379> get name
"wangwu"
192.168.0.87:6379> quit
root@daison:/data#
3、修改本地host配置
C:\Windows\System32\drivers\etc\hosts
3、修改项目配置
在项目中使用时,直接使用域名链接,示例如下:
spring:
#redis config
redis:
open: false # 是否开启redis缓存 true开启 false关闭
#redis使用数据库
database: 1
#通过域名链接
host: daison
#端口
port: 6379
#密码,默认为空
password: 123456
# 连接超时时长(毫秒)
timeout: 120s
jedis:
pool:
# 连接池最大连接数(使用负值表示没有限制)
max-active: 1000
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
# 连接池中的最大空闲连接
max-idle: 10
# 连接池中的最小空闲连接
min-idle: 5
通过桥接模式部署
这里还是以redis部署为例:
sudo docker run -dit --add-host=daison:192.168.0.87 --hostname redis --name redis -p 6379:6379
-v /home/data/redis/redis.conf:/etc/redis/redis.conf
-v /home/data/redis/data:/data
–restart=always --privileged=true
redis:6.0.9 redis-server /etc/redis/redis.conf --appendonly yes
参数说明:
–add-host=daison:192.168.0.87:表示将主机域名和ip映射添加到容器中的/etc/hosts文件中,这样在容器中就可以直接通过域名或者ip进行访问外部网络。
–hostname: 指定域名
-p 6379:6379:把容器内的6379端口映射到宿主机6379端口
-v /home/data/redis/redis.conf:/etc/redis/redis.conf:把宿主机配置好的redis.conf放到容器内的这个位置中
-v /home/data/redis/data:/data:把redis持久化的数据在宿主机内显示,做数据备份
redis-server /etc/redis/redis.conf:这个是关键配置,让redis不是无配置启动,而是按照这个redis.conf的配置启动
–appendonly yes:redis启动后数据持久化
启动服务测试:
[root@daison ~]#
[root@daison ~]# docker exec -it redis bash
root@28c88ea243dc:/data# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.0.87 daison
172.17.0.2 28c88ea243dc
root@28c88ea243dc:/data#
root@28c88ea243dc:/data# redis-cli -h daison -p 6379 -a Dszn@2020
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
daison:6379> keys *
1) "name"
daison:6379> quit
root@28c88ea243dc:/data#
root@28c88ea243dc:/data# redis-cli -h 192.168.0.87 -p 6379 -a Dszn@2020
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.0.87:6379>
192.168.0.87:6379> keys *
1) "name"
192.168.0.87:6379> quit;
(error) ERR unknown command `quit;`, with args beginning with:
192.168.0.87:6379> quit
root@28c88ea243dc:/data#
查看网络可以看到,使用bridge模式,自动生成ip地址为172.17.0.2。