• 一、commit制作镜像

启动一个容器,对容器修改操作,会保存到容器的存储层,当容器销毁存储层也销毁。

但我们可以用commit命令把存储层保存为镜像。

①启动一个nginx容器

docker run --name nginx -d -p 80:80 nginx

②进入nginx容器修改访问首页

docker exec -it nginx bash

echo '<h1>hello,docker</h1>' > /usr/share/nginx/html/index.html

exit

③修改了容器的文件,即修改了容器的存储层,查看具体改动

docker diff nginx

④commit保存修改成为镜像,镜像名字为nginx:v2

docker commit --author "huang km" --message "修改了默认页面" nginx nginx:v2

⑤查看nginx:v2镜像修改历史

docker history nginx:v2

优缺点:

commit命令可以体现镜像分层(镜像只读层,容器读写层)的概念,但实际环境不推荐使用。

用commit镜像除了真正想要修改的东西外,由于命令的执行,还会有其他文件被改动或添加,如果是安装软件包、编译构建,将会有大量无关内容被添加进行,这会导致镜像极为臃肿,docker commit意味着对镜像操作都是黑箱操作,其他人很难知道里面发生了什么,维护十分困难。

 

  • 二、Dockerfile定制镜像

定制nginx:v2镜像为例

①在一个空白目录,新建一个文本文件

mkdir mynginx

cd mynginx

touch Dockerfile

②vi  Dockerfile  修改Dockerfile文件内容为

FROM nginx

RUN echo '<h1>hello,docker</h1>' > /usr/share/nginx/html/index.html

③在Dockerfile文件所在目录执行以构建镜像(注意语句后面有一个点)

docker build -t nginx:v3 .

④docker images 即可查看到nginx:v3镜像

 

要点1:FROM指定基础镜像,即要修改的镜像,FROM必须在文件第一行。RUN命令是用来执行命令行,注意每用一个RUN(dockerfile指令)就是镜像添加多一层(最大限制127层)。执行多个指令用&&来连接(apt-get加上-y,表示系统安装提示都默认选择yes,否则制作镜像失败;如果&&命令之间有换行,记得行后要带上 \ )

FROM nginx
RUN apt-get -y update && \
apt-get install -y vim

除了上面两个Dockerfile命令,还有

# Base images 基础镜像
FROM centos

#MAINTAINER 维护者信息
MAINTAINER deepfeel

#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH

#ADD  文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/  
ADD epel-release-latest-7.noarch.rpm /usr/local/  

#RUN 执行以下命令 
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www

#WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.8.0 

RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install

RUN echo "daemon off;" >> /etc/nginx.conf

#EXPOSE 映射端口
EXPOSE 80

#VOLUME 挂载目录
VOLUME ["/my-vol","/webapp"]

#CMD 运行以下命令
CMD ["nginx"]

 

要点2:docker build命令后面的点并不是指定Dockerfile所有路径,而是指定上下文。

【首先要理解docker build的工作原理。Docker在运行时分为Docker引擎(即服务端守护进程,简称服务端)和客户端工具,属于C/S架构。Docker引擎提供了一组REST API,叫Docker Remote API,我们平时在本机执行的各种docker命令,实际都是以远程调用API的形式让Docker引擎来完成。】

当我们构建镜像时,仅仅使用RUN是不够的,还有COPY、ADD指令等等,而COPY、ADD指令会把本地文件复制进镜像,docker build构建的时候,并非是在本地构建,而是在服务端(Docker 引擎)中构建。

docker build命令就是打包用户指定的上下文路径下的所有内容,然后上传到docker引擎,docker引擎构建的时候就能得到所需的一切文件。

 

执行docker build -t nginx:v3 home,这会打包发送home下的所有文件,如果指定根目录,那就打包发送几十GB的东西。没有指定构建文件名称则默认找home目录下的Dockerfile文件来构建。

如果想使用别的构建文件名称,则需要指定

docker build -t nginx:v3 home -f ../myfile.txt

要点3:构建过程解读:

从输出结果可以看到镜像的构建过程。

step1:在nginx这一层e43d811ce2f4 之上

step2:run启动了一个容器9cdc27646c7b,执行了相应的命令,提交了这一层44aa4490ce2c,随后删除了所用到的容器9cdc27646c7b。

 

 

  • 三、save/load打包镜像

①打包名字为alpine的镜像 压缩包名字为alpine-latest.tar.gz

docker save alpine | gzip > alpine-latest.tar.gz

②然后把alpine-latest.tar.gz复制到其他机子上,执行加载镜像

docker load -i alpine-latest.tar.gz

--还可以直接一步完成

docker save alpine | alpine-latest.tar.gz | pv | ssh <用户名>@<主机名> 'cat | docker load'

 

 

 

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐