如何在Ubuntu16.04上安装和使用Docker

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

介绍

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

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

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

先决条件

要学习本教程,您将需要以下内容:

  • 一台 Ubuntu 16.04 服务器设置有具有 sudo 权限和基本防火墙的非 root 用户,如 Ubuntu 16.04 初始设置指南中所述
  • Docker Hub 上的帐户,如果您希望创建自己的图像并将它们推送到 Docker Hub,如步骤 7 和 8 所示

第 1 步 — 安装 Docker

Ubuntu 16.04 官方仓库中提供的 Docker 安装包可能不是最新版本。 要获取此最新版本,请从官方 Docker 存储库安装 Docker。 本节向您展示如何做到这一点。

首先,为确保下载有效,请将官方 Docker 存储库的 GPG 密钥添加到您的系统:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

将 Docker 存储库添加到 APT 源:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

接下来,使用新添加的 repo 中的 Docker 包更新包数据库:

sudo apt-get update

确保您要从 Docker 存储库而不是默认的 Ubuntu 16.04 存储库进行安装:

apt-cache policy docker-ce

您应该会看到类似于以下内容的输出:

apt-cache 策略 docker-ce 的输出

docker-ce:
  Installed: (none)
  Candidate: 18.06.1~ce~3-0~ubuntu
  Version table:
     18.06.1~ce~3-0~ubuntu 500
        500 https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages

请注意,docker-ce 没有安装,但安装的候选者来自 Ubuntu 16.04 (xenial) 的 Docker 存储库。

最后,安装 Docker:

sudo apt-get install -y docker-ce

现在应该安装 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 Thu 2018-10-18 20:28:23 UTC; 35s ago
     Docs: https://docs.docker.com
 Main PID: 13412 (dockerd)
   CGroup: /system.slice/docker.service
           ├─13412 /usr/bin/dockerd -H fd://
           └─13421 docker-containerd --config /var/run/docker/containerd/containerd.toml

现在安装 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 ${USER}

要应用新的组成员身份,您可以注销服务器并重新登录,或者您可以键入以下内容:

su - ${USER}

系统将提示您输入用户密码以继续。 之后,您可以通过键入以下内容来确认您的用户现在已添加到 docker 组:

id -nG
Outputsammy sudo docker

如果您需要将用户添加到您未登录的 docker 组,请使用以下命令显式声明该用户名:

sudo usermod -aG docker username

本文的其余部分假设您以 docker 用户组中的用户身份运行 docker 命令。 如果您选择不这样做,请在命令前加上 sudo

第 3 步 — 使用 Docker 命令

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

docker [option] [command] [arguments]

要查看所有可用的子命令,请键入:

docker

从 Docker 18.06.1 开始,可用子命令的完整列表包括:

Output
  attach      Attach local standard input, output, and error streams 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 to files or directories 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 Docker objects
  kill        Kill one or more running containers
  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
  pause       Pause all processes within one or more containers
  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 one or more containers
  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 (streamed to STDOUT by default)
  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 one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes

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

docker docker-subcommand --help

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

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 工作正常:

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

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

docker search ubuntu

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

Output
NAME                                                   DESCRIPTION                                     STARS            OFFICIAL            AUTOMATED
ubuntu                                                 Ubuntu is a Debian-based Linux operating sys…   8564                [OK]                
dorowu/ubuntu-desktop-lxde-vnc                         Ubuntu with openssh-server and NoVNC            230                                     [OK]
rastasheep/ubuntu-sshd                                 Dockerized SSH service, built on top of offi…   176                                     [OK]
consol/ubuntu-xfce-vnc                                 Ubuntu container with "headless" VNC session…   129                                     [OK]
ansible/ubuntu14.04-ansible                            Ubuntu 14.04 LTS with ansible                   95                                      [OK]
ubuntu-upstart                                         Upstart is an event-based replacement for th…   91                  [OK]                
neurodebian                                            NeuroDebian provides neuroscience research s…   54                  [OK]                
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5   ubuntu-16-nginx-php-phpmyadmin-mysql-5          48                                      [OK]
ubuntu-debootstrap                                     debootstrap --variant=minbase --components=m…   39                  [OK]                
nuagebec/ubuntu                                        Simple always updated Ubuntu docker images w…   23                                      [OK]
tutum/ubuntu                                           Simple Ubuntu docker images with SSH access     18                                      
i386/ubuntu                                            Ubuntu is a Debian-based Linux operating sys…   14                                      
1and1internet/ubuntu-16-apache-php-7.0                 ubuntu-16-apache-php-7.0                        13                                      [OK]
ppc64le/ubuntu                                         Ubuntu is a Debian-based Linux operating sys…   12                                      
eclipse/ubuntu_jdk8                                    Ubuntu, JDK8, Maven 3, git, curl, nmap, mc, …   6                                       [OK]
1and1internet/ubuntu-16-nginx-php-5.6-wordpress-4      ubuntu-16-nginx-php-5.6-wordpress-4             6                                       [OK]
codenvy/ubuntu_jdk8                                    Ubuntu, JDK8, Maven 3, git, curl, nmap, mc, …   4                                       [OK]
darksheer/ubuntu                                       Base Ubuntu Image -- Updated hourly             4                                       [OK]
pivotaldata/ubuntu                                     A quick freshening-up of the base Ubuntu doc…   2                                       
1and1internet/ubuntu-16-sshd                           ubuntu-16-sshd                                  1                                       [OK]
smartentry/ubuntu                                      ubuntu with smartentry                          1                                       [OK]
ossobv/ubuntu                                          Custom ubuntu image from scratch (based on o…   0                                       
paasmule/bosh-tools-ubuntu                             Ubuntu based bosh-cli                           0                                       [OK]
1and1internet/ubuntu-16-healthcheck                    ubuntu-16-healthcheck                           0                                       [OK]
pivotaldata/ubuntu-gpdb-dev                            Ubuntu images for GPDB development              0                                       

OFFICIAL 列中,OK 表示由项目背后的公司构建和支持的图像。 确定要使用的图像后,您可以使用 pull 子命令将其下载到您的计算机上。 尝试使用 ubuntu 图像,如下所示:

docker pull ubuntu

下载镜像后,您可以使用 run 子命令使用下载的镜像运行容器。 如果使用 run 子命令执行 docker 时没有下载镜像,Docker 客户端将首先下载镜像,然后使用它运行容器:

docker run ubuntu

要查看已下载到计算机的图像,请键入:

docker images

输出应类似于以下内容:

OutputREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              ea4c82dcd15a        16 hours ago        85.8MB
hello-world         latest              4ab4c602aa5e        5 weeks ago         1.84kB

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

第 5 步 — 运行 Docker 容器

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

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

docker run -it ubuntu

注意: run 命令的默认行为是启动一个新容器。 运行上述命令后,您将打开第二个 ubuntu 容器的 shell 界面。


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

Outputroot@9b0db8a30ad1:/#

注意: 记住命令提示符中的容器id。 在前面的示例中,它是 9b0db8a30ad1。 稍后您需要该容器 ID 来在您想要移除该容器时对其进行识别。


现在您可以在容器内运行任何命令。 例如,让我们更新容器内的包数据库。 您不需要在任何命令前加上 sudo,因为您在容器内以 root 用户身份操作:

apt-get update

然后在其中安装任何应用程序。 让我们安装 Node.js:

apt-get install -y nodejs

这会将 Node.js 安装到来自官方 Ubuntu 存储库的容器中。 安装完成后,验证是否安装了 Node.js:

node -v

您将看到终端中显示的版本号:

Outputv8.10.0

您在容器内所做的任何更改仅适用于该容器。

要退出容器,请在提示符处键入 exit

接下来让我们看看管理我们系统上的容器。

第 6 步 — 管理 Docker 容器

使用 Docker 一段时间后,您的计算机上将有许多活动(运行)和非活动容器。 要查看 活动的 ,请使用:

docker ps

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

OutputCONTAINER ID        IMAGE               COMMAND             CREATED             

在本教程中,您启动了三个容器; 一张来自 hello-world 图像,两张来自 ubuntu 图像。 这些容器不再运行,但它们仍然存在于您的系统中。

要查看所有容器 - 活动和非活动 - 使用 -a 开关运行 docker ps

docker ps -a

您将看到与此类似的输出:

OutputCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
9b0db8a30ad1        ubuntu              "/bin/bash"         21 minutes ago      Exited (0) About a minute ago                       xenodochial_neumann
d7851eb12e23        ubuntu              "/bin/bash"         24 minutes ago      Exited (0) 24 minutes ago                           boring_chebyshev
d54945b6510b        hello-world         "/hello"            32 minutes ago      Exited (0) 32 minutes ago                           youthful_roentgen

要查看您创建的最新容器,请将 -l 开关传递给它:

docker ps -l
OutputCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                            PORTS               NAMES
9b0db8a30ad1        ubuntu              "/bin/bash"         22 minutes ago      Exited (127) About a minute ago                       xenodochial_neumann

要启动已停止的容器,请使用 docker start,后跟容器 ID 或容器名称。 让我们以 9b0db8a30ad1 的 ID 启动基于 Ubuntu 的容器:

docker start 9b0db8a30ad1 

容器将启动,您可以使用 docker ps 查看其状态:

OutputCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
9b0db8a30ad1        ubuntu              "/bin/bash"         23 minutes ago      Up 11 seconds                           xenodochial_neumann

要停止正在运行的容器,请使用 docker stop,后跟容器 ID 或名称。 这一次,我们将使用 Docker 为容器分配的名称,即 xenodochial_neumann

docker stop xenodochial_neumann

一旦您决定不再需要某个容器,请使用 docker rm 命令将其删除,再次使用容器 ID 或名称。 使用 docker ps -a 命令查找与 hello-world 图像关联的容器的容器 ID 或名称并将其删除。

docker rm youthful_roentgen

您可以使用 --name 开关启动一个新容器并为其命名。 您还可以使用 --rm 开关创建一个容器,该容器在停止时会自行移除。 有关这些选项和其他选项的更多信息,请参见 docker run help 命令。

容器可以变成镜像,你可以用它来构建新的容器。 让我们看看它是如何工作的。

第 7 步 — 将容器中的更改提交到 Docker 映像

启动 Docker 映像时,您可以像使用虚拟机一样创建、修改和删除文件。 您所做的更改将仅适用于该容器。 您可以启动和停止它,但是一旦使用 docker rm 命令销毁它,更改将永远丢失。

本节向您展示如何将容器的状态保存为新的 Docker 映像。

在 Ubuntu 容器中安装 Node.js 后,您现在有了一个运行镜像的容器,但该容器与您用于创建它的镜像不同。 但您可能希望稍后重用此 Node.js 容器作为新图像的基础。

为此,请使用以下命令结构将更改提交到新的 Docker 映像实例:

docker commit -m "What did you do to the image" -a "Author Name" container-id repository/new_image_name

-m 开关用于提交消息,帮助您和其他人了解您所做的更改,而 -a 用于指定作者。 container ID 是您在本教程前面开始交互式 Docker 会话时提到的那个。 除非您在 Docker Hub 上创建了其他存储库,否则该存储库通常是您的 Docker Hub 用户名。

例如,对于用户 sammy,容器 ID 为 d9b100f2f636,命令将是:

docker commit -m "added node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs

注意:当你提交一张图片时,新的图片保存在本地,也就是你的电脑上。 在本教程的后面,您将学习如何将映像推送到 Docker 注册表(如 Docker Hub),以便您和其他人可以评估和使用它。


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

docker images

输出应该与此类似:

OutputREPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
sammy/ubuntu-nodejs       latest              6a1784a63edf        2 minutes ago       170MB
ubuntu                    latest              ea4c82dcd15a        17 hours ago        85.8MB
hello-world               latest              4ab4c602aa5e        5 weeks ago         1.84kB

在上面的示例中,ubuntu-nodejs 是新镜像,它是从 Docker Hub 中现有的 ubuntu 镜像派生而来的。 大小差异反映了所做的更改。 在此示例中,更改是安装了 Node.js。 下次您需要使用预装了 Node.js 的 Ubuntu 运行容器时,您可以只使用新镜像。

您还可以从 Dockerfile 构建映像,这使您可以在新映像中自动安装软件。 但是,这超出了本教程的范围。

现在让我们与其他人共享新图像,以便他们可以从中创建容器。

第 8 步 — 将 Docker 映像推送到 Docker 存储库

从现有镜像创建新镜像后的下一个合乎逻辑的步骤是与您选择的几个朋友、Docker Hub 上的整个世界或您有权访问的另一个 Docker 注册表共享它。 要将映像推送到 Docker Hub 或任何其他 Docker 注册表,您必须在那里拥有一个帐户。

本节向您展示如何将 Docker 映像推送到 Docker Hub。 要了解如何创建自己的私有 Docker 注册表,请查看 如何在 Ubuntu 14.04 上设置私有 Docker 注册表。

要推送你的镜像,首先登录 Docker Hub:

docker login -u docker-registry-username

系统将提示您使用 Docker Hub 密码进行身份验证。 如果您指定了正确的密码,则身份验证应该会成功。

注意: 如果您的 Docker 注册表用户名与您用于创建镜像的本地用户名不同,您必须使用您的注册表用户名标记您的镜像。 对于上一步中给出的示例,您将键入:

docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs

然后,您可以使用以下方式推送您自己的图像:

docker push docker-registry-username/ubuntu-nodejs

要将 ubuntu-nodejs 图像推送到 sammy 存储库,命令将是:

docker push sammy/ubuntu-nodejs

该过程在上传图像时可能需要一些时间才能完成,但完成后,输出将如下所示:

OutputThe push refers to repository [docker.io/sammy/ubuntu-nodejs]
1aa927602b6a: Pushed
76c033092e10: Pushed
2146d867acf3: Pushed
ae1f631f14b7: Pushed
102645f1cf72: Pushed
latest: digest: sha256:2be90a210910f60f74f433350185feadbbdaca0d050d97181bf593dd85195f06 size: 1362

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

如果推送尝试导致以下错误,则可能是您未登录:

OutputThe push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Preparing
5f70bf18a086: Preparing
a3b5c80a4eba: Preparing
7f18b442972b: Preparing
3ce512daaf78: Preparing
7aae4540b42d: Waiting
unauthorized: authentication required

登录,然后重复推送尝试。

结论

在本教程中,您已经学习了开始在 Ubuntu 16.04 上使用 Docker 的基础知识。 与大多数开源项目一样,Docker 是由一个快速开发的代码库构建的,因此请养成访问项目的 博客页面 以获取最新信息的习惯。

如需进一步探索,请查看 DigitalOcean 社区中的 其他 Docker 教程