默认选择bridge的情况下,容器启动后会通过DHCP获取一个地址.
安装Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。
docker network ls
brctl show
docker network inspect bridge
docker run --name nginx-demo -p 8086:80 -d chengxuyuanshitang/nginx:v3
ip addr
创建一个自定义网络,用于容器间的通信
docker network create testnetwork
启动 Nginx 服务器容器,并连接到自定义网络
docker run --name nginx-demo --network=testnetwork -p 8086:80 -d chengxuyuanshitang/nginx:v3
启动mysql 服务器容器,并连接到自定义网络
docker run -itd --name mysql-demo --network=testnetwork -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
Nginx 服务器容器和mysql 数据库容器都连接到同一个自定义网络?testnetwork,它们可以使用容器名称进行通信。
Host 网络模式是 Docker 中的一种网络模式,它与默认的 bridge 模式不同。在 Host 网络模式下,容器与宿主机共享网络命名空间,直接使用宿主机的网络接口进行通信,而不是创建一个单独的网络栈。
启动 Nginx 服务器容器,并连接到自定义网络
docker run --name nginx-demo --net=host --privileged=true -p 8086:80 -d chengxuyuanshitang/nginx:v3
ip addr
container模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。
新创建的容器不会创建自己的网卡、配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。所以这两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
两个容器的进程可以通过 lo 网卡设备通信。
创建新容器的时候,通过--net container参数。
--network container:[容器名或容器ID]
# docker inspect 容器别名 | grep IPAddress
docker inspect nginx-demo | grep IPAddress
docker run -it --name nginx-demo3 --net container:nginx-demo -d nginx:test
如果加了参数 -p?8087:80。提示: docker: Error response from daemon: conflicting options: port publishing and the container type network mode.
docker run的时候,不能使用-p,因为-p是手动指定端口,而container模式的ip和端口是不受container模式的容器自身控制,它的IP和端口,相当于完全委托给第一个以桥接方式启动的容器了。
ip addr
对比两个容器发现:
第一个以桥接方式启动的容器的网络信息是全套的,ip 端口 网关,都有。
第二个以container模式启动容器的网络信息,发现毛都没有,都是空的。
Docker网络none模式是指创建的容器没有网络地址,只有lo网卡,在无网络模式下,容器没有网络接口,无法与外部网络通信。该模式主要用于一些特殊场景,如只需要运行一个进程的容器或与网络无关的容器。
docker run --name nginx-demo4 --net=none -d nginx:test
ip addr
宿主机的网卡列表没有任何变化。