Docker是一个部署和管理容器化应用程序的平台。由于容器的灵活性,容器在开发人员,管理员和开发人员工程师中很受欢迎。
Docker有三个基本组件:
Docker Engine提供管理容器的核心功能。它与底层Linux操作系统连接,以公开简单的API来处理容器的生命周期。
Docker Tools是一组命令行工具,可与Docker Engine公开的API进行通信。它们用于运行容器,创建新镜像,配置存储和网络,以及执行影响容器生命周期的更多操作。
Docker Registry是存储容器镜像的地方。每个图像可以通过唯一标记识别多个版本。用户从注册表中提取现有图像并将新镜像推送到该注册表。Docker Hub是由Docker,Inc.管理的托管注册表。还可以在您自己的环境中运行注册表,以使镜像更接近引擎。
在本教程结束时,您将在安装Docker,托管容器,处理镜像,添加持久性以及设置私有注册表。腾讯云开发者实验室提供搭建Docker环境的实验教程。
要学习本教程,您需要:
默认情况下,该docker命令需要root权限。但是,您可以通过以docker组中的用户身份运行docker来执行不带sudo
前缀的命令。本教程希望您的服务器配置为运行不带sudo前缀的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命令的其他选项。以下是这些开关的说明:
要验证我们的容器确实在后台运行,请尝试以下命令:
$ docker ps
输出显示名为web的容器正在运行,端口80映射到主机端口80。
现在访问Web服务器:
$ curl localhost
让我们使用以下命令停止并删除正在运行的容器:
$ docker stop web
$ docker rm web
再次运行docker ps
确认容器已终止。
容器是短暂的,这意味着当容器被终止时,容器中存储的任何东西都将丢失。要将数据保留在容器的生命周期之外,我们需要将卷附加到容器。卷是主机文件系统中的目录。
首先在主机上创建一个新目录:
$ mkdir htdocs
现在,让我们使用新的开关启动容器来安装htdoc
s目录,并将其指向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.json
的daemon.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》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。