docker安全实战3: 亲自动手设置多容器架构
2023-6-7 23:26:45 Author: mp.weixin.qq.com(查看原文) 阅读量:15 收藏

在这篇文章中,为一个简单的 HTTP 应用程序设置多容器架构,该应用程序将在端口 80 上提供服务并与端口 11211 上的 Memcached 服务器交互。 在此展示两种方法

  • 冗长的方法使用 Docker 拉取镜像,然后一个一个地部署,
  • 使用 docker-compose,简单的一个文件并一次性部署容器。

为了防止安全配置错误,创建了一个在https://registry:5000 上提供服务的本地 docker 存储库, 使用它来将镜像从注册表拉取到本地文件系统。

使用 Docker CLI 执行部署

在系统上,当前没有拉取镜像。要检查这些镜像的名称,可以从注册表中调用目录 API。

在所有这些中,使用两张镜像appserver:latestmemcached-app:latest。 所以通过docker pull命令拉它

docker pull registry:5000/appserver
docker pull registry:5000/memcached-app

注意:只有一个标签可用于这些镜像(latest),可以在编写拉取镜像命令时忽略它,因为默认情况下 docker 使用latest标签。

完成这两个镜像的拉取后,可以通过执行docker images命令来验证镜像是否已下载。

为容器之间的路由请求创建网络命名空间

可以使用主机网络在appservermemcached之间路由请求。但是这没意思,所以创建一个用户定义的网络并将其分配给这两个服务。

将使用网桥网络,因为它允许通过同一网桥连接时在容器之间创建链接,从而隔离其它在不同网络上的容器。在内部,它将使用名称空间来分配网桥并为其创建iptables规则。当启动 Docker 时,会自动创建一个默认的桥接网络(也称为bridge),除非另有指定,否则新启动的容器将连接到它。

使用docker network create命令创建网络。默认情况下,它将创建一个桥接网络,其名称在命令后指定。

成功创建网络并准备好使用后,可以在创建或运行容器通过--network app-test参数指定它们使用的网络。

创建使用app-test网络路由的容器

创建并启动容器,可以通过 docker run命令来完成。

docker run --network app-test -d registry:5000/appserver
docker run --network app-test -d registry:5000/memcached-app

该标志-d将告诉容器从当前 shell 会话中分离并在后台上下文中启动。但是,为了调试容器,始终可以通过docker logs命令获取日志并使用docker exec命令启动 shell 会话

要获取正在运行的容器的列表,可以执行docker ps命令。该命令将获取所有正在运行的容器的列表。此外,可以使用带有-a标志的相同命令来获取所有状态(包括运行)的容器。

通过 IP地址 与 容器交互

部署容器后,无法直接看到容器的 IP 地址。但可以使用docker inspect命令获取有关已创建容器的详细信息,如文件系统、网络详细信息等等。

还可以通过提供-p 8080:80标志来部署具有端口绑定的容器。这会将发送到 localhost:8080 的流量重定向到容器上的端口 80。

现在可以验证端口 80 是否开放 IP 地址并通过 curl 执行 HTTP 请求。

停止包含并销毁资源

完成工作后,建议停止容器为系统上的其他进程或容器运行提供空间。在现实世界中,只有当在服务器上滚动更新并希望关闭旧的运行代码服务时,才会这样做。

要停止容器,可以docker stop使用多个容器 ID(来自docker ps输出)或容器名称来执行命令。如果要停止所有正在运行的容器,使用docker stop $(docker ps -q)命令,如下所示

删除容器以释放它们在主机文件系统中占用的磁盘空间。这可以通过docker rm命令或docker container rm命令来完成。删除所有容器,使用docker rm $(docker ps -aq)

删除网络命名空间以释放 IP 地址范围和冗余 iptables 规则。可以通过提供网络名称或 ID(来自docker network ls命令) 的docker network rm命令来执行此操作。

为了下一个docker-compose 演示,清除所有镜像,以便系统返回到与开始时相同的状态。使用docker rmi命令或docker image rm命令,后跟镜像的名称或可以通过docker imagesdocker image ls命令获取的 ID。

使用 Docker Compose 执行部署

概述

Docker-compose是一种易于使用的 yaml 配置,用于设置和管理应用程序的多容器架构设置,只需执行最少的命令。它由 docker 团队管理,是一个完全开源的工具。

使用 docker-compose 而不是手动一一设置的原因

  1. yaml文件的简单格式来配置资源和服务(容器)

  2. 一个文件来管理特定项目的所有容器

  3. docker 不同,执行启动、停止操作和扩展容器非常容易。此外,可以轻松创建或销毁资源

  4. 默认情况下为当前应用程序上下文创建网桥以提供网络级隔离

  5. 允许开发人员使用配置即时构建容器

docker-compose 的默认文件是docker-compose.yml ,或者docker-compose -f指定配置文件

为两个服务编写配置

这些服务是要运行和部署的应用程序,它会为每个服务至少创建一个容器。由于memcached-app服务需要部署在appservice之后,可以通过在composer文件中使用depends_on配置依赖

version: "3.3"

services:
  memcached:
    image: registry:5000/memcached-app
    depends_on:
      - app
  app:
    image: registry:5000/appserver
    ports:
      - "8080:80"  # mapping the port 80 of container with 8080 on the host (both ipv4 and ipv6)

启动服务并访问appserver

看看用一个简单的docker-compose up命令启动这两个服务是多么容易。该标志-d告诉 docker 在后台上下文中运行服务(分离模式)。

在检查网络时,会看到它已自动创建网络root_default。这里的root是目录名,在docker-compose中被认为是项目名。可以通过参数-p myproject或环境变量COMPOSE_PROJECT_NAME=myproject更改项目名称。

docker 容器按照动部署时所做的特定顺序运行。当通过 docker-compose 对特定服务进行缩放时,镜像名称中的数字会派上用场。

由于已经在本地主机上转发了端口,因此使用本地主机接口对appserver服务执行 curl 请求。

停止服务并销毁所有资源

在这种情况下,停止并销毁资源非常方便。要在不销毁资源的情况下停止服务,只需使用docker-compose stop,如果想销毁所有资源(容器和网络接口),docker-compose down

注意: docker destroy 命令会先停止容器并释放所有占用的资源。


文章来源: https://mp.weixin.qq.com/s?__biz=MzU4NjY0NTExNA==&mid=2247489541&idx=1&sn=cd6445eb437fa889a2c9c87e78627401&chksm=fdf97310ca8efa064549a1aed9234f8b159b50b255812b0c84b5e4df01a61f022efb03c31e5d&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh