Docker容器之网络详解

目录

前言

一、网络模式

1、Bridge模式

2、Container模式

3、Host模式

4、None模式

5、overlay模式

二、自定义网络

三、暴露端口

四、Docker 数据卷和数据卷容器

1、数据卷(容器和宿主机共享文件)

2、数据卷容器(容器之间共享文件)

五、容器互联

六、端口映射

总结


前言

容器技术很火,经常为人所提及,尤其是开源容器工具docker,已在不少数据中心里有广泛应用。容器主要是对软件和其依赖环境的标准化打包,将应用之间相互隔离,并能运行在很多主流操作系统上。这样看来容器和虚拟机技术很类似,容器是APP层面的隔离,而虚拟化是物理资源层面的隔离,容器解决了虚拟技术的不少痛点问题,很多时候容器可以和虚拟机结合在一起使用,这也是目前数据中心主流的做法。

一、网络模式

1、Bridge模式
 

  • 此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及iptables nat表配置与宿主之间的关联
  • 当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中
  • 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建**一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中**。可以通过brctl show命令查看
  • bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看
     

Docker容器之网络详解_第1张图片

2、Container模式

  • 创建的容器不会创建自己的网卡,配置自己的IP,而是**和一个指定的容器共享IP、端口范围(端口不能一致),只有一个容器有自己的网卡**,出去还是docker0进行通讯
  • 有点像各个服务放在同一个宿主机上面这种情况
  • 这个模式指定新创建的容器和**已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信**
     

Docker容器之网络详解_第2张图片

3、Host模式

  • host容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口范围。如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的 NetworkNamespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如**文件系统、进程列表等还是和宿主机隔离的**。
  • 使用host模式的容器可以直接使用宿主机的Ip地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是**dockerhost 上已经使用的端口就不能再用了**,网络的隔离性不好。
  • 解决了ip地址不固定的情况

Docker容器之网络详解_第3张图片

4、None模式

  • 该模式关闭了容器的网络功能
  • 使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等
  • 这种网络模式下容器**只有lo回环网络,没有其他网卡。**none模式可以在容器创建时通过–network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性,可以安全的储存数据,不会被攻击,可以用来当个仓库

Docker容器之网络详解_第4张图片

5、overlay模式

叠加式网络模式,使用外部的服务组件作为网关或者代理,例如ingress ,一般和docker-swarm结合(所以建议以了解的角度来介绍)

二、自定义网络

##查看网络模式列表
docker network ls


##查看容器信息(包含配置、环境、网关、挂载、cmd等等信息)
docker inspect  容器ID

##指定分配容器IP地址
docker run -itd --name test1 --network bridge --ip 172.17.0.10 centos:7 /bin/bash
#以上会报错,因为用户使用的ip地址不被规则所允许,docker0定义的就是按照顺序来,所有需要创建一个

##自定义网络固定iP
docker network 【--network bridge】 create --subnet=172.18.0.0/16 yxp1
docker run -itd --name test03 --net yxp1 --ip 172.18.0.8 centos:7 /bin/bash
 

三、暴露端口

两个容器如果端口一致的情况下,暴露出去会产生地址冲突,所以需要在docker0上做一个端口映射,通过ens33暴露出去端口不同就可以了

-p 自定义端口 ( 宿主机端口:容器内端口 )

-P 随机端口 (-P 49153起始 49153到65535)

#自定义端口
docker run -itd -p 8081:80 nginx:latest /bin/bash


#需要在容器中开启nginx
docker exec -it f282a476b06c /bin/bash -c nginx


#在网页测试
http://192.168.223.37:8081


# 随机端口
docker run -itd -P nginx:latest /bin/bash
 

四、Docker 数据卷和数据卷容器

  • 管理 Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器(Data Volumes Containers)。
  • 数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。数据卷的使用类似于 Linux 下对目录进行的 mount 操作。
  • 如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器是一个普通的容器,专门提供数据卷给其他容器挂载使用。
     

1、数据卷(容器和宿主机共享文件)

docker pull centos

#宿主机目录 /var/www 挂载容器中的 /data1
docker run -v /var/www:/data1 --name web1 -it centos /bin/bash

[roote202dd484fd62 / ]#cd /data1/
[root@202dd484fd62 data1]# touch test123
#返回宿主机进行查看
[root@localhost ~]#ls /var/www/

#应用场景
原理:将容器内部的配置文件目录,挂载到宿主机指定目录下。
作用:
① 修改配置文件例如:nginx.conf /usr/local/nginx/conf/nginx.conf ---> /container_nginx/conf/nginx.conf
② 容器内部产生的日志,如何收集将容器内部存放日志文件的目录挂载到宿主机指定目录下 /container_nginx/log/access_log/access_log
③ 传入变量挂载到宿主机在宿主机上添加变量内容,将变量放入共享目录,在容器中 /etc/profile 直接加载就可以
export xxdir=/data/data1/xx-

2、数据卷容器(容器之间共享文件)

Docker容器之网络详解_第5张图片 

 

#数据卷容器
docker run --name web100 -v /data1 -v /data2 -itd centos /bin/bash

#新容器挂载数据卷容器 web100
docker run -itd --volumes-from web100 --name db1 centos /bin/bash

> 原理:让两个容器实现数据共享
php --> mysql 之间想要通讯借助于 socket 通讯文件

五、容器互联

  • 容器互联是通过容器的名称在容器间建立一条专门的网络通信隧道。简单点说,就是会在源容器和接收容器之间建立一条隧道,接收容器可以看到源容器指定的信息。

docker run -itd -P --name web1 centos:7 /bin/bash    #创建并运行容器取名 web1,端口号自动映射
docker run -itd -P --name web2 --link web1:web1 centos:7 /bin/bash    #创建并运行容器取名 web2,链接到 web1 和其通信

> 进 web2 容器,ping web1

--link 的格式:
--link :alias
其中,name 和 id 是源容器的 name 和 id,alias 是源容器在 link 下的别名。

六、端口映射

  • 在启动容器的时候,如果不指定对应的端口,在容器外是无法通过网络来来访问容器内的服务。端口映射机制将容器内的服务提供给外部网络访问,实际上就是将宿主机的端口映射到容器中,使得外部网络访问宿主机的端口便可访问容器内的服务。

[root@docker www]# docker run -d --name test1 -P nginx
0a07519f54de9552a37d076613f9f5af4ff4b80d1d3c258762c45f876a29500b
[root@docker www]# docker run -d --name test2 -p 11111:80 nginx
9316ffd9e2aa98e8d1ea679128d308fc0f1842d854e8b772c7cd5c07647251a8
[root@docker www]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                     NAMES
9316ffd9e2aa   nginx     "/docker-entrypoint.…"   1 second ago     Up 1 second     0.0.0.0:11111->80/tcp, :::11111->80/tcp   test2
0a07519f54de   nginx     "/docker-entrypoint.…"   19 seconds ago   Up 18 seconds   0.0.0.0:49154->80/tcp, :::49154->80/tcp   test1

[root@docker www]# curl http://192.168.122.10:11111



Welcome to nginx!



Welcome to nginx!


If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.

For online documentation and support please refer to
nginx.org.

Commercial support is available at
nginx.com.

Thank you for using nginx.



总结

进入容器没有systemctl命令怎么解决

docker run -itd  --name cenos_v1 --privileged=true centos:7 /sbin/init
docker exec -it cenos_v1 /bin/bash

 Docker网络模式有哪些?分别提供哪些功能?

我这边了解到的有四种,Host container none bridge

  • Host :与宿主机共享网络名称空间/网络协议栈
  • Container:多个容器之间共享一个network namespaces
  • None :自闭空间
  • bridge:默认模式通过Veth对连接容器与docker0网桥,网桥分配给容器IP,同时**docker 0**作为“局域网”内容器的网关,最后和宿主机网卡进行通讯
     

如何把脚本传入一个已经运行的容器

#使用cp命令复制进去容器
docker cp start.sh cenos_v1:/opt


#使用cp命令从容器复制出来
docker cp cenos_v1:/opt/start.sh ./

docker中,假设运行一个业务容器,但是业务容器需要暴露三个端口,启动后发现自己少加了一个端口。如何动态添加端口(如何对已经运行的容器添加或者修改端口)

  1. 首先,我们可以修改/var/lib/docker/containers/containers_id中两个文件
  2. hostconfig.json 中的 portbinding:{}修改端口或添加端口
  3. 修改config.v2.json文件,修改对应的Ports{}来添加/修改端口
  4. 最后,重启守护进程
     

你可能感兴趣的:(Docker,docker,网络,linux)