从镜像仓库下载的镜像,都是别人事先做好的。如果需要一个定制的镜像,就必须得自己动手了。自己创建一个镜像有2种方式:
a、使用commit命令基于一个现有的镜像来修改。本质上并不是新建一个镜像,而是基于一个已有的基础镜像进行修改。
b、基于Dockerfile来创建。
1、第一种方式:commit命令
如果你修改了原本容器的某些配置,想要保存这个容器的配置并形成一个新的镜像,就可以使用commit命令,基于该容器创建出一个新的镜像。即:commit 主要用于通过差异性,创建一个新的image。
(1)commit命令格式如下:
docker commit [options] container [repository][:tag]]
options说明:
-a 提交的镜像作者
-c 使用Dockerfile 指令来创建镜像
-m 提交时的说明文字
-p 在commit时,将容器暂停,默认情况下,在提交时,容器的执行将被暂停,以保证数据的完整性。
(2)简单演示:
#查看本地的存在的容器 [root@izwz9ib5he33fx3jnuis2xz ~]# docker ps-a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b2e9025226f0 tomcat "catalina.sh run" 2 days ago Up 47 hours 0.0.0.0:8080->8080/tcp tomcat1 #提交一个存在的容器,b2e9025226f0为本地容器的ID [root@izwz9ib5he33fx3jnuis2xz ~]# docker commit -a "zhangweipeng" -m "mytomcat" b2e9025226f0 mytomcat:v1 sha256:d2259b053f5354dfee0def05e0540ca17e37a2baa0031f3d64b7491f9a5d34bc #查看docker的镜像,可以看到我们新建的镜像 [root@izwz9ib5he33fx3jnuis2xz ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mytomcat v1 d2259b053f53 8 seconds ago 569 MB
2、第二种方式:基于Dockerfile
使用Dockerfile的方式其实是相当于从零开始创建一个新的镜像,具体步骤是先写好一个Dockerfile文件。然后使用docker build命令来构建镜像,构建时会从网上下载及更新基础镜像与相关软件。因此,这种方法的核心是编写好Dockerfiel文件。
通常一个dockerfile文件与shell脚本类似,是一个批处理的过程,但是它具有自己的命令和语法,因此,将构建镜像需要执行的命令写在Dockerfile文件里面。dockerfile的命令都是大写的,比如:FROM、RUN等。
(1)简单演示:
[root@izwz9ib5he33fx3jnuis2xz ~]# mkdir docker_file [root@izwz9ib5he33fx3jnuis2xz ~]# cd docker_file/ #创建并编辑Dockerfile文件,将构建镜像需要使用的命令写到此文件中,该文件十分关键 [root@izwz9ib5he33fx3jnuis2xz docker_file]#vim Dockerfile #查看Docker文件的内容 [root@izwz9ib5he33fx3jnuis2xz docker_file]#cat Dockerfile FROM ubuntu:14.04 ENTRYPOINT ["/bin/echo"] #使用build命令构建镜像 .表示当前目录的所有文件 [root@izwz9ib5he33fx3jnuis2xz docker_file]#docker build . Sending build context to Docker daemon2.048 kB Step 1/2 : FROM ubuntu:14.04 ---> 8cef1fa16c77 Step 2/2 : ENTRYPOINT /bin/echo ---> Running in e080bf082e4a ---> 5cbf5ddc3059 Removing intermediate containere080bf082e4a Successfully built 5cbf5ddc3059 #至此,镜像构建完成,新创建的镜像的id是5cbf5ddc3059,可以使用docker images命令查看 #运行镜像,生成一个新的容器 [root@izwz9ib5he33fx3jnuis2xz docker_file]#docker run 5cbf5ddc3059 #查看容器,可以看到生成一个新的容器 [root@izwz9ib5he33fx3jnuis2xz docker_file]#docker ps –a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 75ccd954b6b8 5cbf5ddc3059 "/bin/echo" 15 minutes ago Exited (0) 15 minutes ago vibrant_swirles #在创建容器的时候加入一个参数 [root@izwz9ib5he33fx3jnuis2xz docker_file]#docker run 5cbf5ddc3059 hello world hello world #重新编写Dockerfile文件 [root@izwz9ib5he33fx3jnuis2xz docker_file]#vim Dockerfile #查看Dockerfile文件的内容 [root@izwz9ib5he33fx3jnuis2xz docker_file]#cat Dockerfile FROM ubuntu:14.04 #ENTRYPOINT ["/bin/echo","Hiworld!"] CMD ["/bin/echo","Hiworld!"] #使用build命令构建镜像 [root@izwz9ib5he33fx3jnuis2xz docker_file]#docker build . Sending build context to Docker daemon2.048 kB Step 1/2 : FROM ubuntu:14.04 ---> 8cef1fa16c77 Step 2/2 : CMD /bin/echo Hi world! ---> Running in 82d89be69ec6 ---> dcb78037c371 Removing intermediate container82d89be69ec6 Successfully built dcb78037c371 #通过新创建的镜像来创建容器 [root@izwz9ib5he33fx3jnuis2xz docker_file]#docker run dcb78037c371 Hi world! [root@izwz9ib5he33fx3jnuis2xz docker_file]#docker run dcb78037c371 /bin/date Thu May 24 14:33:02 UTC 2018