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