如何在 Ubuntu 16.04 上安装 Docker

码头工人 是一种开源软件工具,旨在自动化和简化使用称为容器的环境创建、打包和部署应用程序的过程。 使用 Linux 容器来部署应用程序称为容器化。 容器允许我们将应用程序与运行应用程序所需的所有部分(代码、系统工具、日志、库、配置设置和其他依赖项)打包在一起,并将其作为可通过 Ubuntu 部署的单个独立包发送出去(在这种情况下16.04 LTS)。 Docker 也可以安装在其他平台上。 目前,Docker 软件由 Docker 社区和 Docker Inc. 维护。查看 官方文档 找到更多关于 Docker 的细节。 Docker 术语和概念。

Docker 由几个组件组成:

  • 用于 Linux 的 Docker:在 Ubuntu Linux 操作系统上运行 Docker 容器的软件。
  • 码头引擎:用于构建 Docker 镜像和创建 Docker 容器。
  • Docker 注册表: 用于存储各种 Docker 镜像。
  • 码头工人组成: 用于定义使用多个 Docker 容器的应用程序。

您将接触到的其他一些基本术语和概念是:

  • 容器化: 容器化是全机器虚拟化(如 VMWare)的轻量级替代方案,它涉及将应用程序封装在具有自己的操作环境的容器中。

Docker 还使用 图片容器. 这两个想法密切相关,但又截然不同。

  • 码头工人形象: Docker Image 是部署 Docker 容器的基本单元。 Docker 镜像本质上是容器的静态快照,包含运行容器所需的所有对象。
  • 码头集装箱: 一个 Docker 容器封装了一个 Docker 镜像,当它处于活动状态和运行状态时,它被认为是一个容器。 每个容器在主机中独立运行。
  • 码头工人注册表: Docker 注册表是一个 无国籍,高度可扩展的服务器端应用程序,用于存储和分发 Docker 映像。 此注册表包含 Docker 映像及其版本,并且它可以提供公共和私有存储位置。 有一个名为的公共 Docker 注册表 码头工人中心 它提供免费使用的托管注册表,以及组织帐户、自动构建等附加功能。 用户使用 Docker 推送或拉取命令与注册表交互。 例子:
docker pull registry-1.docker.io/distribution/registry:2.1.
  • 码头引擎:Docker Engine 是存在于容器和 Linux 内核之间并运行容器的层。 它也被称为 Docker 守护进程。 无论底层操作系统如何,任何 Docker 容器都可以在启用了 Docker 守护程序的任何服务器上运行。
  • 码头工人撰写: Docker Compose 是一个定义、管理和控制多容器 Docker 应用程序的工具。 使用 Compose,单个配置文件用于设置应用程序的所有服务。 然后,使用单个命令,您可以从该文件创建并启动所有服务。
  • Dockerfiles: Dockerfile 只是文本文档(.yaml 文件),其中包含组装容器映像所需的所有配置信息和命令。 使用 Dockerfile,Docker 守护进程可以自动构建容器镜像。

    示例:以下是一个基本的 Dockerfile,它在容器中设置 SSHd 服务,我们可以使用它来连接和检查其他容器卷,或者快速访问测试容器。

FROM ubuntu:16.04

RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:THEPASSWORDYOUCREATED' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@sessions*requireds*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

Docker 版本

共有三个版本的 Docker,每个版本都有自己独特的用途:

  • 码头工人 CE 是简单、经典的 Docker 引擎。
  • 码头工人EE 是 Docker CE,在某些系统上获得认证并由 Docker Inc. 提供支持。
  • 码头工人计算机 (商业支持)是 Docker EE 版本 <= 1.13 的旧捆绑版本。

我们将安装 Docker CE。

Docker 设置说明

第 1 步 – 检查先决条件

首先,从以下服务器环境开始:

  1. 64 位 Ubuntu VPS 服务器
  2. 以 root 用户身份登录

重要提示:Ubuntu 上的 Docker 需要 64 位架构才能安装,并且 Linux 内核版本必须为 3.10 或更高版本。

在安装 Docker 之前,我们需要设置 存储库 其中包含最新版本的软件(Docker 在标准 Ubuntu 16.04 存储库中不可用)。 添加存储库使我们以后也可以轻松地更新软件。

第 2 步 — 安装 Docker

下一步是在安装 Docker 之前从现有系统中删除所有默认的 Docker 包。 Linux虚拟主机. 执行以下命令以启动此过程:

root@test:~# apt-get remove docker docker-engine docker.io lxc-docker
 Reading package lists... Done
 Building dependency tree
 Reading state information... Done
 Package 'docker-engine' is not installed, so not removed
 Package 'docker' is not installed, so not removed
 Package 'docker.io' is not installed, so not removed
 E: Unable to locate package lxc-docker

注意:在某些情况下,通过删除不太常见的模块(或驱动程序)来精简 Linux 内核的特定变体。 如果是这种情况,“linux-image-extra”包包含所有被忽略的“额外”内核模块。 使用此命令重新添加它们: root@test:~# sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual

第 3 步 — 添加所需的包

现在,我们需要在您的系统上安装一些必需的软件包。 运行以下命令来完成此操作:

root@test:~# apt-get install curl apt-transport-https ca-certificates software-properties-common

注意:如果您收到错误:“E:无法找到包 curl”, 使用命令“curl -V”查看是否 curl 已经安装; 如果是这样,请继续执行第 4 步。

第 4 步 — 验证、添加和更新存储库

将 Docker GPG 密钥添加到您的系统:

root@test:~# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
 OK

接下来,更新 APT 源以添加源:

root@test:~# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable" | tee /etc/apt/sources.list.d/docker.list

再次运行更新,以便识别 Docker 包:

root@test:~# apt-get update
 Get:1 https://security.ubuntu.com/ubuntu xenial-security InRelease [107 kB]
 Hit:2 https://us.archive.ubuntu.com/ubuntu xenial InRelease
 Get:3 https://us.archive.ubuntu.com/ubuntu xenial-updates InRelease [109 kB]
 Get:4 https://us.archive.ubuntu.com/ubuntu xenial-backports InRelease [107 kB]
 Fetched 323 kB in 0s (827 kB/s)
 Reading package lists... Done
 E: The method driver /usr/lib/apt/methods/https could not be found.
 N: Is the package apt-transport-https installed?
 E: Failed to fetch https://download.docker.com/linux/ubuntu/dists/xenial/InRelease
 E: Some index files failed to download. They have been ignored, or old ones used instead.

注意:如果您收到上面看到的错误:“N: Is the package apt-transport-https installed?”,请使用以下命令进行更正。 root@test:~# sudo apt-get install apt-transport-https

让我们重新运行更新:

root@test:~# apt-get update
 Hit:1 https://us.archive.ubuntu.com/ubuntu xenial InRelease
 Get:2 https://security.ubuntu.com/ubuntu xenial-security InRelease [107 kB]
 Get:3 https://us.archive.ubuntu.com/ubuntu xenial-updates InRelease [109 kB]
 Get:4 https://us.archive.ubuntu.com/ubuntu xenial-backports InRelease [107 kB]
 Hit:5 https://download.docker.com/linux/ubuntu xenial InRelease
 Fetched 323 kB in 0s (656 kB/s)
 Reading package lists... Done

成功! 现在,验证我们是从正确的存储库而不是默认的 Ubuntu 16.04 存储库安装 Docker:

root@test:~# apt-cache policy docker-ce
 docker-ce:
   Installed: (none)
   Candidate: 18.06.0~ce~3-0~ubuntu
   Version table:
      18.06.0~ce~3-0~ubuntu 500
         500 https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages

第 5 步 — 安装 Docker

最后,让我们开始 Docker 安装:

root@test:~# apt-get install -y docker-ce
 Reading package lists... Done
 Building dependency tree
 Reading state information... Done
 The following additional packages will be installed:
   aufs-tools cgroupfs-mount libltdl7 pigz
 Suggested packages:
   mountall
 The following NEW packages will be installed:
   aufs-tools cgroupfs-mount docker-ce libltdl7 pigz
 0 upgraded, 5 newly installed, 0 to remove and 0 not upgraded.
 Need to get 40.3 MB of archives.
 After this operation, 198 MB of additional disk space will be used.
 Get:1 https://us.archive.ubuntu.com/ubuntu xenial/universe amd64 pigz amd64 2.3.1-2 [61.1 kB]
 Get:2 https://us.archive.ubuntu.com/ubuntu xenial/universe amd64 aufs-tools amd64 1:3.2+20130722-1.1ubuntu1 [92.9 kB]
 Get:3 https://us.archive.ubuntu.com/ubuntu xenial/universe amd64 cgroupfs-mount all 1.2 [4,970 B]
 Get:4 https://us.archive.ubuntu.com/ubuntu xenial/main amd64 libltdl7 amd64 2.4.6-0.1 [38.3 kB]
 Get:5 https://download.docker.com/linux/ubuntu xenial/stable amd64 docker-ce amd64 18.06.0~ce~3-0~ubuntu [40.1 MB]
 Fetched 40.3 MB in 1s (38.4 MB/s)
 ...
 ...

现在应该安装 Docker,启动守护程序,并且启用该进程以在启动时启动。 让我们检查一下它是否正在运行:

root@test:~# systemctl status docker
 * docker.service - Docker Application Container Engine
    Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
    Active: active (running) since Wed 2018-08-08 13:51:22 EDT; 2min 13s ago
      Docs: https://docs.docker.com
  Main PID: 6519 (dockerd)
    CGroup: /system.slice/docker.service
            |-6519 /usr/bin/dockerd -H fd://
            `-6529 docker-containerd --config /var/run/docker/containerd/containerd.toml

Aug 08 13:51:22 test.docker.com dockerd[6519]: time="2018-08-08T13:51:22.192600502-04:00" level=info msg="ClientConn switching balancer to "pick_first"" module=grpc
 Aug 08 13:51:22 test.docker.com dockerd[6519]: time="2018-08-08T13:51:22.192630873-04:00" level=info msg="pickfirstBalancer: HandleSubConnStateChange: 0xc42020f6a0, CONNECTING" module=grpc
 Aug 08 13:51:22 test.docker.com dockerd[6519]: time="2018-08-08T13:51:22.192854891-04:00" level=info msg="pickfirstBalancer: HandleSubConnStateChange: 0xc42020f6a0, READY" module=grpc
 Aug 08 13:51:22 test.docker.com dockerd[6519]: time="2018-08-08T13:51:22.192867421-04:00" level=info msg="Loading containers: start."
 Aug 08 13:51:22 test.docker.com dockerd[6519]: time="2018-08-08T13:51:22.340349000-04:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address"
 Aug 08 13:51:22 test.docker.com dockerd[6519]: time="2018-08-08T13:51:22.397715134-04:00" level=info msg="Loading containers: done."
 Aug 08 13:51:22 test.docker.com dockerd[6519]: time="2018-08-08T13:51:22.424005987-04:00" level=info msg="Docker daemon" commit=0ffa825 graphdriver(s)=overlay2 version=18.06.0-ce
 Aug 08 13:51:22 test.docker.com dockerd[6519]: time="2018-08-08T13:51:22.424168214-04:00" level=info msg="Daemon has completed initialization"
 Aug 08 13:51:22 test.docker.com dockerd[6519]: time="2018-08-08T13:51:22.448805942-04:00" level=info msg="API listen on /var/run/docker.sock"
 Aug 08 13:51:22 test.docker.com systemd[1]: Started Docker Application Container Engine.
 ~
 ~
 ~
 (press q to quit)
 

优秀的! 好走!

如果 Docker 是 不是 安装后自动启动,运行以下命令:

root@test:~# systemctl start docker.service
 root@test:~# systemctl enable docker.service

第 6 步 — 测试 Docker

让我们通过下载 hello-world 测试镜像来检查新的 Docker 构建。
要开始测试,请发出以下命令:

root@test:~# docker run hello-world
 Unable to find image 'hello-world:latest' locally
 latest: Pulling from library/hello-world
 9db2ca6ccae0: Pull complete
 Digest: sha256:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdc
 Status: Downloaded newer image for hello-world:latest

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

为了生成此消息,Docker 采取了以下步骤:

  1. Docker 客户端联系了 Docker 守护进程。
  2. Docker 守护程序从 Docker Hub 中提取“hello-world”映像。
    (amd64)
  3. Docker 守护程序从该映像创建了一个新容器,该容器运行生成您当前正在读取的输出的可执行文件。
  4. Docker 守护程序将该输出流式传输到 Docker 客户端,后者将其发送到您的终端。

要尝试更雄心勃勃的事情,您可以运行 Ubuntu 容器:

$ docker run -it ubuntu bash 
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/ 

For more examples and ideas, visit: https://docs.docker.com/engine/userguide/

第 7 步 — ‘Docker’ 命令

安装并运行 Docker 后,现在是熟悉命令行实用程序的时候了。 ‘Docker’ 命令包括使用带有一系列选项和参数的 Docker。 语法采用以下形式:

root@test:~# docker
 Usage: docker [OPTIONS] COMMAND
 A self-sufficient runtime for containers
 Run 'docker COMMAND --help' for more information on a command.
 

要查看所有可用的选项和管理命令,只需键入:

docker

要查看可用于特定命令的开关,请键入:

docker docker-subcommand --help

最后,要查看有关 Docker 的系统范围信息,请使用:

docker info

Docker 是一个动态、健壮且响应迅速的工具,它使得在容器化环境中运行应用程序变得非常简单。 它是可移植的,占用资源较少,并且更依赖于允许多种用途的主机操作系统。 总体而言,Docker 是一个“必备”系统,应该包含在您的工具包中,以实现应用程序的自动化、部署和扩展!

我们的支持团队充满了才华横溢的管理员,他们对多种网络托管技术有着深入的了解,尤其是本文中讨论的那些技术。 如果您对此处列出的步骤感到不自在,请致电我们, 聊天 或拒绝协助您完成此过程。 如果您正在运行我们的完全托管服务之一 Cloud VPS 服务器,我们可以提供更多关于直接实现本文中描述的软件的信息。