Dockerfile基础

发布时间 2023-11-21 15:49:24作者: 奥托

一个基本的dockerfile:

FROM node:latest

WORKDIR /app

COPY . .

RUN npm config set registry https://registry.npmmirror.com/

RUN npm install -g http-server

EXPOSE 8080

CMD ["http-server", "-p", "8080"]

这些指令的含义如下:

  • FROM: 基于一个基础镜像来修改
  • WORKDIR: 指定当前的工作目录
  • COPY: 把容器外的内容复制到容器内
  • EXPOSE: 声明当前容i要访问的网络端口,比如这里启动服务会用到8080端口
  • RUN: 在容器内执行命令
  • CMD: 容器启动的时候执行的命令

我们先通过 FROM 继承了 node 基础镜像,里面就有 npm、node 这些命令了。
通过 WORKDIR 指定当前目录。
然后通过 COPY 把 Dockerfile 同级目录下的内容复制到容器内,这里的 . 也就是 /app 目录
之后通过 RUN 执行 npm install,全局安装 http-server
通过 EXPOSE 指定要暴露的端口
CMD 指定容器跑起来之后执行的命令,这里就是执行 http-server 把服务跑起来

生成镜像命令:
docker build -t imageName:myTag .
-t之后是镜像名:标签

这时候当前目录下的文件就都被拷贝到docker容器中的/app目录下,如果之后需要修改index.html的内容,进入容器修改就很不方便,倒不如直接把容器的/app目录设置为挂载点,给之前的dockerFile加一条命令:

FROM node:latest

WORKDIR /app

COPY . .

RUN npm config set registry https://registry.npmmirror.com/

RUN npm install -g http-server

EXPOSE 8080

VOLUME /app

CMD ["http-server","-p","8080"]

加上VOLUME /app,然后重新build一下

如果不是默认的dockerFile,需要用-f指定dockerFile的文件名:
docker build -t aaa:ddd -f 2.Dockerfile .
启动容器,本机上的某个文件夹就映射到容器内的app目录中了。

但是有一个情况,就算不在dockerfile中指定VOLUME,还是可以通过docker run时通过 -v 挂载数据卷,那么为什么还要指定
在 dockerfile 里指定 VOLUME 之后,如果你 docker run 的时候没有带 -v,那会放在一个临时的目录里。
这样就算你删了容器,数据也可以在这里找回。
设想下,如果你跑了个 mysql 容器,存了很多数据,但是跑容器的时候没指定数据卷。有一天,你把容器删了,所有数据都没了,可不可怕?
为了避免这种情况,mysql 的 dockerfile 里是必须声明 volume 的,这样就算你没通过 -v 指定数据卷,将来也可以找回数据。
在镜像详情可以看到 mysql 的 dockerfile,确实声明了 volume

"Dockerfile" 中的 "VOLUME" 指令用于在镜像中创建一个或多个挂载点,
以便在容器运行时可以将它们挂载到宿主机的文件系统或其他容器中。
这个指令可以让用户在容器中存储数据,
并且这些数据可以在容器删除后仍然存在。

与此不同,"shell" 中的 "-v" 选项是在运行容器时指定要挂载的卷。
这个选项让用户将宿主机或其他容器中的目录挂载到容器中,以便在容器运行时共享数据。
与 "Dockerfile" 中的 "VOLUME" 指令不同,"-v" 选项是在容器运行时指定,而不是在构建镜像时指定。

虽然两者都可以用于在 Docker 容器中创建挂载点,
但是 "Dockerfile" 中的 "VOLUME" 指令更适合用于定义持久化数据存储。
而 "-v" 选项更适合用于将数据从宿主机或其他容器中挂载到容器中。

.dockerignore文件

例如:

*.md
!README.md
node_modules/
[a-c].txt
.git/
.DS_Store
.vscode/
.dockerignore
.eslintignore
.eslintrc
.prettierrc
.prettierignore

注释使用#
*.md 就是忽略所有 md 结尾的文件,然后 !README.md 就是其中不包括 README.md
node_modules/ 就是忽略 node_modules 下 的所有文件
[a-c].txt 是忽略 a.txt、b.txt、c.txt 这三个文件
.DS_Store 是 mac 的用于指定目录的图标、背景、字体大小的配置文件,这个一般都要忽略
eslint、prettier 的配置文件在构建镜像的时候也用不到