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

docker 容器重命名 docker容器名称代替ip_docker 容器重命名


2、修改主机名

vim /etc/sysconfig/network
[root@daison ~]# cat /etc/sysconfig/network
# Created by anaconda
NETWORKING_IPV6=no
PEERNTP=no
HOSTNAME=daison
[root@daison ~]#

docker 容器重命名 docker容器名称代替ip_dns服务器_02


hostnamectl set-hostname daison #立即生效

docker 容器重命名 docker容器名称代替ip_dns服务器_03


3、修改ip域名映射

vim /etc/hosts

docker 容器重命名 docker容器名称代替ip_redis_04

部署服务

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#

docker 容器重命名 docker容器名称代替ip_redis_05


3、修改本地host配置

C:\Windows\System32\drivers\etc\hosts

docker 容器重命名 docker容器名称代替ip_docker 容器重命名_06


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#

docker 容器重命名 docker容器名称代替ip_docker 容器重命名_07


查看网络可以看到,使用bridge模式,自动生成ip地址为172.17.0.2。

docker 容器重命名 docker容器名称代替ip_docker 容器重命名_08