【Docker学习总结】10.Docker-构建镜像

本文详细介绍Docker中构建镜像的两种方法:通过容器构建和通过Dockerfile构建,包括命令格式、选项说明和实战操作,展示了如何利用构建镜像简化服务部署。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇总结我们学习了如何获取和推送镜像,在其中我们曾在推送镜像至DockerHub的时候,将本地的一个容器制作成为了一个镜像,传送到DockerHub上,这个制作镜像的过程就是“构建镜像”。本篇就来学习如何进行镜像的构建。

一、构建镜像的优点

●保存对容器的修改,并再次使用
●自定义镜像的能力
●以软件的形式打包并分发服务及其运行环境

也就是说,我们可以通过自定义的镜像,将服务和运行的系统以及其软件运行环境,通过镜像打包在一起,此时在其他运行Docker守护进程的主机上,都可以以这个镜像来运行容器,从而提供服务。
因此构建镜像是Docker中非常重要的一项技术。

二、如何在Docker中构建镜像

Docker提供了两种构建镜像的方式:
1、docker commit   通过容器构建
commit命令的具体格式如下:

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

因为我们是通过容器来构建镜像的,所以它接受容器的名字作为主要参数。
comiit命令有以下三个选项:
-a, --author="" Author 用来指定作者的名字以及联系方式
-m, --message="" Commit message  用来记录镜像构建的信息
-p, --pause=true Pause container during commit 由于commit构建镜像时会将正在执行的容器暂停,所以-p参数可以指定commit命令不暂停正在执行的容器。

下面我们来看如何使用commit命令:

首先我们启动一个交互式容器,并将它命名为“commit_test”,使用centos系统。
进入容器bash命令行后,我们对容器做出修改,安装一个Nginx(具体参见《7.Docker在容器中部署静态网站》篇,强烈按照这篇文章再搭建一遍,后面会更好理解dockerfile的安装过程)。

安装Nginx好之后我们退出容器,使用ps命令即可查看到刚刚我们建立好的容器:

然后我们使用commit将其打包为镜像,-a和-m分别指定作者的信息和构建的信息。指定被打包的容器可以是名字,也可以是containerid。然后给镜像起名字,使用Dockerhub账户作为仓库名字,“commit_test_1”指定为镜像的名字:

docker commit -a 'jackzhucoder' -m 'nginx' commit_test jackzhucoder/commit_test_1

输入后下面返回的唯一ID就是新生成的镜像ID。使用images命令,查看系统中所有的镜像:

可以看到刚刚构建成功的“commit_test_1”已存在了。下面我们使用这个镜像来运行一个容器:

这里指定映射端口为80。-d指定该容器为守护式容器,然后使用bash进入容器的命令行,然后使用Ctrl+Q或Ctrl+P退出容器命令行,此时容器就在后台运行。
使用ps命令可以看到我们刚刚创建好,正在后台运行的容器:

我们使用attach重新进入这个容器,到/usr/local下面去看,可以看到之前安装好的nginx:

我们进入/usr/local/nginx下的sbin下,执行./nginx,来运行nginx:

然后连接刚刚我们映射的容器的80端口:

可以成功看见nginx提供的欢迎主页。

上面的演示,是为了告诉大家,由于我们将之前容器的修改保存到了镜像中,这样我们可以很容易的重复的执行这个镜像,提供同样的服务,不再是多个环境重复去安装同样的服务。

2、docker build    通过Dockerfile文件构建 
通过Dockerfile文件构建镜像,需要以下两步:
(1)创建Dockerfile
(2)使用docker build命令。

什么是Dockerfile文件?Dockerfile文件实际上就是包含了一系列命令的文本文件。下面显示的就是一个docker文件的例子:

#指定使用那个基础镜像
FROM centos
MAINTAINER jackzhucoder  jackzhucoder@126.com
LABEL Discription="基于centos的nginx镜像" version="1.0"
WORKDIR /usr/local/src
RUN yum install -y wget
RUN wget http://nginx.org/download/nginx-1.8.0.tar.gz
RUN tar -zxvf nginx-1.8.0.tar.gz
WORKDIR nginx-1.8.0
#安装nginx所依赖的包
RUN yum -y install gcc-c++
RUN yum -y install pcre pcre-devel
RUN yum -y install zlib zlib-devel
RUN yum -y install openssl openssl-devel libssl-dev
RUN ./configure
RUN make
RUN make install
EXPOSE 80

上面的docker文件包含了一系列的命令,实际上提供了创建上面我们创建的镜像的能力。即新建一个centos:7.6.1810版本为基础的镜像,然后填写维护人、以及在镜像中需要执行的命令(这里就是安装Nginx的命令)和暴露的端口。

下面我们来演示如何使用dockerfile来构建镜像:

首先我们创建一个存放dockerfile的文件夹,在文件夹下创建一个Dockerfile文件,并使用vim编写该文件。文件内容如上面的例子:

然后我们就可以通过执行docker build的命令来构建镜像。docker build命令的具体格式如下:

docker build [OPTIONS] PATH | URL | -

--force-rm=false 设置镜像过程中是否删除中间容器
--no-cache=false 创建镜像的过程是否不使用缓存
--pull=false 是否尝试去更新镜像的新版本
-q, -quiet=false 安静模式,成功后只输出镜像 ID
--rm=true 设置镜像成功后删除中间容器
-t,--tag="" 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。

这里我们其他参数都默认,然后使用-t为镜像起一个名字“jackzhucoder/df_test1”,后面跟上dockerfile的地址,这里是当前文件夹,所以使用“.”即可:

注意:这里一定要保证Linux虚拟机是联网的,不然所有依赖软件都下载不成功,镜像就会构建失败。
一系列指令后,我们使用images查看创建的镜像:

发现我们的相关镜像已经创建成功。然后我们启动一个容器,使用刚刚创建的镜像:

然后进入容器中,进入/usr/local/src下即可看见在镜像中安装的nginx:

启动nginx:

然后使用curl连接80端口,成功返回nginx欢迎界面:

至此,我们使用不同的构建方式,构建出相似的镜像。而使用Dockerfile,完全可以使用写好的文件,通过自动化的方式来运行,这也是Dockerfile最重要的优势,也是Docker中构建镜像最重要的方式。
同时Dockerfile中还提供了更加强大的命令,我们在后面的总结中进行学习。


参考资料:
《极客学院Docker学习》教学视频

转载请注明出处:https://blog.youkuaiyun.com/acmman/article/details/85218078

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光仔December

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值