Docker 使用指南
Docker 使用指南
Section titled “Docker 使用指南”1 基本概念
Section titled “1 基本概念”容器运行所在的计算机上是宿主机
- Image 镜像,可以类比成为一个虚拟机器的快照
- Container 容器,是 Image 的运行的实例,他们之间隔离
- Dockerfile,用于自动化安装的一个文件
2 Docker 基础概念
Section titled “2 Docker 基础概念”Docker 概述: Docker 是一种成熟高效的软件部署技术,利用容器化技术为应用程序封装独立的运行环境。每个运行环境即为一个容器,承载容器运行的计算机称为宿主机。
容器与虚拟机的区别:
Docker 容器: 多个容器共享同一个系统内核。
虚拟机: 每个虚拟机包含一个操作系统的完整内核。
优势: Docker 容器比虚拟机更轻量、占用空间更小、启动速度更快。
镜像 (Image):
定义: 镜像是容器的模板,可类比为软件安装包。
类比: 类似于制作糕点的模具,可用于创建多个糕点(容器),并可分享给他人。
容器 (Container):
定义: 容器是基于镜像运行的应用程序实例,可类比为安装好的软件。
类比: 类似于模具制作出的糕点。
Docker 仓库 (Registry):
定义: 用于存放和分享 Docker 镜像的场所。
Docker Hub: Docker 的官方公共仓库,存储了大量用户分享的 Docker 镜像。
3 Docker 镜像管理命令
Section titled “3 Docker 镜像管理命令”3.1 docker pull - 下载镜像
Section titled “3.1 docker pull - 下载镜像”功能: 从 Docker 仓库下载镜像到本地。
镜像构成: 一个完整的镜像名称包含四部分:[registry_address/][namespace/]image_name[:tag]
registry_address: Docker 仓库的注册表地址。docker.io表示 Docker Hub 官方仓库,可省略。
namespace: 命名空间,通常是作者或组织名称。library是 Docker 官方仓库的命名空间,可省略。
image_name: 镜像的名称。
tag: 镜像的标签名,通常表示版本号。latest表示最新版本,可省略。
例如:
# 从Docker Hub官方仓库下载最新版Nginx镜像docker pull nginx# 从N8n的私有仓库下载N8n镜像docker pull n8n/n8n另外有一个 —platform 参数,可以指定芯片相关的参数,一般来说不用关心,会自动选择最合适的下载
Docker Hub 网站: hub.docker.com是官方仓库,可搜索、查看镜像详情(如官方镜像、版本号、使用说明)。
Registry (注册表) 与 Repository (镜像库):
Registry: 整个 Docker Hub 网站可视为一个 Registry 。
Repository: 一个 Repository(如 Nginx)存储了同一个镜像的不同版本
有时候官方网站连不上,可以连接镜像:在 Docker Desktop 的设置中,进入“Docker Engine”配置项,在registry-mirrors中添加镜像站地址,点击“Apply & Restart”。
3.2 docker images - 列出本地镜像
Section titled “3.2 docker images - 列出本地镜像”功能: 列出所有已下载到本地的 Docker 镜像。
3.3 docker rmi - 删除镜像
Section titled “3.3 docker rmi - 删除镜像”功能: 删除本地的 Docker 镜像。
参数: 可指定镜像名称或 ID 。
4 Docker 容器管理命令
Section titled “4 Docker 容器管理命令”docker run功能: 使用指定的镜像创建并运行一个容器。
自动拉取: 如果本地不存在指定镜像,docker run会先自动拉取镜像,再创建并运行容器。
-
-d(Detached Mode):让容器在后台执行,不阻塞当前终端窗口。控制台只打印容器 ID,容器日志不会直接输出到终端。 -
-p(Port Mapping / 端口映射):将宿主机的端口映射到容器内部的端口
- 语法:
-p <宿主端口>:<容器端口>
-v(Volume Mounting / 挂载卷):将宿主机的文件目录与容器内的文件目录进行绑定。
- 语法:
-v <宿主机目录路径>:<容器内部目录路径>。
-v命名卷挂载 (Named Volume): 让 Docker 自动创建一个存储空间,并为其命名。
- 创建命名卷:
docker volume create <卷名称>。 - 使用命名卷:
-v <卷名称>:<容器内部目录路径>。 - 特点: 命名卷在第一次使用时,Docker 会将容器的文件夹内容同步到命名卷进行初始化(绑定挂载无此功能)
-e(Environment Variables / 环境变量):向容器内部传递环境变量
- 语法:
-e <KEY>=<VALUE>,可在 Docker Hub 镜像文档或开源项目的 GitHub 仓库中查找可用的环境变量。
-
--name(自定义容器名称):为容器指定一个自定义的、在宿主机上唯一的名称,方便记忆和管理。 -
-it(Interactive & TTY / 交互式终端):让控制台进入容器内部,获得一个交互式的命令行环境。
-
用途: 临时调试容器,执行 Linux 命令。
-
语法:
docker run -it <镜像名称> /bin/bash(或/bin/sh)。
--rm(运行结束后自动删除):
-
功能: 当容器停止时,自动将其从宿主机上删除。
-
常用组合: 与
-it联用,用于临时调试场景。
--restart(重启策略):
-
功能: 配置容器停止时的重启行为。
-
常用策略:
-
always: 只要容器停止(包括内部错误崩溃、宿主机断电等),就会立即重启。 -
unless-stopped: 除非手动停止容器,否则都会尝试重启。对于生产环境非常有用,可自动重启因意外停止的容器,而手动停止的容器不会再重启。
4.1 挂载卷管理
Section titled “4.1 挂载卷管理”docker volume常用管理命令
docker volume ls: 列出所有创建过的卷。
docker volume inspect <卷名称>: 查看卷的详细信息,包括在宿主机的真实目录。
docker volume rm <卷名称>: 删除一个卷。
docker volume prune: 删除所有未被任何容器使用的卷。
4.2 查看运行的容器
Section titled “4.2 查看运行的容器”docker ps输出信息包括:Container ID(容器唯一 ID)、Image(基于哪个镜像创建)、Names(容器名称)。
4.2.1 可用参数
Section titled “4.2.1 可用参数”-a查看所有容器
4.3 容器启停
Section titled “4.3 容器启停”docker stop <容器ID或名称>: 停止一个正在运行的容器。
docker start <容器ID或名称>: 重新启动一个已停止的容器。
参数保留: 使用stop和start启停容器时,之前docker run时设置的端口映射、挂载卷、环境变量等参数都会被 Docker 记录并保留,无需重新设置。
docker inspect <容器ID或名称>: 查看容器的详细配置信息。输出内容复杂,可借助 AI 辅助分析。
docker create <镜像名称>: 只创建容器,但不立即启动。若要启动,需后续执行docker start命令
容器内部操作与调试
Section titled “容器内部操作与调试”docker logs <容器ID或名称>: 查看容器的运行日志。
-f: 滚动查看日志,实时刷新。
Docker 技术原理简述:
Cgroups (Control Groups): 用于限制和隔离进程的资源使用(CPU 、内存、网络带宽等),确保容器资源消耗不影响宿主机或其他容器。
Namespaces: 用于隔离进程的资源视图,使得容器只能看到自己内部的进程 ID 、网络资源和文件目录,而看不到宿主机的。
本质: Docker 容器本质上是一个特殊的进程,但进入容器内部后,其表现如同一个独立的操作系统。
docker exec - 在容器内部执行命令:
功能: 在一个正在运行的 Docker 容器内部执行 Linux 命令。
语法: docker exec <容器ID或名称> <命令>。
示例: docker exec my_nginx ps -ef查看容器内进程。
进入交互式环境: docker exec -it <容器ID或名称> /bin/sh(或/bin/bash)可进入容器内部获得交互式命令行环境,进行文件系统查看、进程管理或深入调试。
注意: 容器内部通常是极简操作系统,可能缺失vi等常用工具,需要自行安装(如 Debian 系容器使用apt update和apt install vim)。
5 Dockerfile 构建镜像
Section titled “5 Dockerfile 构建镜像”定义: Dockerfile 是一个文本文件,详细列出了如何制作 Docker 镜像的步骤和指令,可类比为制作模具的图纸。
基本结构与指令:
FROM <基础镜像>: 所有 Dockerfile 的第一行,选择一个基础镜像,表示新镜像在此基础上构建。
WORKDIR <目录路径>: 设置镜像内的工作目录,后续命令在此目录下执行。
COPY <源路径> <目标路径>: 将宿主机的文件或目录拷贝到镜像内的指定路径。
RUN <命令>: 在镜像构建过程中执行的命令(例如安装依赖)。
EXPOSE <端口号>: 声明镜像提供服务的端口(仅为声明,非强制,实际端口映射仍由-p参数决定)。
CMD <命令>: 容器运行时默认执行的启动命令。一个 Dockerfile 只能有一个CMD指令。
ENTRYPOINT <命令>: 与CMD类似,但优先级更高,不易被docker run命令覆盖。
docker build - 构建镜像:
功能: 根据 Dockerfile 构建 Docker 镜像。
语法: docker build -t <镜像名称>[:<版本号>] <Dockerfile所在目录>。
示例: docker build -t docker-test . (在当前目录构建名为docker-test的镜像)。
镜像推送至 Docker Hub:
-
登录 Docker Hub:
docker login。 -
重新标记镜像:
docker tag <本地镜像名称> <你的用户名>/<镜像名称>[:<版本号>]。推送时镜像名称必须包含用户名作为命名空间。 -
推送镜像:
docker push <你的用户名>/<镜像名称>[:<版本号>]。 -
验证: 在 Docker Hub 网站上可搜索到已推送的镜像,其他用户即可通过
docker pull下载使用。
6 Docker 网络模式
Section titled “6 Docker 网络模式”Bridge (桥接模式)
Section titled “Bridge (桥接模式)”默认模式: 所有容器默认连接到此网络。
内部 IP: 每个容器被分配一个内部 IP 地址(通常是172.17.x.x开头)。
通信: 同一 Bridge 网络内的容器可以通过内部 IP 地址互相访问。容器网络与宿主机网络默认隔离,需通过端口映射(-p)才能从宿主机访问。
自定义子网:
创建: docker network create <子网名称>。
加入: docker run --network <子网名称> ...。
优势:
同一子网内的容器可以使用容器名称互相访问(Docker 内部 DNS 机制)。
不同子网之间默认隔离。
Host (主机模式)
Section titled “Host (主机模式)”功能: Docker 容器直接共享宿主机的网络命名空间。
IP 地址: 容器直接使用宿主机的 IP 地址。
端口: 无需端口映射(-p),容器内的服务直接运行在宿主机的端口上,通过宿主机的 IP 和端口即可访问。
用途: 解决一些复杂的网络问题。
语法: docker run --network host ...。
None (无网络模式)
Section titled “None (无网络模式)”功能: 容器不连接任何网络,完全隔离。
语法: docker run --network none ...。
网络管理命令:
docker network ls: 列出所有 Docker 网络(包括默认的 bridge 、 host 、 none 以及自定义子网)。
docker network rm <网络名称>: 删除自定义子网(默认网络不可删除)。