(四)Docker进阶网络模式与特权指令

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 目录映射到宿主机的一个目录,并可以在容器启动时指定一个宿主机目录作为数据卷,如下所示:

docker run -v /host/data:/mydata -it myimage

以上是一些使用 Docker Volume 的示例。Docker Volume 的使用可以方便地实现容器之间的数据共享和持久化。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
感谢您的提问!以下是一些关于 Docker 进阶学习的建议: 1. 学习容器编排工具:Docker Compose 和 Kubernetes 是两个常用的容器编排工具。通过学习它们,您可以更好地管理和编排多个容器,构建复杂的应用架构。 2. 持续集成与持续部署(CI/CD):学习如何使用 Docker 构建持续集成和持续部署流程。这将有助于自动化应用程序的构建、测试和部署,提高开发和交付效率。 3. 多阶段构建(Multi-stage Builds):掌握多阶段构建技术可以帮助您优化 Docker 镜像的大小和性能。通过在构建过程中创建多个阶段,并且只保留最终运行所需的组件,可以减小镜像的体积。 4. Docker 插件和扩展:探索 Docker 的插件和扩展生态系统,了解如何使用它们来扩展 Docker 的功能。一些常见的扩展包括网络插件、存储插件和身份验证插件,它们可以提供额外的功能和灵活性。 5. 容器安全和隔离:学习如何配置和管理容器的安全性和隔离性。了解容器的安全最佳实践,并使用适当的配置和工具来加强容器的安全性,以防止潜在的攻击和数据泄漏。 6. Docker Swarm:Docker Swarm 是 Docker 官方提供的一个原生的容器编排和集群管理工具。通过学习 Docker Swarm,您可以了解如何使用它来管理分布式应用程序,并实现负载均衡和高可用性。 7. 监控和日志:学习如何监控和记录 Docker 容器的性能和日志。了解如何使用相关工具和技术来监测容器的资源利用率、运行状况和错误日志,以便及时发现和解决问题。 这些是 Docker 进阶学习的一些建议,希望对您有所帮助!如有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值