一,使用 --link容器互联

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

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

1,创建并启动一个被连接的容器

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 ps

2,修改主程序配置文件

# 生产配置
server:
port:
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:/my_db
username: admin
password:
initialization-mode: always #执行根目录下面data.sql初始化数据
continue-on-error: false

3,启动主程序并连接到另一个容器

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

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

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 : -e POSTGRES_PASSWORD= -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 : 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 : 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 : 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基础

Docker使用Link与newwork在容器之间建立连接的更多相关文章

  1. 使用link在两个容器之间建立连接(mysql)

    在使用Docker的时候我们会常常碰到这么一种应用,就是我需要两个或多个容器,其中某些容器需要使用另外一些容器提供的服务.比如这么一种情况:我们需要一个容器来提供mysql的数据库服务,而另外两个容器 ...

  2. Docker学习笔记 - Docker容器之间的连接

    学习目标: 容器之间可以相互连接访问:: --link redis:redisAlias 准备工作 FROM ubuntu:14.04 RUN apt-get install -y ping RUN  ...

  3. Docker & ASP.NET Core (4):容器间的连接

    第一篇:把代码连接到容器 第二篇:定制Docker镜像 第三篇:发布镜像 Docker容器间的连接 Docker提供了两种方式可以用来做容器间的连接/通信: Legacy Linking:这种方式使用 ...

  4. ln -在文件之间建立连接

    总览 ln [options] source [dest] ln [options] source...directory POSIX 选项: [-f] GNU 选项(缩写): [-bdfinsvF] ...

  5. Docker使用link建立容器之间的连接

    我们在使用Docker的时候,经常可能需要连接到其他的容器,比如:web服务需要连接数据库.按照往常的做法,需要先启动数据库的容器,映射出端口来,然后配置好客户端的容器,再去访问.其实针对这种场景,D ...

  6. Docker系列(四):容器之间的网络通信

    首先我们需要知道:两个容器要能通信,必须要有属于同一个网络的网卡. 先来看下正常情况下我们的容器默认是否是能通信的,这里运行两个测试容器: docker run -it --name=bbox1 bu ...

  7. docker 容器之间互联

    容器之间的互联 一. 实验目的: 1.       熟悉容器之间基本的网络原理: 2.       掌握容器之间互联的方法: 二. 实验环境: Ubuntu16.04+Docker 三. 实验内容: ...

  8. 深入理解docker的link机制

    https://yq.aliyun.com/articles/55912 摘要: 什么是docker的link机制 同一个宿主机上的多个docker容器之间如果想进行通信,可以通过使用容器的ip地址来 ...

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

    一.Docker容器的网络基础 通过ifconfig查看docker0的网络设备,docker守护进程就是通过docker0为docker的容器提供网络连接的各种服务. docker0是Linux虚拟 ...

随机推荐

  1. gggg

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. JQuery图片自适应窗口轮播图(淡入淡出效果)

    <script>var w = $(window).width();//获取窗口宽度var h = $(window).height();//获取窗口高度 $(".box&quo ...

  3. C# 对结构体和指针的使用

    //结构体的定义 [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]        pub ...

  4. Java基础知识——算术操作符、自增自减、关系操作符,你真的了解吗?

    三人行,必有我师焉.欢迎大家加我的微信 yh18482155461,或扫描下方二维码,关注我的微信公众号,共同探讨Java相关技术问题. 温故知新 上一节我们讲到了Java中的赋值操作符,用案例的方式 ...

  5. Visual C++ 6.0中if的简单用法

    # include<stdio.h> int main (void) { > ) printf("AAAA"); printf("BBBB") ...

  6. Vue2.5学习路线及基础知识总结。

    在接触新技术不了解时,我喜欢去慕课网上看新手教程,在学习vue时,在慕课网上看了几个老师的视频,发现这挺好,讲到挺详细的,适合新手,有兴趣的可以先看一下,vue2.5入门教程. 然后在学习路上看见了一 ...

  7. Shell脚本中的逻辑判断、文件目录属性判断、if的特殊用法、case判断

    1.Shell脚本中的逻辑判断 格式1:if 条件 ; then 语句; fi格式2:if 条件; then 语句; else 语句; fi格式3:if …; then … ;elif …; then ...

  8. 2018.5.4 Unix的五种IO模型

    阻塞非阻塞和异步同步 同步和异步关注的是消息通信机制,关注两个对象之间的调用关系. 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态,关注单一程序. Unix的五种IO模型 以下基于Li ...

  9. vue day7 table checkbox 全选

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  10. Ubuntu网络不通解决办法

    如下问题: 尝试和Host主机互ping也不通, Ubuntu: vmware 桥接模式 IP:192.168.1.202/24 gateway:192.168.1.1 Host主机:网络正常 IP: ...