项目概要:

        Docker网络通信部分


项目目的:

        一:使用带有httpd应用的镜像创建一个容器,使用外网进行访问网站验证。

        二:Docker 四种网络模式介绍

项目内容:

        创建容器的时候可以使用带有-p-P来指定分配端口号或随机分配空闲端口

-P(大写P)使用时需要指定--expose选项或dockerfile中用expose指令容器要暴露的端口,指定需要对外提供服务的端口

 

一:使用docker run -d -Pcentoshttpd创建容器

wKioL1mEGomTJYAwAABlYWC7H_w133.png

此时我们再次查看容器信息,我们来看端口的映射,所以我们访问容器的http的时候,是从端口映射的那个端口访问的。输入宿主机的32769端口,就会映射到容器的80端口。

wKiom1mEGqzz1_Z2AACwDCca0Is120.png

访问宿主机的32769 就会访问容器应用的80端口

wKioL1mEGsbB-v-fAAPw-9GoF1A425.png

我们也可以使用-p(小写p)来指定映射的端口

Dockerrun -d -p 192.168.182.132:110:22 -p 192.168.182.132:120:80 .centoshttpd

wKiom1mEGt-xnX8dAAFz_Q_XNQs403.png

120端口访问容器应用

wKiom1mEGw6jD4v6AAMcZMkw1W0995.png

访问网站前提:开启路由转发:vim /etc/sysctl.conf 添加:net.ipv4.ip_forward=1

wq保存退出   sysctl -p激活。。。。配置防火墙策略 firewall-cmd --add-port=80/tcp

 

 

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

注意:

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

-p 标记可以多次使用来绑定多个端口

映射所有接口地址:

使用 hostPort:containerPort 格式,将本地的10111端口映射到容器的 22 端口,本地的801端口映射到容器的80端口可以执行

wKiom1mEGzOxQk-mAACN1gJP0B0529.png




二:Docker 四种网络模式

docker run 创建 Docker 容器时,可以用 --net 选项指定容器的网络模式,Docker 有以下 4 种网络模式:

  • host 模式,使用 --net=host 指定。

  • container 模式,使用 --net=container:NAMEorID 指定。

  • none 模式,使用 --net=none 指定。

  • bridge 模式,使用 --net=bridge 指定,默认设置。

 

Host模式:与宿主机公用网络配置

Container模式:先创建一个容器,然后--net=container:第一个容器名 创建出第二个容器。第二个容器共用第一个容器网络配置

Bridge模式:通过宿主机上的网桥与容器连接,进行网络通信

None模式:通过--net=none 创建出来的容器不会有任何网络配置,通过管理员自己手动配置。配置如下:

下面通过配置一个以 --net=none 启动的容器,使他达到跟平常一样具有访问网络的权限。来介绍docker 是如何连接到容器中的。

 

启动一个运行 /bin/bash的容器,并指定 --net=none

wKioL1mEG13hzLEwAADYE5MIzvs704.png

再开启一个新的终端,查找这个容器的进程 id ,然后创建它的命名空间,后面的 ip netns 会用到

wKiom1mEG3Owsro3AAA9OVNZJbo346.png

wKioL1mEG4XQZrUxAACI42NHcd0379.png

检查桥接网卡的 ip 和子网掩码

wKiom1mEG5ryRBDTAACC_89GFS4633.png

创建一对” peer“接口 A B ,绑定 A 到网桥,并启用它

wKioL1mEG67ywLS0AAEVSkG3cYA729.png

B 放到容器的网络命名空间,命名为 eth0, 配置一个空闲的 ip

wKioL1mEG8PjfJ2LAADAIi_Lt0s991.pngwKiom1mEG_uQoD1cAADAIi_Lt0s499.png

自此,你又可以像平常一样使用网络了

wKioL1mEHBHyBSxfAAGwl0FvWdk409.png

当你退出容器后, docker 清空容器,容器的 eth0 随网络命名空间一起被摧毁,接口也被自动从docker0取消注册。不用其他命令,所有东西都被清理掉了!

注意 ip netns exec 命令,它可以让我们像 root 一样配置网络命名空间。但在容器内部无法使用,因为统一的安全策略, docker 限制容器进程配置自己的网络。使用 ip netns exec  可以让我们不用设置--privileged=true 就可以完成一些可能带来危险的操作。