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