4.1 docker网络模式简介
Docker支持多种网络模式,包括bridge、host、none和overlay等。不同的网络模式有不同的特点和适用场景,下面对这些网络模式进行详细的介绍。
-
Bridge模式
Bridge模式是Docker的默认网络模式。在Bridge模式下,Docker会创建一个虚拟的Bridge网络,Docker容器会自动加入这个网络中。Bridge网络会自动分配IP地址,容器之间可以通过IP地址相互通信。同时,Docker还会为每个容器分配一个域名,容器可以通过域名相互访问。Bridge模式的优点是简单易用,容易进行配置。同时,容器之间相互隔离,不会相互影响。但是,由于每个容器都会分配一个IP地址,当容器数量较多时,IP地址可能会耗尽,同时,容器之间的通信需要通过IP地址进行,不够直观。
-
Host模式
Host模式下,容器和宿主机共享同一个网络命名空间,容器不再有自己的网络接口,也不会分配独立的IP地址。容器直接使用宿主机的IP地址和端口,因此在Host模式下,容器的网络性能会得到提升。Host模式的优点是网络性能好,因为容器直接使用宿主机的网络接口,而不需要进行NAT转换。但是,由于容器和宿主机共享网络命名空间,容器之间的隔离性较差,容器之间的端口号不能重复。
-
None模式
None模式下,容器不会分配任何网络资源,也没有独立的网络接口。因此,在None模式下,容器不能与外部网络通信,也不能与其他容器通信。None模式的优点是简单,因为容器不需要进行任何网络配置。但是,None模式下的容器无法与外部网络通信,只能在宿主机上进行本地访问。
-
Overlay模式
Overlay模式是Docker Swarm集群中使用的网络模式。在Overlay模式下,Docker会自动创建一个虚拟的Overlay网络,容器会自动加入这个网络中。Overlay网络可以跨越多个宿主机,容器之间可以通过域名进行通信。Overlay模式的优点是可以跨越多个宿主机,容器之间可以进行跨主机通信。但是,由于Overlay网络需要进行NAT转换,因此网络性能不如Bridge模式。
除了以上四种网络模式外,Docker还支持其他一些网络模式,如Macvlan模式、IPvlan模式、Wireguard模式等。这些网络模式在特定场景下可以发挥重要作用,但是不太常用。
docker 设置网络模式命令如下
docker run -d --net=host nginx
4.2 使用自定义网络实现单向通信
假设我们需要创建两个容器 container1 和 container2,它们需要在同一个自定义网络 mynetwork 中,并且 container1 需要能够与 container2 通信,而 container2 不需要与 container1 通信。
首先,我们需要创建自定义网络 mynetwork:
docker network create mynetwork
然后,我们可以创建 container1,并将其加入 mynetwork:
docker run -d --name container1 --network mynetwork <image1>
接着,我们可以创建 container2,并将其加入 mynetwork:
docker run -d --name container2 --network mynetwork <image2>
现在,我们需要让 container1 能够与 container2 通信,而 container2 不需要与 container1 通信。我们可以使用容器名称(container2)来解析 container2 的 IP 地址,并将其添加到 container1 的 /etc/hosts 文件中:
docker exec -it container1 sh -c "echo '<container2_ip> container2' >> /etc/hosts"
注意,这里的 <container2_ip> 应该替换为 container2 的 IP 地址。可以使用以下命令获取 container2 的 IP 地址:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container2
现在,container1 就可以使用 container2 的主机名(container2)访问它了,例如:
curl http://container2:port
其中,port 是 container2 暴露的端口号。而 container2 无法通过主机名访问 container1。
4.3 docker容器利用brige网桥实现双向通信
创建一个新的网桥:docker network create -d bridge my_bridge
启动第一个容器:docker run -itd --name tomcat centos:7
启动第二个容器:docker run -itd --name redis centos:7
把第一个容器加入网桥:docker network connect my_bridge tomcat
把第二个容器加入网桥:docker network connect my_bridge redis
最后分别进入俩个容器中进行验证
4.4 docker 容器特权模式介绍
Docker 特权模式是指容器可以访问主机系统的特权级别资源和设备,例如可以访问主机系统的网络栈、文件系统、设备节点等,这种模式可以给予容器更高的权限,但也增加了安全风险。
默认情况下,Docker 容器是以非特权模式运行的,也就是说,容器内的进程只能访问容器内部的资源,而不能访问宿主机上的资源和设备。如果需要在容器内访问主机系统的特权资源和设备,则需要在启动容器时使用 --privileged 选项,将容器运行在特权模式下。
在特权模式下,容器内的进程将以 root 用户身份运行,这样容器内的进程就可以访问主机系统的特权级别资源和设备。同时,特权模式下的容器也可以执行一些特权操作,例如加载内核模块、修改网络配置等。
需要注意的是,特权模式可能会带来安全风险,因为容器在该模式下可以访问主机上的任何设备和文件系统,甚至可以更改主机上的网络配置。因此,在使用特权模式时,应格外谨慎,并确保只使用必要的权限。
Docker 特权模式可以通过 --privileged
标志启动容器来启用。可以在 docker run 命令中使用该标志,例如:
docker run --privileged my_image
此外,也可以在 Dockerfile 中使用 privileged: true 指令来启用容器的特权模式。例如:
FROM my_base_image
# ...
# 启用特权模式
# 注意:此处指令使用的是 true,而非 --privileged
# 因为 Dockerfile 中无法使用命令行标志
# 该指令等效于在 docker run 命令中使用 --privileged
# 如果该指令不写,则默认情况下容器处于非特权模式
# 特权模式可能会带来安全风险,谨慎使用
# 参考文档:https://docs.docker.com/engine/reference/builder/#security-configuration
#--rm 参数表示在容器退出时自动删除该容器
RUN ["docker", "run", "--rm", "--privileged", "echo", "Privileged mode enabled"]
4.5 docker Volume数据共享
Docker Volume 是一种可以在容器和主机之间共享数据的方式。Docker Volume 可以用于在容器之间共享数据,也可以用于持久化数据,使得即使删除容器数据仍然存在。
Docker Volume 的创建和管理可以通过命令行和 Docker Compose 来实现。以下是一些使用 Docker Volume 的示例:
1.创建一个 Docker Volume,并将其挂载到一个容器中:
docker volume create myvolume
docker run -it -v myvolume:/app alpine sh
这个命令会创建一个名为 myvolume 的 Docker Volume,并将其挂载到容器的 /app 目录中。alpine 镜像会被下载并运行一个 shell,从而可以在容器中操作 /app 目录。
2.将一个本地目录挂载到一个容器中:
docker run -it -v /path/to/my/folder:/app alpine sh
这个命令会将本地目录 /path/to/my/folder 挂载到容器的 /app 目录中。然后 alpine 镜像会被下载并运行一个 shell,从而可以在容器中操作 /app 目录。
3.将一个 Docker Volume 挂载到一个容器中,并在容器之间共享数据:
首先,创建一个 Docker Volume:
docker volume create mydata
然后,创建两个容器,都将这个 Docker Volume 挂载到容器的 /app 目录中:
docker run -d --name=container1 -v mydata:/app nginx
docker run -d --name=container2 -v mydata:/app nginx
这个命令会创建两个名为 container1 和 container2 的容器,并将它们都连接到名为 mydata 的 Docker Volume。由于两个容器都将 mydata 挂载到 /app 目录中,它们之间可以共享数据。
4.DockerFile 使用VOLUME
Dockerfile 中的 VOLUME 指令可以在镜像构建时定义一个或多个目录,并且这些目录在容器启动时可以被映射为 Docker 卷,从而实现容器内外数据的共享。
例如,在 Dockerfile 中使用 VOLUME 定义一个目录,如下所示:
FROM ubuntu:latest
VOLUME /mydata
这个 Dockerfile 构建出的镜像可以将容器内的 /mydata 目录映射到宿主机的一个目录,并可以在容器启动时指定一个宿主机目录作为数据卷,如下所示:文章来源:https://www.toymoban.com/news/detail-490483.html
docker run -v /host/data:/mydata -it myimage
以上是一些使用 Docker Volume 的示例。Docker Volume 的使用可以方便地实现容器之间的数据共享和持久化。文章来源地址https://www.toymoban.com/news/detail-490483.html
到了这里,关于(四)Docker进阶网络模式与特权指令的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!