摘要

本实验将带你探索如何将运行中的容器保存为新镜像,以及如何使用Dockerfile从头构建镜像。这两种方法都是Docker生态系统中创建自定义镜像的重要技术。

实验简介在Docker的世界中,镜像是容器的基础,而自定义镜像则是应用容器化的关键。本实验将介绍两种构建自定义镜像的方法:

使用docker commit命令将运行中的容器保存为新镜像

使用Dockerfile文件定义镜像构建过程,并通过docker build命令构建镜像

通过这两种方法,我们可以将应用程序、配置文件和依赖项打包成一个可移植的镜像,便于分发和部署。

实验过程

任务一:使用 docker commit 构建docker commit命令允许我们将运行中容器的当前状态保存为新镜像。这种方法特别适合在容器中进行交互式操作后,将结果保存下来。

基本操作流程是:运行容器 → 修改容器 → 保存修改后的容器

在这个任务中,我们将使用Alpine Linux作为基础镜像,安装Nginx并部署一个简单的网站,然后将这个定制化的容器保存为新镜像。

1. 运行Alpine容器首先,我们启动一个Alpine Linux容器,并进入交互式模式:

bash

docker run -it -p 80:80 alpine

信息

Alpine Linux是一个非常精简的Linux发行版,基础镜像只有约5MB大小,非常适合作为Docker容器的基础镜像。命令提示符变为/ #表示我们已经进入了容器的 Shell 环境。

2. 更新软件包索引在容器内执行以下命令,更新软件包索引:

bash

apk update

apk是Alpine Linux的包管理器,类似于Ubuntu的apt或CentOS的yum。

3. 安装必要的软件包接下来,我们安装Web服务器和其他工具:

bash

apk add wget nginx vim

这个命令安装了三个软件包:

wget:用于从网络下载文件

nginx:高性能Web服务器

vim:文本编辑器

4. 创建Nginx配置文件删除默认配置并创建自定义配置:

bash

rm /etc/nginx/http.d/default.conf

vim /etc/nginx/http.d/mysite.conf

在编辑器中粘贴以下配置内容:

nginx

server {

listen 80 default_server;

location / {

root /var/www/localhost/htdocs;

index index.html;

}

}

技巧

这个配置指定 Nginx 监听80端口,并将网站根目录设置为/var/www/localhost/htdocs。当访问网站时,默认显示index.html文件。

5. 部署网站内容切换到网站根目录并下载网站文件:

bash

cd /var/www/localhost/htdocs

# 下载网站文件

wget https://file.hisland.work/f/42ed2bead9d64ace9e46/?dl=1 -O index.html

wget https://file.hisland.work/f/6cef554e8754407c83cd/?dl=1 -O styles.css

6. 启动Nginx服务现在我们启动Nginx服务器

bash

nginx -g 'daemon off;'

信息

daemon off参数使Nginx在前台运行,而不是作为后台服务。这是Docker容器中运行服务的推荐方式,因为容器的主进程结束时,容器也会停止。

在浏览器中访问服务器IP地址,应该能看到我们部署的网站:

7. 将容器保存为镜像按下Ctrl+C停止Nginx服务,然后退出容器:

bash

exit

现在使用docker commit命令将修改后的容器保存为新镜像:

bash

docker commit loving_snyder mysite:v0.1

注意

loving_snyder是Docker自动生成的容器名称,你的容器名称可能不同。可以通过docker ps -a命令查看容器列表及其名称。

现在,我们已经成功地将一个运行中的容器保存为新镜像mysite:v0.1。这个镜像包含了Alpine Linux、Nginx和我们部署的网站内容。

任务二:通过Dockerfile构建虽然docker commit方法简单直观,但它缺乏可重复性和透明度。使用Dockerfile构建镜像是更推荐的方法,它提供了清晰的构建步骤文档,便于版本控制和自动化构建。

1. 准备工作目录和源文件首先,创建一个新的工作目录并下载网站文件:

bash

mkdir /root/mysite

cd /root/mysite

# 下载网站文件

wget https://file.hisland.work/f/42ed2bead9d64ace9e46/?dl=1 -O index.html

wget https://file.hisland.work/f/6cef554e8754407c83cd/?dl=1 -O styles.css

2. 创建Dockerfile在工作目录中创建一个名为Dockerfile的文件:

bash

vim Dockerfile

输入以下内容:

Dockerfile指令解释

FROM:指定基础镜像

RUN:在构建过程中执行命令

COPY:将本地文件复制到容器中

EXPOSE:声明容器将监听的端口

CMD:指定容器启动时执行的命令

3. 构建镜像使用docker build命令构建镜像:

bash

docker build -t harbor.seahi.me/stu00/mysite:v2 .

00 改成你自己的学号后两位

参数说明:

-t:指定镜像的标签(名称和版本)

.:指定构建上下文(当前目录)

4. 验证镜像查看本地镜像列表,确认新镜像已成功构建:

bash

docker images

两种构建方法的比较

docker commit vs Dockerfile

docker commit

优点:简单直观,适合快速原型开发和探索

缺点:构建过程不透明,难以重现,不适合团队协作和自动化

Dockerfile

优点:构建过程透明,易于版本控制,支持自动化,是业界最佳实践

缺点:需要预先规划构建步骤,学习曲线略陡

在实际工作中,Dockerfile 是构建 Docker 镜像的推荐方法,而docker commit通常用于调试和学习过程中。

作业

将网站中的“张三”改成你自己,其他内容也可以自由修改;

将本节课制作的两个镜像推送到 Harbor 注册中心,镜像名称分别是:

text

# 00 是学号后两位

harbor.seahi.me/stu00/mysite:v0.1

harbor.seahi.me/stu00/mysite:v0.2