美元(注)
本文补充了一系列关于在云中部署和管理集装箱工作负载的网络研讨会(https://go.digitalocean.com/containers-and-microservices-webinars-series)。该系列涵盖了集装箱的基本内容,包括集装箱生命周期管理,部署多集装箱应用程序,扩展工作负载,了解Kubernetes,以及突出运行状态应用程序的最佳实践。
本教程包括系列中的第一个会话中涵盖的概念和命令,Getting Started with Containers <$>
[youtube KXp06cdCySc 480 854 ]
介绍
Docker 是部署和管理集装箱应用的平台,容器因其提供的灵活性而受到开发人员、管理员和 devops 工程师的欢迎。
Docker有三个基本组成部分:
- Docker 引擎
- Docker 工具
- Docker 注册表
Docker Engine提供了管理集装箱的核心功能,它与底层的Linux操作系统接口,以曝光简单的API来处理集装箱的生命周期。
Docker 工具是一组指令行工具,可以与 Docker 引擎暴露的 API 交谈,用于运行容器,创建新图像,配置存储和网络,并执行许多影响容器生命周期的其他操作。
Docker 注册表是存储容器图像的地方. 每个图像可以通过独特标签来识别多个版本. 用户可以从注册表中提取现有图像并将新图像推到注册表中。
到本教程结束时,您将安装Docker在DigitalOcean Droplet上,管理容器,处理图像,添加持久性,并设置私人注册表。
前提条件
要遵循本教程,您将需要:
- 一个 Ubuntu 16.04 Droplet 设置是通过遵循这个 Ubuntu 16.04 初始服务器设置教程,包括一个 sudo 非根用户和防火墙
- A Docker Hub 帐户。
默认情况下,docker
命令需要 root 权限,但是,您可以通过在 docker组中运行docker
来执行命令而无需sudo
前缀。
要这样配置您的Droplet,请运行命令 sudo usermod -aG docker ${USER}
. 这将将当前的用户添加到 docker
组中。
本教程预计您的服务器将配置为运行docker
命令而无需sudo
前缀。
步骤 1 — 安装 Docker
在 SSHing 进入 Droplet 后,运行以下命令来删除可能已经安装的现有 docker 相关包,然后从官方存储库中安装 Docker:
1sudo apt-get remove docker docker-engine docker.io
2sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
3curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
4sudo apt-key fingerprint 0EBFCD88
5sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
6sudo apt-get update
7sudo apt-get install -y docker-ce
安装 Docker 后,使用以下命令验证安装:
1docker info
上面的命令显示了在环境中部署的Docker Engine的详细信息。下一个命令验证了Docker Tools的正确安装和配置。
1docker version
步骤2 — 发射集装箱
Docker 容器是由存储在注册表中的现有图像启动的。Docker 中的图像可以存储在私人或公共存储库中。私人存储库要求用户在抽取图像前进行身份验证。
要搜索名为hello-world
的图像,请运行命令:
1docker search hello-world
可能有多个图像匹配名称 hello-world
. 选择具有最大星数的图像,这表明图像的普及程度。
使用以下命令检查本地环境中可用的图像:
1docker images
由于我们还没有推出任何容器,所以不会有任何图像,我们现在可以下载图像并在本地运行:
1docker pull hello-world
2docker run hello-world
如果我们执行docker run
命令而不拉动图像,Docker Engine 会首先拉动图像,然后运行它。
让我们推出一个更有意义的容器:一个Apache Web 服务器。
1docker run -p 80:80 --name web -d httpd
您可能会注意到docker run
命令中传递的其他选项,以下是这些交换机的解释:
-p
— 这告诉Docker Engine在主机的端口80 上暴露容器的端口
80′. 由于Apache在端口80
上倾听,我们需要将其暴露在主机端口--name
— 这个交换机将我们的运行容器命名。 如果我们忽略了这一点,Docker Engine将随机命名-d
— 此选项指示Docker Engine在分离模式下运行容器。
要验证我们的容器是否确实在背景中运行,请尝试此命令:
1docker ps
输出显示,名为Web
的容器正在运行,端口80
被调到主机端口80
。
现在进入Web服务器:
1curl localhost
让我们用以下命令停止并删除运行容器:
1docker stop web
2docker rm web
运行docker ps
再次确认容器已终止。
步骤 3 — 将存储空间添加到容器
容器是短暂的,这意味着在容器中存储的任何东西在容器终止时都会丢失. 为了在容器的生命周期之外保持数据,我们需要向容器附加一个卷。
首先,在主机上创建一个新目录:
1mkdir htdocs
现在,让我们用一个新的开关启动容器来安装htdocs
目录,指向Apache Web 服务器的文档根:
1docker run -p 80:80 --name web -d -v $PWD/htdocs:/usr/local/apache2/htdocs httpd
v
交换机将容器内的 htdocs
目录指向主机的文件系统. 对该目录所做的任何更改都将在两个位置可见。
通过运行命令从容器访问目录:
1docker exec -it web /bin/bash
这个命令将我们的终端连接到容器的壳中,在交互式模式中。
导航到htdocs
文件夹并创建一个简单的HTML文件. 最后,离开壳,返回主机:
1cd /usr/local/apache2/htdocs
2echo '<h1>Hello World from Container</h1>' > index.html
3exit
再次執行「curl localhost」命令顯示網頁伺服器正在返回我們所創建的頁面。
我们不仅可以从主机访问这个文件,我们还可以修改它:
1cd htdocs
2cat index.html
3echo '<h1>Hello World from Host</h1>' | sudo tee index.html >/dev/null
运行curl localhost
再次确认 Web 服务器正在服务来自主机创建的最新页面。
用以下命令终止容器(-f
强迫Docker先停止而不停止)。
1docker rm -f web
步骤 4 — 建筑图像
除了从注册表中运行现有图像外,我们还可以创建自己的图像并将它们存储在注册表中。
您可以从现有容器创建新的图像,首先对容器进行更改,然后将图像标记并推到注册表。
让我们重新启动httpd
容器并修改默认文档:
1docker run -p 80:80 --name web -d httpd
2docker exec -it web /bin/bash
3cd htdocs
4echo '<h1>Welcome to my Web Application</h1>' > index.html
5exit
容器现在运行的是自定义的index.html,您可以用curl localhost
来验证。
在我们订购更改的容器之前,这是一个好主意,停止它. 它停止后,我们将运行订购命令:
1docker stop web
2docker commit web doweb
通过docker images
命令确认创建图像,它显示了我们刚刚创建的doweb
图像。
若要在 Docker Hub 中标记和存储此图像,请运行以下命令,将图像推到公共注册表:
1docker login
2docker tag your_docker_hub_username/doweb
3docker push your_docker_hub_username/doweb
您可以通过浏览器或命令行搜索 Docker Hub 来验证新图像。
步骤 5 — 启动私人注册表
可以在私人环境中运行注册表,以保持图像更安全,还可以减少 Docker 引擎和图像存储器之间的延迟。
Docker 注册表可作为一个容器,可以像任何其他容器一样启动,因为注册表包含多个图像,所以要将一个存储量附加到它。
1docker run -d -p 5000:5000 --restart=always --name registry -v $PWD/registry:/var/lib/registry registry
请注意,容器在背景中启动,端口5000
被曝光,注册表
目录被映射到主机文件系统中,您可以通过执行docker ps
命令来验证容器是否正在运行。
现在我们可以标记本地图像并将其推到私人注册表. 让我们先从Docker Hub拖出busybox
容器并标记它。
1docker pull busybox
2docker tag busybox localhost:5000/busybox
3docker images
之前的命令确认busybox
容器现在被标记为localhost:5000
,所以将图像推到私人注册表。
1docker push localhost:5000/busybox
随着图像被推到本地注册表,让我们尝试从环境中删除它,然后从注册表中拉回它。
1docker rmi -f localhost:5000/busybox
2docker images
3docker pull localhost:5000/busybox
4docker images
我们经过了一整圈的图像拉动,标记它,把它推到本地注册表,最后把它拉回去。
在某些情况下,您可能希望在专用主机上运行私人注册表。Docker Engine在不同的机器上运行将与远程注册表进行交谈,以便将图像拖动和推送。
由于注册表不安全,我们需要修改 Docker Engine 的配置以允许访问不安全的注册表。 要做到这一点,请编辑位于 /etc/docker/daemon.json
的 daemon.json
文件。
添加下列入口:
1[label Editing /etc/docker/daemon.json]
2{
3 "insecure-registries" : ["REMOTE_REGISTRY_HOST:5000"]
4}
将REMOTE_REGISTRY_HOST
替换为远程注册表的主机名称或 IP 地址。
结论
本教程帮助您开始使用 Docker. 它涵盖了安装,容器管理,图像管理,存储和私人注册表等基本概念。