Docker 网络

本文详细介绍了Docker的几种网络模式,包括桥接模式(默认)、host模式、none模式以及自定义网络,展示了端口映射、数据卷在容器间的数据共享和网络通信的应用。
摘要由CSDN通过智能技术生成
桥接模式用于连接两个不同网络段的设备,是一种共享通信的一种方式
桥接设备工作在Osi模型的第二层,数据链路层,转发数据帧,mac地址进行转发,类似于交换机,只能转发同一网段,通过泛洪广播来找目标设备的mac地址
Docker的网络就是基于桥接模式实现的

docker的工作模式

虚拟网络桥

安装开启docker,docker程序会自动创建一个虚拟网络桥(docker0),是一个虚拟的网络设备,类似于物理网络设备的交换机

分配唯一的ip地址,每次运行一个容器,docker进程都会分配唯一的且未被其他容器占用的ip地址给容器,这个ip地址是在桥接模式网络的子网中
容器和主机之间通信:还是通过桥接模式,容器可以与主机直接通信,容器可以访问主机上的运行服务,主机也可以通过桥接网络docker:0来访问容器内部的进程(iptables的nat地址转换,在主机上做了地址转换)

这里有一个问题:docker的网桥是宿主虚拟出来的,并不是一个真正存在的网络设备,外部网络无法寻址到,外部网络无法直接访问docker:0分配给容器的ip地址

可以给容器做一个端口映射来实现外部访问

容器创建完毕之后不能在原基础上做端口映射

docker run -itd --name test1 -P nginx:122.0 /bin/bash
-P:在创建容器时,在宿主机和容器之间做一个端口映射
-P:后面如果什么都不加,会随机分配一个端口给宿主机,容器的端口是不会变的
-P:端口号会从32768开始
docker run -itd --name test2 -p 4300:80 nginx:1.22.0 /bin/bash
-p:p是小写,是指定一个端口而不是随机
-p:指定端口,人为设置固定的端口映射

Docker的网络模式

bridge模式docker的默认的网络模式,在创建docker时不需要指定网络类型,默认就是bridge
host模式

容器将不会虚拟出自己的网卡,也没有自己的ip地址,全部使用宿主机的ip地址和端口

创建容器的时候可以指定网络模式: --network host

格式

docker run -itd --name test1 --network host nginx /bin/bash

host模式的特点是共用模式,如果是单个容器运行,可以使用host模式

container模式

容器和容器之间共用一个ip和端口

如果两个端口互相冲突,关闭一个程序即可

none模式

docker容器有自己的network-space,但是这个容器没有任何网络设置,这个容器没有网卡,ip,路由,只有lo会还网络,在none模式下,容器不可以联网

创建格式

docker run -itd --name test1 --network=none nginx /bin/bash

自定义网络模式我们可以给docker创建一个自己定义的网段
docker network ls
查看docker容器网络信息
自定义网络:我们可以给docker创建一个自己定义的网段,
docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork

--subnet=172.18.0.0/16 可以自定义一个网段 
--opt “com.docker.network.bridge.name”=”docker1” 这里的opt可以不加,但是网卡名称难以识别
mynetwork 表示自定网络的名称

在使用默认docker:0网桥时,创建容器时不能指定ip地址的,只能由docker网桥自动分配除非用户自定义的网络才可以给容器自定义ip地址
NETWORK ID     NAME      DRIVER    SCOPE

c9b9eda7c734   bridge    bridge    local

0ad7f67176f2   host      host      local

8bb245e29c87   none      null      local

NETWORK ID:这个是docker网络唯一id
Name:网络名称
Driver:docker的网络驱动程序
SCOPE:表示网络的作用范围,local 表示只能在本地通信

查看容器日志

docker logs 容器名称/ID(不是实时查看,查看所有)

docker logs -f (从尾部看)

docker logs --tail=10 test1(固定看10行)

★docker logs --tail=10 -f test1(动态看最近的10行

数据卷

容器如何与宿主机之间进行数据共享?
数据卷是一个供容器使用的特殊目录,在容器中,和宿主机进行映射,主机和宿主机之间都可以对目录中的文件进行修改,双方都同步生效,对镜像也没有影响,宿主机到容器实现数据迁移

 宿主机与容器之间数据共享

如何将宿主机的目录和容器中的目录进行挂载(映射关系)?
docker run -itd --name test1 -v /opt/test:/opt/test centos:7 /bin/bash

-v表示进行挂载

docker run -itd --name test1 -v /opt/test:/opt/test:ro centos:7 /bin/bash
:ro表示readonly,只读模式
如果加了ro那么容器里映射的目录中将无法创建或写入文件,变为只读
[root@docker1 opt]# docker run -itd --name test2 -v /opt/test:/opt/test centos:7 /bin/bash
[root@docker1 opt]# docker exec -it test2 bash
[root@6aefab3ed357 test]# ls /opt
test

之后到目录里创建文件或写入文件进行验证

容器和容器之间实现数据共享 

[root@docker1 test]# docker run -itd --name test11 -v /opt/data1 -v /opt/data2 centos:7 /bin/bash
[root@docker1 opt]# docker run -itd --volumes-from test11 --name test3 centos:7 /bin/bash
[root@docker1 opt]# docker exec -it test3 bash
[root@docker1 test]# docker exec -it test11 bash

-v 此时创建的是容器内部的目录
直接查看test11和test3容器/opt目录下有无data1跟2,如果有表示可以在目录里进行数据传输
--name test3 这里的容器名不能是已创建的,必须要是未创建的

test1和test2可以有一个或者多个映射目录,实现数据互传,数据同步

数据卷容器:只提供挂载点,让另一方收集数据

容器互联

实现两个容器之间的网络通信

老版本方法

[root@docker1 opt]# docker run -itd -P --name test111 centos:7 /bin/bash
[root@docker1 opt]# docker ps
[root@docker1 opt]# docker run -itd -P --name test222 --link test111:test222 centos:7 /bin/bash
[root@docker1 opt]# docker ps
[root@699e9c74171c /]# yum -y install net-tools
两个容器都安装net-tools
[root@699e9c74171c /]# ifconfig
[root@699e9c74171c /]# vi /etc/hosts

  

新版本

docker run -itd -P --name test112 --network=mynetwork centos:7 /bin/bash
docker run -itd -P --name test113 --network=mynetwork centos:7 /bin/bash
进入容器1
docker exec -it test112 bash
yum -y install net-tools
进入容器2
docker exec -it test113 bash
yum -y install net-tools
指定两个容器在在同一网段中不需要做映射
1.创建镜像,nginx:1.22.0,centos:7
2、创建容器nginxl,网络模式为host,可以通过宿主机的ip+端口,访问nginx的服务
[root@docker1 ~]# docker run -itd --name nginx1 --network host nginx:1.22.0 /bin/bash
[root@docker1 ~]# docker exec -it nginx1 bash
root@docker1:/# service nginx start
到网页测试是否可以访问nginx

3.创建自定义网络,mynetwork,网段为192.18.10.0/16
[root@docker1 ~]# systemctl restart docker
[root@docker1 ~]# docker network create --subnet=192.18.10.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork

4.创建容器nginx2,使用mynetwork,指定ip地址为192.18.10.10为ip地址,端口映射为3080:80,实内外网访问。
[root@docker1 ~]# docker run -itd --name nginx2 --network mynetwork --ip 192.18.10.10 -p 3080:80 nginx:1.22.0 /bin/bash

5.创建nqinx3和centos1容器,centos1可以在容器内部访问nginx3的页面
要点:两个容器之间互相通信
[root@docker1 ~]# docker run -itd -P --name nginx3 --network=mynetwork nginx:1.22.0
[root@docker1 ~]# docker run -itd -P --name centos1 --network=mynetwork centos:7

[root@docker1 ~]# docker exec -it nginx3 bash
root@3fd608b60f38:/# service nginx start
root@3fd608b60f38:/# echo nginx3 > /usr/share/nginx/html/index.html
root@3fd608b60f38:/# exit

[root@docker1 ~]# docker run -itd -P --name nginx4 --network=mynetwork nginx:1.22.0
321213b0792569ac6c15f9e6343969a2ffd3f07f4d0bdb5865330f53febd9904
[root@docker1 ~]# docker exec -it nginx4 bash
root@321213b07925:/# echo nginx4 > /usr/share/nginx/html/index.html
root@321213b07925:/# service nginx start
root@321213b07925:/# curl nginx4
nginx4
root@321213b07925:/# curl nginx3
nginx3

[root@docker1 ~]# docker exec -it centos1 bash
[root@3b1722bd4a57 /]# curl nginx4
nginx4
[root@3b1722bd4a57 /]# curl nginx3
nginx3

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值