原文出自:http://blog.csdn.net/anxpp/article/details/52495295

123

    我们使用Docker发布的组件,通常都离不开网络的,下面介绍Docker的网络基础配置。

1、端口映射

    从外部访问容器应用

    启动容器时,如果不知道对应参数,在容器外部是无法通过网络访问容器内部的。

    可以通过-p或-P参数指定端口映射。

    使用-P时,Docker会随机映射一个49000~49900的端口到容器内部开放的端口。

    -p会映射到指定的端口,支持的格式:

 

  • ip地址:主机端口:容器端口
  • ip地址::容器端口
  • 主机端口:容器端口

 

    映射所有接口地址

    主机端口:容器端口 格式将本地端口映射到容器端口的命令如下:

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker run -d -p 3306:3306 mysql  

    此时默认会帮顶本地所有接口上的地址,可以多次使用-p帮顶多个端口。

 

    映射到指定地址的指定端口

    ip地址:主机端口:容器端口 格式的参数几乎与上面的差不多,不过多限制了地址,比如需要指定特定的地址的访问(如127.0.0.1):

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker run -d -p 127.0.0.1:3306:3306 mysql  

 

    映射到指定地址的任意端口

 

    ip地址::容器端口 格式的参数,可以绑定localhost的任意端口到容器的指定端口上,本地主机会自动分配一个端口:

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. doccker run -d -p 127.0.0.1::3306 mysql  

    也可以使用udp来标记udp端口:

 

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. doccker run -d -p 127.0.0.1:3386:3386/udp 某个镜像  

 

    查看端口映射配置

 

    使用docker port命令查看端口映射配置:

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker port 容器ID 3306  

    容器有自己的内部往来和IP地址:

 

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker inspect 容器ID  

    然后会输出一大堆信息。

 

 

2、容器互联

    容器的连接系统是除了端口映射外另一种可以与容器中应用进行交互的方式。

 

    它会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息。

 

    自定义容器名

    连接系统根据容器的名称执行,所以需要自定义一个较为简单容易区分的容器名。

 

    自定义命名使用--name参数,这个在之前的文章中已经遇到过了:

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker run -d -p --name db mysql  

    容器的命名必须是唯一的。

 

    执行docker run时,如果加上--rm参数,容器在终止后悔立即被删除,但是不能与-d参数一同使用。

 

    容器互联

    使用--link参数可以让容器间建立安全的连接进行交互。

 

    下面是一个示例:

 

  • 首先创建一个数据库的容器:

 

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker run -d --name db training/postgres  

 

  • 然后创建web容器:

 

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker run -d -P --name web --link db:db training/webapp python app.py  

    此时db容器和web容器加你互联关系。

 

    --link参数:--link name:alias,name是要连接的容器的名字,alias是这个连接的别名。

    可以使用docker ps查看容器信息,其中names列就能看出互联的状态。

 

    docker在两个互联的容器之间建立了一个安全隧道,不需要吧他们的端口映射到宿主主机上,也可以避免端口的暴露。

    Docker通过两种方式公开连接信息:

 

  • 环境变量
  • 更新/etc/hosts文件

 

    使用env命令查看刚刚的web容器的环境变量:

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker run --rm --name web2 --link db:db training/webapp env  

    ...

 

    其中DB_开头的环境变量是供web容器连接db容器使用,前缀采用大写的连接别名。

    除了环境变量,Docker还添加host信息到父容器的/etc/hosts文件。其中web容器会以自己的ID作为默认主机名,db容器以db作为主机名。

    比如多个web到db容器的情况,可以链接多个子容器到父容器上。

 

 

小结

    Docker通过端口映射和容器互联,优雅的提供了网络配置功能。