Docker使用Link与newwork在容器之间创建链接

一,使用 --link容器互联 html

docker 默认使容许container 互通的(经过-icc=false 关闭互通)同一个宿主机上的多个docker容器之间若是想进行通讯,能够经过使用容器的ip地址来通讯,也能够经过宿主机的ip加上容器暴露出的端口号来通讯,前者会致使ip地址的硬编码,不方便迁移,而且容器重启后ip地址会改变,除非使用固定的ip,后者的通讯方式比较单一,只能依靠监听在暴露出的端口的进程来进行有限的通讯。经过docker的link机制能够经过一个name来和另外一个容器通讯,link机制方便了容器去发现其它的容器而且能够安全的传递一些链接信息给其它的容器。 node

格式 -link name:alias 命令链接指定container web

1,建立并启动一个被链接的容器spring

docker run --name mypostgres_merry -d -p 5432:5432 -e POSTGRES_PASSWORD=123456 -e PGDATA=/data/ -e POSTGRES_USER=admin -e POSTGRES_DB=my_db postgres

 查看容器名称 docker pssql

2,修改主程序配置文件docker

# 生产配置
server:
  port: 8081
spring:
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
        jdbc:
          lob:
            non_contextual_creation: true
  datasource:
    driverClassName: org.postgresql.Driver
    url: jdbc:postgresql://db:5432/my_db
    username: admin
    password: 123456
    initialization-mode: always #执行根目录下面data.sql初始化数据
    continue-on-error: false

3,启动主程序并链接到另外一个容器数据库

docker run -d --name web --link mypostgres_merry:db -p 8081:8081 ejiyuan/demo-docker

 注意,link后面的名字要必须是一个存在的容器名称(与上图中NAMES一致)冒号后面的别名为容器内部识别名称,别名要与主程序配置文件一致json

4,验证安全

登陆到容器网络

docker exec -it node /bin/sh

执行 env 查看环境变量(或者使用: docker exec 16087e0f620a env),包含db相关配置参数

执行 ping db 能够ping通

使用了link机制后,能够经过指定的名字来和目标容器通讯,这实际上是经过给/etc/hosts中加入名称和IP的解析关系来实现的,下面是名为web的容器中的/etc/hosts信息.

 

二,使用network互联

1,查看docker网络说明:

docker network ls

Docker内置这三个网络,运行容器时,你能够使用该--network标志来指定容器应链接到哪些网络。

1.1 Host:host至关于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址

1.2 Container:在理解了host模式后,这个模式也就好理解了。这个模式指定新建立的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新建立的容器不会建立本身的网卡,配置本身的IP,而是和一个指定的容器共享IP、端口范围等。一样,两个容器除了网络方面,其余的如文件系统、进程列表等仍是隔离的。两个容器的进程能够经过lo网卡设备通讯。

1.3 None:该模式将容器放置在它本身的网络栈中,可是并不进行任何配置。在容器并不须要网络(例如只须要写磁盘卷的批处理任务)使用该模式关闭了容器的网络功能。

1.4 Bridge:至关于Vmware中的Nat模式,容器使用独立network Namespace,并链接到docker0虚拟网卡(默认模式)。经过docker0网桥以及Iptables nat表配置与宿主机通讯;bridge模式是Docker默认的网络设置,此模式会为每个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器链接到一个虚拟网桥上,除非你使用该docker run --network=<NETWORK>选项指定,不然Docker守护程序默认将容器链接到此网络。

 2,查看容器网络配置

docker inspect 容器id

查看networks段配置

查看brigdge 网络配置

docker network inspect bridge

结果以下:

3,建立网络

docker network create --driver bridge new_net_1

--driver为网络类型,后面“new_net_1”为网络名称,默认为bridge能够不指定--driver bridge

经过network inspect再次查看网络

经过 inspect 查看,分配了一个新的ip段

4,启动服务加入网络

docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=123456 -e PGDATA=/data/ -e POSTGRES_USER=admin -e POSTGRES_DB=my_db --network new_net_1  postgres

使用inspect 查看网络设置

 docker inspect ba5e1d752bc9

5,启动另外一个程序服务加入网络另外一个网络

docker run -d -t --name web -p 8081:8081 ejiyuan/demo-docker
  • 默认加入到 bridge
  • ejiyuan/demo-docker配置文件数据库链接字符串为:jdbc:postgresql://172.25.0.2:5432/my_db 即上面启动数据库容器加入到new_net_1网络的ip地址

由于不在一个网段,没法访问,经过docker logs xxxx 输出日志发现

6,修改配置文件链接字符串jdbc:postgresql://db:5432/my_db使用 --link链接

修改启动参数

 docker run -d -t --name web --link gracious_mcnulty:db -p 8081:8081 ejiyuan/demo-docker

服务没法启动,错误以下:

Error response from daemon: Cannot link to /gracious_mcnulty, as it does not belong to the default network.

7,修改启动参数加入同一个网络

 docker run -d -t --name web --net new_net_1  -p 8081:8081 ejiyuan/demo-docker

使用inspect查看网络设置

验证能够正常访问的

三,总结

  •  经过验证发现docker network做用为分组隔离不一样网络环境中的各组应用
  •  在都加入到“new_net_1”的情状况下,使用--link没法进行互通,在默认不指定网络的状况下能够使用 --link 互通,介于下面参考资料1中尾部所诉,这里具体缘由就不作研究了

四,参考资料

深刻理解docker的link机制

docker 基于link 的互联

关于对docker run --link的理解

Docker网络设置

问题&解决:Docker之DOCKER_OPTS参数不生效

Docker:网络模式详解

Docker基本命令与使用 —— Docker容器的网络链接(四)

Docker系列教程16-network命令

docker network基础

相关文章
相关标签/搜索