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网络模式。同一个宿主机上的所有容器会在同一个网段下,相互之间是可以通信的。
外部访问容器
让本机网络也可以访问容器中运行的服务,关键在于容器和宿主机的端口映射。
1.新建一个容器
docker run -itd -p 8080:80 --name centos-nginx centos bash
-p port:port :表示映射宿主机和容器的端口,宿主机端口:容器端口
2.在容器中下载服务
[root@7607eaefdc07 /]# yum install epel-release
[root@7607eaefdc07 /]# yum install nginx
[root@7607eaefdc07 /]# /usr/sbin/nginx
因为容器中执行systemctl starg nginx 命令会有如下错误
Failed to get D-Bus connection: Operation not permitted
3.退出容器,在外部访问
新建的容器,启动nginx或者httpd服务的时候会报错
Failed to get D-Bus connection: Operation not permitted
这是因为dbus-daemon没有启动,解决该问题可以这样做
# 启动容器时,要加上--privileged -e "container=docker" ,并且最后面的命令改为/usr/sbin/init
docker run -itd --privileged -e "container=docker" centos-nginx /usr/sbin/init
配置桥接网络
为了使本地网络中的机器和Docker容器更方便的通信,我们经常会有将Docker容器配置到和主机同一网段的需求。这个需求其实很容易实现,我们只要将Docker容器和宿主机的网卡桥接起来,再给Docker容器配上IP就可以了。
修改宿主机网络配置
cd /etc/sysconfig/network-scripts/
cp ifcfg-eth0 ifcfg-br0
# ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
#UUID="61d3f945-5a5a-403d-be81-a669df2f0d6b" # 注释(重要)
DEVICE="ens33"
ONBOOT="yes"
#IPADDR="192.168.127.128" # 注释
#NETMASK="255.255.255.0" # 注释
#GATEWAY="192.168.127.2" # 注释
#DNS1="114.114.114.114" # 注释
BRIDGE=br0 # 指定桥接的网卡(重要)
# ifcfg-br0
TYPE="Bridge" # 指定网络模式(重要)
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="br0"
#UUID="61d3f945-5a5a-403d-be81-a669df2f0d6b" # 注释
DEVICE="br0"
ONBOOT="yes"
IPADDR="192.168.127.128"
NETMASK="255.255.255.0"
GATEWAY="192.168.127.2"
DNS1="114.114.114.114"
启动网络服务
systemctl restart network
安装pipework
git clone https://github.com/jpetazzo/pipework
# 复制pipework包下的可执行文件pipework
cp pipework/pipework /usr/local/bin/
开启一个容器
docker run -itd --net=none --name httpd centos-nginx bash
pipework br0 httod 192.168.127.140/24@192.168.127.2 # 140为容器的ip,@后面的ip为网关ip
docker exec -it httpd bash # 进去后ifconfig查看就可以看到新添加的ip
再配置sshd服务,就可以直接对外提供一台简易的linux主机了。