Docker网络基础

2015/6/6 posted in  Docker

大量的互联网应用服务包括多个服务组件,这往往需要多个容器之间通过网络通信进行相互配合。 Docker目前提供了映射容器端口到宿主主机和容器互联机制来为容器提供网络服务。

端口映射实现访问容器

在启动容器的时候,如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。

从外部访问容器应用

当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-P或-p参数来指定端口映射。当使用-P标记时,Docker会随即映射49000~49900中的端口至容器内部开放的网络端口。 小写-p则可以指定要映射的端口,并且,在一个指定端口上只可以帮顶一个容器。支持的格式有:

  • ip:hostPort:containerPort
  • ip::containerPort
  • hostPort:containerPort

映射所有接口地址

使用hostPort:containerPort格式将本地5000端口映射到容器5000端口(之前创建私有仓库的例子):

docker run -d -p 5000:5000 registry

这时默认会帮顶本地所有接口上的所有地址。可以多次使用-p参数从而映射多个端口。

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

可以使用ip:hostPort:containerPort格式指定映射使用一个特定地址,比如locakhost地址127.0.0.1。

docker run -d -p 127.0.0.1:5000:5000 registry

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

可以使用ip::containerPort格式帮顶localhost的任意端口到容器的5000端口,本地主机会自动分配一个端口:

docker run -d -p 127.0.0.1::5000 registry

可以使用udp标记来指定udp端口:

docker run -d -p 127.0.0.1:5000:5000/udp registry

查看端口映射配置

可以使用docker port命令来查看当前映射的端口配置,也可以查看绑定的地址:

docker port registry 
5000/tcp -> 0.0.0.0:5000
docker port registry 5000
0.0.0.0:5000

容器有自己的内部网络和IP地址(使用docker inspect + ID可以获取所有变量值)。

容器互联实现容器间通信

容器的连接(linking)系统是除了端口映射外另一种可以与容器中应用进行交互的方式。他会在源和接收容器之间创建一个隧道,接受容器可以看到源容器指定的信息。

容器互联

使用--link参数可以让容器之间安全的进行交互。 比如创建一个数据库容器:

docker run --name dbserver mysql

让后创建一个容器,并将这个容器连接到dbserver容器:

docker run -d --name likeweb --link dbserver:dbserver ubuntu

因为要连接的容器并没有启动,所以建立完容器之后会报错,这里只是演示--link,请忽略。 --link参数的格式为--link name:alias,其中name是要链接的容器的名称,alias是这个连接的别名。 可以用docker ps 命令查看连接情况。 这样Docker两个容器之间创建了一个安全隧道而不需要开放外部端口,避免了数据库端口到外部网络上。 Docker通过两种方式为容器公开连接信息:

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

可以使用env命令来查看容器的环境变量。 Docker目前采用了Linux系统自带的网络系统来实现对网络服务的支持,这既可以利用现有成熟的技术提供稳定的支持,又可以实现快速的高性能转发。