1. 在/usr/local/docker 目录下创建目录 xxx 例如 yb
2. 拉取基础镜像 :例如 需要定制jetty镜像 则先拉取jetty (比tomcat更轻量的servlet容器)
3. 在 yb 目录下 vi Dockerfile
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。每一条Dockerfile指令就是创建一个分层(镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层)
编写指令 例如:
FROM jetty
WORKDIR /var/lib/jetty/webapps
RUN mkdir ROOT
WORKDIR /var/lib/jetty/webapps/ROOT
COPY myshop.zip /var/lib/jetty/webapps/ROOT
RUN unzip myshop.zip
WORKDIR /var/lib/jetty
FROM jetty ----定制的镜像来源于 jetty 镜像 相当于继承
WORKDIR /var/lib/jetty/webapps ----进入到 /var/lib/jetty/webapps 工作目录(不能用 cd 不然下面的 RUN 不是在上面的目录运行。因为每一条指令就是创建一个分层 而cd 不会创建分层 下面的分层没有) 注意:jetty的工作目录是/var/lib/jetty/ 具体看docker仓库搜索jetty介绍
RUN mkdir ROOT ----在上一个分层的基础上创建目录ROOT (但还是在/var/lib/jetty/webapps目录)
WORKDIR /var/lib/jetty/webapps/ROOT----进入 /var/lib/jetty/webapps 目录
COPY myshop.zip /var/lib/jetty/webapps/ROOT-----将上下文目录下的myshop.zip 拷贝到/var/lib/jetty/webapps/ROOT 目录下(可以用.代表当前目录)
WORKDIR /var/lib/jetty ------重新回到 /var/lib/jetty 目录 因为jetty 在这个目录才会运行成功(跟tomcat相似 /usr/local/tomcat)
上述指令 相当于在镜像中 添加了 ROOT 目录 以及 部署了项目----以后由该镜像创建的容器都具有这些 进入到容器的目录也会是/usr/local/jetty目录。
4. 将需要上传到镜像的文件拷贝到 /usr/local/docker/yb 目录下(因为创建镜像的时候 ==docker build 命令将路径下(/yb目录)的所有内容打包,然后上传给 Docker 引擎。这样 Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件,即/yb目录下的就称为上下文==) COPY xx 代表复制上下文路径的 xx
[ADD 命令 先拷贝后自动压缩 (尽量不用 有时候会出错 了解就行)]
5. 创建镜像 : docker build -t 镜像名 . (. 代表上下文, yb目录下的所有文件) 例如 docker build -t gg
当存在构建的镜像时 再一次运行构建 如果Dockerfile中修改较大 且新构建的镜像名与存在的一致 则新构建的镜像名会覆盖存在的 存在的镜像会变为虚拟镜像 <none> ,当改动不大时 会直接覆盖存在的镜像(将存在的镜像当做缓存一般 相同的分层不需要重新构建)
6. 运行镜像中部署的项目 docker run -p 8080:8080 --yueba -d Build_images_Name(当然还得先运行mysql容器) 例如 docker run -p 8080:8080 --yueba -d gg
Dockfile编辑的时候每次出现Dockfile关键字就是创建了一层(分层存储) 下一层具有上一层的东西,在Dockerfile用cd 进入目录 再RUN 目录指令 不会生效 RUN这一层的工作目录不具有cd的目录
CMD指令与 ENTRYPOINT 指令的区别:
差异1:CMD指令指定的容器启动时命令可以被docker run指定的命令覆盖,而ENTRYPOINT指令指定的命令不能被覆盖,而是将docker run指定的参数当做ENTRYPOINT指定命令的参数
差异2:CMD指令可以为ENTRYPOINT指令设置默认参数,而且可以被docker run指定的参数覆盖