一,使用 --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. 使用LSTM-RNN建立股票预测模型

    硕士毕业之前曾经对基于LSTM循环神经网络的股价预测方法进行过小小的研究,趁着最近工作不忙,把其中的一部分内容写下来做以记录. 此次股票价格预测模型仅根据股票的历史数据来建立,不考虑消息面对个股的影响 ...

  2. TFS2015安装、配置

    一.安装,参考:http://www.cnblogs.com/WilsonWu/archive/2011/11/24/2261674.html 二.配置,参考:http://www.cnblogs.c ...

  3. vue.js 精学组件记录

    组件需要注册后才可以使用. Vue.component('my-component',{ template:'<div>这是组件内容</div>' }): 局部注册组件 var ...

  4. mysql数据库 事务和索引

    1.MySQL数据库特性:  原子性(atomidity) 一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一 ...

  5. 使用find命令查找文件

    find命令用法 语法: find (选项) (参数) 常用选项: -exec<执行命令>: 假设find指令的回传值为True,就执行该指令; -ls: 假设find指令的回传值为Tru ...

  6. tornado--启动

    tornado--启动 from tornado import web from tornado import ioloop from tornado.httpserver import HTTPSe ...

  7. Javascript 4.3 事件处理函数

    鼠标指针悬停在某个元素上时触发一个动作:onmouseover事件处理函数 鼠标指针离开某个元素时触发一个动作:onmouseout事件处理函数 点击某个链接时触发一个动作:onclick事件处理函数 ...

  8. java虚拟机 之 垃圾回收机制

    一.如何判断对象已死 垃圾回收器并不是java独有的,垃圾回收器的作用就是回收对象释放内存空间,那么如何判断哪些对象应该被回收呢? 在Java语言中是采用GC Roots来解决这个问题.如果一个对象和 ...

  9. 企业SQL笔试

    Student(SID, Sname, Sage, Ssex) 学生表        Course(CID, Cname, TID) 课程表        SC(SID, CID, score) 成绩 ...

  10. Assembly Experiment5

    Answer to the experiment(1),(2),(3),(4) Experiment(5): Screenshots&Results: from the command u w ...