Docker网络模式

  • 一、实现原理
  • 二、Docker四种网络模式
  • 三、Docker命令
  • 1、查看网络列表
  • 2、自定义网络固定IP
  • 3、暴露端口
  • 4、在宿主机环境执行容器内命令
  • 5、怎么把宿主机的文件传入到容器内部
  • 6、进入容器没有systemctl 命令解决:添加--privileged=true (指定此容器是否为特权容器),使用此参数,则不能用attach示例:
  • 总结


一、实现原理

Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。

Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。

  • docker0网络
    docker容器的虚拟网关
  • loopback :回环网卡、TCP/IP网卡是否生效
  • virtual bridge: linux
    自身继承了一个虚拟化功能(kvm架构〉,是原生架构的一个虚拟化平台,安装了一个虚拟化平台之后就会系统就会自动安装虚拟网卡
    (示例:安装workstation(虚拟化平台)之后,会在网络适配器中会多出VMnet1 VMnet8 VMnet0)
  • docker 0:容器的网关,绑定物理网卡,负责做NAT地址转换、端口映射
    docker 0本身也是一种容器

二、Docker四种网络模式

Docker网络模式

配置

说明

host模式

–net=host

容器和宿主机共享Network namespace。

container模式

–net=container:NAME_or_ID

容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。

none模式

–net=none

容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。

bridge模式

–net=bridge

(默认为该模式)

使用网络模式为bridge的docker容器无法访问 docker自带的网络模式_docker


使用网络模式为bridge的docker容器无法访问 docker自带的网络模式_docker_02


使用网络模式为bridge的docker容器无法访问 docker自带的网络模式_docker_03


使用网络模式为bridge的docker容器无法访问 docker自带的网络模式_docker_04

三、Docker命令

1、查看网络列表

docker network ls
docker run -itd --name test1 --network bridge --ip 172.17.0.10 centos:7 /bin/bash(以上会报错>

使用网络模式为bridge的docker容器无法访问 docker自带的网络模式_docker_05

2、自定义网络固定IP

docker network create --subnet=172.18.0.0/16 mynetwork
docker run -itd --name test2 --net mynetwork --ip 172.18.0.100 centos:7 /bin/bash

使用网络模式为bridge的docker容器无法访问 docker自带的网络模式_IP_06


使用网络模式为bridge的docker容器无法访问 docker自带的网络模式_docker_07

docker inspect db255ac0f50d

使用网络模式为bridge的docker容器无法访问 docker自带的网络模式_linux_08

3、暴露端口

docker rum -itd -P nginx:latest /bin/bash
docker run -itd -p 80:3333 nginx /bin/bash
-P  大写p是随机分配端口
-p  小写p是指定暴露端口

docker run -itd -P nginx /bin/bash

使用网络模式为bridge的docker容器无法访问 docker自带的网络模式_Docker_09

4、在宿主机环境执行容器内命令

docker exec -it 容器ID /bin/bash -c 'nginx'

使用网络模式为bridge的docker容器无法访问 docker自带的网络模式_linux_10


使用网络模式为bridge的docker容器无法访问 docker自带的网络模式_docker_11

5、怎么把宿主机的文件传入到容器内部

1、linux怎么复制
cp原文件路径目标文件路径

docker cp lopt/ abc容器id:/opt/ abc

6、进入容器没有systemctl 命令解决:添加–privileged=true (指定此容器是否为特权容器),使用此参数,则不能用attach示例:

docker run -itd --name test3 --privileged=true centos /sbin/init
/sbin/init内核启动时主动呼叫的第一个进程
docker ps -a

使用网络模式为bridge的docker容器无法访问 docker自带的网络模式_linux_12

总结

docker 中有几种网络模式,分别提供哪些功能

  • Host container none bridge
  • Host:与宿主机共享网络名称空间/网络协议栈
  • Container:多个容器之间共享一个network namespaces
  • None :自闭空间
  • Bridge:默认模式通过 veth对连接容器与dockerO网桥,网桥分配给容器Ip,同时docker0作为“局域网”内容器的网关,最后和宿主机网卡进行通讯

两个容器如何通信

  • host:通过docker0网桥通信
  • container:通过lo0网卡通信

怎么把宿主机的文件传入到容器内部

docker cp lopt/ abc容器id:/opt/ abc