前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker入门教程

Docker入门教程

原创
作者头像
陈树丶
发布2018-07-31 15:50:39
2.7K1
发布2018-07-31 15:50:39
举报

介绍

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:

代码语言:txt
复制
$ 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后,使用以下命令验证安装:

代码语言:txt
复制
$ docker info

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

代码语言:txt
复制
$ docker version

第二步 - 启动容器

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

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

代码语言:txt
复制
$ docker search hello-world

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

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

代码语言:txt
复制
$  docker images

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

代码语言:txt
复制
$ docker pull hello-world
$ docker run hello-world

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

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

代码语言:txt
复制
$ 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。

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

代码语言:txt
复制
$ docker ps

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

现在访问Web服务器:

代码语言:txt
复制
$ curl localhost

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

代码语言:txt
复制
$ docker stop web
$ docker rm web

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

第三步 - 向容器添加存储

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

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

代码语言:txt
复制
$ mkdir htdocs

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

代码语言:txt
复制
$ docker run -p 80:80 --name web -d -v $PWD/htdocs:/usr/local/apache2/htdocs httpd

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

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

代码语言:txt
复制
$ docker exec -it web /bin/bash

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

代码语言:txt
复制
$ cd /usr/local/apache2/htdocs
$ echo '<h1>Hello World from Container</h1>' > index.html
$ exit

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

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

代码语言:txt
复制
$ cd htdocs
$ cat index.html
$ echo '<h1>Hello World from Host</h1>' | sudo tee index.html >/dev/null

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

代码语言:txt
复制
$ docker rm -f web

第四步 - 构建镜像

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

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

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

代码语言:txt
复制
$ 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命令:

代码语言:txt
复制
$ docker stop web
$ docker commit web doweb

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

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

代码语言:txt
复制
$ docker login
$ docker tag your_docker_hub_username/doweb
$ docker push your_docker_hub_username/doweb

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

第五步 - 启动私人注册

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

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

代码语言:txt
复制
$ docker run -d -p 5000:5000 --restart=always --name registry -v $PWD/registry:/var/lib/registry registry

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

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

代码语言:txt
复制
$ docker pull busybox
$ docker tag busybox localhost:5000/busybox
$ docker images

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

代码语言:txt
复制
$ docker push localhost:5000/busybox

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

代码语言:txt
复制
$ 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

代码语言:txt
复制
{
  "insecure-registries" : ["REMOTE_REGISTRY_HOST:5000"]
}

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

结论

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


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

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 准备
    • 第一步 - 安装Docker
      • 第二步 - 启动容器
        • 第三步 - 向容器添加存储
          • 第四步 - 构建镜像
            • 第五步 - 启动私人注册
              • 结论
              相关产品与服务
              容器镜像服务
              容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档