Docker网络模式

桥接网络:你的网络和宿主机的同等关系,连接了同一个路由器同一个交换机网段也是一样的

nat:他把你宿主机的网络做成了一个类似于路由器的设备,它实现了网络地址转换,宿主机能联网,他就能联网,但是他们的网段是不一样的

仅主机:仅仅是让你的宿主机和虚拟机进行连接

  • host模式

使用方法:docker run时使用--net=host指定

docker使用的网络实际上和宿主机一样,在容器内看到的网卡ip是宿主机ip

  • container模式

使用方法:--net=container:container_id/container_name

多个容器使用共同的网络,看到的ip是一样的

  • none模式

使用方法:--net=none指定

这种模式下,不会配置任何网络,没网卡,也不联网

  • bridge模式

使用方法:--net=bridge指定默认模式,不用指定默认就是这种网络模式。这种模式会为每个容器分配一个独立的Network Namespace。类似于vmware的nat网络模式。同一个宿主机上的所有容器会在同一个网段下,相互之间是可以通信的。


Docker网络管理-外部访问容器

思路:首先使用centos镜像新建一个容器,然后在该容器中安装nginx服务,并启动,再把该容器导成一个新的镜像(centos_nginx),然后再使用新镜像创建容器,并指定宿主机端口映射

创建新镜像:docker run -itd -p 8888:80 centos_nginx bash  //-p 可以指定端口映射,本例中将容器的80端口映射为本地的8888端口

进入新镜像:docker exec -it container_id  bash 

安装nginx:yum install -y nginx

启动nginx: systemctl start nginx

退出该容器:exit

测试: curl 127.0.0.1:8888

  • -p后面也支持IP:port:ip:port 的格式,比如

-p 127.0.0.1:8080:80 

  • 也可以不写本地的端口,只写ip,这样会随意分配一个端口

-p 127.0.0.1::80 //注意这里是两个冒号

另一台机器访问:docker租主机IP:8888也可以访问了

解决启动nginx时的报错Operation not permitted

新建的容器,启动nginx或者httpd服务的时候会报错

[root@34b9c062b8d9 /]# systemctl start nginxSystem has not been booted with systemd as init system (PID 1). Can't operate.Failed to connect to bus: Host is downFailed to get D-Bus connection: Operation not permitted

这是因为dbus-daemon没有启动,解决该问题可以这样做

启动容器时,要加上--privileged -e "container=docker" 参数,并且最后面的命令改为/usr/sbin/init

格式:docker run -itd -p 8888:80 --privileged -e "container=docker" centos_with_nginx /usr/sbin/init

或者加上:--privileged=true

docker run -itd -p 8888:80 --privileged -e "container=true" centos_nginx /usr/sbin/init

[root@bogon ~]# docker run -itd -p 8888:80 --privileged -e "container=true" centos_nginx /usr/sbin/init20df5c59352256a8bae6d8e8315f65a1f06831a68ec4dc8fc51aa56d1d2bde60[root@localhost ~]# docker psCONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                    NAMES73bda065303e   centos_nginx   "/usr/sbin/init"         12 minutes ago   Up 12 minutes   0.0.0.0:8888->80/tcp     wizardly_taussigdf3b494539d4   300e315adb2f   "bash"                   31 minutes ago   Up 31 minutes                            hopeful_haibtf251f778055e   registry       "/entrypoint.sh /etc…"   57 minutes ago   Up 57 minutes   0.0.0.0:5000->5000/tcp   cranky_ramanujan


Docker网络管理-配置桥接网络

这种模式可以使你的docker容器和宿主机使用同一个交换机,他们在同一个网段下,这样就可以直接跟外面的机器通信,也可以把这个docker看成是一个独立的服务器一样

为了使本地网络中的机器和Docker容器更方便的通信,我们经常会有将Docker容器配置到和主机同一网段的需求。这个需求其实很容易实现,我们只要将Docker容器和宿主机的网卡桥接起来,再给Docker容器配上IP就可以了。

首先进入到网卡配置目录下:

cd /etc/sysconfig/network-scripts/

拷贝一个新的网卡出来

cp ifcfg-ens33  ifcfg-br0

  • 更改br0配置:

vim ifcfg-br0

首先更改第一行TYPE=Bridge

再更改名字:NAME=br0;DEVICE=br0;UUID也注释掉

  • 更改ens33配置

vi ifcfg-ens33 //最后一行增加BRIDGE=br0,注释掉:UUID,IPADDR,NETMASK,GATEWAY,DNS1

其实就是把ens33的ip配置到新的虚拟网卡br0上来,然后ens33在进行桥接

重启网卡:systemctl restart network

配置成功以后br0网卡就会继承ens33的ip,而ens33就没有了

[root@localhost network-scripts]# ifconfigbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500        inet 192.168.18.141  netmask 255.255.255.0  broadcast 192.168.18.255        inet6 fe80::5b35:7d8a:d448:fcf1  prefixlen 64  scopeid 0x20<link>        ether 00:0c:29:b8:0f:33  txqueuelen 1000  (Ethernet)        RX packets 66  bytes 5379 (5.2 KiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 73  bytes 8400 (8.2 KiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255        inet6 fe80::42:74ff:fe8a:e688  prefixlen 64  scopeid 0x20<link>        ether 02:42:74:8a:e6:88  txqueuelen 0  (Ethernet)        RX packets 7464  bytes 330335 (322.5 KiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 12839  bytes 27117685 (25.8 MiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500        ether 00:0c:29:b8:0f:33  txqueuelen 1000  (Ethernet)        RX packets 243167  bytes 341083270 (325.2 MiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 60420  bytes 5248917 (5.0 MiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

安装pipwork

克隆:git clone https://github.com/jpetazzo/pipework

[root@localhost ~]# git clone https://github.com/jpetazzo/pipework正克隆到 'pipework'...remote: Enumerating objects: 8, done.remote: Counting objects: 100% (8/8), done.remote: Compressing objects: 100% (6/6), done.remote: Total 518 (delta 2), reused 5 (delta 2), pack-reused 510接收对象中: 100% (518/518), 182.72 KiB | 14.00 KiB/s, done.处理 delta 中: 100% (272/272), done.

拷贝文件到可执行目录下:

cp pipework/pipework /usr/local/bin/

开启一个容器:(--net=none参数意思是不设置网络)

docker run -itd --net=none centos_with_nettool  bash

[root@localhost pipework]# docker run -itd --net=none 772d8347a1d7 bash62cb0a73d01b26b4b3f7972f45806b8960c0762eacd486ff5e4f578c716051b0

进入到容器里,现在是没有网卡ip的

[root@localhost pipework]# docker exec -it 62cb0a bash[root@62cb0a73d01b /]# ifconfiglo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536        inet 127.0.0.1  netmask 255.0.0.0        loop  txqueuelen 1000  (Local Loopback)        RX packets 0  bytes 0 (0.0 B)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 0  bytes 0 (0.0 B)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0[root@62cb0a73d01b /]#

退出并设置IP:

pipework br0 62cb0a73d01b 192.168.18.142/24@192.168.18.2  #192.168.18.142为自定义容器的ip,@后面的ip为网关ip

[root@localhost pipework]# pipework br0 62cb0a73d01b 192.168.18.142/24@192.168.18.2

在进入容器就有IP了,而且还能ping外网,其他机器也可以ping它,在里边安装一些服务(nginx,httpd)就可以直接ip端口访问了

[root@localhost pipework]# docker exec -it 62cb0a bash[root@62cb0a73d01b /]# ifconfigeth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500        inet 192.168.18.142  netmask 255.255.255.0  broadcast 192.168.18.255        ether 2a:d0:c4:88:ba:63  txqueuelen 1000  (Ethernet)        RX packets 12  bytes 896 (896.0 B)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 1  bytes 42 (42.0 B)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536        inet 127.0.0.1  netmask 255.0.0.0        loop  txqueuelen 1000  (Local Loopback)        RX packets 0  bytes 0 (0.0 B)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 0  bytes 0 (0.0 B)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

在容器ping外网

[root@62cb0a73d01b /]# ping baidu.comPING baidu.com (39.156.69.79) 56(84) bytes of data.64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=1 ttl=128 time=47.4 ms64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=2 ttl=128 time=44.6 ms64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=3 ttl=128 time=46.10 ms

其他机器ping该容器

[root@localhost ~]# ping 192.168.18.141PING 192.168.18.141 (192.168.18.141) 56(84) bytes of data.64 bytes from 192.168.18.141: icmp_seq=42 ttl=64 time=0.486 ms64 bytes from 192.168.18.141: icmp_seq=43 ttl=64 time=0.313 ms64 bytes from 192.168.18.141: icmp_seq=44 ttl=64 time=0.296 ms64 bytes from 192.168.18.141: icmp_seq=45 ttl=64 time=0.372 ms64 bytes from 192.168.18.141: icmp_seq=46 ttl=64 time=0.220 ms64 bytes from 192.168.18.141: icmp_seq=47 ttl=64 time=0.297 ms


更多相关文章

  1. mall在Linux环境下的部署(基于Docker容器)
  2. 一文读懂 SuperEdge 边缘容器架构与原理
  3. JDK 中有哪些同步容器?并发容器?
  4. CopyOnWriteArrayList,一个面试中经常问到的冷门容器
  5. 解读容器的 2020:寻找云原生的下一站
  6. 谷歌助力,快速实现 Java 应用容器化
  7. 011. 盛最多水的容器 | Leetcode题解
  8. 如何根据容器更改元素的宽度?
  9. 主滑块调整大小到行容器

随机推荐

  1. 新导入项目数据库导入失败
  2. msql,触发器无事物回滚,插入之前满足条件
  3. 我的MYSQL学习心得(十一) 视图
  4. Excel数据快速导入mysql的几个办法
  5. ORACLE-SQL:定义并使用多字符串变量
  6. Oracle的PL/SQL块中select * from 查询结
  7. MySQL数据库SQL语法
  8. mysql5.5 允许远程访问
  9. 列出所有行,如果行在其他表中退出,则添加其
  10. [置顶] sqlserver性能调优方法论