一、概念介绍
1.1 什么是macvlan
macvlan是一种网卡虚拟化技术,能够将一张网卡(Network Interface Card, NIC)虚拟出多张网卡,这意味着每个虚拟网卡都能拥有独立的MAC地址和IP地址,从而在系统层面表现为完全独立的网络接口。这些虚拟网卡可以直接连接到物理网络,就像是网络中单独的物理设备一样,而不像传统的网络桥接或VLAN那样需要一个共同的桥接接口来转发流量。可以简单理解为macvlan是docker容器中的一种网络模式,可以让容器直接连接到宿主机的物理网络。
1.2 什么是docker容器
Docker容器是一种轻量级、可移植的软件封装技术,它允许开发者将应用程序及其所有的依赖包打包到一个独立的、可运行的包中。这个包可以在任何安装了Docker引擎的系统上运行,无论该系统是在开发、测试还是生产环境中,保证了应用运行环境的一致性。Docker容器利用操作系统的Namespace和Control Groups等技术,实现了资源的隔离和限制,使得每个容器都像是运行在一个独立的系统中,但实际共享着宿主机的内核。
1.3docker容器与虚拟机对比
- 资源消耗:虚拟机运行在宿主机上的虚拟化层(如Hypervisor)上,每个虚拟机都需要自己的操作系统,这导致较高的资源开销。相比之下,容器直接运行在宿主机的操作系统上,共享宿主机的内核,因此资源消耗小得多。
- 启动速度:容器由于不需要启动完整的操作系统,其启动速度远远快于虚拟机。
- 隔离程度:虚拟机提供了更强的隔离性,每个虚拟机都有自己的硬件虚拟化层,包括CPU、内存、硬盘等,而容器共享宿主机的硬件资源,隔离性相对较弱,但通过命名空间和控制组仍能有效隔离。
- 灵活性与便携性:容器镜像体积小,便于在网络上分发和快速部署,更适合动态扩缩容和快速迭代的开发模式。
- 适用场景:虚拟机更适合需要高度隔离或需要运行完全不同操作系统环境的场景,而容器则更适合微服务架构、快速部署、轻量级隔离的场景。
1.4 docker的五种网络模式
二、 Docker的安装与使用
2.1 Docker的安装
安装教程:https://docker-practice.github.io/zh-cn/install/ubuntu.html
安装完后一定要添加镜像源:
安装完上面后再拉取镜像
2.1.1 相关知识了解
2.2 Docker的基础使用命令
查看信息 --------------------------------------------------------------------------
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器
#查看容器相关信息(推荐使用这个)
#打印网络名称、容器名称、主机名及对应的IP地址
docker inspect --format '{{range $key, $value := .NetworkSettings.Networks}}{{$key}}: {{$.Name}} - {{$.Config.Hostname}} - {{$value.IPAddress}}{{println}}{{end}}' 容器名/ID
#查看存在的网络
docker network ls
#查看某个网络下连接的容器
docker network inspect 网络名或ID
#查看容器连接的网络
docker inspect 容器名/ID
ip addr show #列出系统中所有网络接口,包括IP地址、子网掩码、广播地址、网络接口的状态
ip route #展示系统的路由表。路由表是决定数据包在网络中如何转发
删除 ------------------------------------------------------------------------------
#将容器从指定网络断开
docker network disconnect my_network my_container
#删除网络(无容器连接时才可删除)
docker network rm my_network -f (-f表示强制删除)
#删除容器
docker rm 容器名/ID #(正在运行容器不能删除,除非加-f选项)
进入和退出容器 ------------------------------------------------------------------------
#进入容器前要先启动
docker start 容器名/ID #启动容器
docker restart 容器名/ID #重启容器
docker stop 容器名/ID #停止正在运行的容器
# 进入容器,推荐exec 进入容器前要先启动容器
docker attach 容器名/ID #使用attach进入后退出,容器停止运行
docker exec -it 容器名/ID /bin/bash #使用exec进入后退出,容器不会停止
docker exec -it 容器名/ID bash
# 退出容器
exit #直接退出
crlt + P 再按 ctrl + Q #退出容器但是不终止运行
docker相关服务 ------------------------------------------------------------------------
systemctl start docker #启动服务
systemctl status docker #查看状态 active(runing)表示已启动
systemctl stop docker #停止服务
ubuntu防火墙 ---------------------------------------------------------------------------
sudo ufw status #查看防火墙状态,inactive是关闭,active是开启
sudo ufw enable #开启防火墙
udo ufw disable #关闭防火墙
三、创建macvlan网络连接的容器
3.1 创建macvlan网络
创建容器时必须选择连接一个网络,如果不选择就是默认桥接模式brideg,可以使用docker network ls查看目前存在的网络。
sudo docker network create \
--driver macvlan \
--subnet=<你的宿主机子网,如192.168.0.0/24> \
--gateway=<你的宿主机网关> \
-o parent=物理接口名称,如ens33 \
net-1
3.2 查询创建网络时候的相关信息
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic ens33
valid_lft 3444sec preferred_lft 3444sec
default via [网关IP] dev [网络接口名称] proto [协议] metric [数值]
- [网关IP]:这部分显示的就是你的默认网关地址。
- [网络接口名称]:表示数据包将通过哪个网络接口发送到默认网关。
- [协议]:可能是dhcp, static, kernel, boot等,表示路由设置的来源。
- [数值]:metric值,用于衡量路径的优先级,数值越小优先级越高。
3.3 创建一个docker容器
sudo docker run -itd \
--name container-1 \
--network=net-1 \
--ip=192.168.0.61 \
-v /home/norten/Public/tools:/mnt \
ubuntu
需要注意的是:
- 容器要先使用docker start [容器名称] 命令启动后才能够进入容器内部
- 可以使用dokcer ps查看所有正在运行的容器,docker ps -a显示所有存在的容器
- 使用docker exec -it [容器名称] bash 进入容器后,使用exit退出时容器仍正常运行
- 使用docker attach [容器名称] 进入容器后,使用exit退出容器则容器停止运行
- 可以使用docker inspect [网络名称] 查看该网络所有相关的信息
- 可以使用docker inspect [容器名称] 查看该容器所有相关的信息,如以下图片所示
Mounts:
Networks: