Dockerfile内容:
FROM node:8.4.0-alpine
RUN set -ex \
&& npm install -g mountebank
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY ./imposter.ejs /usr/src/app
COPY ./mockApi /usr/src/app/mockApi
EXPOSE 8001
CMD mb --configfile imposter.ejs
#CMD语句与RUN不同,RUN是在build镜像的时候运行,而CMD语句是在build结束后运行。
#一个Dockerfile钟可以有多个RUN语句,虽然也可以有多个CMD语句,但是却只有最后一条CMD语句会执行。
RUN set -ex \
的作用
set是shell的一个命令,因为shell的执行的过程中,如果有某个出错了,也会继续往下执行,set -ex
作用就是,当下面的命令执行出错后,就退出执行,不在继续往下执行。Dockerfile 的
ADD
和COPY
的区别:
在build镜像时ADD
:
-
ADD
可以实现从远程的某个指定的url上下载文件,然后添加到容器的系统文件目录中。 -
ADD
可以将本地可识别的压缩文件解压到容器的指定路径上(但是URL下载和解压不能同时进行,任何通过远程URL下载的压缩文件,都只能拷贝到容器中,不会自动解压)
COPY
: - 它是
ADD
的一个简化版本,它只会复制文件到容器中
-
mkdir -p /var/www/app
中的-p :
因为mkdir创建目录时,不是递归的,所以想要从非现有的父目录创建子目录,就必须使用 -p来不存在的父目录下创建子目录
使用多个FROM基础镜像来构建多个镜像,dockerfile 如下:
FROM jetty
MAINTAINER "xxx <xxx@163.com>"
COPY RESTful.war /var/lib/jetty/webapps/
FROM jetty
MAINTAINER "xxx <xxx@163.com>"
COPY serverManager.war /var/lib/jetty/webapps/
build 的时候:加 -t 指定仓库名称、tag名称,只对最后一个镜像有效。
如果不加-t,所有新生成镜像都没有仓库名、tag名称。
试过以下几种build生成镜像命令:
1、docker build -t test/restful -t test/manager .
//指定多次-t ,只有最后一个镜像有名称,前面都是<none>
2、docker build .
//不指定-t,新生成的镜像都是<none>
关于Dockerfile的操作
写好Dockerfile后,可以使用docker来构建一个镜像:
$ docker build . // . 表示本地Dockerfile的路径
通过构建的这个镜像来创建一个容器:
$ docker images
$ docker run -p 8001:8001 7784202e0e60( 镜像ID || 镜像名字)
如果创建容器总是有错,就需要把错误信息更正了,然后重新构建以此镜像,再创建容器。
但是再创建容器总是出错的时候 ,可以进入到docker中去查看目录等信息:
docker run -it d0b7e6faf4eb sh
构建一个指定名字镜像:
docker build -t mounteserver . //通过Dockerfile构建了名字为mountersever的镜像
将自己写好的Dockerfile放到远程docker hub上。
step1: 需要在本地登陆Docker:
$ docker login
然后输入username(是用户名,不是Docker ID(邮箱)) 和password
将本地的某个镜像push到远程的Docker hub的镜像库中
//表示通过当前目录的Dockerfile构建一个镜像 名字叫qmm888/qmm
// 注意! 构建镜像名格式必须为:`docker hub的用户名/自定义镜像名`, 否则就会出现push到docker hub时,提示没有权限.
$ docker build -t qmm888/qmm .
$ docker push qmm888/qmm //然后把这个镜像push到远程的qmm888用户的qmm仓库下
⚠️: 需要镜像的名字和远程库的目录一致,才能push成功
给镜像打标签
$ docker tag qmm888/qmm qmm888/qmm:0.0.1
$ docker push qmm888/qmm:0.0.1
可以看到第一次提交的镜像没有指定标签,docker就会默认给它一个lastest的标签;
第二次指定标签为0.0.1(可以认是一个版本),在Tag Name中显示了