如果你刚开始用容器,很有可能是从Docker开始——Docker使学习和使用容器技术变得非常容易。如果直接跳到Kubernetes,你会很快迷路的。

所以,大多数人都应该认真考虑从Docker迈出第一步。今天,笔者将带你了解使用Docker容器要做的第一件事。我们会为NGINX服务器部署一个容器,对其进行修改,然后从正在运行的容器中创建一个新的镜像,你可以使用该镜像创建新容器。

为什么要这样做?对于大多数基于web的容器部署,你都使用NGINX。不必总是部署一个新的NGINX容器,然后修改它以满足基线需求,你可以创建一个已经包含该基线的镜像,避免大量重复工作。

这一切都是为了提高效率。

安装Docker

笔者将在Ubuntu服务器(版本20.04)上演示。如果你使用不同的Linux发行版,则只需修改此过程的安装步骤。

要在Ubuntu服务器上安装Docker,请登录并发出以下命令:

sudo apt-get install docker.io -y

安装完成后,使用以下命令将用户添加到docker组:

sudo usermod -aG docker $USER

注销并重新登录,以便更改生效。

创建新容器

Docker就绪后,让我们创建新容器。这将是一个非常基本的web服务器,使用NGINX。该命令如下所示:

docker create --name nginx-base -p 80:80 nginx:alpine

对于从未使用过Docker的用户,该命令执行以下操作:

创建一个名为nginx base的新容器,该容器在内部(访客)端口80和外部(主机)端口80上运行,并使用必须从DockerHub下拉的nginx:alpine镜像。

该命令将以容器ID响应,容器ID是一长串随机字符,表示部署成功。如果打开web浏览器并将其指向托管服务器的IP地址,你应该会看到NGINX欢迎页面(图A)。

图A:NGINX欢迎页面,由Docker容器生成。

修改现有容器

现在,是时候修改现有的容器了。我们将只做一个非常基本的修改(稍后你可以扩展)。我们要做的是创建一个新的为NGINX提供服务的index.html页面。

为此,我们使用以下命令创建新页面:

nano index.html

在该文件中,粘贴以下内容(你可以修改):

<html>

<head>

<title>Hello, New Stack!</title>

</head>

<body>

<h1>Hello, New Stack!</1>

</body>

保存并关闭文件。

如你所见,新的欢迎页面将显示“Hello,new Stack!”任何创建了“Hello,World”应用程序的人都会立即意识到这一点。

下一步,我们将把该文件复制到正在运行的容器中。对于NGINX镜像,文档根目录(容纳网页的基本目录)是/usr/share/NGINX/html。因为Docker有一个内置的copy命令,所以将文件添加到正在运行的容器非常简单。

记住,我们的容器称为nginx-base。复制index.html到nginx base上文档根目录的命令为:

docker cp index.html nginx-base:/usr/share/nginx/html/index.html

如果在web浏览器中刷新页面,你应该会看到它现在显示新的欢迎消息(图B)。

图B:正在运行的Docker容器中的新欢迎消息。

创建一个新镜像-++++

有了新修改的(正在运行的)容器,如何创建包含更改的新镜像?其实很简单。

首先,我们使用命令提交更改:

docker commit nginx-base

这将创建一个没有存储库或标记的新镜像。使用命令列出当前镜像:

docker images

你应该看到如下内容:

REPOSITORY   TAG       IMAGE ID          CREATED               SIZE

<none>       <none>    7fb3d1656c23   About a minute ago       23.5MB

nginx        alpine    cc44224bfe20   7 days ago               23.5MB

底部镜像是我们用来创建新容器的镜像。上面的图片是我们刚刚创建的。请注意,它既没有REPOSITORY(第一列)也没有TAG(第二列)。为了使这个镜像可用,我们必须对它进行标记。为了标记镜像,我们必须使用图IMAGE ID作为标识符,因此标记镜像(我们将其命名为docker-base-image)如下所示:

docker tag IMAGE_ID nginx-base-container

其中IMAGE_ID是新容器的实际ID。

现在,如果你列出镜像(使用docker images命令),你将看到如下内容:

REPOSITORY               TAG       IMAGE ID          CREATED         SIZE

nginx-base-container     latest    7fb3d1656c23   6 minutes ago      23.5MB

nginx                    alpine    cc44224bfe20   7 days ago         23.5MB

现在,你已经从一个正在运行的容器中创建了一个新的Docker镜像。让我们停止并移除原始容器。为此,请使用以下命令定位原始文件的ID:

docker ps -a

使用原始容器ID的前4个字符,用以下命令停止:

docker stop ID

其中ID是原始容器的前四位数字。

使用以下命令删除容器:

docker rm ID

其中ID是原始容器的前四位数字。

然后,你可以使用如下命令从新镜像部署容器:

docker create --name nginx-new -p 80:80 nginx-base-container:latest

刷新web浏览器,你应该再次看到新的Hello,new Stack!欢迎页面。新镜像包括对index.html页面的修改,因此从中创建的每个容器都将反映该更改。

这就是从运行中的容器创建Docker镜像要做的,这项技能将非常有用。

原文链接:

https://thenewstack.io/tutorial-create-a-docker-image-from-a-running-container/

Logo

开源、云原生的融合云平台

更多推荐