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通,搭建完成
本文转自方向对了,就不怕路远了!51CTO博客,原文链接:
http://blog.51cto.com/jacksoner/2051041 ,如需转载请自行联系原作者