Doker制作镜像

410 阅读3分钟

docker制作镜像有两种方式,一种是通过对现有容器的修改后,提交到镜像,生成新的镜像;一种是通过Dockfile文件构建。

手动制作

我们以centos中安装node环境举例:

安装centos镜像

docker pull centos

QQ20191005-091600@2x.png

安装node环境

首先启动容器(这里没有添加镜像的tag,默认为latest),必须指定终端运行,否则容器会自动停止

docker run -d -it --name centos_node centos bash

QQ20191005-093014@2x.png

进入容器,安装node

docker exec -it centos_node bash

yum install -y nodejs

QQ20191005-093340@2x.png

提交修改

这里说一下docker commit命令:

QQ20191005-094000@2x.png

-a: 作者信息
-c: 使用Dockerfile时会用到
-m: 本次提交的信息
-p: 提交时是否暂停容器

安装好node后,退出当前容器,并提交修改,生成新的镜像:

docker commit -a 'vongola' -m '包含node环境的centos' centos_node mycentos_node:v1

QQ20191005-093759@2x.png

这里可以看到我们新生成的镜像比原版大了100多兆,我们来验证一下是不是含有node环境。

验证结果

这里要指定版本运行容器:

docker run -d -it --name my_centos mycentos_node:v1 bash

QQ20191005-094801@2x.png

进入容器,检查node:

docker exec -it my_centos bash

QQ20191005-094937@2x.png

至此,第一种制作方法结束,我们来看看第二种。

Dockerfile

Dockerfile是一个包含用于组合镜像的命令的文本文档。

Dockerfile结构

Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。#开头的行为注释。
示例:

# 我的第一个Dockerfile
# Version 1.0

# 基础镜像
FROM centos

# 维护者信息
MAINTAINER vongola 

#ENV 设置环境变量
ENV myCentos centos_node

#ADD  文件放在当前目录下,拷过去会自动解压
ADD 123.txt /usr/local/  

#RUN 执行以下命令 
RUN yum install -y nodejs

#WORKDIR 相当于cd,当指定后,下面的run命令会在当前文件路径下执行
WORKDIR /usr/local/

RUN mkdir 123

#EXPOSE 暴露端口
EXPOSE 80

#CMD 运行以下命令 这个命令会在容器运行时执行
CMD ["/bin/echo", "Hello"]

构建镜像

docker build [OPTIONS] PATH | URL | -

常用参数为:

  1. -f Dockerfile路径。
  2. -t 镜像名称和标签。

这里我们以上面的例子作为Dockerfile构建镜像(请在Dockerfile所在目录执行以下命令,目录中请创建一个123.txt文件,因为Dockerfile里有一个复制123.txt)。

docker build -t centos_dokerfile:v1 . (注意这里最后有个点,表示Dockerfile在当前目录)

安装成功后:

QQ20191006-163249@2x.png

验证Dockerfile参数

运行容器

docker run -d -it --name centos_dokerfile centos_dokerfile:v1 bash

容器启动成功后,我们可以看见暴露出来的端口就是我们指定的80端口:

QQ20191006-163439@2x.png

进入容器

docker exec -it centos_dokerfile bash

这里可以看到我们安装的node,复制的123.txt和创建的123目录,以及环境变量myCentos:

QQ20191006-170123@2x.png

CMD命令

docker run -it centos_dokerfile:v1

这里可以看到当我们启动容器不传入其他参数时,可以看到CMD命令执行了,但是容器并没有启动,这里是因为centos镜像启动时必须制定终端,是centos镜像的特殊性,如果是其他没有限制的镜像这里就能正常启动了。

QQ20191006-170339@2x.png

更多参数:

参考docker官方文档链接