Docker容器化技术从入门到实战:核心概念、安装部署与生产应用指南
1. 项目概述:为什么Docker是开发现代应用的基石
如果你是一名开发者或者运维工程师,最近几年肯定没少听到“Docker”这个词。它早已不是某个小众圈子里的玩具,而是成为了构建、分发和运行应用程序的事实标准。简单来说,Docker是一个容器化平台,它允许你将应用程序及其所有依赖项(库、配置文件、环境变量等)打包成一个标准化的单元,称为“容器”。这个容器可以在任何安装了Docker的环境中运行,无论是你的个人笔记本、公司的测试服务器,还是云端的生产环境,都能保证运行结果的一致性。
这解决了软件开发中一个老大难问题:“在我机器上能跑,为什么到你那就出错了?” Docker通过容器技术,将应用与底层操作系统解耦,确保了环境的一致性。无论是前端Vue项目、后端Java服务、数据库如MySQL或人大金仓,还是大数据组件如Hadoop,都可以通过Docker进行标准化封装。网络上热门的搜索词,如“docker安装教程”、“docker部署”、“docker常用命令”,恰恰反映了从入门到实践的巨大需求。很多人卡在第一步,比如在Windows上遇到“Docker Desktop failed to start because virtualization support wasn’t detected”这样的错误,或者在CentOS上纠结于服务启动失败和权限问题。这篇指南的目的,就是带你系统性地掌握Docker,从核心概念、安装避坑,到日常命令详解和实战部署,让你能真正把Docker用起来,而不是停留在“听说过”的层面。
2. Docker核心概念与工作原理拆解
在动手敲命令之前,理解Docker的几个核心概念至关重要。这能让你知其然,更知其所以然,在遇到问题时能快速定位。
2.1 镜像、容器与仓库:三位一体的核心模型
你可以把Docker的模型想象成面向对象编程:镜像(Image)是类,容器(Container)是类的实例,仓库(Registry)是存放类的库。
镜像(Image):一个只读的模板。它包含了运行某个软件所需的所有内容:代码、运行时环境、系统工具、库和设置。例如,nginx:latest就是一个包含了Nginx Web服务器的镜像。镜像是分层的,每一层代表Dockerfile中的一条指令。这种分层结构使得镜像非常轻量和高效,不同镜像可以共享相同的基础层(如Ubuntu层)。
容器(Container):镜像的一个运行实例。当你从镜像创建并启动一个容器时,Docker会在镜像层之上创建一个可写的“容器层”。所有对运行中容器的修改(如写入日志、安装临时软件)都发生在这个容器层。容器是隔离的,拥有自己的文件系统、网络和进程空间。它是真正承载应用运行的环境。
仓库(Registry):集中存放镜像的地方。最著名的公共仓库是Docker Hub,你可以从中拉取(pull)像mysql、redis这样的官方镜像。你也可以搭建私有仓库(如Harbor)来存放公司内部的镜像。操作镜像的命令,如docker pull、docker push,其操作对象就是仓库。
2.2 Docker与虚拟机的本质区别
很多人会把Docker容器和虚拟机(VM)搞混,因为它们都提供了隔离的运行环境。但它们的架构有根本性不同,这也决定了Docker为何如此轻量。
虚拟机:在每个VM中,都运行着一个完整的客户机操作系统(Guest OS),其下是虚拟化层(Hypervisor),再下面是物理服务器硬件。这带来了巨大的开销:每个VM都要分配独立的CPU、内存、磁盘空间,并运行一个完整的OS内核。
Docker容器:容器直接运行在宿主机的操作系统内核之上。所有容器共享宿主机的内核,但拥有各自独立的用户空间(文件系统、进程、网络等)。容器中不需要一个完整的OS,只需要包含应用及其依赖的库。这使得容器启动速度极快(秒级 vs 分钟级),资源消耗极小,密度可以远高于VM。
简单类比:虚拟机好比在一栋大楼里为每个租户建了一栋带独立地基、承重墙的“楼中楼”,而Docker容器则是在大楼统一框架下,用轻质隔断为每个租户隔出的独立房间。后者显然更高效。
2.3 Docker Desktop与Docker Engine:不同场景下的选择
这也是新手常困惑的点,尤其是在Windows和macOS上。
Docker Engine:这是Docker的核心,是一个C/S架构的应用程序。它包含一个长期运行的守护进程(dockerd)、一个REST API用于与守护进程交互,以及一个命令行接口(CLI)客户端(docker)。在Linux服务器上,我们通常直接安装Docker Engine。
Docker Desktop:这是为Windows和macOS用户设计的桌面端应用程序。它做了一个重要的事情:在非Linux系统上创建一个轻量级的Linux虚拟机(在Windows上通过WSL2或Hyper-V,在macOS上通过轻量级虚拟机),然后在这个虚拟机中运行Docker Engine。你桌面的docker命令实际上是通过网络与这个虚拟机中的Engine通信。这就是为什么在Windows上安装时,会要求你开启“虚拟化支持”或“Hyper-V/WSL2”,因为需要底层虚拟化技术来创建这个Linux环境。那些“virtualization support not detected”的错误,根源就在这里。
注意:对于生产环境的Linux服务器,绝不要安装Docker Desktop,直接安装Docker Engine即可。Docker Desktop是为开发者的桌面环境设计的,包含了图形界面等额外组件。
3. 跨平台安装指南与深度避坑
安装是万里长征第一步,也是劝退很多人的一步。下面我将针对不同系统,给出最稳妥的安装方案和排错心法。
3.1 Linux系统安装(以Ubuntu/CentOS为例)
在Linux上安装Docker Engine是最直接的。推荐使用官方提供的脚本或仓库安装,不推荐用系统自带的陈旧版本。
Ubuntu 22.04/20.04 安装步骤:
卸载旧版本(如果是全新安装可跳过):
sudo apt-get remove docker docker-engine docker.io containerd runc设置仓库:
sudo apt-get update sudo apt-get install ca-certificates curl gnupg lsb-release sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null安装Docker Engine:
sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin验证安装:
sudo docker run hello-world如果能看到欢迎信息,说明安装成功。
CentOS 7/RHEL 7 安装步骤:
CentOS 7的默认内核版本可能较低,建议先升级内核到较新版本(如3.10以上),但大多数情况下可以直接安装。
卸载旧版本:
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine设置仓库:
sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo安装Docker Engine:
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin启动并设置开机自启:
sudo systemctl start docker sudo systemctl enable docker验证安装:同样使用
sudo docker run hello-world。
实操心得:权限问题处理默认情况下,运行
docker命令需要sudo权限。为了方便,可以将当前用户加入docker用户组:sudo usermod -aG docker $USER。操作后必须退出当前终端并重新登录,用户组变更才会生效。这是新手常踩的坑,直接执行命令会报“权限错误”。
3.2 Windows/macOS安装与“虚拟化支持”错误根治
对于Windows 10/11和macOS,Docker Desktop是标准选择。
Windows安装核心要点:
前提条件检查:这是避免“Docker Desktop failed to start”的关键。
- Windows版本:必须是Windows 10 64位专业版、企业版或教育版(Build 16299或更高),或者Windows 11。家庭版需要额外步骤。
- 虚拟化支持:必须在BIOS/UEFI设置中开启CPU的虚拟化技术(Intel VT-x或AMD-V)。可以在任务管理器“性能”标签页的“CPU”部分查看“虚拟化”是否已启用。
- 功能启用:二选一。
- WSL2后端(推荐):适用于Windows 10版本 1903 及以上。需要先安装WSL2。在PowerShell(管理员)中运行:
这会安装默认的Linux发行版(通常是Ubuntu)并启用必要功能。wsl --install- Hyper-V后端:适用于Windows专业版/企业版。在“启用或关闭Windows功能”中勾选“Hyper-V”和“Windows虚拟机监控程序平台”。
安装Docker Desktop:从官网下载安装包,安装过程通常很简单。安装完成后,它会自动检测你的系统配置,推荐使用WSL2还是Hyper-V。
启动失败排查:
- 错误信息明确:如果提示“Virtualization support not detected”,请返回第一步,务必在BIOS和Windows功能中确保虚拟化已开启。
- 重启是关键:更改BIOS设置或启用Windows功能后,必须完整重启电脑,而不是关机再开机。
- 杀毒软件/安全软件冲突:某些安全软件可能会阻止Docker Desktop的虚拟化驱动。尝试暂时禁用它们。
- 查看日志:Docker Desktop启动失败后,可以查看其日志文件(通常在
%AppData%\Docker\log下)获取更详细的错误信息。
macOS安装:相对简单,直接从官网下载.dmg文件安装即可。要求macOS版本10.15及以上,基于Intel或Apple Silicon芯片均可。
3.3 配置国内镜像加速器
从Docker Hub拉取镜像速度可能很慢,配置国内镜像加速器是必做操作。
Linux系统:编辑(或创建)
/etc/docker/daemon.json文件。{ "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com", "https://mirror.baidubce.com" ] }可以配置多个,Docker会按顺序尝试。然后重启服务:
sudo systemctl restart docker。Docker Desktop:在设置(Settings)中找到 Docker Engine,直接修改JSON配置,添加
registry-mirrors项,然后点击“Apply & Restart”。
4. Docker命令全解:从入门到精通
Docker的命令行接口(CLI)是其灵魂。命令虽多,但有清晰的逻辑。我们可以将其分为:生命周期管理、镜像操作、容器运维、数据与网络几大类。
4.1 镜像生命周期命令:拉取、查看、构建、清理
镜像是容器的基础,管理好镜像是第一步。
docker pull:从仓库拉取镜像。docker pull nginx:1.21-alpinenginx是镜像名,1.21-alpine是标签(Tag),指定版本和变体。不指定标签时默认为latest。- 技巧:生产环境务必指定明确版本标签,避免使用
latest,因为它会变化,导致环境不一致。
docker images:列出本地所有镜像。docker images # 显示 REPOSITORY, TAG, IMAGE ID, CREATED, SIZEdocker rmi:删除本地镜像。docker rmi nginx:1.21-alpine docker rmi <image-id> # 通过IMAGE ID删除- 注意:如果该镜像有正在运行的容器依赖,需要先停止并删除容器,或使用
-f强制删除(不推荐)。
- 注意:如果该镜像有正在运行的容器依赖,需要先停止并删除容器,或使用
docker build:根据Dockerfile构建镜像。这是自定义镜像的核心命令。docker build -t my-app:1.0 .-t:为镜像打标签(名称:版本)。.:指定构建上下文路径,Dockerfile默认应位于此路径下。
docker image prune:清理未被使用的镜像(悬空镜像)。docker image prune -a-a:删除所有未被任何容器引用的镜像,而不仅仅是悬空镜像。定期执行可以释放大量磁盘空间。
4.2 容器生命周期命令:创建、启动、停止、交互
容器是镜像的运行实例,管理容器是日常操作。
docker run:创建并启动一个新容器。这是最复杂也最强大的命令。docker run -d --name my-nginx -p 8080:80 -v /host/path:/container/path nginx:alpine-d:后台运行(detached mode)。--name:为容器指定一个易读的名称,否则Docker会分配一个随机名称。-p:端口映射,格式为主机端口:容器端口。将容器内的80端口映射到主机的8080端口。-v:数据卷挂载,格式为主机路径:容器路径。实现主机与容器间的数据持久化和共享。nginx:alpine:使用的镜像。
docker ps:列出容器。docker ps # 列出正在运行的容器 docker ps -a # 列出所有容器(包括已停止的)docker start/stop/restart:启动、停止、重启一个已存在的容器。docker stop my-nginx docker start my-nginx docker restart my-nginxdocker exec:在运行中的容器内执行命令。这是调试和操作的利器。docker exec -it my-nginx /bin/sh-i:保持标准输入打开。-t:分配一个伪终端(pseudo-TTY)。-it通常一起使用,实现交互式操作。/bin/sh:要执行的命令,这里是启动一个shell。
docker logs:查看容器的日志输出。docker logs my-nginx docker logs -f my-nginx # -f 参数可以实时跟踪日志(类似 tail -f)docker rm:删除已停止的容器。docker rm my-nginx docker rm -f my-nginx # -f 强制删除运行中的容器(先发送SIGKILL信号)
4.3 容器运维与信息查看命令
docker inspect:获取容器(或镜像)的底层详细信息,以JSON格式返回。用于查看配置、网络、挂载卷等所有元数据。docker inspect my-nginx | grep IPAddress # 查看容器的IP地址docker stats:实时显示容器的资源使用情况统计(CPU、内存、网络IO、磁盘IO等)。docker statsdocker top:查看容器内运行的进程列表。docker top my-nginxdocker cp:在容器和主机文件系统之间复制文件/目录。docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf.bak # 从容器复制到主机 docker cp ./config.json my-nginx:/app/config.json # 从主机复制到容器
4.4 数据卷与网络管理命令
数据持久化和网络通信是容器化应用的关键。
数据卷(Volume)管理:
docker volume create:创建一个命名的数据卷,这是Docker管理的持久化存储的最佳实践。docker volume create my-datadocker volume ls:列出所有数据卷。- 在
docker run时使用-v挂载:docker run -d -v my-data:/app/data my-app # 使用命名卷 docker run -d -v /host/path:/app/data my-app # 使用绑定挂载(bind mount)注意:绑定挂载直接将主机目录映射到容器,性能好但依赖主机路径;命名卷由Docker管理,更便携,是生产环境首选。
网络(Network)管理:
docker network create:创建一个自定义网络。容器加入同一自定义网络后,可以通过容器名互相通信(Docker内置的DNS解析)。docker network create my-network docker run -d --name app1 --network my-network my-app docker run -d --name app2 --network my-network another-app # 现在在app2容器内,可以直接 ping app1docker network ls:列出所有网络。docker network connect/disconnect:将容器连接到某个网络或从网络断开。
5. Dockerfile编写实战:构建自定义镜像
Dockerfile是一个文本文件,包含了一系列构建镜像的指令。掌握Dockerfile是自定义应用环境的核心。
5.1 Dockerfile指令精讲
一个典型的Dockerfile示例(用于一个简单的Python Flask应用):
# 第一阶段:构建阶段 FROM python:3.9-slim AS builder WORKDIR /app COPY requirements.txt . RUN pip install --user -r requirements.txt # 第二阶段:运行阶段 FROM python:3.9-slim WORKDIR /app # 从builder阶段复制已安装的包 COPY --from=builder /root/.local /root/.local # 确保脚本能找到用户安装的包 ENV PATH=/root/.local/bin:$PATH # 复制应用代码 COPY . . # 声明容器运行时监听的端口 EXPOSE 5000 # 定义容器启动时执行的命令 CMD ["python", "app.py"]FROM:指定基础镜像。最佳实践是使用官方、特定版本、轻量级变体(如-slim,-alpine)的镜像。多阶段构建(如上例)可以显著减小最终镜像体积。WORKDIR:设置工作目录。后续的RUN、CMD、COPY等指令都会在这个目录下执行。COPY:将文件从构建上下文复制到镜像中。COPY . .表示将当前目录(构建上下文)下的所有文件复制到镜像的/app目录。RUN:在构建镜像时执行命令。常用于安装软件包、编译代码等。多条RUN指令应尽量合并,并用&&连接,以减少镜像层数。ENV:设置环境变量。这些变量在容器运行时可用。EXPOSE:声明容器运行时监听的端口。这只是一个文档说明,实际端口映射需要在docker run时用-p参数指定。CMD:指定容器启动时默认执行的命令。一个Dockerfile只能有一个CMD指令。格式推荐使用exec格式(["executable", "param1", "param2"]),这能确保正确的信号传递。
5.2 镜像构建优化与最佳实践
使用
.dockerignore文件:类似于.gitignore,它告诉Docker在构建时忽略哪些文件和目录。避免将node_modules、.git、日志等不必要的文件复制到镜像中,可以加速构建和减小镜像体积。**/node_modules **/.git *.log Dockerfile README.md层缓存与构建顺序:Docker会缓存每一层。如果某一层及其之前的所有层都没有变化,Docker会直接使用缓存。因此,将变化频率低的指令(如安装依赖)放在前面,变化频率高的指令(如复制源代码)放在后面,可以最大化利用缓存。
多阶段构建:如上例所示,在第一个“构建”阶段安装编译工具、构建应用;在第二个“运行”阶段,只复制构建好的产物。这样最终镜像只包含运行所需的最小内容,体积非常小。
非root用户运行:默认情况下,容器内的进程以root用户运行,存在安全风险。应在Dockerfile中创建并使用非root用户。
RUN groupadd -r appuser && useradd -r -g appuser appuser USER appuser
6. Docker Compose:定义和运行多容器应用
当你的应用由多个服务组成(例如一个Web应用+一个数据库+一个缓存),使用docker run一个个启动和管理会非常繁琐。Docker Compose就是解决这个问题的工具,它通过一个YAML文件(docker-compose.yml)来定义和运行多个容器。
6.1 docker-compose.yml文件结构解析
一个典型的docker-compose.yml示例(定义了一个WordPress应用,包含WordPress和MySQL):
version: '3.8' # 指定Compose文件格式版本 services: # 定义所有服务 db: # 服务名:数据库 image: mysql:8.0 volumes: - db_data:/var/lib/mysql # 使用命名卷持久化数据 restart: always environment: # 设置环境变量 MYSQL_ROOT_PASSWORD: some_root_password MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress_password networks: - wp-network wordpress: # 服务名:WordPress depends_on: # 依赖关系,确保db先启动 - db image: wordpress:latest ports: - "8080:80" # 主机端口:容器端口 restart: always environment: WORDPRESS_DB_HOST: db:3306 # 使用服务名‘db’作为主机名,Compose提供了服务发现 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress_password WORDPRESS_DB_NAME: wordpress volumes: - wp_data:/var/www/html # 持久化WordPress文件 networks: - wp-network volumes: # 声明在文件顶部使用的命名卷 db_data: wp_data: networks: # 声明自定义网络 wp-network: driver: bridge6.2 Docker Compose常用命令
docker compose up:创建并启动所有服务。-d参数用于后台运行。docker compose up -ddocker compose down:停止并删除所有容器、网络。-v参数会同时删除在volumes部分声明的命名卷(数据会被清除!请谨慎使用)。docker compose downdocker compose ps:列出项目中的所有容器。docker compose logs:查看所有服务的日志。-f跟踪实时日志,[service_name]查看特定服务日志。docker compose logs -f wordpressdocker compose exec:在运行的服务容器中执行命令。docker compose exec db mysql -u root -pdocker compose build:如果服务配置中使用了build上下文(而非image),此命令可以重新构建镜像。
使用Docker Compose,你可以用一行命令启动一个复杂的多服务应用环境,极大地简化了开发和测试流程。对于部署Vue项目(需要Nginx)、Kodbox(需要Web环境+数据库)或Collabora Online等复杂应用,编写一个docker-compose.yml文件是标准做法。
7. 实战部署:从零部署一个Web应用
让我们通过一个完整的实战,将上述所有知识串联起来:部署一个简单的静态网站(例如一个Vue项目构建产物)到Nginx容器中。
7.1 准备应用与Dockerfile
假设你的Vue项目构建后的文件在dist目录下。
编写Dockerfile(
Dockerfile.nginx):# 使用轻量级的Nginx镜像 FROM nginx:alpine # 删除默认的欢迎页面 RUN rm /etc/nginx/conf.d/default.conf # 将自定义的Nginx配置文件复制到容器中 COPY nginx.conf /etc/nginx/conf.d/ # 将构建好的静态文件复制到Nginx的默认服务目录 COPY dist/ /usr/share/nginx/html/ # 声明端口(非必须,但作为文档) EXPOSE 80 # Nginx镜像已有默认的CMD,无需指定编写Nginx配置文件(
nginx.conf):server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html; # 支持Vue Router的history模式 } # 可以添加其他配置,如gzip压缩、静态资源缓存等 }
7.2 构建镜像并运行容器
构建镜像:
docker build -t my-vue-app:1.0 -f Dockerfile.nginx .运行容器:
docker run -d --name vue-app -p 8080:80 my-vue-app:1.0现在,打开浏览器访问
http://localhost:8080,就能看到你的Vue应用了。
7.3 使用Docker Compose编排(进阶)
如果应用更复杂,比如还需要一个后端API服务,可以使用Docker Compose。
docker-compose.yml:
version: '3.8' services: frontend: build: context: . dockerfile: Dockerfile.nginx ports: - "8080:80" depends_on: - backend networks: - app-network backend: # 假设后端是一个简单的Node.js API build: context: ./backend dockerfile: Dockerfile.node environment: - NODE_ENV=production networks: - app-network networks: app-network:在这个编排中,前端服务可以通过服务名backend直接访问后端服务(例如http://backend:3000/api),Docker Compose的网络机制会自动处理服务发现。
8. 生产环境注意事项与高级技巧
将Docker用于生产环境,需要考虑更多因素。
8.1 资源限制与监控
不能让一个容器无限制地占用主机资源。
资源限制:在
docker run或docker-compose.yml中设置。docker run -d --name my-app \ --memory="512m" \ # 限制内存为512MB --cpus="1.5" \ # 限制使用1.5个CPU核心 --cpu-shares=1024 \ # CPU权重(默认1024) my-app-image在Compose文件中:
services: app: deploy: resources: limits: cpus: '1.5' memory: 512M监控:使用
docker stats命令进行简单监控。对于生产环境,需要集成更专业的监控系统,如Prometheus(配合cAdvisor)来收集容器指标,或使用商业监控方案。
8.2 日志管理
容器默认将日志输出到标准输出(stdout)和标准错误(stderr)。Docker Engine会捕获这些流。
- 日志驱动:Docker支持多种日志驱动(json-file, syslog, journald, fluentd等)。默认是
json-file,日志文件会堆积在主机上(/var/lib/docker/containers/<container-id>/<container-id>-json.log)。 - 日志轮转:对于
json-file驱动,可以在/etc/docker/daemon.json中配置日志轮转策略,防止日志占满磁盘。
这表示每个容器日志文件最大10MB,最多保留3个文件。{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } } - 集中式日志:生产环境推荐使用
fluentd、ELK(Elasticsearch, Logstash, Kibana)或Loki等方案,将所有容器的日志集中收集、存储和分析。
8.3 安全最佳实践
- 使用非root用户:如Dockerfile部分所述,在容器内使用非特权用户运行进程。
- 定期更新镜像:基础镜像和应用镜像都可能存在安全漏洞。定期使用
docker pull更新到最新安全版本,并重建自己的镜像。 - 扫描镜像漏洞:使用
docker scan命令(集成Snyk)或Trivy、Clair等工具扫描本地镜像中的已知漏洞。 - 限制容器能力:使用
--cap-drop和--cap-add来精细控制容器拥有的Linux能力(Capabilities),遵循最小权限原则。docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx # 只保留绑定特权端口的权限 - 避免在镜像中存储敏感信息:不要将密码、API密钥等硬编码在Dockerfile或镜像中。应通过环境变量(
-e或environment)、Docker Secrets(Swarm模式)或外部配置中心传入。
8.4 数据备份与恢复
对于使用数据卷(Volume)的容器,备份至关重要。
- 备份命名卷:创建一个临时容器,挂载需要备份的卷和主机的一个备份目录,然后使用
tar命令打包数据。docker run --rm -v my-data:/data -v /host/backup:/backup alpine tar czf /backup/my-data-backup.tar.gz -C /data . - 恢复命名卷:同样使用临时容器,将备份文件解压到卷中。
docker run --rm -v my-data:/data -v /host/backup:/backup alpine sh -c "cd /data && tar xzf /backup/my-data-backup.tar.gz --strip-components=1"
Docker的世界远不止于此,还有Docker Swarm、Kubernetes等容器编排工具,以及CI/CD中的镜像构建和推送。但掌握以上内容,你已经能够游刃有余地使用Docker来容器化绝大多数应用,解决从开发到部署中的环境一致性问题。记住,多动手实践,遇到问题善用docker --help、docker logs和搜索引擎,社区的解决方案通常非常丰富。
