Ubuntu 16.04安装Docker
查看Ubuntu版本
1 | sudo lsb_release -a |
或者
1 | cat /etc/issue |
查看Linux 内核版本
1 | uname -a |
安装Docker
官方Ubuntu存储库中提供的Docker安装包可能不是最新版本。为了确保我们获得最新版本,我们将从官方Docker存储库安装Docker。为此,我们将添加一个新的包源,从Docker添加GPG密钥以确保下载有效,然后安装该包。
首先,更新现有的包列表:
1 | sudo apt update |
接下来,安装一些允许apt通过HTTPS使用包的必备软件包:
1 | sudo apt install apt-transport-https ca-certificates curl software-properties-common |
然后将官方Docker存储库的GPG密钥添加到您的系统:
1 | curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - |
将Docker存储库添加到APT源:
1 | sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable" |
接下来,使用新添加的repo中的Docker包更新包数据库:
1 | sudo apt update |
确保您要从Docker repo而不是默认的Ubuntu repo安装:
1 | apt-cache policy docker-ce |
虽然Docker的版本号可能不同,但您会看到这样的输出:
apt-cache策略docker-ce的输出
1 | docker-ce: |
请注意,docker-ce未安装,但安装的候选者来自Ubuntu 18.04(bionic)的Docker存储库。
最后,安装Docker:
1 | sudo apt install docker-ce |
现在应该安装Docker,守护进程启动,并启用进程启动进程。检查它是否正在运行:
1 | sudo systemctl status docker |
输出应类似于以下内容,表明该服务处于活动状态并正在运行:
1 | Output |
现在安装Docker不仅可以为您提供Docker服务(守护程序),还可以为您提供docker命令行实用程序或Docker客户端。我们将docker在本教程后面探讨如何使用该命令。
在没有Sudo的情况下执行Docker命令
默认情况下,该docker命令只能由root用户或docker组中的用户运行,该用户在Docker的安装过程中自动创建。如果您尝试运行该docker命令而不使用sudo或不在docker组中作为前缀,您将获得如下输出:
1 | Output |
如果要sudo在运行docker命令时避免键入,请将用户名添加到docker组中:
1 | sudo usermod -aG docker ${USER} |
要应用新的组成员身份,请注销服务器并重新登录,或键入以下内容:
1 | su - ${USER} |
系统将提示您输入用户密码以继续。
通过键入以下内容确认您的用户现已添加到docker组:
1 | id -nG |
输出:
1 | username sudo docker |
如果您需要将用户添加到docker您未登录的组中,请使用以下方式明确声明该用户名:
1 | sudo usermod -aG docker username |
本文的其余部分假定您docker以docker组中的用户身份运行该命令。如果您选择不这样做,请在前面添加命令sudo。
使用Docker命令
使用docker包括传递一系列选项和命令,后跟参数。语法采用以下形式:
1 | docker [option] [command] [arguments] |
要查看所有可用的子命令,请键入:
1 | docker |
从Docker 18开始,可用子命令的完整列表包括:
1 | Output |
要查看特定命令可用的选项,请键入:
1 | docker docker-subcommand --help |
要查看有关Docker的系统范围信息,请使用:
1 | docker info |
使用Docker镜像
Docker容器是从Docker镜像构建的。默认情况下,Docker从[Docker Hub](https://hub.docker.com)中提取这些图像,这是一个由Docker管理的Docker注册表,这是Docker项目背后的公司。任何人都可以在Docker Hub上托管他们的Docker镜像,所以大多数您需要的应用程序和Linux发行版将在那里托管图像。
要检查您是否可以从Docker Hub访问和下载图像,请键入:
1 | docker run hello-world |
输出将指示Docker正常工作:
1 | Output |
Docker最初无法在hello-world本地找到图像,因此它从Docker Hub下载了图像,Docker Hub是默认存储库。下载映像后,Docker从映像创建了一个容器,并在容器中执行了应用程序,显示了该消息。
您可以使用带子docker命令的search命令搜索Docker Hub上可用的图像。例如,要搜索Ubuntu映像,请键入:
1 | docker search ubuntu |
该脚本将对Docker Hub进行爬网,并返回名称与搜索字符串匹配的所有图像的列表。在这种情况下,输出将类似于:
1 | Output |
在OFFICIAL列中,OK表示由项目后面的公司构建和支持的图像。确定要使用的映像后,可以使用pull子命令将其下载到计算机。
执行以下命令将官方ubuntu映像下载到您的计算机:
1 | docker pull ubuntu |
您将看到以下输出:
1 | Output |
下载映像后,可以使用带有run子命令的下载映像运行容器。正如您在hello-world示例中看到的,如果在docker使用run子命令执行时未下载图像,则Docker客户端将首先下载图像,然后使用它运行容器。
要查看已下载到计算机的图像,请键入:
1 | docker images |
输出应类似于以下内容:
1 | Output |
正如您将在本教程后面看到的那样,用于运行容器的图像可以被修改并用于生成新图像,然后可以将其上载(推送是技术术语)到Docker Hub或其他Docker注册表。
我们来看看如何更详细地运行容器。
运行Docker容器
在hello-world您在上一步中跑容器是运行并发出一个测试消息之后退出容器的一个例子。容器可以比这更有用,它们可以是交互式的。毕竟,它们类似于虚拟机,只是更加资源友好。
举个例子,让我们使用Ubuntu的最新图像运行一个容器。-i和-t开关的组合为您提供了对容器的交互式shell访问:
1 | docker run -it ubuntu |
您的命令提示符应该更改以反映您现在正在容器内工作的事实,并应采用以下形式:
1 | Output |
请注意命令提示符中的容器ID。在这个例子中,它是d9b100f2f636。稍后您需要该容器ID以在要删除容器时标识容器。
现在您可以在容器内运行任何命令。例如,让我们更新容器内的包数据库。您不需要为任何命令添加前缀sudo,因为您以root用户身份在容器内操作:
1 | apt update |
然后在其中安装任何应用程序。我们安装Node.js:
1 | apt install nodejs |
这将从官方Ubuntu存储库中安装容器中的Node.js. 安装完成后,验证是否已安装Node.js:
1 | node -v |
您将看到终端中显示的版本号:
1 | Output |
您在容器内进行的任何更改仅适用于该容器。
要退出容器,请exit在提示符处键入。
让我们看看下一步管理我们系统上的容器
管理Docker容器
使用Docker一段时间后,您的计算机上将有许多活动(运行)和非活动容器。要查看活动的,请使用:
1 | docker ps |
您将看到类似于以下内容的输出:
1 | Output |
在本教程中,您启动了两个容器; 一个来自hello-world图像,另一个来自ubuntu图像。两个容器都不再运行,但它们仍然存在于您的系统上。
要查看所有容器 - 活动和非活动,请docker ps 使用-a开关运行:
1 | docker ps -a |
您将看到类似于此的输出:
1 | d9b100f2f636 ubuntu "/bin/bash" About an hour ago Exited (0) 8 minutes ago sharp_volhard |
要查看您创建的最新容器,请将其传递给-l交换机:
1 | docker ps -l |
要启动已停止的容器,请使用docker start,后跟容器ID或容器名称。让我们启动基于Ubuntu的容器,其ID为 d9b100f2f636:
1 | docker start d9b100f2f636 |
容器将启动,您可以使用它docker ps来查看其状态:
1 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
要停止正在运行的容器,请使用docker stop,后跟容器ID或名称。这次,我们将使用Docker分配容器的名称,即sharp_volhard:
1 | docker stop sharp_volhard |
一旦您决定不再需要容器,请使用该docker rm命令将其删除,再次使用容器ID或名称。使用该docker ps -a命令查找与hello-world映像关联的容器的容器ID或名称,然后将其删除。
1 | docker rm festive_williams |
您可以使用–name开关启动一个新容器并为其命名。您还可以使用该–rm开关创建一个在停止时自行删除的容器。有关docker run help这些选项和其他选项的更多信息,请参阅该命令。
容器可以转换为可用于构建新容器的映像。让我们来看看它是如何工作的
将容器中的更改提交到Docker镜像
当您启动Docker镜像时,您可以像使用虚拟机一样创建,修改和删除文件。您所做的更改仅适用于该容器。您可以启动和停止它,但是一旦使用该docker rm命令销毁它,更改将永久丢失。
本节介绍如何将容器的状态保存为新的Docker镜像。
在Ubuntu容器中安装Node.js后,您现在有一个运行图像的容器,但容器与您用来创建它的图像不同。但是您可能希望稍后重新使用此Node.js容器作为新映像的基础。
然后使用以下命令将更改提交到新的Docker镜像实例。
1 | docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name |
该-m开关是提交信息,可以帮助你和其他人知道你所做的修改,而-a用于指定作者。container_id当您启动交互式Docker会话时,这是您在本教程前面提到的那个。除非您在Docker Hub上创建了其他存储库,否则repository通常是您的Docker Hub用户名。
例如,对于用户sammy,使用容器ID d9b100f2f636,命令将是:
1 | docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs |
当你提交的图像,新的图像在您的计算机上本地保存。在本教程的后面,您将学习如何将映像推送到Docker Hub之类的Docker注册表,以便其他人可以访问它。
再次列出Docker图像将显示新图像以及从中派生的旧图像:
1 | docker images |
你会看到这样的输出:
1 | Output |
在此示例中,ubuntu-nodejs是新图像,它是ubuntu从Docker Hub 的现有图像派生的。尺寸差异反映了所做的变化。在此示例中,更改是NodeJS已安装。因此,下次需要使用预先安装了NodeJS的Ubuntu运行容器时,您可以使用新映像。
您还可以从a构建映像Dockerfile,这样可以在新映像中自动安装软件。但是,这超出了本教程的范围。
现在让我们与他人分享新图像,以便他们可以从中创建容器。
将Docker镜像推送到Docker存储库
从现有映像创建新映像之后的下一个逻辑步骤是与您选择的几个朋友,Docker Hub上的整个世界或您可以访问的其他Docker注册表共享它。要将映像推送到Docker Hub或任何其他Docker注册表,您必须在那里拥有一个帐户。
本节介绍如何将Docker镜像推送到Docker Hub。要了解如何创建自己的私有Docker注册表,请查看如何在Ubuntu 14.04上设置私有Docker注册表。
要推送图像,请先登录Docker Hub。
1 | docker login -u docker-registry-username |
系统将提示您使用Docker Hub密码进行身份验证。如果您指定了正确的密码,则身份验证应该成功。然后你可以使用以下方法推送自己的图像
1 | docker push docker-registry-username/docker-image-name |
要将ubuntu-nodejs图像推送到sammy存储库,命令将是:
1 | docker push sammy/ubuntu-nodejs |
上传图像时,该过程可能需要一些时间才能完成,但完成后,输出将如下所示:
1 | Output |
将图像推送到注册表后,它应该列在您帐户的仪表板上,如下图所示。
如果推送尝试导致此类错误,那么您可能没有登录:
1 | Output |
登录docker login并重复推送尝试。然后验证它是否存在于Docker Hub存储库页面上。
您现在可以使用将图像拉到新计算机并使用它来运行新容器。
1 | docker pull sammy/ubuntu-node<^> |
结论
在本教程中,您安装了Docker,使用了镜像和容器,并将修改后的镜像推送到Docker Hub。现在您已了解基础知识,请浏览DigitalOcean社区中的其他Docker教程。