Dockerfile 定义容器内环境中发生的事情。对网络接口和磁盘驱动器等资源的访问在该环境中进行了虚拟化,该环境与系统的其他部分隔离,因此您需要将端口映射到外部世界,并具体说明要将哪些文件“复制”到该环境中。但是,这样做之后,您可以期望在这个dockerfile中定义的应用程序的构建在运行的任何地方的行为都完全相同。

镜像构建步骤

  1. 编写 Dockerfile 文件
  2. docker build
  3. docker run

DockerFile体系结构

  • FROM:基础镜像,当前新镜像是基于哪个镜像的
  • MAINTAINER:镜像维护者的姓名和邮箱地址基础镜像,当前新镜像是基于哪个镜像的
  • RUN:容器构建时需要运行的命令
  • EXPOSE:当前容器对外暴露出的端口
  • WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
  • ENV:用来在构建镜像过程中设置环境变量
  • ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
  • COPY:类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
  • VOLUME:容器数据卷,用于数据保存和持久化工作
  • CMD:指定一个容器启动时要运行的命令

Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换

  • ENTRYPOINT:指定一个容器启动时要运行的命令,ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数
  • ONBUILD: 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

RUN、CMD、ENTRYPOINT的区别


Dockerfile 官方例子:

# Use an official Python runtime as a parent image
FROM python:2.7-slim

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
COPY . /app

# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["python", "app.py"]

构建命令

docker build [OPTIONS] PATH | URL | -

docker build -t myImage:1.0 .

注意最后面有一个. ,代表当前文件夹

  • -f可以指定Dockerfile的文件位置
docker build -f /path/to/a/Dockerfile  -t myImage:1.0 .

项目Dockerfile例子

FROM java:8
ADD demo.jar demo.jar

# 设置Docker时间为上海时区
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/shanghai" >> /etc/timezone

EXPOSE 9001
ENTRYPOINT ["java","-jar","demo.jar"]