一、 Docker概述
Docker简介
Docker,翻译过来就是码头工人
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可抑制的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器完全使用沙盒机制,相互之间不会存在任何接口。几乎没有性能开销,可以很容易的在机器和数据中心运行。最重要的是,他们不依赖于任何语言、框架或者包装系统。
Docker是dotCloud公司开源的一个基于LXC 的高级容器引擎,源码托管在Github上,基于go语言 并且遵从Apache2.0协议开源。 GitHub地址 :https://github.com/moby/moby
LXC主要通过Kernel的namespace 实现每个用户实例之间的项目隔离,通过cgroup实现对资源的配额和调度。
名词解释
**沙盒:**沙盒也叫沙箱(sandbox)。在计算机领域指一种虚拟技术,而且多用于计算机安全技术。安全软件可以让它在沙盒中运行,如果含有恶意行为,则禁止程序的进一步运行,而这不会对系统造成任何危害。
**LXC:**Linux Container的简写。Linux Container 容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。
**cgroup:**控制组,Control Groups,是一种内核功能,用于限制、统计和隔离一个进程组(process groups)所使用的物理资源,如CPU、内存、磁盘输入输出等。从2.6.24内核引入,它将进程管理从cpuset中剥离出来,并非全新创造的。cgroup提供了一个虚拟文件系统,作为分组管理和各子系统设置的接口。因此,使用cgroup时,必须挂载cgroup文件系统。
cgroup的主要目的是实现资源限制和进程管理。通过将进程分组,可以对各个组内的进程进行资源限制,例如CPU、内存和磁盘输入输出等。这有助于确保系统资源得到合理分配,同时也可以避免单个进程过度消耗资源,导致系统性能下降。
docker官网: https://www.docker.com
docker中文库: https://www.docker.org.cn/
Docker版本演化与技术特征更新
1、Docker发展历程概述
Docker自2013年诞生以来,经历了从简单的容器工具到完整的容器生态系统的演变过程。其版本演化可以分为四个主要阶段:
1. 初创期(2013-2014)
-
2013年3月:Docker 0.1.0发布,基于LXC技术
-
2014年6月:Docker 1.0发布,标志着生产就绪
2. 成长期(2015-2016)
-
引入Swarm集群管理
-
建立开放容器倡议(OCI)标准
3. 成熟期(2017-2019)
-
采用新的版本命名方案(YY.MM)
-
分化为CE(社区版)和EE(企业版)
4. 现代期(2020至今)
-
深度集成Kubernetes
-
专注于开发者体验和安全增强
2、重大版本技术特征更新
Docker 1.0 (2014年6月)
-
核心技术:从LXC转向libcontainer
-
镜像格式:建立分层存储体系
-
网络模型:基础桥接网络支持
Docker 1.12 (2016年7月)
-
Swarm模式:内置容器编排功能
-
服务发现:内置DNS服务
-
安全增强:TLS加密通信
Docker 17.03 (2017年3月)
-
版本改革:采用YY.MM版本号
-
多架构支持:ARM平台正式支持
-
插件系统:卷和网络插件标准化
Docker 18.09 (2018年11月)
-
BuildKit:实验性下一代构建引擎
-
Rootless模式:非root用户运行容器
-
cgroups v2:初步支持新控制组系统
Docker 19.03 (2019年7月)
-
GPU支持:NVIDIA GPU容器化
-
性能优化:containerd集成改进
-
Windows容器:完善WSL2支持
Docker 20.10 (2020年12月)
-
BuildKit默认:取代经典构建引擎
-
Compose V2:重写为Go版本
-
检查点/恢复:实验性容器状态保存
Docker 23.0 (2023年1月)
-
构建革新:完全移除经典构建引擎
-
镜像管理:改进垃圾回收机制
-
安全扫描:内置漏洞扫描工具
3、关键技术演进路线
1. 容器运行时演进
-
libcontainer → runc → containerd
-
符合OCI运行时规范
-
gVisor、Kata Containers等安全容器支持
2. 构建系统革新
-
传统构建 → BuildKit
-
多阶段构建支持
-
构建缓存优化和并行构建
3. 网络模型发展
-
基础桥接网络 → overlay网络
-
Macvlan/IPvlan支持
-
服务网格集成能力
4. 存储驱动优化
-
AUFS → overlay2
-
快照和存储配额管理
-
卷插件生态系统
5. 安全增强路径
-
用户命名空间隔离
-
Rootless容器模式
-
内容信任和镜像签名
4、当前技术趋势
-
云原生集成:与Kubernetes深度整合
-
开发者体验:简化本地开发工作流
-
安全强化:默认安全配置和策略
-
性能优化:资源利用率和启动速度
-
多平台支持:ARM、RISC-V等架构
Docker容器技术与虚拟机的区别
相同点:docker容器技术和虚拟机技术,都是虚拟化技术。
不同点:
- 虚拟机技术:
- docker容器技术:
通过图片,我们很明显的看到docker有着比虚拟机更少的抽象层。 由于docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。所以docker效率比虚拟机效率高。达到了秒级启动的地步。
Docker相较于VM的优点
-
比VM小、快,Docker容器的尺寸减小相比于整个虚拟机大大简化了分布到云和分发时间的开销。Docker启动一个容器实例时间仅仅需要几秒钟。
-
Docker是一个开放的平台,构建、发布和运行分布式应用程序。
-
开发人员不需要关注具体是哪个Linux操作系统。
-
Google、微软(azure)、亚马逊(AWS)、IBM等都支持docker。
-
Docker支持Unix/Linux操作系统,也支持Windows和Mac。
-
一次封装,到处运行
Docker局限性
Docker用于应用程序时是最有用的,但并不包含数据。日志、数据库等通常放在Docker容器外。一个容器的镜像通常都很小,不用存储大量数据,存储可以通过外部挂载等方式使用,比如:NFS、ipsan、MFS、ceph等 ,或者docker -v 命令进行映射磁盘。 总之,docker只用于计算,存储交给别人。
Docker通常用于如下场景
-
web应用的自动化打包和发布;
-
自动化测试和持续集成、发布;
-
在服务型环境中部署和调整数据库或其他的后台应用;
-
从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
二、 Docker 架构
Docker 包括三个基本概念
-
镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
-
容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
-
仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
概念 | 说明 |
---|---|
Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板,比如 CentOS 系统。 |
Docker 容器(Container) | 容器是独立运行的一个或一组应用,是镜像运行时的实体。 |
Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。 |
Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
Docker Registry | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
三、 Docker安装
1、使用官方安装脚本自动安装
bash
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
2、手动安装
bash
#rocky8 安装
yum remove runc -y
yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce
3、启动 Docker
bash
[root@localhost ~]# systemctl start docker
##通过运行 hello-world 镜像来验证是否正确安装了 Docker Engine-Community 。
[root@localhost ~]# docker run hello-world
4、卸载 Docker
bash
##删除安装包
[root@localhost ~]# yum remove docker-ce
##删除镜像、容器、配置文件等内容
[root@localhost ~]# rm -rf /var/lib/docker
四、 Docker 镜像加速
国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,
##编辑配置文件
bash
[root@localhost ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": [
"https://0vmzj3q6.mirror.aliyuncs.com",
"https://docker.m.daocloud.io",
"https://mirror.baidubce.com",
"https://dockerproxy.com",
"https://mirror.iscas.ac.cn",
"https://huecker.io",
"https://dockerhub.timeweb.cloud",
"https://noohub.ru",
"https://vlgh0kqj.mirror.aliyuncs.com"
]
}
##重新启动服务
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
镜像源转换站点
bash
https://dockerproxy.cn
/
Docker 配置文件 /etc/docker/daemon.json
所有字段详解
以下是 Docker 守护进程配置文件 daemon.json
中所有支持的配置字段及其功能说明(基于最新版 Docker 文档整理):
核心配置
字段 | 类型 | 默认值 | 说明 |
---|---|---|---|
data-root |
string | /var/lib/docker |
Docker 镜像、容器等数据的存储路径 |
exec-root |
string | /var/run/docker |
容器运行时状态文件的存储路径 |
pidfile |
string | /var/run/docker.pid |
Docker 守护进程 PID 文件的路径 |
网络配置
字段 | 类型 | 说明 |
---|---|---|
bip |
string | 设置 Docker 网桥的 IP 范围(如 192.168.0.1/24 ) |
default-address-pools |
array | 自定义 IP 地址池(用于 Swarm 和容器网络) |
mtu |
integer | 容器网络的 MTU(默认为 1500) |
ipv6 |
boolean | 是否启用 IPv6 支持 |
fixed-cidr-v6 |
string | 为 IPv6 分配固定的子网 |
dns |
array | 容器的默认 DNS 服务器(如 ["8.8.8.8", "8.8.4.4"] ) |
dns-search |
array | DNS 搜索域(如 ["example.com"] ) |
dns-opts |
array | DNS 高级选项(如 ["use-vc"] ) |
安全配置
字段 | 类型 | 说明 |
---|---|---|
tlsverify |
boolean | 强制启用 TLS 客户端证书验证 |
tlscacert |
string | CA 证书路径(如 /etc/docker/ca.pem ) |
tlscert |
string | TLS 证书路径(如 /etc/docker/cert.pem ) |
tlskey |
string | TLS 私钥路径(如 /etc/docker/key.pem ) |
userns-remap |
string | 用户命名空间映射(如 default 或 uid:gid ) |
selinux-enabled |
boolean | 启用 SELinux 支持 |
no-new-privileges |
boolean | 禁止容器获取新权限(默认 false ) |
icc |
boolean | 是否允许容器间通信(默认 true ) |
日志管理
字段 | 类型 | 说明 |
---|---|---|
log-driver |
string | 默认日志驱动(如 json-file , syslog , journald ) |
log-opts |
object | 日志驱动选项(如 {"max-size":"10m", "max-file":"3"} ) |
存储驱动
字段 | 类型 | 说明 |
---|---|---|
storage-driver |
string | 存储驱动(如 overlay2 , btrfs , zfs ) |
storage-opts |
array | 存储驱动选项(如 ["overlay2.override_kernel_check=true"] ) |
容器运行时
字段 | 类型 | 说明 |
---|---|---|
default-runtime |
string | 默认容器运行时(如 runc ) |
runtimes |
object | 自定义运行时(如 nvidia-runtime 配置) |
init |
boolean | 是否在容器内使用 tini 作为初始化进程 |
init-path |
string | 自定义初始化进程的路径 |
资源限制
字段 | 类型 | 说明 |
---|---|---|
default-ulimits |
object | 容器默认 Ulimits(如 {"nofile":{"Name":"nofile","Hard":1024,"Soft":512}} ) |
default-shm-size |
string | /dev/shm 默认大小(如 128m ) |
max-concurrent-downloads |
integer | 镜像下载最大并发数(默认 3) |
max-concurrent-uploads |
integer | 镜像上传最大并发数(默认 5) |
镜像仓库
字段 | 类型 | 说明 |
---|---|---|
registry-mirrors |
array | 镜像加速器地址(如 ["https://xxxx.mirror.aliyuncs.com"] ) |
insecure-registries |
array | 允许非 HTTPS 访问的仓库(如 ["192.168.0.100:5000"] ) |
高级功能
字段 | 类型 | 说明 |
---|---|---|
experimental |
boolean | 是否启用实验性功能 |
features |
object | 启用/禁用特定功能(如 {"buildkit":true} ) |
live-restore |
boolean | 守护进程重启时保持容器运行 |
debug |
boolean | 启用调试模式 |
metrics-addr |
string | 指标监控地址(如 127.0.0.1:9323 ) |
弃用字段(避免使用)
字段 | 替代方案 |
---|---|
bridge |
使用 bip 或自定义网络 |
fixed-cidr |
使用 default-address-pools |
配置文件示例
bash
{
"data-root": "/mnt/docker",
"registry-mirrors": ["https://registry.example.com"],
"insecure-registries": ["my-registry:5000"],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"live-restore": true,
"experimental": true
}
注意:
修改
daemon.json
后需重启 Docker:sudo systemctl restart docker
使用
docker info
可验证配置是否生效完整文档参考:Docker 官方配置文档
Dockerfile文件
一、 概述
Dockfile文件是镜像生成的一种方式。Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 快速创建自定义的镜像。Dockerfile文件中的每一个命令都会创建镜像的一层。
二、常见命令
命令字 | 作用 | 语法 |
---|---|---|
FROM | 指定基础镜像,并且必须是第一条指令。 | FROM <image> FROM <image> :<tag> FROM <image> :<digest> |
RUN | 镜像创建时运行指定的命令。 注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层. 多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。 linux操作系统上默认 /bin/sh -c RUN书写时的换行符是 \ | RUN command RUN ["executable", "param1", "param2"] |
CMD | 功能为容器启动时要运行的命令. 注意:里边包括参数的一定要用双引号,就是",不能是单引号。千万不能写成单引号。 原因是参数传递后,docker解析的是一个JSON array | CMD ["executable","param1","param2"] CMD ["param1","param2"] CMD command param1 param2 |
LABEL | 为镜像指定标签,一个Dockerfile种可以有多个LABEL 注意:LABEL会继承基础镜像中的LABEL,如遇到key相同,则值覆盖 | LABEL <key> =<value> <key> =<value> <key> =<value> ... |
MAINTAINER | 指定作者 | MAINTAINER name |
EXPOSE | 暴漏容器运行时的监听端口给外部,但是EXPOSE并不会使容器访问主机的端口 | EXPOSE port |
ENV | 设置环境变量,多环境变量使用空格隔开 | ENV <key><value> ENV <key>=<value> <key>=<value> <key>=<value>... |
ADD | 把文件复制到镜像中;如果把<src> 写成一个url,那么ADD就类似于wget命令; 尽量不要把<scr> 写成一个文件夹,如果<src> 是一个文件夹了,复制整个目录的内容,包括文件系统元数据 能够将压缩文件自动解压 |
ADD <src>... <dest> ADD ["<src>",... "<dest>"] |
SHELL | 设置默认的 shell 环境。默认情况下,Docker 使用 /bin/sh -c | SHELL ["<shell>", "<shell参数>"] |
COPY | 把文件复制到镜像中; 与ADD的区别:COPY的<src> 只能是本地文件,其他用法一致 |
COPY <src>... <dest> COPY ["<src>",... "<dest>"] |
ENTRYPOINT | 容器启动时的默认命令; 与CMD比较说明: 相同点: 只能写一条,如果写了多条,那么只有最后一条生效 容器启动时才运行,运行时机相同 不同点: ENTRYPOINT不会被docker run运行的command覆盖,而CMD则会被覆盖 如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数 如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD是一个完整的指令,那么它们两个会互相覆盖,谁在最后谁生效。 | ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2 |
VOLUME | 实现挂载功能,可以将内部文件夹或者其他容器中得文件夹挂载到这个容器中,一般的使用场景为需要持久化存储数据时; ["/data"]可以是一个JsonArray ,也可以是多个值。所以如下几种写法都是正确的 VOLUME ["/var/log/"] VOLUME /var/log VOLUME /var/log /var/db 注意:VOLUME命令在Dockerfile中只能用来创建挂载点,不能指定已经存在的目录作为挂载点。如果指定的目录已经存在,但没有使用VOLUME命令,Docker将会将其作为普通目录对待,而不会创建一个挂载点。 | VOLUME ["/data"] |
USER | 设置启动容器的用户,可以是用户名或UID 注意:如果设置了容器以daemon用户去运行,那么RUN, CMD 和 ENTRYPOINT 都会以这个用户去运行 | USER daemo USER UID |
WORKDIR | 设置工作目录,对RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在则会创建,也可以设置多次;默认工作目录是:/ | WORKDIR /path/to/workdir |
ARG | 设置变量命令,ARG命令定义了一个变量;在docker build创建镜像的时候,使用 --build-arg <varname> =<value> 来指定参数;如果用户在build镜像时指定了一个参数没有定义在Dockerfile种,那么将有一个Warning 提示如下: [Warning] One or more build-args [foo] were not consumed. 如果我们给了ARG定义的参数默认值,那么当build镜像时没有指定参数值,将会使用这个默认值 |
ARG <name> [=<default value> ] |
STOPSIGNAL | 当容器退出时给系统发送什么样的指令 | STOPSIGNAL signal |
HEALTHCHECK | 容器健康状况检查命令; 第一个的功能是在容器内部运行一个命令来检查容器的健康状况 第二个的功能是在基础镜像中取消健康检查命令 [OPTIONS]的选项支持以下三中选项: interval=DURATION 两次检查默认的时间间隔为30秒 timeout=DURATION 健康检查命令运行超时时长,默认30秒 retries=N 当连续失败指定次数后,则容器被认为是不健康的,状态为unhealthy,默认次数是3 注意: HEALTHCHECK命令只能出现一次,如果出现了多次,只有最后一个生效。 CMD后边的命令的返回值决定了本次健康检查是否成功,具体的返回值如下: 0: success - 表示容器是健康的 1: unhealthy - 表示容器已经不能工作了 2: reserved - 保留值 | HEALTHCHECK [OPTIONS] CMD command HEALTHCHECK NONE |
2.1 FROM
指定基础镜像,必须为第一个命令
bash
格式:
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
示例:
FROM mysql:5.6
注:
tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
2.2 MAINTAINER(新版即将废弃)
维护者信息
bash
格式:
MAINTAINER <name>
示例:
MAINTAINER bertwu
MAINTAINER xxx@162.com
MAINTAINER bertwu <xxx@162.com>
2.3 RUN
构建镜像时执行的命令
bash
RUN用于在构建镜像时执行命令,其有以下两种命令执行方式:
shell执行
格式:
RUN <command>
exec执行
格式:
RUN ["executable", "param1", "param2"]
示例:
RUN ["executable", "param1", "param2"]
RUN apk update
RUN ["/etc/execfile", "arg1", "arg1"]
注:RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,
可以在构建时指定--no-cache参数,如:docker build --no-cache
2.4 ADD
将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
bash
格式:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
示例:
ADD hom* /mydir/ # 添加所有以"hom"开头的文件
ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"
ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/
ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
2.5 COPY
功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
2.6 CMD
构建镜像后调用,也就是在容器启动时才进行调用。
bash
格式:
CMD ["executable","param1","param2"] (执行可执行文件,优先)
CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
CMD command param1 param2 (执行shell内部命令)
示例:
CMD echo "This is a test." | wc -l
CMD ["/usr/bin/wc","--help"]
注:CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
2.7 ENTRYPOINT
配置容器,使其可执行化。配合CMD可省去"application",只使用参数。
bash
格式:
ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
ENTRYPOINT command param1 param2 (shell内部命令)
示例:
FROM ubuntu
ENTRYPOINT ["ls", "/usr/local"]
CMD ["/usr/local/tomcat"]
之后,docker run 传递的参数,都会先覆盖cmd,然后由cmd 传递给entrypoint ,做到灵活应用
注:ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,
而docker run命令中指定的任何参数,都会被当做参数再次传递给CMD。
Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,
而只执行最后的ENTRYPOINT指令。
通常情况下, ENTRYPOINT 与CMD一起使用,ENTRYPOINT 写默认命令,当需要参数时候 使用CMD传参
2.8 LABEL
用于为镜像添加元数据
bash
格式:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
示例:
LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"
注:
使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据
之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
2.9 ENV
设置环境变量
bash
格式:
ENV <key> <value> #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量
ENV <key>=<value> ... #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行
示例:
ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat=fluffy
2.10 EXPOSE
指定于外界交互的端口
bash
格式:
EXPOSE <port> [<port>...]
示例:
EXPOSE 80 443
EXPOSE 8080
EXPOSE 11211/tcp 11211/udp
注: EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口
如果没有暴露端口,后期也可以通过-p 8080:80方式映射端口,但是不能通过-P形式映射
2.11 VOLUME
用于指定持久化目录(指定此目录可以被挂载出去)
bash
格式:
VOLUME ["/path/to/dir"]
示例:
VOLUME ["/data"]
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"
注:一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
1 卷可以容器间共享和重用
2 容器并不一定要和其它容器共享卷
3 修改卷后会立即生效
4 对卷的修改不会对镜像产生影响
5 卷会一直存在,直到没有任何容器在使用它
2.12 WORKDIR
工作目录,类似于cd命令
bash
格式:
WORKDIR /path/to/workdir
示例:
WORKDIR /a (这时工作目录为/a)
WORKDIR b (这时工作目录为/a/b)
WORKDIR c (这时工作目录为/a/b/c)
注:
通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY
等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
2.13 USER
指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
bash
格式:
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
示例:
USER www
注:
使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。
镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。
2.14 ARG
用于指定传递给构建运行时的变量(给dockerfile传参),相当于构建镜像时可以在外部为里面传参
bash
格式:
ARG <name>[=<default value>]
示例:
ARG site
ARG build_user=www
From centos:7
ARG parameter
VOLUME /usr/share/nginx
RUN yum -y install $parameter
EXPOSE 80 443
CMD nginx -g "daemon off;"
# 可以这如下这样灵活传参
bash
docker build --build-arg=parameter=net-tools -t nginx:01 .
2.15 ONBUILD
用于设置镜像触发器
bash
格式:
ONBUILD [INSTRUCTION]
示例:
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
注:
ONBUID后面跟指令,当当前的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发
三、制作镜像
编写dockerfile文件
bash
FROM ubuntu
RUN apt update && apt install -y gcc make wget && apt install -y libpcre3 libpcre3-dev zlib1g-dev openssl libssl-dev
RUN wget http://nginx.org/download/nginx-1.24.0.tar.gz && tar xf nginx-1.24.0.tar.gz && cd nginx-1.24.0 && ./configure --prefix=/usr/local/nginx && make && make install
EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
bash
# This my first nginx Dockerfile
# Version 1.0
# Base images 基础镜像
FROM centos:7
#MAINTAINER 维护者信息
MAINTAINER bertwu
#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
#ADD 文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/
ADD epel-release-latest-7.noarch.rpm /usr/local/
#RUN 执行以下命令
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www
#WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.8.0
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
RUN echo "daemon off;" >> /etc/nginx.conf
#EXPOSE 映射端口
EXPOSE 80
#CMD 运行以下命令
CMD ["nginx"]
构建镜像
docker build命令解析
-
-t, --tag : 给镜像打标签,格式为
name:tag
。bashdocker build -t myimage:latest .
-
-f, --file: 指定 Dockerfile 的路径。
bashdocker build -f /path/to/Dockerfile .
-
--build-arg : 设置构建参数,可以在 Dockerfile 中使用
ARG
指令引用。bashdocker build --build-arg MY_VAR=value .
-
--no-cache: 不使用缓存,强制重新构建所有层。
bashdocker build --no-cache .
-
--pull: 总是尝试拉取最新的基础镜像。
bashdocker build --pull .
-
--compress: 使用 gzip 压缩构建上下文。
bashdocker build --compress .
-
--quiet, -q: 静默模式,只输出镜像 ID。
bashdocker build -q .
-
--target: 指定构建阶段,适用于多阶段构建。
bashdocker build --target mystage .
-
--network: 指定构建过程中使用的网络模式。
bashdocker build --network mynetwork .
-
--label: 给镜像添加元数据标签。
bashdocker build --label version=1.0 .
例如,如果你想构建一个带有特定标签和构建参数的镜像,可以使用以下命令:
bash
docker build -t myimage:1.0 --build-arg MY_VAR=value .
这样,你就可以在 Dockerfile 中使用 ARG MY_VAR
来引用 MY_VAR
的值。