Docker 的网络功能

功能介绍

Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。

外部访问容器

容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过  -P  或  -p  参数来指定端口映射。
     -P:当使用 -P 标记时,Docker 会随机映射一个  49000~49900  的端口到内部容器开放的网络端口。

     -p:-p(小写的)则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort  。

#映射所有接口地址
docker run -d -p 80:80  nginx
#映射到指定地址的指定接口
docker run -d -p 127.0.0.1:80:80  nginx
#映射到指定地址的任意接口
docker run -d -p 127.0.0.1:80 nginx
#查看映射端口的配置
docker port  容器名称或者ID
# -p 标记多次使用绑定多个端口
docker run -d -p 443:443 -p 80:80 

注意:容器有自己的内部网络和 ip 地址(使用  docker inspect  可以获取所有的变量,Docker还可以有一个可变的网络配置)

容器互联

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

连接系统依据容器的名称来执行。因此,首先需要自定义一个好记的容器命名。

虽然当创建容器的时候,系统默认会分配一个名字。自定义命名容器有2个好处:

  • 自定义的命名,比较好记,比如一个web应用容器我们可以给它起名叫web
  • 当要连接其他容器时候,可以作为一个有用的参考点,比如连接web容器到db容器

自定义容器名,使用  --name  标记可以为容器自定义命名。

注意:容器的名称是唯一的。如果已经命名了一个叫 web 的容器,当你要再次使用 web 这个名称的时候,需要先用 docker rm  来删除之前创建的同名容器。

在执行  docker run  的时候如果添加  --rm  标记,则容器在终止后会立刻删除。注意, --rm  和  -d  参数不能同时使用。

docker run -d --name=web  -p 80:80 nginx

 容器互联,使用  --link  参数可以让容器之间安全的进行交互。

#创建一个数据库容器
docker run -d --name=mysql -e MYSQL_ROOT_PASSWORD=123456 mysql
#创建一个新的 web 容器,并将它连接到 db 容器
#--link  参数的格式为  --link name:alias  ,其中  name  是要链接的容器的名称, alias  是这个连接的
别名。
使用  docker ps  来查
docker run -d --name=nginx -p 82:80 --link mysql:nginx-mysql nginx
#检查nginx容器,查看hosts文件,记录下了mysql容器的信息
172.17.0.5	nginx-mysql 4d9879f4cba3 mysql

高级网络配置

当 Docker 启动时,会自动在主机上创建一个  docker0  虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。

所以Docker 所有的网络可以定制配置,可以通过 Linux 命令来调整、补充、甚至替换 Docker 默认的网络配置。

案例:

更改 docker 网桥的网段地址

vim /etc/docker/daemon.json
{
 "bip":"192.168.100.1/24", # 更改网桥的IP地址
 "registry-mirrors": [ "https://zgmke8qe.mirror.aliyuncs.com"],
 "insecure-registries": [ "192.168.8.77:5000"]
}
#重新启动docker,使配置生效
systemctl restart docker

容器访问控制

容器的访问控制,主要通过 Linux 上的  iptables  防火墙来进行管理和实现

    容器访问外部网络

    启动 Docker 服务的时候设定  ip-forward=true,(/etr/docker/daemon.json) Docker 就会自动设定系统的  ip_forward  参数,默认参数为 true.

    容器以 nat 的方式访问互联网。

[root@localhost ~]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

    容器之间访问

    默认情况下,不同容器之间是允许网络互通的,可以在配置文件 /etc/docker/daemon.json 中禁止它。icc=false

{
 "bip":"192.168.100.1/24",
 "registry-mirrors": [ "https://zgmke8qe.mirror.aliyuncs.com"],
 "insecure-registries": [ "192.168.8.77:5000"],
 "icc":false # 禁止容器间互相访问
}  

    在通过  icc=false  关闭网络访问后,还可以通过  --link=CONTAINER_NAME:ALIAS  选项来访问容器的开放端口。此设置会在 iptables 中添加规则.
    管理网桥

#安装
yum install bridge-utils -y
#查看 docker 网桥
[root@localhost docker]# brctl show
bridge name	bridge id		STP enabled	 interfaces
docker0		8000.02420156745f	no		 veth47144f4						

 

 

  

 

 


    

posted @ 2018-12-20 11:59  步绍训  阅读(403)  评论(0)    收藏  举报