赞
踩
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
Docker 是一个很棒的工具,但要充分发挥其潜力,最好是让应用程序的每个组件都在自己的容器中运行。对于具有许多组件的复杂应用程序,编排所有容器一起启动和关闭(更不用说彼此通信)很快就会变得难以控制。
Docker 社区提出了一个流行的解决方案,叫做 Fig,它允许您使用单个 YAML 文件来编排所有 Docker 容器和配置。这变得如此流行,以至于 Docker 团队最终决定基于 Fig 源码制作自己的版本。他们称之为 Docker Compose。简而言之,它使得处理 Docker 容器的编排过程(如启动、关闭和设置容器间的链接和卷)变得非常容易。
通过本文,您将安装 Docker 和 Docker Compose,并对 Docker Compose 的工作原理有基本的了解。
使用 Docker Compose 需要将一堆不同的 Docker 概念结合在一起,因此在开始之前,让我们花一分钟时间回顾涉及的各种概念。如果您已经熟悉 Docker 概念,如卷、链接和端口转发,那么您可能想直接跳到下一节。
每个 Docker 容器都是 Docker 镜像的本地实例。您可以将 Docker 镜像视为完整的 Linux 安装。通常,最小安装只包含运行镜像所需的最少软件包。这些镜像使用主机系统的内核,但由于它们运行在 Docker 容器内部并且只能看到自己的文件系统,因此完全可以在 Ubuntu 主机上运行 CentOS(或反之亦然)。
大多数 Docker 镜像都是通过 Docker Hub 分发的,这是由 Docker 团队维护的。大多数流行的开源项目都有对应的镜像上传到 Docker Registry,您可以使用这些镜像来部署软件。在可能的情况下,最好获取“官方”镜像,因为它们由 Docker 团队保证遵循 Docker 最佳实践。
默认情况下,Docker 容器与主机机器隔离,这意味着默认情况下主机机器无法访问 Docker 容器内部的文件系统,也无法通过网络与其通信。不用说,这使得配置和处理运行在 Docker 容器内部的镜像变得困难。
Docker 有三种主要方法来解决这个问题。第一种最常用的方法是让 Docker 指定环境变量,这些环境变量将在 Docker 容器内部设置。然后,运行在 Docker 容器内部的代码将在启动时检查这些环境变量的值,并使用它们来正确配置自身。
另一种常用的方法是 Docker 数据卷。Docker 卷有两种类型 — 内部和共享。
指定内部卷意味着对于您为特定 Docker 容器指定的文件夹,当容器被移除时数据将被持久化。例如,如果您想确保日志文件保留下来,您可能会指定一个内部的 /var/log
卷。
共享卷将 Docker 容器内的文件夹映射到主机机器上的文件夹。这允许您轻松地在 Docker 容器和主机机器之间共享文件,我们将在 Docker 数据卷文章中探讨这一点。
与 Docker 容器通信的第三种方式是通过网络。Docker 允许不同的 Docker 容器之间通过 links
进行通信,以及端口转发,允许您将 Docker 容器内部的端口转发到主机服务器上的端口。例如,您可以创建一个链接,允许您的 WordPress 和 MariaDB Docker 容器彼此通信,并进行端口转发以将 WordPress 暴露给外部世界,以便用户可以连接到它。
要遵循本文,您需要以下内容:
首先,如果您尚未安装 Docker,请安装它。安装 Docker 的最快方法是下载并安装他们的安装脚本(您将被提示输入 sudo 密码)。
wget -qO- https://get.docker.com/ | sh
上述命令会下载并执行 Docker 团队编写的一个小型安装脚本。如果您不信任第三方脚本,或者想要了解脚本的详细信息,请查看 DigitalOcean Docker 教程或 Docker 自己的安装文档。
如果您的用户配置不正确,使用 Docker 就会很麻烦,因此使用以下命令将您的用户添加到 docker
组中。
sudo usermod -aG docker $(whoami)
注销并重新登录到服务器以激活您的新组。
现在您已经安装了 Docker,让我们继续安装 Docker Compose。首先,安装 python-pip
作为先决条件:
sudo apt-get -y install python-pip
然后您可以安装 Docker Compose:
sudo pip install docker-compose
公共 Docker 注册表 Docker Hub 包含一个简单的 Hello World 镜像。现在我们已经安装了 Docker Compose,让我们用这个非常简单的例子来测试一下。
首先,为我们的 YAML 文件创建一个目录:
mkdir hello-world
然后切换到该目录:
cd hello-world
现在使用你喜欢的文本编辑器创建 YAML 文件(我们将使用 nano):
nano docker-compose.yml
将以下内容放入文件中,保存文件并退出文本编辑器:
my-test:
image: hello-world
第一行将作为容器名称的一部分。第二行指定要使用哪个镜像来创建容器。该镜像将从官方 Docker Hub 仓库下载。
在 ~/hello-world
目录中,执行以下命令来创建容器:
docker-compose up
输出应该以以下内容开头:
[secondary_label Output of docker-compose up]
Creating helloworld_my-test_1...
Attaching to helloworld_my-test_1
my-test_1 |
my-test_1 | Hello from Docker.
my-test_1 | This message shows that your installation appears to be working correctly.
my-test_1 |
然后输出解释了 Docker 正在做的事情:
如果进程没有自行退出,请按 CTRL-C
。
这个简单的测试并没有展示 Docker Compose 的主要优势之一 —— 能够同时启动和关闭一组 Docker 容器。《如何在 Ubuntu 14.04 上使用 Docker Compose 安装 Wordpress 和 PhpMyAdmin》文章展示了如何使用 Docker Compose 运行三个容器作为一个应用程序组。
让我们来了解 docker-compose
工具支持的命令。
docker-compose
命令是基于每个目录的。您可以在一台机器上运行多个 Docker 容器组 —— 只需为每个容器创建一个目录,并在其目录内部为每个容器创建一个 docker-compose.yml
文件。
到目前为止,我们一直在自己运行 docker-compose up
,并使用 CTRL-C
来关闭它。这允许在终端窗口中显示调试消息。然而,当在生产环境中运行时,您会希望 docker-compose
更像一个服务。一个简单的方法是在启动会话时添加 -d
选项:
docker-compose up -d
docker-compose
现在将在后台运行。
要显示您的 Docker 容器组(已停止和当前运行的),请使用以下命令:
docker-compose ps
例如,以下内容显示 helloworld_my-test_1
容器已停止:
[secondary_label Output of `docker-compose ps`]
Name Command State Ports
-----------------------------------------------
helloworld_my-test_1 /hello Exit 0
运行中的容器将显示 Up
状态:
[secondary_label Output of `docker-compose ps`]
Name Command State Ports
---------------------------------------------------------------
nginx_nginx_1 nginx -g daemon off; Up 443/tcp, 80/tcp
要停止应用程序组的所有运行中的 Docker 容器,请在与用于启动 Docker 组的 docker-compose.yml
文件相同的目录中发出以下命令:
docker-compose stop
在某些情况下,Docker 容器将在内部卷中存储其旧信息。如果您想从头开始,可以使用 rm
命令完全删除组成容器组的所有容器:
docker-compose rm
如果您尝试从除了包含 Docker 容器和 .yml
文件的目录之外的目录中运行这些命令,它将抱怨并不会显示您的容器:
[secondary_label Output from wrong directory]
Can't find a suitable configuration file in this directory or any parent. Are you in the right directory?
Supported filenames: docker-compose.yml, docker-compose.yaml, fig.yml, fig.yaml
如果您需要在容器内部的命令提示符下工作,可以使用 docker exec
命令。
Hello World! 示例在运行后退出,因此我们需要启动一个将保持运行的容器,以便我们可以使用 docker exec
访问容器的文件系统。让我们来看看 Docker Hub 上的 Nginx 镜像。
为其创建一个新目录并切换到该目录:
mkdir ~/nginx && cd $_
在我们的新目录中创建一个 docker-compose.yml
文件:
nano docker-compose.yml
并粘贴以下内容:
nginx:
image: nginx
保存文件并退出。我们只需要使用以下命令将 Nginx 容器作为后台进程启动:
docker-compose up -d
Nginx 镜像将被下载,然后容器将在后台启动。
现在我们需要容器的 CONTAINER ID
。列出所有正在运行的容器:
docker ps
您将看到类似以下内容:
[secondary_label Output of `docker ps`]
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e90e12f70418 nginx "nginx -g 'daemon off" 6 minutes ago Up 5 minutes 80/tcp, 443/tcp nginx_nginx_1
如果我们想要对该容器内的文件系统进行更改,我们将使用其 ID(在本例中为 e90e12f70418
)并使用 docker exec
在容器内启动一个 shell:
docker exec -it e90e12f70418 /bin/bash
-t
选项打开一个终端,-i
选项使其交互式。/bin/bash
选项在运行的容器内打开一个 bash shell。请确保使用您的容器 ID。
您将看到类似于以下内容的容器的 bash 提示符:
root@e90e12f70418:/#
从这里,您可以从命令提示符工作。请记住,除非您在保存为数据卷的目录中,否则您的更改将在容器重新启动时消失。另一个注意事项是,大多数 Docker 镜像都是使用非常简化的 Linux 安装创建的,因此您习惯使用的一些命令行实用程序和工具可能不存在。
很好,这就涵盖了 Docker Compose 的基本概念以及如何安装和运行它。查看在 Ubuntu 14.04 上使用 Docker Compose 部署 Wordpress 和 PHPMyAdmin 的教程,了解如何使用 Docker Compose 部署应用程序的更复杂示例。
要获取 docker-compose.yml
文件的完整配置选项列表,请参考 Compose 文件参考。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。