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 指令设置网络模式