Docker
Docker
介绍 ¶
Docker 是开发,运行和部署应用程序的开放管理平台。
- 开发人员能利用 Docker 开发和运行应用程序。
- 运维人员能利用 Docker 部署和管理应用程序。
可以简单理解为:使用主机内核的虚拟机,不需要和虚拟机一样需要自己独立的操作系统,因此比虚拟机更轻量。
作用及解决 ¶
- Docker 可以将应用程序和基础架构分开,便于程序和软件的交付。
- 借助 Docker 可以像管理应用程序一样管理基础架构。
- 借助 Docker 可以快速进行传输、测试和部署,可以缩短代码的编写和在生产环境运行之间的时间差。
Docker 主要解决的问题:
- 保证程序运行环境的一致性。
- 降低配置开发环境和生产环境的复杂度和成本。
- 实现程序的快速部署和开发。
Docker 引擎 ¶
Docker Engine 是一个包含以下组件的客户端 - 服务端(C/S)应用程序。
- 服务端:一个长时间运行的守护进程(Docker Daemon)。
- Rest API:一套用于与 Docker Daemon 通信并指示其执行操作的接口。
- 客户端:命令行接口 CLI(Command Line Interface)。
- CLI 利用 Docker 命令通过 Rest API 直接操作 Docker Daemon 运行。
- Docker Daemon 负责创建并管理 Docker 的对象(镜像、容器、网络、数据卷)。
Docker 结构 ¶
-
Docker 客户端(Docker Client):
- 是用户与 Docker 进行交互的最主要方式。当在终端输入 docker 命令时,对应的就会在服务端产生。对应的作用,并把结果返回给客户端。Docker Client 除了连接本地服务端,通过更改或指定 DOCKER_ HOST 连接远程服务端。
-
Docker 服务端(Docker Server):
- Docker Daemon 其实就是 Docker 的服务端。它负责监听 Docker APl 请求 (如 Docker Client) 并管理 Docker 对象。
-
Docker Registries:
- 俗称 Docker 仓库,专门用于存储镜像的云服务环境。Docker Hub 就是一个公有的存放镜像的地方,类似 Github 存储代码文件。同样的也可以类似 Github 那样搭建私有的仓库。
-
Docker 对象(Docker Objects):
- 镜像:一个 Docker 的可执行文件,其中包括运行应用程序所需的所有代码内容、依赖库、环境变量和配置文件等。
- 容器:镜像被运行起来后的实例。
- 网络:外部或者容器间如何互相访问的网络方式,如 host 模式、bridge 模式。
- 数据卷:容器与宿主机之间、容器与容器之间共享存储方式,类似虚拟机与主机之间的共享文件目录。
底层技术 ¶
Docker 使用 Go 语言实现,利用 Linux 内核的几个特性来实现:
- 命名空间(Name Space):为 Docker 容器提供操作系统层面的隔离。
- 控制组(Control Groups):为 Docker 容器提供硬件层面的隔离。
- 联合文件系统(Union File Systems):利用分层思想管理镜像和容器。
而 Windows 和 MacOS 则借助了虚拟化技术,使其在这些操作系统上得以运行 Docker。
容器格式 ¶
Docker Engine 将 Linux 的三个特性进行组合成一个 package,这就是一个容器格式(Container Format)。
Docker 通过 package 对这三个特性进行管理控制实现容器的创建和生命周期的管理。
容器格式有很多种,其中 Docker 目前使用的容器格式称为 libcontrainer。
版本 ¶
- Docker-CE:Docker 社区版,由社区维护和提供技术支持,是免费版本,适合个人开发和小团队使用。
- Docker-EE:Docker 企业版,是收费版本,有售后团队和技术团队提供技术支持,专为企业开发和 IT 团队设计,在社区版的基础上增加一些额外功能,提供了更重要的安全保障。
其中,Stable 版按季度发布,更加稳定;Edge 版按月发布,供测试使用。
各平台安装 ¶
CentOS 中安装 ¶
Install Docker Engine on CentOS | Docker Docs
- 卸载
sudo yum remove docker \ |
- 更新系统工具
sudo yum install -y yum-utils |
- 添加软件源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo |
可替换阿里云源:https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
或在 /etc/yum.repos.d/docker-ce.repo 中将
download.docker.com
替换为mirrors.aliyun.com/docker-ce
- 安装 Docker
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin |
- 启动 Docker
sudo systemctl start docker |
- 查看安装
sudo docker run hello-world |
Ubuntu 中安装 ¶
Install Docker Engine on Ubuntu | Docker Docs
- 卸载
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done |
- 更新 apt 及安装证书
sudo apt-get update |
可替换阿里云源:https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg
- 安装并启动 Docker
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin |
- 查看安装
sudo docker run hello-world |
MacOS 中安装 ¶
Install Docker Desktop on Mac | Docker Docs
Windows 中安装 ¶
Install Docker Desktop on Windows | Docker Docs
Docker 镜像加速 ¶
-
https://docker.1panel.dev
-
https://dockerpull.org
-
https://docker.unsee.tech
-
https://docker.m.daocloud.io
Ubuntu/CentOS 镜像加速 ¶
- 创建配置文件夹
sudo mkdir -p /etc/docker |
- 写入配置
sudo tee /etc/docker/daemon.json <<-'EOF' |
加速器地址请自行替换。
- 重载进程
sudo systemctl daemon-reload |
- 重启 Docker
sudo systemctl restart docker |
服务端配置 ¶
为了让其他第三方客户端连接到 Docker Server,我们需要进行一些配置。
- 编辑配置文件
vim /usr/lib/systemd/system/docker.service |
- 在
ExecStart
行尾添加-H tcp://0.0.0.0:2375
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375 |
- 重启服务
sudo systemctl daemon-reload |
- CentOS 开启 2375 端口
# 开放端口 |
镜像 ¶
介绍 ¶
Docker 镜像是一个轻量级、可执行的独立软件包,它包含了运行某个应用所需要的所有内容,包括代码、运行时环境、库、环境变量和配置文件等。镜像是 Docker 容器的基础,容器通过镜像创建并运行。
特点:
- 只读层: Docker 镜像的每一层都是只读的,当你创建一个新的镜像时,Docker 会通过层叠的方式将每个更改应用到现有镜像的基础上。每一层都代表着 Docker 镜像的某个状态,比如安装一个新的包或更改配置文件。
- 层次结构: 镜像的构建是层叠的。每个命令(如
RUN
、COPY
等)都会在镜像中生成一个新的层。这使得 Docker 在存储和管理镜像时非常高效,因为相同的层可以被多个容器共享,而不必重复存储。 - 可复用性: 因为镜像是基于层的,Docker 提供了镜像复用机制。如果多个镜像使用了相同的底层镜像,那么这些镜像共享底层层,节省存储空间。
- 跨平台性: Docker 镜像可以在不同的操作系统和架构上运行,只要 Docker 引擎支持该平台。通常,镜像包含了与应用相关的所有依赖,使得在不同环境中部署应用变得更加容易。
镜像管理 ¶
搜索 ¶
作用:搜索 Docker Hub 镜像仓库的镜像。
命令格式:
docker search [OPTIONS] TERM |
命令参数(OPTIONS):
- -f,–filter filter:根据提供的格式筛选结果(如
-f is-official=true
、-f is-automated=true
)。 - –format string:使用 Go 语言 format 格式化输出结果。
- –limit int:展示最大结果数,默认 25 个。
- –no-trunc:完全内容展示。
查看 ¶
作用:列出本地镜像。
命令格式:
docker images [OPTIONS] [REPOSITORY[:TAG]] |
命令参数(OPTIONS):
- -a,–all:展示所有镜像(默认隐藏底层镜像)。
- –no-trunc:完全内容展示。
- -q,–quiet:只展示镜像 ID。
下载 ¶
作用:拉取远程镜像仓库(如:Docker Hub 镜像仓库)到本地。
命令格式:
docker pull [OPTIONS] NAME[:TAG|@DIGEST] |
命令参数(OPTIONS):
- -a,–all-tags:下载所有符合 tag 的镜像。
- –platform:指定镜像运行的平台(arm64、amd64)。
删除 ¶
作用:删除一个或多个本地镜像。
命令格式:
docker rmi [OPTIONS] IMAGE [IMAGE...] |
命令参数(OPTIONS):
- -f,–force:强制删除。
删除所有镜像:
bash
docker rmi -f `docker images -aq`
保存 ¶
作用:将一个或多个本地镜像保存为本地 tar 文件(输出到 STDOUT)。
命令格式:
docker save [OPTIONS] IMAGE [IMAGE...] |
命令参数:
- -o,–output string:指定导出的文件名和路径(使用
>
重定向也可)。
加载 ¶
作用:将保存的 tar 文件加载到本地镜像库。
命令格式:
docker load [OPTIONS] |
命令参数(OPTIONS):
- -i,–input string:指定导入文件路径(加载到 STDIN)。
- -q,–quiet:不打印加载信息。
改名 ¶
作用:将本地镜像的 NAME、TAG 进行重命名,并产生一个新镜像引用。
命令格式:
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] |
详情 ¶
作用:查看一个或多个本地镜像详情信息。
命令格式:
docker image inspect [OPSTION] IMAGE [IMAGE...] |
可搭配
| grep keyword
输出指定字段信息。
命令参数(OPSTIONS):
- -f,–format string:使用 Go 语言 format 格式化输出结果。
历史 ¶
作用:查看本地镜像的历史(分层)信息。
命令格式:
docker history [OPTIONS] IMAGE |
命令参数(OPTIONS):
- -H,–human:优化打印创建时间、大小(默认为 true)。
- -q,–quiet:只显示镜像 ID。
- –no-trunc:完全内容展示。
容器 ¶
容器(Container)是一种轻量级、可移植、可将程序打包的技术,使应用程序可以在几乎任何地方以相同的方式运行。
Docker 将镜像文件运行起来后,产生的对象就是容器,容器相当于是镜像运行起来的一个实例,具备一定的生命周期。
容器与虚拟机 ¶
相同点:
- 都会对物理硬件资源进行共享使用。
- 生命周期比较相似(创建、运行、暂停、关闭等等)。
- 都可以安装各种应用,如 redlis、 mysql、 nginx 等。
- 资源会存储在宿主机上:linux 上位于 /var/lib/docker/containers 下。
不同点:
- 虚拟机的生命周期基于一个完整的操作系统,而容器则直接运行在宿主的内核上,由一系列进程结合。
- 虚拟机是重量级的,会消耗更多资源,而容器是轻量级的,不需要额外的资源来管理(Hypervisor、GuestOS)程序。
生命周期 ¶
容器管理 ¶
创建 ¶
作用;使用镜像创建一个 Created 状态的待启动的容器。
命令格式:
docker create [OPTIONS] IMAGE [COMMAND] [ARG...] |
命令参数(OPTIONS):
- -i,–interactive:关联 STDIN。
- -t,–tty:分配一个伪 TTY(虚拟终端)。
- –name:容器命名。
- –rm:关闭容器时自动删除容器。
命令参数(COMMAND/ARG):
- COMMAND:容器启动后,在容器内执行的命令,也是容器的主进程。
- ARG:COMMAND 执行时提供的参数。
启动 ¶
作用:启动一个或多个容器。
命令格式:
docker start [OPTIONS] CONTAINER [CONTAINER...] |
命令参数(OPTIONS):
- -a,–attach:关联 STDOUT/STDERR。
- -i,–interactive:关联 STDIN。
重启 ¶
作用:重启一个或多个容器。
命令格式:
docker restart [OPTIONS] CONTAINER [CONTAINER...] |
命令参数(OPTIONS):
- -t,–time int:等待 N 秒后重启容器(默认 10s)。
运行 ¶
作用:使用镜像创建并启动一个容器。
指令格式:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...] |
命令参数(OPTIONS):
- -i,–interactive:保持 STDIN 打开。
- -t,–tty:分配一个伪 TTY(虚拟终端)。
- -d,–detach:容器运行在后台并打印容器 ID。
- -e,–env list:设置容器中运行时的环境变量。
- -a,–attach list:关联 STDIN、STDOUT、STDERR。
- -v,–volume list:绑定数据卷。
- –rm:关闭容器时自动删除容器。
- –restart string:重启配置(默认
no
,如always
)
暂停 ¶
作用:暂停一个或多个容器的所有进程。
命令格式:
docker pause CONTAINER [CONTAINER...] |
恢复 ¶
作用:恢复一个或多个暂停的容器。
命令格式:
docker unpause CONTAINER [CONTAINER...] |
关闭 ¶
作用:关闭一个或多个运行 / 暂停的容器。
命令格式:
docker stop [OPTIONS] CONTAINER [CONTAINER...] |
先发送
SIGTERM
,后发送SIGKILL
。
命令参数(OPTIONS):
- -t,–time int:等待 N 秒后关闭容器(默认 10s)。
杀死 ¶
作用:杀死一个或多个运行 / 暂停的容器。
命令格式:
docker kill [OPTIONS] CONTAINER [CONTAINER...] |
直接发送
SINGKILL
命令参数(OPTONS):
- -s,–signal:发送一个信号给容器(默认
kill
)。
删除 ¶
作用:删除一个容器。
命令格式:
docker rm [OPTIONS] CONTAINER [CONTAINER...] |
命令参数(OPTIONS):
- -f,–force:强制删除一个运行中的容器。
- -l,–link:删除指定链接。
- -v,–volumes:删除指定数据卷。
详情 ¶
作用:查看一个或多个本地容器的详情信息。
命令格式:
docker container inspect [OPTIONS] CONTAINER [CONTAINER...] |
可搭配
| grep keyword
输出指定字段信息。
命令参数(OPTIONS):
- -f,–format string:使用 Go 语言 format 格式化输出结果。
- -s,–size:显示总大小。
日志 ¶
作用:查看容器日志信息(来自 COMMAND 产生的 STDOUT)。
命令格式:
docker logs [OPTIONS] CONTAINER |
命令参数(OPTIONS):
- –details:显示额外信息。
- -f,–follow:动态跟踪显示日志信息。
- –until string:只显示某时间节点之前的信息。
- –since string:只显示某时间节点之后的信息。
- –tail string:显示倒数几条信息(默认全部)。
- -t,–timestamps:显示 timestamps 时间。
改名 ¶
作用:重命名一个容器。
命令格式:
docker rename CONTAINER NEW_NAME |
拷贝 ¶
作用:用于宿主机与容器之间、容器与容器之间的文件拷贝。
命令格式:
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|SRC_PATH CONTAINER:DEST_PATH |
命令参数(OPTIONS):
- -a,–archive:归档模式(复制所有 uid/gid 等信息)。
- -L,–follow-link:在 SRC_PATH 携带 link 符号。
- -q,–quiet:拷贝过程中不输出内容。
运行操作 ¶
连接 ¶
作用:将当前终端的 STDIN、STDOUT、STDERR 关联到正在运行容器的主进程上实现连接。
命令格式:
docker attach [OPTIONS] CONTAINER |
退出会关闭主进程而导致容器关闭。
命令参数(OPTIONS):
- –no-stdin:不关联 STDIN。
执行 ¶
作用:在容器中运行命令。
命令格式:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...] |
退出不会影响主进程,因此退出不会导致容器关闭。
命令参数(OPTIONS):
- -d,–detach:后台运行命令。
- -i,–interactive:关联 STDIN。
- -t,–tty:分配一个伪 TTY(虚拟终端)。
- -w,–workdir string:指定到容器的工作目录。
- -e,–env list:设置容器运行时的虚拟环境。
命令参数(COMMAND/ARG):
- COMMAND:在容器内执行的命令。
- ARG:COMMAND 执行时提供的参数。
容器与镜像的关系 ¶
关系图 ¶
操作 ¶
提交 ¶
作用:根据容器生成一个镜像(基于该容器)。
命令格式:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] |
命令参数(OPTIONS):
- -a,–author string:指定作者。
- -c,–change list:添加 Dockerfile 命令。
- -m,–message string:提交时添加注释。
- -p,–pause:提交时暂停容器(默认 true)。
导出 ¶
作用:将容器当前的文件系统导出为 tar 文件。
命令格式:
docker export [OPTIONS] CONTAINER |
命令参数(OPTIONS):
- -o,–output string:指定导出的文件名和路径(默认 STDOUT)。
导入 ¶
作用:将导出的 tar 文件导入到本地镜像库为一个新镜像。
命令格式:
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]] |
命令参数(OPTIONS):
- -c,–change list:添加 Dockerfile 命令。
- -m,–message string:导入时添加注释
联合文件 ¶
Docker 镜像与容器的底层都是基于联合文件系统的。
通过 inspect
命令可以查看镜像的 Layer 层级,通过 commit
命令修改文件系统会覆盖 Layer。
通过 create
命令会创建一层可读写的 Layer,通过 commit
命令会将可读写 Layer 添加为一层只读 Layer,与之前的 Layer 合并为一个镜像。
网络 ¶
作用 ¶
容器的网络默认与宿主机、与其他容器都是相互隔离的。
在开发和使用过程中,容器与宿主机之间、容器与容器之间通常都是有网络需求的,此时我们就可以使用 Docker 中的网络管理对其进行操作。
驱动模式 ¶
Docker 有 5 种内置网络驱动模式
- Bridge network 模式(网桥):默认的网络模式,类似虚拟机的 nat 模式(应用较多)。
- Host network 模式(主机):容器直接使用宿主机的网络(性能最好)。
- None network 模式(null):容器禁用所有网络。
- Overlay network 模式(覆盖):利用 VXLAN 实现的 bridge 模式。
- Macvlan network 模式(Mac):容器具备 Mac 地址,使其显示为网络上的物理设备。
特殊的驱动模式:Container network 模式(应用较多)。
bridge 网络模式 ¶
- 宿主机上需要单独的 bridge 网卡,如 docker 默认创建的 docker0。
- 容器与容器、容器与主机之间的网络通信,是借助每一个容器生成的一对 veth pair 虚拟网络设备对进行通信的。
- 每创建一个 bridge 网络的容器,都会在宿主机上创建一个 vethxxx 的虚拟网络设备。
- 外部无法直接访问容器,需要端口映射才能访问。
- 容器借助 veth 虚拟设备通过 docker0 这种 bridge 网络设备进行通信。
- 每一个容器具备独立 IP。
host 网络模式 ¶
- 容器完全共享宿主机的网络,无网络隔离。
- 容器和宿主机上的应用所使用的端口不能重复。
- 外部可以直接访问容器,不需要端口映射。
- 容器 IP 就是宿主机的 IP。
none 网络模式 ¶
- 容器上无网络,也没有任何网络设备。
- 如果需要使用网络,需要用户自行安装与配置。
- 适合高度定制网络的情景使用。
overlay 网络模式 ¶
- 网络的实现方式和方案有很多,Docker 中是基于 VXLAN 隧道技术(会在 TCP/IP 的网络层封装一个自己的 IP 和 Mac 地址传输到各个容器)实现。
- 主要用于实现跨主机容器之间的通信,适合涉及跨主机的容器集群管理的情景使用。
macvlan 网络模式 ¶
- 网络通信直接基于 Mac 地址进行转发,让容器像一个真实物理设备。
- 宿主机充当二层交换机,Docker 会维护一个 Mac 地址表,根据地址表找到对应的容器并进行传输。
- 容器之间可以直接通过 IP 互通,通过宿主机上内建的虚拟网络设备,但是与主机无法直接使用 IP 互通。
- 对于每个外来数据报都是与容器 Mac 地址进行通信的场景使用。
container 网络模式 ¶
会将指定的容器作为 “主机” 并共享其网络,与指定的容器无网络隔离。
docker run/create --network container:CONTAINER ... |
网络管理 ¶
查看 ¶
作用:查看已经建立的网络对象。
命令格式:
docker network ls [OPTIONS] |
命令参数(OPTIONS):
- -f,–filter filter:根据提供的格式筛选结果。
- –format string:使用 Go 语言 format 格式化输出结果。
- –no-trunc:完全内容展示。
- -q,–quiet:只输出网络对象的 ID。
创建 ¶
作用:创建新的网络对象。
命令格式:
docker network create [OPTIONS] NETWORK |
命令参数(OPTIONS):
- -d,–driver string:指定网络的驱动(默认 bridge)。
- –subnet string:指定子网网段(如 192.168.0.0/16)。
- –ip-range string:指定容器 IP 范围,subnet 子集。
- –gateway string:指定子网 IPv4 或 IPv6 网关(如 192.168.0.1)。
注意:
- host、none 模式网络只能存在一个。
- Docker 自带的 overlay 模式创建依赖 Docker swarm(集群负载均衡)服务。
- 192.168.0.0/16 == 192.168.0.0 ~ 192.168.255.255
- 172.88.0.0/24 == 172.88.0.0 ~ 172.88.0.255
删除 ¶
作用:删除一个或多个网络。
命令格式:
docker network rm NETWORK [NETWORK] |
详情 ¶
作用:查看一个或多个网络的详情信息。
命令格式:
docker network inspect [OPTIONS] NETWORK [NETWORK...] |
命令参数(OPTIONS):
- -f,–format string:使用 Go 语言 format 格式化输出结果。
使用 ¶
作用:为启动的容器指定网络。
命令格式:
docker run/create --network NETWORK ... |
默认使用名为 bridge 的网络。
连接 / 断开 ¶
作用:连接 / 断开指定容器与网络。
命令格式:
docker network connect/disconnect [OPTIONS] NETWORK CONTAINER |
命令参数(OPTIONS):
- -f,–force:强制断开连接。
注意:
- 不能用于 host 网络、overlay 网络的连接与断开。
- none 网络、overlay 网络和其他网络不能同时连接。
- bridge 网络和 macvlan 网络可以同时连接多个。
端口映射 ¶
作用:用于 bridge 网络模式下,外部访问容器内部服务。
命令格式:
docker run/create -P/-p ... |
命令参数:
- -P,–publish-all:将容器内所有暴露的端口进行随机映射。
- -p,–publish list:手动指定端口映射。
注意:
-p [HOST_IP]:[HOST_PORT]:CONTAINER_PORT
-
-p ::80
:将容器的 80 端口随机映射到主机任意 IP 随机端口。 -
-p :16379:6379
:将容器的 6379 端口映射到主机任意 IP 的 16379 端口。 -
-p 192.168.0.0::3306
:将容器的 3306 端口映射到主机该 IP 的随机端口。 -
-p 192.168.0.1:13306:3306
:将容器的 3306 端口映射到主机该 IP 的 13306 端口。
数据卷 ¶
简介 ¶
问题:
- 宿主机无法直接访问容器中的文件。
- 容器中的文件无法持久化,导致容器删除后,文件数据也随之丢失。
- 容器之间也无法直接访问互相的文件
数据卷解决:
- 容器与主机之间、容器与容器之间共享文件。
- 容器中的数据持久化。
- 容器中的数据备份、迁移、恢复。
特点 ¶
- 数据卷存在于宿主机的文件系统中,独立于容器,和容器的生命周期是分离的。
- 数据卷可以目录也可以是文件,容器可以利用数据卷与宿主机进行数据共享,实现了容器间的数据共享和交换。
- 容器启动初始化时,如果容器使用的镜像包含了数据,这些数据会拷贝到数据卷中。
- 容器对数据卷的修改是实时进行的。
- 数据卷的变化不会影响镜像的更新。数据卷是独立于联合文件系统,镜像是基于联合文件系统。镜像与数据卷之间不会有相互影响。
挂载方式 ¶
- bind mounts:将宿主机上的文件或目录挂载到容器上。
- volume mounts:由 Docker 创建和管理的。
- tmps mounts:基于内存的临时文件系统,不会存储在磁盘上。
挂载 ¶
bind 挂载 ¶
命令格式:
docker run/create -v,--volume HOST_DIR:CONTAINER_DIR ... |
注意:
- 路径必须是绝对路径。
- src 指定的路径必须存在。
volume 挂载 ¶
命令格式:
docker run/create -v,--volume VOLUME_NAME:CONTAINER_DIR ... |
注意:
- VOLUME_NAME 是数据的名称,会将容器的目录挂载到宿主机的 /var/lib/docker/volumes/VOLUME_NAME/_data 上。
- 如果不指定 VOLUME_NAME,则会使用随机名称。
- VOLUME_NAME 不存在则会创建,存在则直接使用。
temps 挂载 ¶
命令格式:
docker run/create --tmpfs CONTAINER_DIR [CONTAINER_DIR...] ... |
数据卷容器挂载 ¶
作用:使用另一个容器的数据卷达到数据卷共享。
命令格式:
docker run/create --volumes-from CONTAINER ... |
数据卷管理 ¶
查看 ¶
作用:查看所有 volume 对象。
命令格式:
docker volume ls [OPTIONS] |
命令参数(OPTIONS):
- -f,–filter filter:根据提供的格式筛选结果(如
dangling=true
)。 - –format string:使用 Go 语言 format 格式化输出结果。
- -q,–quiet:只展示数据卷 ID。
详情 ¶
作用:查看一个或多个数据卷的详情信息。
命令格式:
docker volume inspect [OPTIONS] VOLUME [VOLUME...] |
命令参数(OPTIONS):
- -f,–format string:使用 Go 语言 format 格式化输出结果。
创建 ¶
作用:创建一个 volume 对象。
命令格式:
docker volume create [OPTIONS] [VOLUME] |
命令参数(OPTIONS):
- -d,-- driver string:指定数据卷 driver(默认 local)。
- –label list:设置元信息。
- -o,–opt map:设置 driver 指定选项(默认 map [])。
删除 ¶
作用:删除一个或多个数据卷对象。
命令格式:
docker volume rm [OPTIONS] |
命令参数(OPTIONS):
- -f,–force:强制删除。
清理 ¶
作用:删除未被使用的数据卷对象。
命令格式:
docker volume prune [OPTIONS] |
命令参数(OPTIONS):
- -a,–all:删除所有未被使用的数据卷。
- –filter filter:根据提供的格式删除数据卷(如
label=LABEL
)。 - -f,–force:强制删除。
注意事项 ¶
- 如果挂载一个空的数据卷到容器中的一个非空目录中,那么容器目录下的文件会被复制到宿主机的数据卷中。
- 如果挂载一个非空的数据卷到容器中的一个目录中,那么容器中的目录中会显示数据卷中的数据。如果原来容器中的目录中有数据,那么这些原始数据会被隐藏掉。
这两个规则都非常重要,灵活利用第一个规则可以帮助我们初始化数据卷中的内容。掌握第二个规则可以保证挂载数据卷后的数据总是你期望的结果。
远程仓库 ¶
简介 ¶
Docker 仓库上存放 docker 镜像,可以通过 pull 命令下载的云环境。
分为公有仓库和私有仓库。知名的公有仓库有 Docker Hub。
仓库搭建 ¶
无认证私有仓库的搭建 ¶
- 在服务器上安装并配置 docker。
- 启动仓库。
docker run -dti --restart always \ |
registry 镜像默认开放 5000 端口,默认镜像存放路径是 /var/lib/registry。
带认证私有仓库的搭建 ¶
- 在服务器上安装并配置 docker。
- 创建存放认证用户名和密码。
mkdir /my-registry/auth -p |
- 创建验证文件。
docker run --entrypoint htpasswd registry \ |
"htpasswd": executable file not found in $PATH 解决思路:
安装签证工具:
# CentOS |
创建验证文件:
htpasswd -Bbn USER_NAME PASSWORD > /my-registry/auth/htpasswd |
- 启动仓库。
docker run -d -p 5000:5000 --restart always \ |
仓库管理 ¶
可使用 HOST_IP:PORT/v2/_catalog
查看仓库的镜像。
登录 ¶
在带认证私有仓库进行上传和下载镜像时,需要先进行登录。
docker login -u USER_NAME -p PASSWORD HOTS_IP:PORT |
注销 ¶
执行完毕后,可退出该认证。
docker logout HOST_IP:PORT |
上传 ¶
- 重命名:想要对上传的镜像进行重命名,命名格式如下。
docker tag IMAGE HOST_IP:PORT/IMAGE_NAME |
- 上传镜像:将重命名后镜像上传到服务器的私有仓库。
docker push HOST_IP:PORT/IMAGE_NAME |
出现 https 错误,是因为创建的仓库默认使用 http 协议,而 push 默认使用 https 协议。
解决思路:使用 http 协议,修改配置文件 /etc/docker/daemon.json,添加 "insecure-registries":["HOST_IP:PORT"]
,重启 Docker。
下载 ¶
从指定的无认证私有仓库下载镜像。
docker pull HOST_IP:PORT/IMAGE_NAME |
Dockerfile¶
简介 ¶
是根据特定的语法格式撰写出来的一个普通文件。
利用 docker build 命令(基于 commit 命令)依次执行在 Dockerfile 中定义的一系列命令,最终生成一个新镜像(定制镜像)。
各大官方镜像 Dockerfile 文档。
使用 ¶
使用 Dockerfile 进行构建。
命令格式:
docker build [OPTIONS] PATH|URL|- |
命令参数(OPTIONS):
- -t,–tag list:指定镜像名及版本。
- -f,–file string:指定自定义 Dockerfile 文件。
注意:
- Dockerfile 中的每一步操作都会产生一层历史记录。
- 第一次构建后,后面的构建过程中,会在更改的位置及之后的步骤重新执行,否则将会使用已有的镜像缓存。
Dockerfile 指令 ¶
常用指令如下:
- FROM:指定基础镜像。
- RUN:构建镜像过程中需要执行的命令(一般使用 shell 方式)。
- CMD:添加启动容器时需要执行的命令,只会执行最后一条,且会被覆盖(一般使用 exec 方式)。
- ENTRYPOINT:同 CMD,且必须执行,不会被覆盖(一般使用 exec 方式)。
- LABEL:给镜像添加对应的说明数据。
- MAINTAINER:指定镜像作者(已被遗弃)。
- EXPOSE:设置对外暴露的端口,用于端口映射。
- ENV:设置执行命令时的环境变量,在构建完后依然生效。
- ARG:设置只在构建过程中使用的环境变量,构建完后失效。
- COPY:将本地文件或目录拷贝到镜像的文件系统中。
- ADD:同 COPY,且解压特定格式文件,可使用 URL。
- VOLUME:添加数据卷。
- USER:指定以哪个用户的权限执行 RUN、CMD、ENTRYPOINT 等命令。
- WORKDIR:设置工作目录。
- ONBUILD:在引用另一个 Dockerfile 之前,执行一些操作。
- STOPSIGNAL:设置容器退出时发出的关闭信号。
- HEALTHCHECK:设置容器状态检查。
- SHELL:更改执行 shell 命令的程序(Linux 默认为
["/bin/sh", "-c"]
、Windows 默认为["cmd", "/S", "/C"]
。
示例 ¶
如:构建一个 Flask 项目的 Dockerfile
# 1. 使用 Python 官方镜像作为基础镜像 |
Docker Compose¶
简介 ¶
Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。 借助 Compose,我们可以使用 YAML 文件来配置应用程序的服务。 只需一个命令,即可创建并启动所有服务。一般与 Dockerfile 搭配使用。
安装 ¶
Mac 和 Windows 安装 Docker 后会携带 Docker Compose,而 Linux 则需要额外安装,由于我们在安装 docker 时已经一起安装了,如未安装可按以下方式安装。
查看 docker-compose 版本:
docker compose version |
出现版本即已安装。
自动安装 ¶
# Ubuntu |
手动安装 ¶
- 下载安装包
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker} |
arm 架构的可下载:https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-linux-aarch64。
其他版本请参考:Releases · docker/compose。
- 执行文件
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose |
TOP 配置参数 ¶
Docker Compose File 顶级配置项:
- version、name:指定 Docker Compose File 版本号、名称。
- services:定义多个服务并配置启动参数。
- network:指定在多个服务中共同使用的网络对象。
- volumes:声明或创建在多个服务中共同使用的数据卷。
- config:声明在本服务中要使用的一些配置文件。
- secrets:声明在本服务中要使用的一些密钥、密码文件。
- x-***:自定义配置,用于复用多个服务的相同配置。
单机部署 ¶
使用 Docker Compose File 在单个机器部署一系列服务。
使用 Node.js 和 MongoDB 的 docker-compose.yaml
:
version: '3.8' |
其中的.env
文件内容如下:
# .env |
集群部署 ¶
集群部署的方案有很多,可以使用 docker 内置的 Swarm,也可以使用 Kubernetes。