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 项目
1FROM:openjdk:8-jre
2# 指定进入容器默认进入路径
3WORKDIR /app
4# 拷贝jar包并重命名
5ADD demo-0.0.1-SNAPSHOT.jar app.jar
6ENTRYPOINT ["java","-jar"]
7CMD ["app.jar]
构建后端 api 使用的镜像
1FROM centos:7
2# 指定工作目录(进入容器的默认目录)
3WORKDIR /project
4# 在 centos7 中安装相关依赖
5RUN yum -y update \
6 && yum -y install vim \
7 && yum -y install git \
8 && yum -y install java-1.8.0-openjdk-devel.x86_64 \
9 && yum install -y maven \
10 && mkdir ~/.m2
11# 配置 maven
12RUN 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)镜像
1# 依赖centos环境
2FROM centos:latest
3# 指定工作目录(进入容器的默认目录)
4WORKDIR /project
5#安装vim和git环境
6RUN yum -y update \
7 && yum -y install vim \
8 && yum -y install git \
9 && git --version \
10 && cd ~/ \
11 && git clone https://hub.fastgit.org/nvm-sh/nvm.git .nvm \
12 && echo "source ~/.nvm/nvm.sh" >> ~/.bashrc && source ~/.bashrc
实践总结:
- 通常在 Dockerfile 中尽量少使用 RUN 命令,因为每个 RUN 命令会对容器包装一层
- 通常在基于某个镜像构建我们自己的镜像时,可以先用该镜像创建一个容器,在里面把软件的安装过一遍,数据卷映射规划一遍,最后再编写 Dockerfile,这样思路会更清晰一点
使用 Dockerfile 构建镜像
通常我们将要构建镜像要用的 Dockerfile、配置文件、数据等放在一个文件夹里,然后在这个文件夹中运行 docker build
命令。
1# 使用默认 Dockerfile, 比如构建 api 容器, -t 设置镜像标签,这里 api 镜像的标签为 api:v1, 最后要加一个路径,(.)表示当前路径
2docker buil -t api:v1 .
3
4# 使用 Dockerfile-api 构建 api 镜像,-f 指定 Dockerfile,-t 设置标签
5docker build -f Dockerfile-api -t api:v1 .
Dockerfile 构建镜像的流程
使用镜像
1# 运行容器,-i 交互运行 -t tty终端 --name 设置容器启动的名字,api:v1指定使用的镜像,"/bin/bash" 为非必须参数
2docker run -itd --name my-api api:v1 /bin/bash