什么是 Dockerfile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
Dockerfile的作用
安装dockerfile中的指令定义docker容器或者容器中的应用程序以及服务
Dockerfile制作一个镜像模板安装模板统一生成容器
环境介绍
- 1.Dockerfile中所用的所有文件一定要和Dockerfile文件在同一级父目录下,可以为Dockerfile父目录的子目录
- 2.Dockerfile中相对路径默认都是Dockerfile所在的目录
- 3.Dockerfile中一定要惜字如金,能写到一行的指令,一定要写到一行,原因是分层构建,联合挂载这个特性。
- 4.Dockerfile中每一条指令被视为一层
- 5.Dockerfile中指明大写(约定俗成)
Docker build 命令
语法
docker build [OPTIONS] PATH | URL | -
OPTIONS说明:
- --build-arg=[] :设置镜像创建时的变量;
- --cpu-shares :设置 cpu 使用权重;
- --cpu-period :限制 CPU CFS周期;
- --cpu-quota :限制 CPU CFS配额;
- --cpuset-cpus :指定使用的CPU id;
- --cpuset-mems :指定使用的内存 id;
- --disable-content-trust :忽略校验,默认开启;
- -f :指定要使用的Dockerfile路径;
- --force-rm :设置镜像过程中删除中间容器;
- --isolation :使用容器隔离技术;
- --label=[] :设置镜像使用的元数据;
- -m :设置内存最大值;
- --memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
- --no-cache :创建镜像的过程不使用缓存;
- --pull :尝试去更新镜像的新版本;
- --quiet, -q :安静模式,成功后只输出镜像 ID;
- --rm :设置镜像成功后删除中间容器;
- --shm-size :设置/dev/shm的大小,默认值是64M;
- --ulimit :Ulimit配置。
- --squash :将 Dockerfile 中所有的操作压缩为一层。
- --tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
- --network: 默认 default。在构建期间设置RUN指令的网络模式
dockerfile常用命令
- FROM:基础镜像,FROM命令必须是dockfile的首个命令
- LABEL:为镜像生成元数据标签信息。
- USER:指定运行容器时的用户名或UID,后续RUN也会使用指定用户
- RUN:RUN命令是Dockfile执行命令的核心部分。它接受命令作为参数并用于创建镜像。每条RUN命令在当前镜像基础上执行,并且会提交一个新镜像层。
- WORKDIR:设置CMD指明的命令的运行目录。为后续的RUN、CMD、ENTRYPOINT、ADD指令配置工作目录。
- ENV:容器启动的环境变量
- ARG:构建环境的环境变量
- COPY:复制文件到镜像中,格式: COPY 源路径 目标路径
- ADD: 拷复制文件到镜像中,格式: ADD 源路径 目标路径
- CMD:容器运行时执行的默认命令
- ENTRYPOINT:指定容器的“入口”
- HEALTHCHECK:容器健康状态检查
关于 ADD ,有如下注意事项:
- 1、如果源路径是个文件,且目标路径是以 / 结尾, 则docker会把目标路径当作一个目录,会把源文件拷贝到该目录下。如果目标路径不存在,则会自动创建目标路径。
- 2、如果源路径是个文件,且目标路径是不是以 / 结尾,则docker会把目标路径当作一个文件。
如果目标路径不存在,会以目标路径为名创建一个文件,内容同源文件;
如果目标文件是个存在的文件,会用源文件覆盖它,当然只是内容覆盖,文件名还是目标文件名。
如果目标文件实际是个存在的目录,则会源文件拷贝到该目录下。 注意,这种情况下,最好显示的以 / 结尾,以避免混淆。 - 3、如果源路径是个目录,且目标路径不存在,则docker会自动以目标路径创建一个目录,把源路径目录下的文件拷贝进来。
如果目标路径是个已经存在的目录,则docker会把源路径目录下的文件拷贝到该目录下。 - 4、如果源文件是个归档文件(压缩文件),则docker会自动帮解压。
- COPY指令和ADD指令功能和使用方式类似。只是COPY指令不会做自动解压工作。
演示
使用Dockerfile构建nginx容器,添加容器健康检查
# 基于nginx:1.17.9 镜像构建
FROM nginx:1.17.9
# 指定信息 maintainer 贡献者
LABEL maintainer="chenshifeng@163.com"
#设置环境变量
ENV NGINX_VERSION 1.17.9
ARG work_pwd=/data/html
#切换 root 用户
USER root
#执行命令,安装curl 软件,设置软连接把 nginx 服务的日志显示到终端输出
RUN apt-get -yq update && apt-get install -y curl &&
ln -sf /dev/stdout /var/log/nginx/access.log &&
ln -sf /dev/stderr /var/log/nginx/error.log
#挂载卷
VOLUME ["/data"]
#设置工作目录
WORKDIR ${work_pwd}
# 复制 index.html 文件到 WORKDIR 目录下
COPY index.html .
# 映射 80 端口
EXPOSE 80
# 此处 CMD 作为 ENTRYPOINT 的参数
CMD ["nginx","-g","daemon off;"]
STOPSIGNAL SIGRTMAX
# 检查容器健康,通过访问NGINX 服务80端口,来判断容器是否运行正常
HEALTHCHECK --interval=5s --timeout=3s
CMD curl -fs http://localhost/ || exit 1
构建
docker build -t n:1 .
chenshifengdeMacBook-Pro:nginx chenshifeng$ docker build -t n:1 .
[+] Building 2265.0s (5/8)
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 276B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/nginx:1.17.9 2.3s
=> [internal] load build context 0.0s
=> => transferring context: 280B 0.0s
=> [1/4] FROM docker.io/library/nginx:1.17.9@sha256:88ea86df324b03b3205cbf4ca0d999143656d0a3394675630e55e49044d38b50 12.9s
=> => resolve docker.io/library/nginx:1.17.9@sha256:88ea86df324b03b3205cbf4ca0d999143656d0a3394675630e55e49044d38b50 0.0s
=> => sha256:123275d6e508d282237a22fefa5aef822b719a06496444ea89efa65da523fc4b 27.10MB / 27.10MB 9.7s
=> => sha256:9a5d769f04f8b7810455a5c19f35a91042cbe6a53d5155b8840c67e90a352e0f 23.92MB / 23.92MB 8.2s
=> => sha256:faad4f49180d2ade69590557af5af7695b3659bbf50f59fdfe984aab06269d49 204B / 204B 0.3s
[+] Building 2265.1s (5/8) => [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 276B 0.0s. => [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s. => [internal] load metadata for docker.io/library/nginx:1.17.9 2.3s
=> [internal] load build context 0.0s. => => transferring context: 280B 0.0s
=> [1/4] FROM docker.io/library/nginx:1.17.9@sha256:88ea86df324b03b3205cbf4ca0d999143656d0a3394675630e55e49044d38b50 1[+] Building 2265.3s (5/8) => [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 276B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/nginx:1.17.9 2.3s => [internal] load build context [+] Building 2265.4s (5/8) => [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 276B 0.0s2 => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/nginx:1.17.9 [+] Building 2265.6s (5/8)
=> [internal] load build definition from Dockerfile 0.0s0 => => transferring dockerfile: 276B 0.0s0 => [internal] load .dockerignore 0.0s => => transferring context: 2B [+] [+] Building 2267.6s (5/8) [+] Building[+] Building[+] Building 2268.9s (5/8) => [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 276B 0.0s> => [internal] load .dockerignore 0[+] Building 2269.1s (5/8) => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 276B 0.0s => [internal] load .dockerignore [+] Building 2269.2s (5/8) => [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 276B 0.0s[[[+] Building 2364.5s (9/9) FINISHED => [internal] load build definition from Dockerfile 0.0s> => => transferring dockerfile: 276B 0.0s => [internal] load .dockerignore 0.0s= => => transferring context: 2B 0.0si => [internal] load metadata for docker.io/library/nginx:1.17.9 2.3sn => [internal] load build context 0.0st => => transferring context: 280B 0.0s
=> [1/4] FROM docker.io/library/nginx:1.17.9@sha256:88ea86df324b03b3205cbf4ca0d999143656d0a3394675630e55e49044d38b50 12.9s => => resolve docker.io/library/nginx:1.17.9@sha256:88ea86df324b03b3205cbf4ca0d999143656d0a3394675630e55e49044d38b50 0.0s= => => sha256:123275d6e508d282237a22fefa5aef822b719a06496444ea89efa65da523fc4b 27.10MB / 27.10MB 9.7s> => => sha256:9a5d769f04f8b7810455a5c19f35a91042cbe6a53d5155b8840c67e90a352e0f 23.92MB / 23.92MB 8.2s => => sha256:faad4f49180d2ade69590557af5af7695b3659bbf50f59fdfe984aab06269d49 204B / 204B 0.3s= => => sha256:88ea86df324b03b3205cbf4ca0d999143656d0a3394675630e55e49044d38b50 1.41kB / 1.41kB 0.0s> => => sha256:30d9dde0c4cb5ab4989a92bc2c235b995dfa88ff86c09232f309b6ad27f1c7cd 948B / 948B 0.0s => => sha256:5a8dfb2ca7312ee39433331b11d92f45bb19d7809f7c0ff19e1d01a2c131e959 6.67kB / 6.67kB 0.0se => => extracting sha256:123275d6e508d282237a22fefa5aef822b719a06496444ea89efa65da523fc4b 1.6s
=> => extracting sha256:9a5d769f04f8b7810455a5c19f35a91042cbe6a53d5155b8840c67e90a352e0f 1.0s => => extracting sha256:faad4f49180d2ade69590557af5af7695b3659bbf50f59fdfe984aab06269d49 0.0s= => [2/4] RUN apt-get -yq update && apt-get install -y curl && ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stder 2349.0s> => [3/4] WORKDIR /data/html 0.0s => [4/4] COPY index.html . 0.0s => exporting to image 0.3s => => exporting layers 0.3s => => writing image sha256:663bf35f3ce6c35b0fbf159382a60ba1f271f89ae59fa32690e12f812801375c 0.0s => => naming to docker.io/library/n:1 0.0s
运行镜像
chenshifengdeMacBook-Pro:nginx chenshifeng$ docker run -d -p 9090:80 n:1
56b9ed9a0a49bac4e525cdcc8589467a28fbeacae47400770e037b8aee55c3ab
chenshifengdeMacBook-Pro:docker-compose chenshifeng$ docker exec -it nifty_chatelet bash
root@56b9ed9a0a49:/data/html# pwd
/data/html # 对应WORKDIR 工作目录
root@56b9ed9a0a49:/data/html# ls
index.html # 对应 COPY index.html
root@56b9ed9a0a49:/data/html# env
HOSTNAME=56b9ed9a0a49
PWD=/data/html
PKG_RELEASE=1~buster
HOME=/root
NJS_VERSION=0.3.9
TERM=xterm
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NGINX_VERSION=1.17.9
_=/usr/bin/env
root@56b9ed9a0a49:/data/html# id
uid=0(root) gid=0(root) groups=0(root) # 对应#切换 root 用户 USER root
root@56b9ed9a0a49:/data/html# df -h
Filesystem Size Used Avail Use% Mounted on
overlay 59G 6.3G 50G 12% /
tmpfs 64M 0 64M 0% /dev
tmpfs 994M 0 994M 0% /sys/fs/cgroup
shm 64M 0 64M 0% /dev/shm
/dev/vda1 59G 6.3G 50G 12% /data # 挂载卷
tmpfs 994M 0 994M 0% /proc/acpi
tmpfs 994M 0 994M 0% /sys/firmware
root@56b9ed9a0a49:/data/html#