1.DockerFile介绍

dockerfile 是用来构建docker镜像的文件!命令参数脚本!

构建步骤:

  1. 编写一个dockerfile文件
  2. docker build构建成为一个镜像
  3. docker run 运行镜像
  4. docker push发布镜像(DockerHub、阿里云镜像仓库)

2.DockerFile构建过程

2.1 DockerFile基础

  1. 每个保留关键字(指令)都必须是大写字母
  2. 执行从上到下顺序执行
  3. #表示注释
  4. 每一个指令都会创建一个新的镜像层,并提交!
  5. dockerfile作者 dockerfile的编写_dockerfile作者

dockerfile 是面向开发的,我们以后要发布姓项目,做镜像,就需要编写dockerfile文件!

2.2 步骤

  1. DockerFile: 构建文件,定义了一切的步骤,源代码
  2. DockerImages: 通过DockerFile 构建生成的镜像,最终发布和运行的产品!
  3. Docker容器:容器就是镜像运行起来提供服务器

3.DockerFile的指令

FROM 基础镜像, 一切从这里开始构建

MAINTAINER 镜像是谁写的,姓名+邮箱

RUN 镜像构建的时侯需要运行的命令

ADD 步骤:比如mysql的镜像,这个mysql压缩包!添加内容

WORKDIR 镜像的工作目录

VOLUME 挂载的目录

EXPOSE 保留端口配罝

CMD 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代

ENTRYPOINT 指定这个容器启动的时候要运行的命令,可以追加命令

ONBUILD 当构建一个被跳承 DockerFile 这个时候就会运行 ONBUILD 的指令。触发指令。

COPY 类似ADD,将我们文件拷贝到镜像中

ENV 构建的时候设買环境变量!

  • 例如构建一个自己的centos
FROM centos:7
MAINTAINER tongweiwei<2290581805@qq.com>

ENV MYPATH /user/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "-----end-----"
CMD /bin/bash

4. 构建命令

docker build -f dockerfile文件路径 -t 镜像名称:[tag] .


docker build -f mydockerfile-centos -t mycentos:0.1 .


dockerfile作者 dockerfile的编写_运维_02

5.查看镜像的构建历史

docker history 容器id

dockerfile作者 dockerfile的编写_linux_03

6. CMD 和 ENTRYPOINT 区别

4.1 CMD的一个测试,

  1. 首先构建一个简单的 CMD 的Dockerfile的镜像
FROM centos:7
CMD ["ls", "-a"]
  1. 构建镜像
# 容器名称就叫做cmdtest
docker build -f dockerfile-cmd-test -t cmdtest .
  1. 运行镜像,就会发现,会执行我们的 CMD指令中的内容,即把当前的目录展示出来
docker run 容器id

dockerfile作者 dockerfile的编写_Dockerfile_04

  1. 但是我们想要在 run 的时候,后面加命令就会报错,例如我run的时候加一个
    -l,就会报错, 结合CMD中的命令,则会执行该命令,-l
docker run 容器id -l

报错

docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown.

CMD的指令下,-l 替换了 CMD [“ls”, “-a”]命令,-l不是命令所以会报错!

4.2 ENTRYPOINT 的一个测试

  1. 首先构建一个简单的 ENTRYPOINT 的Dockerfile的镜像
FROM centos:7
ENTRYPOINT ["ls", "-a"]
  1. 构建镜像
# 容器名称就叫做 entrypoint-test
docker build -f dockerfile-cmd-entrypoint -t entrypoint-test .

dockerfile作者 dockerfile的编写_Dockerfile_05


dockerfile作者 dockerfile的编写_运维_06

  1. 运行镜像,就会发现,会执行我们的 ENTRYPOINT 指令中的内容,即把当前的目录展示出来,到这块是和CMD是没有区别的
docker run 容器id

dockerfile作者 dockerfile的编写_docker_07

  1. 但是我们想要在 run 的时候,后面加命令,例如和上面一样 也加一个 -l
docker run 容器id -l

dockerfile作者 dockerfile的编写_docker_08

如上图所示,ENTRYPOINT 时候不是把 run后面加的命令替换掉dockerfile里面的,而是,
将run 后面加的命令,拼接到后面,相当于 ls -al