简介
Docker 是一个应用程序,它简化了在容器中运行应用程序进程的过程。这些容器类似于虚拟机,但更加便携、资源友好,并且更依赖于主机操作系统。如果你想详细了解 Docker 容器的不同组件,请查看《Docker 生态系统:常见组件介绍》。
在 CentOS 7 上安装 Docker 有两种方法。一种方法是在现有的操作系统安装 Docker,另一种方法是使用一个名为 Docker Machine 的工具在服务器上安装 Docker。
在本教程中,你将学习如何在现有的 CentOS 7 安装上安装并使用 Docker。
先决条件
- 64 位 CentOS 7 Droplet
- 具有 sudo 权限的非 root 用户。《CentOS 7 初始设置指南》介绍了如何设置这一点。
本教程中的所有命令都应该以非 root 用户身份运行。如果命令需要 root 访问权限,将在命令之前加上 sudo
。《CentOS 7 初始设置指南》介绍了如何添加用户并赋予他们 sudo 权限。
步骤 1 — 安装 Docker
官方 CentOS 7 仓库中提供的 Docker 安装包可能不是最新版本。为了获取最新版本,可以从官方 Docker 仓库安装 Docker。本节将向你展示如何做到这一点。
首先,让我们更新软件包数据库:
sudo yum check-update
现在运行以下命令。它将添加官方 Docker 仓库,下载最新版本的 Docker 并进行安装:
curl -fsSL https://get.docker.com/ | sh
安装完成后,启动 Docker 守护进程:
sudo systemctl start docker
验证它是否正在运行:
sudo systemctl status docker
输出应该类似于以下内容,显示服务处于活动状态并正在运行:
● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2016-05-01 06:53:52 CDT; 1 weeks 3 days ago Docs: https://docs.docker.com Main PID: 749 (docker)
最后,确保它在每次服务器重启时启动:
sudo systemctl enable docker
现在安装 Docker 不仅提供了 Docker 服务(守护进程),还提供了 docker
命令行实用程序,或者称为 Docker 客户端。我们将在本教程后面探讨如何使用 docker
命令。
步骤 2 — 无需使用 sudo 执行 Docker 命令(可选)
默认情况下,运行 docker
命令需要 root 权限 — 也就是说,你必须在命令前加上 sudo
。也可以通过将用户添加到 docker 组来运行 docker
命令,该组在安装 Docker 时会自动创建。如果你尝试在没有加上 sudo
或者不在 docker 组中的情况下运行 docker
命令,你会得到如下输出:
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?. See 'docker run --help'.
如果你想在运行 docker
命令时避免输入 sudo
,可以将你的用户名添加到 docker 组中:
sudo usermod -aG docker $(whoami)
你需要注销 Droplet 并以相同用户身份重新登录以启用此更改。
如果你需要将一个不是当前登录用户的用户添加到 docker
组中,可以显式声明该用户名:
sudo usermod -aG docker username
本文的其余部分假设你将作为 docker 用户组中的用户运行 docker
命令。如果你选择不这样做,请在命令前加上 sudo
。
步骤 3 — 使用 Docker 命令
安装并运行 Docker 后,现在是熟悉命令行实用程序的时候了。使用 docker
包括传递一系列选项和子命令,后跟参数。语法如下:
docker [option] [command] [arguments]
要查看所有可用的子命令,输入:
docker
截至 Docker 1.11.1,可用的完整子命令列表包括:
attach Attach to a running container build Build an image from a Dockerfile commit Create a new image from a container's changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes on a container's filesystem events Get real time events from the server exec Run a command in a running container export Export a container's filesystem as a tar archive history Show the history of an image images List images import Import the contents from a tarball to create a filesystem image info Display system-wide information inspect Return low-level information on a container or image kill Kill a running container load Load an image from a tar archive or STDIN login Log in to a Docker registry logout Log out from a Docker registry logs Fetch the logs of a container network Manage Docker networks pause Pause all processes within a container port List port mappings or a specific mapping for the CONTAINER ps List containers pull Pull an image or a repository from a registry push Push an image or a repository to a registry rename Rename a container restart Restart a container rm Remove one or more containers rmi Remove one or more images run Run a command in a new container save Save one or more images to a tar archive search Search the Docker Hub for images start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop a running container tag Tag an image into a repository top Display the running processes of a container unpause Unpause all processes within a container update Update configuration of one or more containers version Show the Docker version information volume Manage Docker volumes wait Block until a container stops, then print its exit code
要查看特定命令可用的开关,输入:
docker docker-subcommand --help
要查看系统范围的信息,使用:
docker info
步骤 4 —— 使用 Docker 镜像
Docker 容器是从 Docker 镜像运行的。默认情况下,它从 Docker Hub 拉取这些镜像,Docker Hub 是由 Docker 公司管理的 Docker 注册表,该公司是 Docker 项目的背后支持者。任何人都可以在 Docker Hub 上构建和托管他们的 Docker 镜像,因此大多数应用程序和 Linux 发行版都需要在 Docker 容器中运行的镜像都托管在 Docker Hub 上。
要检查是否可以访问并从 Docker Hub 下载镜像,请输入以下命令:
docker run hello-world
输出应包括以下内容,表明 Docker 正常工作:
Hello from Docker. This message shows that your installation appears to be working correctly. ...
您可以使用 docker
命令和 search
子命令在 Docker Hub 上搜索可用的镜像。例如,要搜索 CentOS 镜像,请输入:
docker search centos
该脚本将爬取 Docker Hub 并返回所有名称与搜索字符串匹配的镜像列表。在这种情况下,输出将类似于:
NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official build of CentOS. 2224 [OK] jdeathe/centos-ssh CentOS-6 6.7 x86_64 / CentOS-7 7.2.1511 x8... 22 [OK] jdeathe/centos-ssh-apache-php CentOS-6 6.7 x86_64 / Apache / PHP / PHP M... 17 [OK] million12/centos-supervisor Base CentOS-7 with supervisord launcher, h... 11 [OK] nimmis/java-centos This is docker images of CentOS 7 with dif... 10 [OK] torusware/speedus-centos Always updated official CentOS docker imag... 8 [OK] nickistre/centos-lamp LAMP on centos setup 3 [OK] ...
在 OFFICIAL 列中,OK 表示由项目背后的公司构建和支持的镜像。一旦确定要使用的镜像,您可以使用 pull
子命令将其下载到您的计算机,如下所示:
docker pull centos
下载镜像后,您可以使用 run
子命令使用已下载的镜像运行容器。如果在使用 run
子命令时尚未下载镜像,则 Docker 客户端将首先下载镜像,然后使用它运行容器:
docker run centos
要查看已下载到计算机上的镜像,请输入:
docker images
输出应类似于以下内容:
[secondary_lable Output] REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 778a53015523 5 weeks ago 196.7 MB hello-world latest 94df4f0ce8a4 2 weeks ago 967 B
正如您将在本教程的后面看到的那样,用于运行容器的镜像可以被修改并用于生成新的镜像,然后可以上传(push 是技术术语)到 Docker Hub 或其他 Docker 注册表。
步骤 5 —— 运行 Docker 容器
您在上一步中运行的 hello-world
容器是一个运行并退出的容器的示例,它发出一个测试消息后退出。然而,容器可以比那更有用,它们可以是交互式的。毕竟,它们类似于虚拟机,只是更节约资源。
例如,让我们使用最新的 CentOS 镜像运行一个容器。-i 和 -t 开关的组合为您提供了对容器的交互式 shell 访问:
docker run -it centos
您的命令提示符应该会更改以反映您现在正在容器内工作,并且应该采用以下形式:
[root@59839a1b7de2 /]#
重要提示: 注意命令提示符中的容器 ID。在上面的示例中,它是 59839a1b7de2
。
现在,您可以在容器内运行任何命令。例如,让我们在运行的容器中安装 MariaDB 服务器。无需在任何命令前加上 sudo
,因为您正在以 root 权限在容器内操作:
yum install mariadb-server
步骤 6 —— 将容器中的更改提交为 Docker 镜像
当您启动 Docker 镜像时,您可以创建、修改和删除文件,就像您可以使用虚拟机一样。您所做的更改将仅适用于该容器。您可以启动和停止它,但一旦使用 docker rm
命令销毁它,更改将永久丢失。
本节向您展示如何将容器的状态保存为新的 Docker 镜像。
在 CentOS 容器内安装 MariaDB 服务器后,您现在有一个运行在镜像上的容器,但该容器与您用于创建它的镜像不同。
要将容器的状态保存为新镜像,首先退出容器:
exit
然后使用以下命令将更改提交为新的 Docker 镜像实例。-m 开关用于提交消息,帮助您和其他人知道您所做的更改,而 -a 用于指定作者。容器 ID 是您在本教程开始交互式 Docker 会话时记下的 ID。除非您在 Docker Hub 上创建了其他存储库,否则存储库通常是您的 Docker Hub 用户名:
docker commit -m "What did you do to the image" -a "Author Name" container-id repository/new_image_name
例如:
docker commit -m "added mariadb-server" -a "Sunday Ogwu-Chinuwa" 59839a1b7de2 finid/centos-mariadb
完成该操作后,列出您计算机上的 Docker 镜像应显示新镜像,以及它派生自的旧镜像:
docker images
输出应该类似于:
REPOSITORY TAG IMAGE ID CREATED SIZE finid/centos-mariadb latest 23390430ec73 6 seconds ago 424.6 MB centos latest 778a53015523 5 weeks ago 196.7 MB hello-world latest 94df4f0ce8a4 2 weeks ago 967 B
在上面的示例中,centos-mariadb 是新镜像,它派生自 Docker Hub 上的现有 CentOS 镜像。大小差异反映了所做的更改。在此示例中,更改是安装了 MariaDB 服务器。因此,下次您需要使用预先安装了 MariaDB 服务器的 CentOS 运行容器时,您可以使用新镜像。镜像也可以从所谓的 Dockerfile 构建。但这是一个非常复杂的过程,远远超出了本文的范围。我们将在以后的文章中探讨这一点。
步骤 7 — 列出 Docker 容器
在使用 Docker 一段时间后,你的计算机上会有许多活跃(正在运行)和非活跃容器。要查看活跃容器,使用以下命令:
docker ps
你将看到类似以下的输出:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f7c79cc556dd centos "/bin/bash" 3 hours ago Up 3 hours silly_spence
要查看所有容器(包括活跃和非活跃的),使用 -a
开关:
docker ps -a
要查看你创建的最新容器,使用 -l
开关:
docker ps -l
停止运行中的容器很简单,只需输入:
docker stop 容器ID
容器ID
可以在 docker ps
命令的输出中找到。
步骤 8 — 将 Docker 镜像推送到 Docker 仓库
在从现有镜像创建新镜像之后的下一个逻辑步骤是与你的一些朋友、Docker Hub 上的整个世界或其他你可以访问的 Docker 注册表共享它。要将镜像推送到 Docker Hub 或任何其他 Docker 注册表,你必须在那里拥有一个帐户。
本节将向你展示如何将 Docker 镜像推送到 Docker Hub。
要在 Docker Hub 上创建一个帐户,请在 Docker Hub 上注册。然后,要推送你的镜像,首先登录到 Docker Hub。系统会提示你进行身份验证:
docker login -u docker-registry-username
如果输入了正确的密码,身份验证应该会成功。然后你可以使用以下命令推送你自己的镜像:
docker push docker-registry-username/docker-image-name
这将需要一些时间来完成,完成后,输出将类似于:
The push refers to a repository [docker.io/finid/centos-mariadb] 670194edfaf5: Pushed 5f70bf18a086: Mounted from library/centos 6a6c96337be1: Mounted from library/centos ...
将镜像推送到注册表后,它应该会在你帐户的仪表板上列出,就像下面的图片所示。
!Docker image listing on Docker Hub
如果推送尝试导致以下错误,则你可能没有登录:
The push refers to a repository [docker.io/finid/centos-mariadb] e3fbbfb44187: Preparing 5f70bf18a086: Preparing a3b5c80a4eba: Preparing 7f18b442972b: Preparing 3ce512daaf78: Preparing 7aae4540b42d: Waiting unauthorized: authentication required
登录后,重复推送尝试。
结论
Docker 还有很多内容没有在本文中介绍,但这应该足够让你在 CentOS 7 上开始使用它了。像大多数开源项目一样,Docker 是基于一个快速发展的代码库构建的,所以要养成访问项目博客页面获取最新信息的习惯。
还要查看 DO 社区中的其他 Docker 教程。