Dockerfile 学习笔记

Dockerfile

Dockerfile 的作用是用来构建 docker 镜像(image),使用 Dockerfile 我们可以构建出更符合自己需要的镜像,而编写好的 Dockerfile 我们可以多次使用。

Dockerfile 中的保留字

Dockerfile 中的保留字在使用时全部需要大写,保留字不能再作为属性的值使用。

  • FROM:指定当前镜像是基于哪个镜像来构建的
  • RUN:构建镜像是需要运行的指令
  • EXPOSE:当前容器对外暴露的端口
  • WORKDIR:指定容器创建后,终端默认的进入的路径(PATH)
  • EVN:用来定义在构建过程中设置环境变量,使用$引用
  • ADD:把宿主机目录下的文件和目录拷贝到容器,如果是 tar 文件则会镜像自动解压,如果 ADD 的第一个参数是 URL,则会下载文件然后拷贝到容器
  • COPY:把宿主机目录下的文件拷贝到容器,不对被拷贝进行操作,功能通 cp 命令
  • VOLUME:设置容器容器数据卷,用于容器中数据持久化存储
  • CMD:指定一个容器启动时运行的命令,使用 docker run 命令最后加的命令会覆盖 CMD 指定的命令
  • ENTRYPOINT:指定一个容器启动时要运行哪个命令,功能同 CMD 但不能被覆盖。通常与 CMD 配合使用,注意:配合使用时要用数组方式执行命令,即 ENTRYPOINT ["java","-jar"]

Dockerfile 示例

构建 springboot 镜像,启动时运行 springboot 项目

FROM:openjdk:8-jre
# 指定进入容器默认进入路径
WORKDIR /app
# 拷贝jar包并重命名
ADD demo-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar"]
CMD ["app.jar]

构建后端 api 使用的镜像

FROM centos:7
# 指定工作目录(进入容器的默认目录)
WORKDIR /project
# 在 centos7 中安装相关依赖
RUN yum -y update \
    && yum -y install vim \
    && yum -y install git \
    && yum -y install java-1.8.0-openjdk-devel.x86_64 \
    && yum install -y maven \
    && mkdir ~/.m2
# 配置 maven
RUN echo '<?xml version="1.0" encoding="UTF-8"?><settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"><mirrors><mirror><id>alimaven</id><mirrorOf>central</mirrorOf><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/repositories/central/</url></mirror></mirrors></settings>' > ~/.m2/settings.xml

构建 nvm(node version manage)镜像

# 依赖centos环境
FROM centos:latest
# 指定工作目录(进入容器的默认目录)
WORKDIR /project
#安装vim和git环境
RUN yum -y update \
    	&& yum -y install vim \
	&& yum -y install git \
	&& git --version \
	&& cd ~/ \
	&& git clone https://hub.fastgit.org/nvm-sh/nvm.git .nvm \
	&& echo "source ~/.nvm/nvm.sh" >> ~/.bashrc && source ~/.bashrc

实践总结:

  • 通常在 Dockerfile 中尽量少使用 RUN 命令,因为每个 RUN 命令会对容器包装一层
  • 通常在基于某个镜像构建我们自己的镜像时,可以先用该镜像创建一个容器,在里面把软件的安装过一遍,数据卷映射规划一遍,最后再编写 Dockerfile,这样思路会更清晰一点

使用 Dockerfile 构建镜像

通常我们将要构建镜像要用的 Dockerfile、配置文件、数据等放在一个文件夹里,然后在这个文件夹中运行 docker build 命令。

# 使用默认 Dockerfile, 比如构建 api 容器, -t 设置镜像标签,这里 api 镜像的标签为 api:v1, 最后要加一个路径,(.)表示当前路径
docker buil -t api:v1 .

# 使用 Dockerfile-api 构建 api 镜像,-f 指定 Dockerfile,-t 设置标签
docker build -f  Dockerfile-api -t api:v1 .

Dockerfile 构建镜像的流程

image.png

使用镜像

# 运行容器,-i 交互运行 -t tty终端 --name 设置容器启动的名字,api:v1指定使用的镜像,"/bin/bash" 为非必须参数
docker run -itd --name my-api api:v1 /bin/bash