在这篇文章中,为一个简单的 HTTP 应用程序设置多容器架构,该应用程序将在端口 80
上提供服务并与端口 11211
上的 Memcached
服务器交互。 在此展示两种方法
冗长的方法使用 Docker
拉取镜像,然后一个一个地部署,
使用 docker-compose
,简单的一个文件并一次性部署容器。
为了防止安全配置错误,创建了一个在https://registry:5000
上提供服务的本地 docker
存储库, 使用它来将镜像从注册表拉取到本地文件系统。
在系统上,当前没有拉取镜像。要检查这些镜像的名称,可以从注册表中调用目录 API。
在所有这些中,使用两张镜像appserver:latest
和memcached-app:latest
。 所以通过docker pull
命令拉它
docker pull registry:5000/appserverdocker pull registry:5000/memcached-app
注意:只有一个标签可用于这些镜像(
latest
),可以在编写拉取镜像命令时忽略它,因为默认情况下docker
使用latest
标签。
完成这两个镜像的拉取后,可以通过执行docker images
命令来验证镜像是否已下载。
可以使用主机网络在appserver
和memcached
之间路由请求。但是这没意思,所以创建一个用户定义的网络并将其分配给这两个服务。
将使用网桥网络,因为它允许通过同一网桥连接时在容器之间创建链接,从而隔离其它在不同网络上的容器。在内部,它将使用名称空间来分配网桥并为其创建iptables
规则。当启动 Docker
时,会自动创建一个默认的桥接网络(也称为bridge
),除非另有指定,否则新启动的容器将连接到它。
使用docker network create
命令创建网络。默认情况下,它将创建一个桥接网络,其名称在命令后指定。
成功创建网络并准备好使用后,可以在创建或运行容器通过--network app-test
参数指定它们使用的网络。
创建并启动容器,可以通过 docker run
命令来完成。
docker run --network app-test -d registry:5000/appserverdocker run --network app-test -d registry:5000/memcached-app
该标志-d
将告诉容器从当前 shell
会话中分离并在后台上下文中启动。但是,为了调试容器,始终可以通过docker logs
命令获取日志并使用docker exec
命令启动 shell
会话
要获取正在运行的容器的列表,可以执行docker ps
命令。该命令将获取所有正在运行的容器的列表。此外,可以使用带有-a
标志的相同命令来获取所有状态(包括运行)的容器。
部署容器后,无法直接看到容器的 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 images
或docker image ls
命令获取的 ID。
Docker-compose
是一种易于使用的 yaml 配置,用于设置和管理应用程序的多容器架构设置,只需执行最少的命令。它由 docker
团队管理,是一个完全开源的工具。
使用 docker-compose
而不是手动一一设置的原因
yaml
文件的简单格式来配置资源和服务(容器)
一个文件来管理特定项目的所有容器
与 docker
不同,执行启动、停止操作和扩展容器非常容易。此外,可以轻松创建或销毁资源
默认情况下为当前应用程序上下文创建网桥以提供网络级隔离
允许开发人员使用配置即时构建容器
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)
看看用一个简单的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
命令会先停止容器并释放所有占用的资源。