docker制作镜像有两种方式,一种是通过对现有容器的修改后,提交到镜像,生成新的镜像;一种是通过Dockfile文件构建。
手动制作
安装centos镜像
docker pull centos
安装node环境
首先启动容器(这里没有添加镜像的tag,默认为latest),必须指定终端运行,否则容器会自动停止:
docker run -d -it --name centos_node centos bash
进入容器,安装node
docker exec -it centos_node bash
yum install -y nodejs
提交修改
这里说一下docker commit命令:
-a: 作者信息
-c: 使用Dockerfile时会用到
-m: 本次提交的信息
-p: 提交时是否暂停容器
安装好node后,退出当前容器,并提交修改,生成新的镜像:
docker commit -a 'vongola' -m '包含node环境的centos' centos_node mycentos_node:v1
这里可以看到我们新生成的镜像比原版大了100多兆,我们来验证一下是不是含有node环境。
验证结果
这里要指定版本运行容器:
docker run -d -it --name my_centos mycentos_node:v1 bash
进入容器,检查node:
docker exec -it my_centos bash
至此,第一种制作方法结束,我们来看看第二种。
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 | -
常用参数为:
- -f Dockerfile路径。
- -t 镜像名称和标签。
这里我们以上面的例子作为Dockerfile构建镜像(请在Dockerfile所在目录执行以下命令,目录中请创建一个123.txt文件,因为Dockerfile里有一个复制123.txt)。
docker build -t centos_dokerfile:v1 . (注意这里最后有个点,表示Dockerfile在当前目录)
安装成功后:
验证Dockerfile参数
运行容器
docker run -d -it --name centos_dokerfile centos_dokerfile:v1 bash
容器启动成功后,我们可以看见暴露出来的端口就是我们指定的80端口:
进入容器
docker exec -it centos_dokerfile bash
这里可以看到我们安装的node,复制的123.txt和创建的123目录,以及环境变量myCentos:
CMD命令
docker run -it centos_dokerfile:v1
这里可以看到当我们启动容器不传入其他参数时,可以看到CMD命令执行了,但是容器并没有启动,这里是因为centos镜像启动时必须制定终端,是centos镜像的特殊性,如果是其他没有限制的镜像这里就能正常启动了。
更多参数:
参考docker官方文档链接