Docker入门教程

介绍

Docker是一个部署和管理容器化应用程序的平台。由于容器的灵活性,容器在开发人员,管理员和开发人员工程师中很受欢迎。

Docker有三个基本组件:

  • Docker引擎
  • Docker工具
  • Docker注册表

Docker Engine提供管理容器的核心功能。它与底层Linux操作系统连接,以公开简单的API来处理容器的生命周期。

Docker Tools是一组命令行工具,可与Docker Engine公开的API进行通信。它们用于运行容器,创建新镜像,配置存储和网络,以及执行影响容器生命周期的更多操作。

Docker Registry是存储容器镜像的地方。每个图像可以通过唯一标记识别多个版本。用户从注册表中提取现有图像并将新镜像推送到该注册表。Docker Hub是由Docker,Inc.管理的托管注册表。还可以在您自己的环境中运行注册表,以使镜像更接近引擎。

在本教程结束时,您将在安装Docker,托管容器,处理镜像,添加持久性以及设置私有注册表。腾讯云开发者实验室提供搭建Docker环境的实验教程。

准备

要学习本教程,您需要:

  • 一个Ubuntu 16.04 Droplet,包括一个具有sudo权限的非root用户和防火墙。
  • 一个Docker Hub帐户

默认情况下,该docker命令需要root权限。但是,您可以通过以docker组中的用户身份运行docker来执行不带sudo前缀的命令。本教程希望您的服务器配置为运行不带sudo前缀的docker命令。

第一步 - 安装Docker

运行以下命令以删除可能已安装的任何现有的与docker相关的包,然后从官方存储库安装Docker:

$ sudo apt-get remove docker docker-engine docker.io
$ sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get update
$ sudo apt-get install -y docker-ce

安装Docker后,使用以下命令验证安装:

$ docker info

以上命令显示了在环境中部署的Docker Engine的详细信息。下一个命令验证Docker Tools是否已正确安装和配置。它应该打印Docker引擎和工具的版本。

$ docker version

第二步 - 启动容器

Docker容器从存储在注册表中的现有镜像启动。Docker中的镜像可以存储在私有或公共存储库中。私有存储库要求用户在提取镜像之前进行身份验证。任何人都可以访问公共镜像。

要搜索名为hello-world的镜像,请运行以下命令:

$ docker search hello-world

可能有多个镜像与名称hello-world匹配。选择具有最多星号的,这表示镜像的流行度。

使用以下命令检查本地环境中的可用镜像:

$  docker images

由于我们尚未发布任何容器,因此不会有任何镜像。我们现在可以下载镜像并在本地运行它:

$ docker pull hello-world
$ docker run hello-world

如果我们在不拉动镜像的情况下执行docker run命令,DockerEngine将首先拉出镜像然后运行它。再次运行docker images命令表明我们在本地可以使用hello-world镜像。

让我们启动一个更有意义的容器:一个Apache Web服务器。

$ docker run -p 80:80 --name web -d httpd

您可能会注意到传递给docker run命令的其他选项。以下是这些开关的说明:

  • -p- 这告诉DockerEngine在主机的端口80上公开容器的端口80。由于Apache侦听端口80,我们需要在主机端口上公开它。
  • --name - 此开关为正在运行的容器指定一个名称。如果我们省略它,Docker Engine将分配一个随机名称。
  • -d - 此选项指示Docker Engine以分离模式运行容器。如果没有这个,容器将在前台启动,阻止访问shell。通过将容器推入后台,我们可以在容器仍在运行时继续使用shell。

要验证我们的容器确实在后台运行,请尝试以下命令:

$ docker ps

输出显示名为web的容器正在运行,端口80映射到主机端口80。

现在访问Web服务器:

$ curl localhost

让我们使用以下命令停止并删除正在运行的容器:

$ docker stop web
$ docker rm web

再次运行docker ps确认容器已终止。

第三步 - 向容器添加存储

容器是短暂的,这意味着当容器被终止时,容器中存储的任何东西都将丢失。要将数据保留在容器的生命周期之外,我们需要将卷附加到容器。卷是主机文件系统中的目录。

首先在主机上创建一个新目录:

$ mkdir htdocs

现在,让我们使用新的开关启动容器来安装htdocs目录,并将其指向Apache Web服务器的文档根目录:

$ docker run -p 80:80 --name web -d -v $PWD/htdocs:/usr/local/apache2/htdocs httpd

\-v开关将容器内的htdocs目录指向主机的文件系统。对这个目录所做的任何更改都将在两个位置都可见。

通过运行以下命令从容器访问该目录:

$ docker exec -it web /bin/bash

此命令以交互方式将终端附加到容器的shell。现在,你已经位于容器内部了。导航到htdocs文件夹并创建一个简单的HTML文件。最后,退出shell以返回主机:

$ cd /usr/local/apache2/htdocs
$ echo '<h1>Hello World from Container</h1>' > index.html
$ exit

再次执行curl localhost命令表明Web服务器正在返回我们创建的页面。

我们不仅可以从主机访问此文件,还可以修改它:

$ cd htdocs
$ cat index.html
$ echo '<h1>Hello World from Host</h1>' | sudo tee index.html >/dev/null

再次运行curl localhost确认Web服务器正在提供从主机创建的最新页面。使用以下命令终止容器。(-f迫使Docker终止而不是首先停止。)

$ docker rm -f web

第四步 - 构建镜像

除了从注册表运行现有镜像外,我们还可以创建自己的镜像并将它们存储在注册表中。

您可以从现有容器创建新镜像。首先提交对容器所做的更改,然后标记镜像并将其推送到注册表。

让我们再次启动httpd容器并修改默认文档:

$ docker run -p 80:80 --name web -d httpd
$ docker exec -it web /bin/bash
$ cd htdocs
$ echo '<h1>Welcome to my Web Application</h1>' > index.html
$ exit

容器现在正在运行,并且已定制index.html。你可以用curl localhost来验证它。

在我们提交更改的容器之前,一个好主意是停止它。停止后,我们将运行commit命令:

$ docker stop web
$ docker commit web doweb

使用docker images命令确认镜像的创建。它显示我们刚刚创建的doweb镜像。

要在Docker Hub中标记和存储此镜像,请运行以下命令将镜像推送到公共注册表:

$ docker login
$ docker tag your_docker_hub_username/doweb
$ docker push your_docker_hub_username/doweb

您可以通过浏览器或命令行在Docker Hub中搜索来验证新镜像。

第五步 - 启动私人注册

可以在私有环境中运行注册表以使镜像更安全。它还减少了Docker Engine和镜像存储库之间的延迟。

Docker Registry可作为容器使用,可以像任何其他容器一样启动。由于注册表包含多个镜像,因此最好将存储卷附加到其中。

$ docker run -d -p 5000:5000 --restart=always --name registry -v $PWD/registry:/var/lib/registry registry

请注意,容器在后台启动,端口5000已公开,并且registry目录映射到主机文件系统。您可以通过执行docker ps命令来验证容器是否正在运行。

我们现在可以标记本地镜像并将其推送到私有注册表。让我们首先从Docker Hub中取出busybox容器并标记它。

$ docker pull busybox
$ docker tag busybox localhost:5000/busybox
$ docker images

上一个命令确认busybox容器现在已标记为localhost:5000,因此将镜像推送到私有注册表。

$ docker push localhost:5000/busybox

将镜像推送到本地注册表后,让我们尝试将其从环境中删除并从注册表中将其拉回。

$ docker rmi -f localhost:5000/busybox
$ docker images
$ docker pull localhost:5000/busybox
$ docker images

我们经历了下载镜像,标记镜像,将其推送到本地注册表,然后将其拉回的整个循环。

在某些情况下,您可能希望在专用主机中运行私有注册表。在不同机器上运行的Docker Engine将与远程注册表通信以拉取和推送镜像。

由于注册表不安全,我们需要修改Docker Engine的配置以启用对不安全注册表的访问。为此,请编辑位于/etc/docker/daemon.jsondaemon.json文件。如果文件不存在,请创建该文件。

添加以下条目:

Editing/etc/docker/daemon.json

{
  "insecure-registries" : ["REMOTE_REGISTRY_HOST:5000"]
}

REMOTE_REGISTRY_HOST替换为远程注册表的主机名或IP地址。重新启动Docker Engine以确保应用配置更改。

结论

本教程帮助您开始使用Docker。它涵盖了基本概念,包括安装,容器管理,镜像管理,存储和私有注册表,同时腾讯云开发者手册提供Docker中文文档Docker其他使用教程,欢迎使用。


参考文献:《Webinar Series: Getting Started with Containers》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算教程系列

如何在Ubuntu 18.04上安装Docker Compose

Docker是一个很好的工具,用于在软件容器中自动部署Linux应用程序,但要充分利用其潜力,应用程序的每个组件都应该在自己的单独容器中运行。对于具有大量组件的...

7412
来自专栏Rainbond开源「容器云平台」

Dockerfile,你给我站住!

1495
来自专栏编码前线

Docker容器进入的4种方式(推荐最后一种)

  在使用Docker创建了容器之后,大家比较关心的就是如何进入该容器了,其实进入Docker容器有好几多种方式,这里我们就讲一下常用的几种进入Docker容器...

2543
来自专栏菜鸟程序员

Docker 容器镜像删除

1243
来自专栏大魏分享(微信公众号:david-share)

Openshift容器云安全加固措施70项

前言 企业中使用容器承载业务,除了考虑到容器的优势之外,容器的安全更是很多客户关心的话题。本篇文章就此进行讨论。本文在书写过程中,参考了一些文档,文后给出了链接...

5997
来自专栏吴伟祥

Docker学习——创建镜像(四) 顶

1284
来自专栏散尽浮华

Docker容器学习梳理--私有仓库Registry使用

但有时候使用Docker Hub这样的公共仓库可能不方便,这种情况下用户可以使用registry创建一个本地仓库供私人使用,这点跟Maven的管理类似。 使用私...

2348
来自专栏zingpLiu

Docker快速入门(二)

上篇文章《Docker快速入门(一)》介绍了docker的基本概念和image的相关操作,本篇将进一步介绍image,容器和Dockerfile。

1303
来自专栏编程坑太多

跟我一起学docker(三)--镜像的常用操作

1596
来自专栏点滴积累

Docker Registry

前言 上一篇文章讲了Docker Machine实现多主机Docker节点的管理。本文讲解如何实现Docker Registry,其实这个在第一篇Docker入...

4097

扫码关注云+社区

领取腾讯云代金券