20-Docker镜像制作

查看镜像构建的历史

docker image history 26a5       #查看镜像26a5的构建历史

使用commit命令构建镜像

使用commit命令可以将容器构建成镜像。

  • 将容器webserver制作为镜像nginx:v2
docker commit \
    --author "Tao Wang <[email protected]>" \     #指定镜像作者
    --message "修改了默认网页" \    #指定镜像的描述信息。 
    webserver \		#容器名
    nginx:v2		#新镜像名

实验

docker container run -d -p 8080:80 --name "webserver" nginx
docker exec -it webserver bash
cd /usr/share/nginx/html
echo "hello" > index.html       #修改主页文件index.html
exit        #退出容器
docker commit webserver nginx:v2    #将容器webserver构建成镜像nginx:v2
docker container run -d -p 8090:80 --name "webserver2" nginx:v2    #根据新构建的镜像启动容器
#测试:curl 127.0.0.1:8090,会返回hello

commit命令的弊端

镜像是分层的,如上例中的nginx:v2比nginx多了一层(将webserver的可写层制作成了镜像)
当我们多次使用commit制作镜像,镜像就会变得很臃肿,拥有很多层,这导致镜像的管理,传输等过程中效率低下。
如,我们将nginx中的index.html修改为123,下一次又修改为456,修改了很多次,最后又变成了123。那么中间的镜像就是多余了。
使用Dockerfile可以解决这个问题。


使用Dockerfile制作镜像

Dcokerfile是一个文件,里面说明了镜像如何制作。

  • 用一个例子来入门
vim Dockerfile
    FROM centos:7
    MAINTAINER flight
    CMD [ "sh", "-c", "echo $HOME" ]
docker build -t centos:v1 .
docker run centos:v1    #输出家目录后退出
docker run centos:v1 echo hello     #输出hello之后退出

#Dockerfile文件解释:
#FROM centos:7      #指定base镜像(根据bash镜像制作新的镜像)
#MAINTAINER flight  #维护者(作者)
#CMD [ "sh", "-c", "echo $HOME" ]       #启动镜像后运行此命令(使用docker run时可以在命令最后添加新的命令将CMD替换)

通常会使用centos、ubuntu等base镜像进行制作。

Dockerfile的参数
FROM centos			#指定base镜像
MAINTAINER flight	#指定作者
ENV WELCOME "hello"	#设置环境变量,ENV a=123 b="456 789"
ARG WELCOME[=hello]	#设置环境变量,但容器中不存在这些变量。可以用--build-arg WELCOME=hi来覆盖
EXPOSE	8080 8888	#指定容器监听端口
VOLUME	/data		#定义匿名卷(/var/lib/docker/volumes下)
WORKDIR	/testdir	#设置当前工作目录
RUN	touch 1.txt		#运行命令(一条RUN指令建立一层镜像,可使用&&将命令串起来)
COPY ./src dst	#将文件从本机复制到镜像中(目标路径不存在则自动创建)
ADD ./src dst	#与COPY类似,但可以复制压缩文件(会自动解压)
CMD [ "sh", "-c", "echo $HOME" ]	#默认执行命令(启动镜像时就会执行),docker run最后使用新的命令替换CMD
ENTRYPOINT [ "sh", "-c", "echo $HOME" ]	#docker run之后得参数作为参数传递给ENTRYPOINT
docker build -t ryan/nginx:v3 .
    -t	#指定新镜像name和tag
    -f	#可以指定Dockerfile文件名(默认文件名为Dockerfile)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章