小娜老师的讲义-Docker基础知识-网络基础配置

来源:互联网 发布:江铠同翟天临分手知乎 编辑:程序博客网 时间:2024/04/27 06:31

今天讲docker的网络基础配置
比较成熟的互联网应用服务往往需要很多服务组件,为了更好地相互配合,需要多个容器之间可以互联通信。
目前docker提供的是映射容器端口到宿主主机以及容器互联机制来为容器提供网络服务。
使用的docker的网络功能包括使用端口映射机制来将容器内应用服务提供给外部网络,以及通过容器互联系统让多个容器之间进行快捷的网络通信。

先说前者,通过端口映射实现访问容器:
1)从外部访问容器应用:
启动容器时,需要指定相应的参数,否则在外部不能通过网络来访问容器内部的网络应用和服务。
这个参数就是-P或者-p,用它们来指定对应的端口,用-P标记时,一般情况下docker会随机的映射一个端口到容器内部开放的网络端口:

$ docker run -d -P training/webapp python app.py$ docker ps -l

这里写图片描述
可以看到,本地主机的32772端口被映射到了容器的5000端口上,此时访问宿主主机的32772端口就可以访问容器内web提供的界面。
用docker logs也可以查看应用里面的信息:

$ docker logs -f NAME

这里写图片描述
如果是-p的话,那就要指定具体的端口号了,并且一个指定的端口上只能绑定一个容器,支持的格式有:hostPort:containerPort ip:hostPort:containerPort ip::containerPort
2)映射所有接口地址

 $ docker run -d -p 5000:5000 training/webapp python app.py

应用hostPort:containerPort格式来将本地的端口映射到容器的5000端口
3)映射到指定地址的指定端口

$ docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py

应用ip:hostPort:containerPort格式指定映射的特定地址
4)映射到指定地址的任意端口

$ docker run -d -p 127.0.0.1::5000 training/webapp python app.py

应用ip::containerPort来绑定localhost的任意端口到容器的5000端口,本地主机会自动分配一个端口
默认情况下用的是tcp协议,也可用udp标记来指定udp端口,直接在端口号的后面加上/udp即可。

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

$ docker port NAME 5000

再说后者,即容器互联实现容器间通信:
这种通信方式会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息。

1)自定义容器命名:我们自己定义一个好记的容器名称,用–name标记

$ docker run -d -P --name web training/webapp python app.py

用docker ps验证:
这里写图片描述
需要注意的是,容器的名称是唯一的,除非删除之前存在的容器
2)容器互联
我们用–link参数让容器之间进行交互
下面我们先创建一个新的数据库容器:

$ docker run -d --name db training/postgres

删除之前创建的web容器:

$ docker rm -f web

然后创建一个新的web容器,并将它连接到db容器:

$ docker run -d -P --name web --link db:db training/webapp python app.py

此时,db容器和web容器建立了互联关系
–link参数的格式为–link name:alias,其中name是要链接的容器的名称,alias是这个链接的别名。
使用docker ps 来查看容器的链接:

可以看到自定义命名的容器:db和web.db容器的names列有db也有web/db.这表示web容器链接到db容器,这允许web容器访问db容器的信息。
Docker在两个互联的容器之间创建了一个安全隧道,而且不用映射他们的端口到宿主主机上,在启动db容器的时候并没有使用-p和-P标记,从而避免了暴露数据库端口到外部网络上。
Docker通过两种方式为容器公开连接信息:
①环境变量
②更新/etc/hosts文件
使用env命令来查看web容器的环境变量:

$ docker run --rm --name web2 --link db:db training/webapp env

其中DB_开头的环境变量是提供web容器连接db容器使用,前缀采用大写的连接别名。
除了环境变量,docker还添加host信息到父容器的/etc/hosts的文件,下面是父容器web的hosts文件:

$ docker run -t -i --rm --link db:db training/webapp /bin/bash

这里有两个hosts信息,第一个是web容器,web容器用自己的id作为默认主机名,第二个是db容器的ip和主机名,可以在web容器中安装ping命令来测试db容器的连通:

用Ping来测试db容器,它会解析成172.17.0.5。注意,官方的Ubuntu 12.04镜像默认没有安装ping,需要自行安装。
用户可以链接多个子容器到父容器,比如可以链接多个web到db容器上。
小结:网络是云时代最核心也是最复杂的系统之一,我们在这部分中讲解了docker涉及网络的基本操作,包括基础的容器端口映射机制和容器互联机制。Docker目前采用了linux系统自带的网络系统来实现对网络服务的支持,这既可以利用现有成熟的技术提供稳定支持,又可以实现快速的高性能转发。
在生产环境中,网络方面的需求更加复杂多变,往往需要引入额外的机制,例如SDN(软件定义网络)或NFV(网络功能虚拟化)的相关技术,之后我们会进一步探讨docker网络的高级配置和实现细节。

0 0
原创粉丝点击