|
|
# Docker镜像学习
|
|
|
|
|
|
> [官网文档](https://docs.docker.com/engine/reference/commandline/build/) [BuildFile](https://docs.docker.com/engine/reference/builder/)
|
|
|
|
|
|
## 镜像构建流程
|
|
|
|
|
|
![构建镜像](assets/images/DockerBuild.png)
|
|
|
|
|
|
## 构建镜像的三种方法
|
|
|
|
|
|
+ 基于现有容器,使用 `docker commit` 命令构建
|
|
|
|
|
|
```shell
|
|
|
# 1 创建容器,执行相关操作,之后退出
|
|
|
docker run -it ubuntu:18.04 /bin/bash
|
|
|
docker exec -it xxxxxxxx
|
|
|
|
|
|
# 2 基于该容器使用构建新的镜像
|
|
|
docker commit -m "new_image" -a "cnLinuxer" b66 myubuntu:v1
|
|
|
|
|
|
参数解释:
|
|
|
-m选项指定了新镜像的提交信息
|
|
|
-a标注作者信息
|
|
|
b66是容器ID
|
|
|
myubuntu:v1是指定的新镜像名称。
|
|
|
|
|
|
# 3 使用新镜像
|
|
|
docker images
|
|
|
docker run -it ubuntu:18.04 /bin/bash
|
|
|
```
|
|
|
|
|
|
+ 基于本地模板,使用 `docker import` 导入
|
|
|
|
|
|
```shell
|
|
|
# 1 将现有容器,导出为模板文件
|
|
|
docker export b66 > /root/myubuntu.tar
|
|
|
|
|
|
# 2 模板文件导入为镜像
|
|
|
docker import /root/myubuntu.tar ruyu/ubuntu:18.04
|
|
|
|
|
|
# 3 使用新镜像
|
|
|
docker images
|
|
|
docker run xxxx
|
|
|
```
|
|
|
|
|
|
+ 基于Dockerfile文件,使用 `docker build` 构建
|
|
|
|
|
|
```tex
|
|
|
# 1 编写Dockerfile文件
|
|
|
|
|
|
文件内容示例
|
|
|
|
|
|
#指定父镜像
|
|
|
FROM centos:7.5.1804
|
|
|
|
|
|
#指定维护者信息
|
|
|
MAINTAINER mynginx
|
|
|
|
|
|
#将本地nginx软件包上传至容器/usr/local/下
|
|
|
ADD nginx-1.11.1.tar.gz /usr/local
|
|
|
|
|
|
#yum安装依赖软件
|
|
|
RUN yum -y install vim wget gcc gcc-c++ make openssl-devel pcre-devel
|
|
|
|
|
|
#进入nginx工作目录
|
|
|
WORKDIR /usr/local/nginx-1.11.1/
|
|
|
|
|
|
#编译并安装nginx服务
|
|
|
RUN ./configure --prefix=/usr/local/nginx && make && make install
|
|
|
|
|
|
#关闭nginx后台运行
|
|
|
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
|
|
|
|
|
|
#添加nginx的环境变量
|
|
|
ENV PATH /usr/local/nginx/sbin:$PATH
|
|
|
|
|
|
#将容器的80端口映射出来
|
|
|
EXPOSE 80
|
|
|
|
|
|
#执行nginx命令,启动nginx
|
|
|
CMD ["nginx"]
|
|
|
|
|
|
# 2 docker build 构建镜像
|
|
|
docker build -f Dockerfile -t mynginx:v1 .
|
|
|
```
|
|
|
|
|
|
## 构建过程(docker build -f Dockerfile -t name .)
|
|
|
|
|
|
> docker是c/s架构,c为docker cli,s为驻守服务进程。
|
|
|
> docker build 构建镜像时,cli只负责把命令和相文件传递给服务进程,服务程序接收命令和文件、创建构建上下文、执行构建并产出镜像。
|
|
|
|
|
|
![build](assets/images/build2.png)
|
|
|
|
|
|
## docker build 命令
|
|
|
|
|
|
```shell
|
|
|
# docker build 详解
|
|
|
# 语法
|
|
|
docker build [OPTIONS] PATH|URL|本地文本文件
|
|
|
|
|
|
# 参数可以是三种资源:Git存储库、tar压缩包和文本文件
|
|
|
git库示:
|
|
|
示例:docker build https://github.com/docker/rootfs.git#container:docker
|
|
|
|
|
|
Build Syntax Suffix Commit Used Build Context Used
|
|
|
myrepo.git refs/heads/master /
|
|
|
myrepo.git#mytag refs/tags/mytag /
|
|
|
myrepo.git#mybranch refs/heads/mybranch /
|
|
|
myrepo.git#pull/42/head refs/pull/42/head /
|
|
|
myrepo.git#:myfolder refs/heads/master /myfolder
|
|
|
myrepo.git#master:myfolder refs/heads/master /myfolder
|
|
|
myrepo.git#mytag:myfolder refs/tags/mytag /myfolder
|
|
|
myrepo.git#mybranch:myfolder refs/heads/mybranch /myfolder
|
|
|
|
|
|
tar包:
|
|
|
示例:docker build http://server/context.tar.gz
|
|
|
|
|
|
文件文件:
|
|
|
Powershell示例:Get-Content Dockerfile | docker build -
|
|
|
```
|
|
|
|
|
|
Options
|
|
|
|
|
|
| 名称与速记 | 默认 | 描述 |
|
|
|
| ------------------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
|
| `--add-host` | | 添加自定义主机到 IP 的映射 (host:ip) |
|
|
|
| `--build-arg` | | 设置构建时变量 |
|
|
|
| `--cache-from` | | 要考虑用作缓存源的图像 |
|
|
|
| `--cgroup-parent` | | 容器的可选父 cgroup |
|
|
|
| `--compress` | | 使用 gzip 压缩构建上下文 |
|
|
|
| `--cpu-period` | | 限制 CPU CFS(完全公平的调度程序)期限 |
|
|
|
| `--cpu-quota` | | 限制 CPU CFS(完全公平的调度程序)配额 |
|
|
|
| `--cpu-shares`,`-c` | | CPU 份额(相对权重) |
|
|
|
| `--cpuset-cpus` | | 允许执行的 CPU (0-3, 0,1) |
|
|
|
| `--cpuset-mems` | | 允许执行的 MEM (0-3, 0,1) |
|
|
|
| `--disable-content-trust` | `true` | 跳过镜像验证 |
|
|
|
| `--file`,`-f` | | Dockerfile 的名称(默认值为"PATH/Dockerfile") |
|
|
|
| `--force-rm` | | **始终删除中间容器** |
|
|
|
| `--iidfile` | | 将映像 ID 写入文件 |
|
|
|
| `--isolation` | | 容器隔离技术 |
|
|
|
| `--label` | | 设置图像的元数据 |
|
|
|
| `--memory`,`-m` | | 内存限制 |
|
|
|
| `--memory-swap` | | 交换限制等于内存加交换:"-1",用于启用无限制交换 |
|
|
|
| `--network` | | [**原料检修 1.25+**](https://docs.docker.com/engine/api/v1.25/) 在构建期间设置 RUN 指令的网络模式 |
|
|
|
| `--no-cache` | | 构建映像时不要使用缓存 |
|
|
|
| `--output`,`-o` | | [**1.40+ 原料药**](https://docs.docker.com/engine/api/v1.40/) 输出目标(格式:类型=本地,dest=路径) |
|
|
|
| `--platform` | | [**产品信息 1.38+**](https://docs.docker.com/engine/api/v1.38/) 如果服务器支持多平台,则设置平台 |
|
|
|
| `--progress` | `auto` | 设置进度输出类型(自动、普通、tty)。使用普通版显示容器输出 |
|
|
|
| `--pull` | | 始终尝试拉取较新版本的映像 |
|
|
|
| `--quiet`,`-q` | | 成功时禁止显示生成输出并打印图像 ID |
|
|
|
| `--rm` | `true` | **成功生成后删除中间容器** |
|
|
|
| `--secret` | | [**原料检修 1.39+**](https://docs.docker.com/engine/api/v1.39/) 要向构建版本公开的秘密文件(仅当启用 BuildKit 时):id=mysecret,src=/local/secret |
|
|
|
| `--security-opt` | | 安全选项 |
|
|
|
| `--shm-size` | | /dev/shm 的大小 |
|
|
|
| `--squash` | | [**实验性(守护进程)**](https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file)[**原料检修 1.25+**](https://docs.docker.com/engine/api/v1.25/) 将新构建的图层压缩为单个新图层 |
|
|
|
| `--ssh` | | [**原料检修 1.39+**](https://docs.docker.com/engine/api/v1.39/) 要向构建版本公开的 SSH 代理套接字或密钥(仅当启用了 BuildKit 时)(格式:default\|<id>[=<socket>\|<key>[,<key>]]) |
|
|
|
| `--stream` | | 流附加到服务器以协商生成上下文 |
|
|
|
| `--tag`,`-t` | | 名称和标签(可选)采用"名称:标签"格式 |
|
|
|
| `--target` | | 设置要生成的目标生成阶段。 |
|
|
|
| `--ulimit` | | 乌利米特选项 |
|
|
|
|
|
|
> **特别注意**:
|
|
|
>
|
|
|
> 不要将 根目录 用作生成上下文的 , 因为这会导致生成将硬盘驱动器的全部内容传输到 Docker 守护程序。
|
|
|
>
|
|
|
> 推荐作法:在空目录中放Dockerfile文件,把需要的文件全部复制到Dockerfile目录或子目录中。
|
|
|
|
|
|
## 构建环境
|
|
|
|
|
|
1. Dockerfile中所用的所有文件一定要和Dockerfile文件在同一级父目录下,可以为Dockerfile父目录的子目录
|
|
|
2. Dockerfile中相对路径默认都是Dockerfile所在的目录
|
|
|
3. 因Docker构建的分层构建,联合挂载的特性,Dockerfile中,每一条指令被视为一层,尽量一行写多个指令(&&连接 \用来分行)。
|
|
|
4. 约定:指令大写,内容小写
|
|
|
|
|
|
```shell
|
|
|
# 构建流程
|
|
|
# docke build . 默认构建
|
|
|
|
|
|
# 输出,#行为手动添加的说明
|
|
|
# 加载 Dockerfile 文件
|
|
|
=> [internal] load build definition from Dockerfile 0.0s
|
|
|
# 把 dockerfile 文件传输到Docker守护进程服务,大小为 149B
|
|
|
=> => transferring dockerfile: 149B 0.0s
|
|
|
# 加载.dockerignore(Dockerfile目录下,不上传文件配置文件) 文件
|
|
|
=> [internal] load .dockerignore 0.0s
|
|
|
# 传输构建上下文(会传Docfile目录及子目录中除.dockerignore配置外的所有文件及文件夹)
|
|
|
=> => transferring context: 2B 0.0s
|
|
|
# 从基础镜像加载元数据
|
|
|
=> [internal] load metadata for docker.io/library/centos:latest 3.0s
|
|
|
# 加载构建上下文
|
|
|
=> [internal] load build context 0.0s
|
|
|
# 传输构建上下文
|
|
|
=> => transferring context: 125B 0.0s
|
|
|
# 构建第一阶段:下载与验证基础镜像
|
|
|
=> [1/2] FROM docker.io/library/centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177 10.8s
|
|
|
=> => resolve docker.io/library/centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177 0.0s
|
|
|
=> => sha256:a1d0c75327776413fa0db9ed3adcdbadedc95a662eb1d360dad82bb913f8a1d1 83.52MB / 83.52MB 7.0s
|
|
|
=> => sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177 762B / 762B 0.0s
|
|
|
=> => sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc 529B / 529B 0.0s
|
|
|
=> => sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6 2.14kB / 2.14kB 0.0s
|
|
|
=> => extracting sha256:a1d0c75327776413fa0db9ed3adcdbadedc95a662eb1d360dad82bb913f8a1d1
|
|
|
|
|
|
# 构建第二阶段
|
|
|
# 执行命令
|
|
|
=> [2/2] ADD ./project/ /usr/local/app/ 3.6s
|
|
|
# 导出镜像
|
|
|
=> exporting to image 0.3s
|
|
|
# 导出镜像层
|
|
|
=> => exporting layers 0.0s
|
|
|
# 写入镜像文件
|
|
|
=> => writing image sha256:9f21ab65d16f8a8599aec0ba0c1b31b806ae675be2701a6d671ec42887ab5e56
|
|
|
0.0s
|
|
|
# 给镜像打标签
|
|
|
=> => naming to docker.io/library/mycentos:study1 0.0s
|
|
|
```
|
|
|
|
|
|
## Dockerfile文件
|
|
|
|
|
|
> Dockerfile是用来定制镜像的文本文件,内容为构Docker建镜像的一条条指令,由Docker build 命令使用,构建Docker镜像。
|
|
|
|
|
|
## 文件组成(注释与指令)
|
|
|
|
|
|
> \# 开头的为注释行
|
|
|
>
|
|
|
> INSTRUCTION arguments
|
|
|
>
|
|
|
> 通常包含4部分:
|
|
|
>
|
|
|
> 基础镜像信息、维护者信息、 镜像操作指令和容器启动时执行指令,新版“维护者信息”放在LABLE中指定
|
|
|
>
|
|
|
> 执行:按照Dockerfile指令顺序,从上到下依次执行。
|
|
|
|
|
|
```dockerfile
|
|
|
# 这是一个示例Dockerfile文件
|
|
|
FROM busybox
|
|
|
MAINTAINER username <demo@163.com>
|
|
|
ENV file=app
|
|
|
ADD ./project/ /usr/local/$file/
|
|
|
```
|
|
|
|
|
|
## 指令
|
|
|
|
|
|
> 指令,不区分大小写,但按惯例指令名一律大写,指令内容小写
|
|
|
|
|
|
+ FROM
|
|
|
|
|
|
> FROM 指令必须是非注释的第一个指令(新版AGU指令可值于前面), 可以使用 “ AS 别名” 提供别名,在路另外使用( --from=别名)。
|
|
|
>
|
|
|
> 指定了基础镜像,后面的所有指令都是运行在该基础镜像环境上的。
|
|
|
>
|
|
|
> 如果不以任何镜像为基础,那么写法为:FROM scratch
|
|
|
|
|
|
```dockerfile
|
|
|
#语法格式
|
|
|
FROM <image>
|
|
|
FROM <image>:<tag>
|
|
|
FROM <image>@<digest摘要即md5值>
|
|
|
|
|
|
# 特殊例子
|
|
|
#不以任何镜像为基础(内置空白镜像)
|
|
|
FROM scratch
|
|
|
|
|
|
# busybox是一个软件工具箱镜像,集成了linux中几百个常用的linux命令以及工具。
|
|
|
# 大小只有1.2M,适合用来测试
|
|
|
FROM busybox
|
|
|
|
|
|
# .net core sdk
|
|
|
FROM mcr.microsoft.com/dotnet/sdk:2.1 AS build
|
|
|
```
|
|
|
|
|
|
+ RUN
|
|
|
|
|
|
> RUN指令在**docker build** 时运行,用于执行命令并创建新的镜像层,通常用于安装软件包。
|
|
|
>
|
|
|
> 可以在Docker build输出中看到执行详情
|
|
|
|
|
|
```shell
|
|
|
# run 有两种方式
|
|
|
1. RUN <command>
|
|
|
解释:shell形式,该命令在 shell 中运行。默认情况下:
|
|
|
Linux上为 /bin/sh -c : -c 参数:把后面的命令(字符串)当成一个整体来执行
|
|
|
Windows为 cmd /S /C : /C即 /Close 命令运行之后关闭窗口(/K 命令运行之后保持窗口不关闭)
|
|
|
/S
|
|
|
|
|
|
2. RUN ["executable", "param1", "param2"]
|
|
|
exec形式可以避免 shell 字符串冗余,以及使用不包含指定 shell 可执行文件的基本映像的命令。
|
|
|
要使用除"/bin/sh"以外的其他 shell,请使用传入所需 shell 的exec形式
|
|
|
|
|
|
# 该指令将在当前镜像之上的新层中执行任何命令并提交结果。生成的已提交映像将用于下一步中。
|
|
|
```
|
|
|
|
|
|
```shell
|
|
|
# 示例
|
|
|
FROM busybox
|
|
|
WORKDIR /app
|
|
|
RUN /bin/sh -c 'echo 我是shell方式执行后写入的内容 > demo.txt'
|
|
|
RUN ["/bin/sh", "-c", "echo exec方式执行后写入的内容 > demo2.txt"]
|
|
|
|
|
|
# 说明:因为RUN指令是在docker build时执行的,所以docker run后终端上是没有回显的,用输入文件的方式验证是否执行成功了。
|
|
|
|
|
|
# docker build --rm -f Dockerfile.Run -t study:buildrun1 .
|
|
|
# docker run --rm -it --name runstudy1 study:buildrun1
|
|
|
# pwd 查看当前目录
|
|
|
# ls 命令查看是否有demo.txt demo2.txt文件
|
|
|
# cat demo.txt 查看内容
|
|
|
```
|
|
|
|
|
|
+ CMD 命令
|
|
|
|
|
|
> CMD命令设置容器启动后默认执行的命令及其参数,但CMD设置的命令能够被docker run命令后面的命令行参数替换。
|
|
|
|
|
|
```shell
|
|
|
# cmd 三种方式
|
|
|
CMD ["executable","param1","param2"] (执行形式,这是首选形式)
|
|
|
CMD ["param1","param2"](作为ENTRYPOINT 的默认参数)
|
|
|
CMD command param1 param2 (外壳形式)
|
|
|
```
|
|
|
|
|
|
+ LABLE 标签
|
|
|
|
|
|
> 标签:将元数据添加到镜像,键值对的形式。值包含空格时,使用双引号;包含特殊字符时,使用转义符 `\` 这在K8S筛选、管理镜像时很有用。
|
|
|
|
|
|
```textile
|
|
|
LABEL <key>=<value> <key>=<value> <key>=<value>
|
|
|
或者
|
|
|
LABLE <key>=<value>
|
|
|
LABLE <key>=<value>
|
|
|
```
|
|
|
|
|
|
> 一个镜像中可以有多个标签。可以在一行上指定多个标签,这在 Docker 1.10 之前,将减少最终映像的大小,但之后不需要如此。仍然可以选择在一条指令中以下列两种方式之一指定多个标签:
|
|
|
|
|
|
```dockerfile
|
|
|
LABEL multi.label1="value1" multi.label2="value2" other="value3"
|
|
|
```
|
|
|
|
|
|
```dockerfile
|
|
|
LABEL multi.label1="value1" \
|
|
|
multi.label2="value2" \
|
|
|
other="value3"
|
|
|
```
|
|
|
|
|
|
> 镜像会继承基本图像或父镜像中的标称,如果标签已存在但具有不同的值,则最近应用的值将覆盖之前设置的任何值。(类似CSS)使用如下命令查看镜像的标签。
|
|
|
>
|
|
|
> ```
|
|
|
> docker image inspect --format='' imageName
|
|
|
> -- format 遵循Go模板语法,使用需要学习,例如
|
|
|
> docker image inspect --format="{{.ContainerConfig.Labels}}" centos
|
|
|
> ```
|
|
|
|
|
|
+ ENV 环境变量
|
|
|
|
|
|
```dockerfile
|
|
|
# 语法
|
|
|
ENV key=value key=value ...
|
|
|
|
|
|
#替代语法,一次只能设置一个环境变量
|
|
|
ENV key value
|
|
|
|
|
|
# 可以设置多个环境变量,
|
|
|
# 含有空格等特殊内容的值用“”包括,可以使用转义符\进行转义和多行显示
|
|
|
|
|
|
# 环境变量位于构建阶段所有后续指令的环境中,并且可以在许多指令中以内联方式替换。
|
|
|
# 该值将针对其他环境变量进行解释,因此,如果不转义,将删除引号字符。
|
|
|
# 与命令行分析一样,引号和反斜杠可用于在值中包含空格。
|
|
|
|
|
|
# 镜像中的环境变量,从父镜像中层层继承。
|
|
|
# 同名的环境变量,子镜像中的值覆盖父镜像中的仁,后续值覆盖前面的值。
|
|
|
|
|
|
# 容器会继承其镜像中的所有环境变量使用容器的系统变量
|
|
|
# 对于容器内的应用程序来说,此环境变量相当于系统的环境变量;可以使用于多级配置项中。
|
|
|
```
|
|
|
|
|
|
```dockerfile
|
|
|
# Deckerfile 环境变量测试,包含各种方式的配置示例
|
|
|
|
|
|
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS EnvStudy
|
|
|
ENV Dockerfile_version=0.0.2
|
|
|
WORKDIR /app
|
|
|
COPY WebApiPublish/ /app/
|
|
|
ENTRYPOINT ["dotnet", "DockerStudyApi.dll"]
|
|
|
|
|
|
# docker build -f Dockerfile.ENV -t study.dockerfile.env.webapi:latest -t study.dockerfile.env.webapi:0.0.1 .
|
|
|
# docker run --rm -p 5051:80 -d --name study.dockerfile.env.webapi.run1 study.dockerfile.env.webapi
|
|
|
# 查看日志 docker logs contain_id -f //使用 -f 参数 实时输出,ctl + c 退出(不影响容器运行)
|
|
|
```
|
|
|
|
|
|
+ MAINTAINER 维护者
|
|
|
|
|
|
> 已弃用,可以使用 LABLE 代替
|
|
|
|
|
|
+ EXPOSE 显露端口
|
|
|
|
|
|
```dockerfile
|
|
|
# 该指令通知 Docker 容器在运行时侦听指定的网络端口。
|
|
|
# 您可以指定端口是侦听 TCP 还是 UDP,如果未指定协议,则默认值为 TCP。
|
|
|
|
|
|
# EXPOSE实际上并未发布端口。
|
|
|
# 它充当生成映像的人员和运行容器的人员之间的一种文档类型,用于发布哪些端口。
|
|
|
# 若要在运行容器时实际发布端口,请使用 on 标志发布和映射一个或多个端口,或使用该标志发布所有公开的端口并将其映射到高阶端口
|
|
|
|
|
|
EXPOSE 80/tcp
|
|
|
EXPOSE 80/udp
|
|
|
|
|
|
|
|
|
# Docker Run 中使用真实端口与映射
|
|
|
# P (大写-P参数 表示随机 小写-p参数 表示指定端口)
|
|
|
|
|
|
docker run -P ...
|
|
|
docker run -p 80:80/tcp -p 80:80/udp ...
|
|
|
```
|
|
|
|
|
|
+ WORKDIR 工作目录
|
|
|
|
|
|
> 语法:
|
|
|
>
|
|
|
> ```dockerfile
|
|
|
> WORKDIR /path/to/workdir
|
|
|
> ```
|
|
|
>
|
|
|
> WORKDIR 设置工作目录,其后的指令均在该目录中执行。如果目录不存在,则将创建它,即使它未在任何后续指令中使用。
|
|
|
>
|
|
|
> WORKDIR 目录可以是绝对路径或相对路径。
|
|
|
>
|
|
|
> 如果是相对路径,则该路径将相对于上一条WORKDIR指令的路径
|
|
|
>
|
|
|
> ```dockerfile
|
|
|
> WORKDIR /a
|
|
|
> WORKDIR b
|
|
|
> WORKDIR c
|
|
|
> RUN pwd
|
|
|
> ```
|
|
|
>
|
|
|
> 因为b c 均是相对目录,所以 pwd 的工作目录是 /a/b/c
|
|
|
>
|
|
|
> 可以使用已设置的变量、环境变量
|
|
|
>
|
|
|
> ```dockerfile
|
|
|
> ENV DIRPATH=/path
|
|
|
> WORKDIR $DIRPATH/$DIRNAME
|
|
|
> RUN pwd
|
|
|
> ```
|
|
|
|
|
|
+ VOLUME 数据卷
|
|
|
|
|
|
> 语法:
|
|
|
>
|
|
|
> ```dockerfile
|
|
|
> VOLUME ["/data","/data2",....]
|
|
|
> #或者
|
|
|
> VOLUME /DATA
|
|
|
> ```
|
|
|
>
|
|
|
> Docker数据卷有两个常用使用方法:
|
|
|
>
|
|
|
> `docker run -v` 和 `dockerfile VOLUME 指令`
|
|
|
>
|
|
|
> 1、前者比后者功能丰富、用法灵活,可指定具名卷或匿名卷;在启动容器时,使用,只能用于启动的容器自身。后者只能指定匿名卷;在Dockerfile文件中指定,作用于镜像生成时;对镜像的所容器均有效,是镜像的统一行为。
|
|
|
>
|
|
|
> 2、 VOLUME指令,只是起到了声明了容器中的目录作为匿名卷(在镜像架构层指定哪些数据要运用卷技术持久化到容器外),但是并没有将匿名卷绑定到宿主机指定目录的功能;具体的绑定 延迟到 容器启动时。<mark>注意</mark>:对于Windows系统上的Docker for Desktop而言, 匿名卷绑定的宿主目录,并不在直接的Windows系统上,而是在Docker守护服务系统上:Hyper-V形式的在DockerDesktopVM虚拟机中;WSL形式的,在WLS子系统文件中。
|
|
|
>
|
|
|
> 3、两者的数据卷一样,容器被删除以后映射在主机上的文件不会被删除,数据持久
|
|
|
>
|
|
|
> 4、如果两者指定了同一个卷,以前者(-v)为准。可以认为,dockerfile从镜像架构层指定了,那些目录数据要使用数据卷技术持久化,并提供了一个匿名的默认自动(Docker引擎自动)实现;而在启动容器时,可以使用 -v 参数 覆盖默认实现,并且不指定-v参数时使用默认实现,也不出错误。
|
|
|
>
|
|
|
> 5、共享数据卷:docker run --volumes-from xxxx xxxx可以是同一镜像,也可以是其它镜像或容器。使用数据卷容器,设置数据,其它容器统一使用--volumes-from 引用数据卷。
|
|
|
>
|
|
|
> 6、可以作用 docker volume 命令统一管理。
|
|
|
|
|
|
|
|
|
|
|
|
+ ARG 构建时变量
|
|
|
|
|
|
> 语法
|
|
|
>
|
|
|
> ```dockerfile
|
|
|
> ARG <name>[=<default value>]
|
|
|
> ```
|
|
|
>
|
|
|
> ```dockerfile
|
|
|
> # 构建时使用
|
|
|
> docker build --build-arg name=value --build-arg name2=value2 -t study.dockerfile.arg:latest .
|
|
|
> ```
|
|
|
>
|
|
|
> ARG定义了一个变量,用户可以在构建时使用该标志的命令将该变量传递给构建器。如果用户指定了未在 Dockerfile 中定义的生成参数,则生成将输出警告。
|
|
|
>
|
|
|
> <mark>注意</mark>:EVN定义的变量是在构建时和容器内均可用,ARG变量只能在构建时使用,容器内部是不存在的。也是唯一一个可以使用在FROM命令之前的命令
|
|
|
>
|
|
|
> <mark>范围</mark>:变量从 Dockerfile 中定义的行开始生效,而不是从命令行或其他地方的自变量使用开始。ARG变量,在定义它的构建阶段结束时超出范围。要在多个阶段使用变量,每个阶段都必须包含 ARG 指令。
|
|
|
|
|
|
```dockerfile
|
|
|
# 注释: Dockerfile ARG命令
|
|
|
|
|
|
FROM busybox
|
|
|
ARG BaseWorkPath=/App/
|
|
|
WORKDIR $BaseWorkPath
|
|
|
WORKDIR WebSites/
|
|
|
WORKDIR ApiDemo/
|
|
|
RUN pwd
|
|
|
|
|
|
# docker build -f Dockerfile.ARG --build-arg CONT_IMG_VER=0.0.2 -t study.dockerfile.arg:latest -t study.dockerfile.arg:0.0.1 .
|
|
|
# docker run --rm -it study.dockerfile.arg
|
|
|
```
|
|
|
|
|
|
+ ONBUILD
|
|
|
|
|
|
+ SHELL
|
|
|
|
|
|
+ 小结
|