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

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

也就是说,我们可以通过自定义的镜像,将服务和运行的系统以及其软件运行环境,通过镜像打包在一起,此时在其他运行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命令:

进入容器之后,安装Nginx:

依赖包:
yum install gcc-c++
 
yum install pcre pcre-devel
 
yum install zlib zlib-devel
 
yum install openssl-devel

正式安装:
cd /usr/local
 
yum -y install wget
 
wget http://nginx.org/download/nginx-1.7.4.tar.gz
 
tar -zxvf nginx-1.7.4.tar.gz
 
mkdir nginx
 
cd nginx-1.7.4
 
./configure --prefix=/usr/local/nginx
 
yum -y install gcc automake autoconf libtool make
 
make 
 
make install

ctrl+p ctrl+q退出容器。   

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

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

下面我们使用这个镜像来运行一个容器:

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

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

 

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

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

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

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

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

#指定使用那个基础镜像
FROM centos
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

下面我们来演示如何使用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的地址,这里是当前文件夹,所以使用“.”即可:

我们使用images查看创建的镜像:

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

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

启动nginx:

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

至此,我们使用不同的构建方式,构建出相似的镜像。而使用Dockerfile,完全可以使用写好的文件,通过自动化的方式来运行,这也是Dockerfile最重要的优势,也是Docker中构建镜像最重要的方式。

猜你喜欢

转载自blog.csdn.net/FullStackDeveloper0/article/details/87970641
今日推荐