DockerFile的使用

DockerFile的构建步骤大致如下:

编写一个dockerfile文件 docker build 构建一个镜像 docker run 运行镜像 docker push 发布镜像(DockerHub、阿里云从仓库等)

DockerFile常用指令:

FROM [镜像:版本]:指定所依赖的基础镜像

RUN <命令行命令>:等同于在终端执行的shell命令

RUN ["可执行文件", "参数1", "参数2"]:等同于在终端shell中执行 ./可执行文件

COPY <源文件> <目标文件> :将Dockerfile同目录下的文件拷贝到容器里面

ADD <源文件> <目标文件>:类似于COPY,区别在于如果文件是*.tar、.gzip、.bzip2等文件,会自动解压缩(注意:支持解压tar、gzip和bzip2文件,但不会自动解压zip文件)。

  • 复制某个目录及子目录下的文件:ADD 和 COPY 都无法实现

CMD <命令行命令>:类似于RUN,区别在于:

  • RUN 是在 docker build 时运行
  • CMD 是在 docker run 时运行
  • 存在多个 CMD 指令,仅最后一个生效
  • CMD 会被 docker run 的命令行参数指定的--entrypoint 选项所覆盖

ENTRYPOINT ["<可执行命令>", "<参数1>", "<参数22>"]:类似于CMD,存在多个 ENTRYPOINT 指令,仅最后一个生效,区别在于:

  • ENTRYPOINT 不会被 docker run 的命令行参数指定的指令所覆盖

  • ENTRYPOINT 可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参 比如:

FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参 

ENV:设置环境变量

ARG:类似于ENV,区别在于 ARG 只在 docker build 过程中有效,build 好之后,镜像内不存在设定的环境变量。

VOLUME:定义挂载数据卷,一般为/tmp,作用是避免容器内数据因为重启而丢失。

EXPOSE:声明暴露端口,docker run -P 时会自动映射EXPOSE指定的端口,-p 会覆盖声明的端口。

WORKDIR:指定工作目录,指定的工作目录,会在构建的镜像的每一层都在。(WORKDIR 指定的工作目录,必须是提前创建好的)。docker build 过程中,每一个RUN命令都是新建的一层,只有通过 WORKDIR 创建的目录会一直存在。

LABEL:给镜像添加标签,以键值对的形式存在,比如添加镜像的作者:

LABEL org.opencontainers.image.authors="acgkaka"

注意:Dockerfile 的每一行指令都会在docker上新建一层,为了避免镜像过大,尽量将命令写在同一行,例如:

FROM centos
RUN yum -y install wget \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"

来一个本网站启动的例子:
FROM openjdk:8-jdk-alpine

ENV JAVA_OPTS=""\
        SLEEP=0

VOLUME /tmp

EXPOSE 80 #这样写在run的时候-P可默认直接进行端口映射,但是宿主机端口好像是随机的,服了

EXPOSE 443

CMD echo "The applcaiton will start in ${SLEEP}s..." &&\
sleep ${SLEEP} &&\
java ${JAVA_OPTS} -jar /app.jar

ADD *.jar /app.jar

docker build 常用参数

-f,--file 指定 dockerfile 路径,不指定的话,默认会读取上下文路径( . )下的 dockerfile -t,--tag 指定构建的镜像名和 tag --add-host 可以使用一个或多个 --add-host 标志将其他主机添加到容器的 /etc/hosts 文件中

docker build --add-host=docker:10.180.0.1 .

--no-cache 构建镜像时不使用缓存 --network 在构建过程中为 RUN 指令设置网络模式