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 :当进入到容器后,退出时将删除该容器

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

container模式

1、创建一个容器 [root@centos7 ~]# docker run -itd --name test centos bash 332c789ad9cf5ac721a1ef0becf061d2f95b99051239caa99e5641870eb341dc

2、进入到容器

docker exec -it test bash
IP:172.17.0.3

3、再新建一个容器 [root@centos7 ~]# docker run -it --net=container:test --name test2 centos_with_net bash

##IP一致

none模式

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

就只有一个本地的网卡

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

4、将test容器保存为新的镜像: [root@centos7 ~]# docker commit -m "centos_installd_httpd" -a "jack" httpd centos_with_httpd:jack sha256:3167350a47e6a229db0c9bdbb2bba8ac08a4a890fcbe8e28c3fc0c31b784af8e

5、查看

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

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

可以访问!!!

准备工作 创建一个数据库容器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、安装再启动

有了端口

保存新的镜像 [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容器配上IP就可以了。

系统:centos7.2
宿主机网卡信息:
name:eno16777736
IP:192.168.3.74
gateway: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、正常情况下是:

 安装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/init
818d0c9c7d37eecf6407f707f9ad95d7154a1c31d6501646a252768d9d1fead9
配置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<UP,BROADCAST,RUNNING,MULTICAST>  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.74
PING 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 ms
64 bytes from 192.168.3.74: icmp_seq=2 ttl=64 time=0.091 ms


[root@818d0c9c7d37 /]# ping 192.168.3.83
PING 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通,搭建完成