docker有四种网络模式:

  • 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网络模式。同一个宿主机上的所有容器会在同一个网段下,相互之间是可以通信的。

host模式

[root@centos7 ~]# docker run -it --rm --name=centos-test --net=host centos-7-x86_64-minimal bash

##--rm :当进入到容器后,退出时将删除该容器
Docker网络管理-网络模式

##以上可以看到和宿主机的IP一样

container模式

1、创建一个容器

[root@centos7 ~]# docker run -itd --name test centos bash
332c789ad9cf5ac721a1ef0becf061d2f95b99051239caa99e5641870eb341dc

2、进入到容器

docker exec -it test bashIP:172.17.0.3

Docker网络管理-网络模式

3、再新建一个容器

[root@centos7 ~]# docker run -it --net=container:test --name test2 centos_with_net bash

Docker网络管理-网络模式

##IP一致

none模式

[root@centos7 ~]# docker run -it --rm --net=none --name test3 centos_with_net bash

就只有一个本地的网卡

Docker网络管理-网络模式

bridge模式

平时使用的模式。

Docker网络管理-如何让外部网络访问docker资源
1、可以指定端口映射,本例中将容器的80端口映射为本地的5123端口
docker run -itd -p 5123:80 centos-httpd bash //-p

2、新建一个容器,并安装httpd

[root@centos7 ~]# docker run -it --name=httpd centos-7-x86_64-minimal bash
[root@9a98ecf75df4 /]# yum install httpd

3、启动httpd

[root@9a98ecf75df4 /]# httpd

[root@9a98ecf75df4 /]# yum install net-tools -y

Docker网络管理-网络模式

4、将test容器保存为新的镜像:

[root@centos7 ~]# docker commit -m "centos_installd_httpd" -a "jack" httpd centos_with_httpd:jack
sha256:3167350a47e6a229db0c9bdbb2bba8ac08a4a890fcbe8e28c3fc0c31b784af8e

5、查看

Docker网络管理-网络模式

6、做端口映射

[root@centos7 ~]# docker run -itd --name test-httpd -p 5123:80 centos_with_httpd:jack bash
2f42ddcaf332597ad3610ce7be85d62dc2047fa2d035bcc304396d0dab8c3734
##-p:指定映射端口
##将宿主机的某端口映射到容器的80端口
7、进入test-httpd容器:
[root@centos7 ~]# docker exec -it test-httpd bash

8、启动httpd

[root@2f42ddcaf332 /]# httpd

9、创建测试文件

[root@2f42ddcaf332 /]# vi /var/www/html/test.html

jack is this!!!

10、测试

[root@2f42ddcaf332 /]# curl localhost/test.html 
jack is this!!!

11、在宿主机测试:

[root@centos7 ~]# curl 192.168.3.74:5123/test.html
jack is this!!!

##测试通过,可以访问

Docker网络管理-容器互联

在同一台母机上的容器可以通过IP连接,配置容器互联后,容器之间可以通过name进行连接。

1、查看容器 test-httpd的IP
Docker网络管理-网络模式

2、用另外一台容器访问test-httpd的页面

Docker网络管理-网络模式

可以访问!!!

准备工作

创建一个数据库容器data:
1、创建容器db:
[root@centos7 ~]# docker run -itd --name db centos_with_net /usr/sbin/init
813475c73973a82c9eb5b8b065b9624249f9170f697fcff8fe20b5e2d2f78c7e

2、[root@centos7 ~]# docker exec -it db bash

3、安装数据库

[root@813475c73973 /]# yum install -y mariadb mariadb-server

启动mariadb:

[root@813475c73973 /]# systemctl start mariadb
Failed to get D-Bus connection: Operation not permitted

报错:没有权限操作

因为在创建容器时没有加上--privileged
使用该参数,container内的root拥有真正的root权限。

解决:1、重新创建

[root@centos7 ~]# docker run -itd --privileged --name db centos_with_net /usr/sbin/init

2、安装再启动

Docker网络管理-网络模式

有了端口

保存新的镜像

[root@centos7 ~]# docker commit -m "centos_with_mariadb" -a "jack" db centos_with_mariadb

创建数据库容器data:

[root@centos7 ~]# docker run -itd --privileged --name data -p 13306:3306 centos_with_mariadb /usr/sbin/init

连接数据库容器

1、新建一个web容器并和data容器互联:
[root@centos7 ~]# docker run -itd -p 18080:80 --name web --link data:webdb centos_with_httpd:jack /usr/sbin/init
75755f2ee34a6f25072e85faada5f6582d2fb6351b70224a52f47376359ac6cf
“–link=data:webdb”,这个参数就是告诉Docker容器需要使用“data”容器,并将其别名命名为webdb,这样在这两个容器里就可以使用“webdb”来作为提供mysql数据库服务的机器名。所以在最后启动参数里我们使用的是“/usr/bin/mysql -h webdb -u root -pletmein”来连接mysql数据库的。

You have new mail in /var/spool/mail/root

[root@centos7 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
75755f2ee34a centos_with_httpd:jack "/usr/sbin/init" 4 seconds ago Up 3 seconds 0.0.0.0:18080->80/tcp web

2、在web上运行env命令可以查看到关于db的环境变量:

Docker网络管理-网络模式

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

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

系统:centos7.2宿主机网卡信息:name:eno16777736IP:192.168.3.74gateway:192.168.3.1

停止docker服务

[root@centos7 ~]# systemctl stop docker

删除docker0网卡

安装网桥配置命令:[root@centos7 ~]# yum install -y bridge-utils[root@centos7 ~]# ifconfig docker0 down[root@centos7 ~]# brctl delbr docker0

1、cd /etc/sysconfig/network-scripts/;cp ifcfg-eno16777736 ifcfg-br0

2、更改BRIDGE为br0;删除IPADDR,NETMASK,GATEWAY,DNS1
[root@centos7 network-scripts]# vi /etc/sysconfig/network-scripts/ifcfg-eno16777736

TYPE=Ethernet

#MACADDR=00:50:56:2D:75:E7
#BOOTPROTO=dhcp
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=eno16777736
UUID=bb3b3feb-b209-4e36-ba0f-6022977c84d0
DEVICE=eno16777736
ONBOOT=yes
BRIDGE=br0
#IPADDR=192.168.3.77
#NETWORK=255.255.255.0
#GATEWAY=192.168.3.1
#DNS1=202.96.128.86

3、修改DEVICE为br0,Type为Bridge,配置网络设置ipaddr

[root@centos7 network-scripts]# vi /etc/sysconfig/network-scripts/ifcfg-br0

TYPE=Bridge

MACADDR=00:50:56:2D:75:E7
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=br0
UUID=bb3b3feb-b209-4e36-ba0f-6022977c84d0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.3.74
NETMASK=255.255.255.0
GATEWAY=192.168.3.1
DNS1=202.96.128.86

4、systemctl restart network

ping www.baidu.com是否正常

5、正常情况下是:
Docker网络管理-网络模式

安装pipwork 1、[root@centos7 ~]# cd /home/[root@centos7 home]# cp pipework/pipework /usr/local/bin/2、[root@centos7 home]# cp pipework/pipework /usr/local/bin/3、新建没有网络的容器[root@centos7 home]# docker run -itd --privileged --net=none --name jack123 centos_with_net  /usr/sbin/init818d0c9c7d37eecf6407f707f9ad95d7154a1c31d6501646a252768d9d1fead9配置IP,192.168.3.78/24 :设置IP/子网掩码 @后面:网关root@centos7 home]# pipework br0  jack123 192.168.3.78/24@192.168.3.1[root@centos7 home]# docker exec -it jack123 bash[root@818d0c9c7d37 /]# ifconfig eth1: flags=4163
mtu 1500 inet 192.168.3.78 netmask 255.255.255.0 broadcast 192.168.3.255 ether ce:eb:38:0a:97:8d txqueuelen 1000 (Ethernet) RX packets 86 bytes 10422 (10.1 KiB) 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 0验证:[root@818d0c9c7d37 /]# ping 192.168.3.74PING 192.168.3.74 (192.168.3.74) 56(84) bytes of data.64 bytes from 192.168.3.74: icmp_seq=1 ttl=64 time=0.326 ms64 bytes from 192.168.3.74: icmp_seq=2 ttl=64 time=0.091 ms[root@818d0c9c7d37 /]# ping 192.168.3.83PING 192.168.3.83 (192.168.3.83) 56(84) bytes of data.64 bytes from 192.168.3.83: icmp_seq=1 ttl=64 time=1.44 ms###可以ping通,搭建完成