如何在CentOS7上安装和使用Docker

来自菜鸟教程
跳转至:导航、​搜索

介绍

Docker 是一个应用程序,它使在容器中运行应用程序进程变得简单易行,就像虚拟机一样,只是更便携,更资源友好,并且更依赖于主机操作系统。 有关 Docker 容器的不同组件的详细介绍,请查看 Docker 生态系统:通用组件简介

在 CentOS 7 上安装 Docker 有两种方法。 一种方法涉及将其安装在操作系统的现有安装上。 另一个涉及使用名为 Docker Machine 的工具启动服务器,该工具会在其上自动安装 Docker。

在本教程中,您将学习如何在现有的 CentOS 7 安装上安装和使用它。

先决条件

  • 64 位 CentOS 7 Droplet
  • 具有 sudo 权限的非 root 用户。 使用 CentOS 7 初始设置指南设置的 CentOS 7 服务器解释了如何设置。

注意: Docker 需要 64 位版本的 CentOS 7 以及等于或大于 3.10 的内核版本。 默认的 64 位 CentOS 7 Droplet 满足这些要求。


本教程中的所有命令都应以非 root 用户身份运行。 如果该命令需要 root 访问权限,它将在前面加上 sudoCentOS 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

输出应类似于以下内容,表明该服务处于活动状态且正在运行:

Output● 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 组中,您将获得如下输出:

Outputdocker: 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 开始,可用子命令的完整列表包括:

Output
    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 项目背后的公司 Docker 管理的 Docker 注册表)中提取这些图像。 任何人都可以在 Docker Hub 上构建和托管他们的 Docker 映像,因此运行 Docker 容器所需的大多数应用程序和 Linux 发行版都具有托管在 Docker Hub 上的映像。

要检查您是否可以从 Docker Hub 访问和下载图像,请键入:

docker run hello-world

输出应该包括以下内容,应该表明 Docker 工作正常:

OutputHello from Docker.
This message shows that your installation appears to be working correctly.
...

您可以使用带有 search 子命令的 docker 命令搜索 Docker Hub 上可用的映像。 例如,要搜索 CentOS 映像,请输入:

docker search centos

该脚本将爬取 Docker Hub 并返回名称与搜索字符串匹配的所有图像的列表。 在这种情况下,输出将类似于:

OutputNAME                            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 客户端将首先下载镜像,然后使用它运行容器:

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

正如您将在本教程后面看到的那样,可以修改用于运行容器的镜像并用于生成新镜像,然后可以将其上传(pushed 是技术术语)到 Docker Hub 或其他Docker 注册表。

第 5 步 — 运行 Docker 容器

您在上一步中运行的 hello-world 容器是在发出测试消息后运行和退出的容器示例。 然而,容器可能比这更有用,它们可以是交互式的。 毕竟,它们类似于虚拟机,只是对资源更友好。

例如,让我们使用最新的 CentOS 镜像运行一个容器。 -i-t 开关的组合使您可以交互式 shell 访问容器:

docker run -it centos

您的命令提示符应更改以反映您现在正在容器内工作的事实,并且应采用以下形式:

Output[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 会话时记下的那个。 除非您在 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 Hub),以便您和其他人可以评估和使用它。


完成该操作后,现在在您的计算机上列出 Docker 映像应该会显示新映像以及派生它的旧映像:

docker images

输出应该是这样的:

OutputREPOSITORY             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

您将看到类似于以下内容的输出:

OutputCONTAINER 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 container-id

container-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

这需要一些时间才能完成,完成后,输出将是这样的:

OutputThe push refers to a repository [docker.io/finid/centos-mariadb]
670194edfaf5: Pushed 
5f70bf18a086: Mounted from library/centos 
6a6c96337be1: Mounted from library/centos

...

将图像推送到注册表后,它应该列在您帐户的仪表板上,如下图所示。

如果推送尝试导致此类错误,那么您可能没有登录:

OutputThe 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 教程