教你一招:从正在运行的容器创建Docker镜像
如果你刚开始用容器,很有可能是从Docker开始——Docker使学习和使用容器技术变得非常容易。如果直接跳到Kubernetes,你会很快迷路的。所以,大多数人都应该认真考虑从Docker迈出第一步。今天,笔者将带你了解使用Docker容器要做的第一件事。我们会为NGINX服务器部署一个容器,对其进行修改,然后从正在运行的容器中创建一个新的镜像,你可以使用该镜像创建新容器。为什么要这样做?对于大
如果你刚开始用容器,很有可能是从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/
更多推荐
所有评论(0)