创建docker镜像有2种方式:1、使用“docker commit”命令基于已有容器手动构建镜像;2、使用dockerfile自动构建镜像,docker程序会通过读取dockerfile构建文件中的指令自动生成镜像。
本教程操作环境:linux5.9.8系统、docker-1.13.1版、dell g3电脑。
有时候从docker镜像仓库中下载的镜像不能满足要求,我们可以基于一个基础镜像构建一个自己的镜像.
镜像构建介绍在什么情况下我们需要自己构建镜像那?
(1)当我们找不到现有的镜像,比如自己开发的应用程序
(2)需要在镜像中加入特定的功能
docker构建镜像有两种方式:docker commit命令与dockerfile构建文件
docker commit构建镜像基于已有容器构建镜像主要是通过docker commit命令来构建新的镜像。
dockercommit构建进行主要有三步:
运行容器修改容器将容器保存为新的镜像比如在centos镜像中安装vim编辑器并存为新的镜像
(1)运行容器
[root@ken1 docker]# docker run -it centosunable to find image 'centos:latest' locallylatest: pulling from library/centosa02a4930cb5d: pull complete digest: sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426status: downloaded newer image for centos:latest
(2)安装vim编辑器
vim编辑器确认没有安装
[root@69f501e858a6 /]# vimbash: vim: command not found
进行安装
[root@69f501e858a6 /]# yum install vim -y
(3)保存为新得镜像
首先查看当前运行的镜像
[root@ken1 ~]# docker pscontainer id image command created status ports names69f501e858a6 centos /bin/bash 2 minutes ago up 2 minutes quizzical_torvalds
使用commit存为新的镜像
[root@ken1 ~]# docker commit 69f501e858a6 centos-vimsha256:42083b89a179368bc29a8f40d14f8824990183c8e4b28fd84411d440c26342e5
69f501e858a6是运行容器的id使用name下面的名称也行
centos-vim是新镜像的名字
查看一下是否有了centos-vim镜像
重新启动新的镜像,验证是否可以使用vim编辑器
可以发现新的镜像可以使用vim编辑器了
[root@ken1 ~]# docker run -it centos-vim [root@61d090898bad /]# vim[root@61d090898bad /]# vim test
上面演示了如何使用commit创建新的镜像,但是docker并不建议使用这种方式创建镜像,原因如下:
这是一种手工创建镜像的方式,容器出错,而且效率低且可重复性弱更重要的是。使用者并不知道镜像是如何创建出来的。里面是否有恶意程序dockerfile构建镜像dockerfile是由一组指令组成的文件,其每条指令对应linux中的一条命令,docker程序通过读取dockerfile中的指令最终生成镜像。
第一个dockerfike第一步:创建一个新的目录
[root@ken1 ~]# mkdir /test
第二步:编写dockerfile
名称就叫dockerfile,且第一个d需要大写
[root@ken1 ~]# cat dockerfilefrom centosrun yum install vim -y
fromcentos表示使用centos这个基础镜像
run表示在centos上安装vim编辑器
第三步:构建镜像
[root@ken1 ~]# docker build -t centos-vim2 .
-t后面指定新的镜像的标签名(tag)
. 最后的一个点指明docker context为当前目录。docker默认会从build context中查找 dockerfile文件,我们也可以通过-f参数指定dockerfile的位置
第四步:查看镜像
查看镜像分层结构
docker history会显示镜像的构建历史,也就是dockerfile的执行过程。
dcokerfile常用指令1.from指定base镜像
2. maintainer设置镜像的作者。可以是任意的字符
3.copy将文件从build context复制到镜像
copy支持两种格式:copy src dest 和 copy [“src”,”dest”]
注意:src只能制动build context中的文件或目录即在和dockerfile同目录下才可以
4.add与copy类似,从build context复制文件到镜像。
不同的是,如果src是归档文件(tar,zip,tgz,xz),文件会被自动接要到dest
5.env设置环境变量,环境变量可被后面的指令使用,例如:
env name ken run echo $name
6.expose指定容器中的进程会监听某个端口,docker可以将该端口暴露出来
7.volume将文件或目录声明为volume
8.workdir为后面的run,entrypint,add,copy指令设置镜像中的当前工作目录
9.run在容器中运行指定的命令
10.cmd容器启动时运行指定的命令
dockerfile中可以多个cmd指令,但是只要最后一个生效。cmd可以被docker run之后的参数替换
11.entrypoint设置容器启东市的命令
dockerfile中可以有多个entrypoint,但是只有最后一个生效。
cmd或者docker run之后的参数会被当做参数传递给enterypoint.
dockerfile演示下面演示一个比较全面的dockerfile
[root@ken1 test]# cat dockerfile #my dockerfilefrom busyboxmaintainer kenworkdir /kenrun touch testcopy [ken1,.]add [wordpress.tar.gz,.]env name ken
注意:dockerfile支持以#开头的注释
构建镜像
[root@ken1 test]# docker build -t myimage .sending build context to docker daemon 4.281mbstep 1/7 : from busybox ---> 3a093384ac30step 2/7 : maintainer ken ---> running in 2a73a83507ceremoving intermediate container 2a73a83507ce ---> 8c3df9b3d823step 3/7 : workdir /ken ---> running in 31c6f9fe2195removing intermediate container 31c6f9fe2195 ---> a458cf986072step 4/7 : run touch test ---> running in e1b08ebd363cremoving intermediate container e1b08ebd363c ---> 41601920009astep 5/7 : copy [ken1,.] ---> 2ebfa0933fcastep 6/7 : add [wordpress.tar.gz,.] ---> d0ad29d3aa34step 7/7 : env name ken ---> running in fceae6e20e63removing intermediate container fceae6e20e63 ---> 7efe0600e48fsuccessfully built 7efe0600e48fsuccessfully tagged myimage:latest
查看镜像
运行该镜像
[root@ken1 test]# docker run -it myimage/ken # lsken1 test wordpress/ken # echo $nameken
可以发现当前工作目录为/ken,且自动创建ken1是我们从docker context目录中复制过去的test是使用touch创建的wordpres压缩包已经被自动解压$name为变量值为ken推荐学习:《docker视频教程》
以上就是创建docker镜像有几种方式的详细内容。