docker commit/Dockerfile制作镜像,save/load打包镜像
一、commit制作镜像启动一个容器,对容器修改操作,会保存到容器的存储层,当容器销毁存储层也销毁。但我们可以用commit命令把存储层保存为镜像。①启动一个nginx容器docker run --name nginx -d -p 80:80 nginx②进入nginx容器修改访问首页docker exec -it nginx bashecho '<h1...
-
一、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'
更多推荐
所有评论(0)