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查看
     

2、Container模式

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

3、Host模式

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

4、None模式

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

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 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 <name or id>: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
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

总结

进入容器没有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. 最后,重启守护进程
     
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值