免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

Ubuntu 22.04 Docker安装配置全攻略:从零到生产环境部署

Ubuntu 22.04 Docker安装配置全攻略:从零到生产环境部署 1. 项目概述为什么在Ubuntu 22.04上部署Docker是当下的明智之选如果你是一名开发者、运维工程师或者正在学习云原生技术那么Docker绝对是你绕不开的核心工具。它通过容器化技术将应用及其所有依赖打包成一个标准化的单元彻底解决了“在我机器上能跑”的经典难题。而Ubuntu 22.04 LTSJammy Jellyfish作为一款长期支持、稳定且社区活跃的Linux发行版是运行Docker的绝佳平台。这篇指引的目的就是为你提供一份从零开始、覆盖所有关键细节和潜在坑点的Docker安装与配置全攻略。无论你是刚接触Linux的新手还是需要为团队搭建标准化环境的资深工程师这份指引都将帮你绕过我踩过的那些坑高效、稳定地完成部署。我们将不仅完成安装更会深入配置优化、权限管理和日常使用技巧让你真正掌握这个强大的工具。2. 环境准备与系统检查在开始安装任何软件之前对系统进行“体检”是确保后续流程顺畅的关键。盲目操作可能导致依赖冲突、权限问题甚至系统不稳定。2.1 确认系统版本与架构首先我们需要确认当前系统确实是Ubuntu 22.04并且了解其硬件架构。打开终端执行以下命令lsb_release -a你会看到类似如下的输出No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy关键信息是Release: 22.04和Codename: jammy。这确认了我们操作的基础是正确的。接下来查看系统架构uname -m常见的输出有x86_64(AMD64架构) 或aarch64(ARM64架构如苹果M系列芯片或树莓派)。Docker官方为这两种主流架构都提供了完善的支持但后续的安装包选择需要与此对应。2.2 更新现有软件包索引一个最新的软件源列表是安装成功的前提。Ubuntu使用APTAdvanced Package Tool进行包管理我们首先更新本地软件包索引文件这个文件记录了各个软件仓库中所有可用软件包的版本信息。sudo apt update这个命令本身不升级任何已安装的软件它只是从配置的软件源如官方的archive.ubuntu.com或国内镜像源拉取最新的软件包列表。看到“所有包均为最新”或列出可升级包数量的提示即表示成功。2.3 安装基础依赖工具有些工具虽然不是Docker直接组成部分但在安装过程中或后续使用中会非常方便。我们一并安装sudo apt install -y apt-transport-https ca-certificates curl software-properties-common gnupg lsb-releaseapt-transport-https允许APT通过HTTPS协议与软件源通信增强安全性。ca-certificates存储受信任的CA证书颁发机构根证书用于验证HTTPS连接。curl命令行工具用于从网络下载数据我们将用它来获取Docker的GPG密钥。software-properties-common提供add-apt-repository命令用于管理PPA个人软件包存档或其他软件源。gnupgGNU隐私卫士用于管理加密密钥我们将用它来验证Docker官方软件包的签名。lsb-release我们已经用过的命令它帮助系统脚本更容易地获取发行版信息。-y参数表示自动确认安装提示避免中途需要手动输入“Y”。注意如果你的服务器或主机位于国内为了获得更快的下载速度建议先将Ubuntu的官方软件源替换为国内镜像源如阿里云、腾讯云、华为云镜像。这需要在执行sudo apt update之前修改/etc/apt/sources.list文件。由于这属于系统优化范畴且步骤稍多本指引专注于Docker安装你可以自行搜索“Ubuntu 22.04 更换国内源”完成此操作这将大幅提升后续所有软件包的下载速度。3. Docker安装方案选型与实施安装Docker主要有三种途径使用Ubuntu官方仓库、使用Docker官方仓库、或使用便捷脚本。每种方式各有优劣我将详细拆解并推荐最稳妥的方案。3.1 方案对比官方仓库 vs 系统仓库Ubuntu官方仓库不推荐命令sudo apt install docker.io优点最简单与系统集成度最高。缺点版本通常不是最新的稳定版。Ubuntu 22.04仓库中的docker.io包版本可能落后于Docker官方数月甚至更久会错过重要的新特性、性能优化和安全补丁。对于生产环境或需要最新功能的开发者这不是一个好选择。Docker官方APT仓库推荐优点能第一时间获得官方维护的最新稳定版Stable或测试版Edge/Nightly。这是Docker公司推荐的安装方式保证了软件的完整性和更新路径的顺畅。缺点步骤稍多需要添加额外的软件源。便捷安装脚本慎用命令curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh优点极度简单一条命令完成所有工作。缺点缺乏透明度和控制力。脚本会自动执行一系列操作添加源、安装、配置用户组等你无法精确控制每一步。在安全要求高的环境或需要审计的系统中应避免使用。它更适合快速测试或个人学习。结论对于绝大多数场景尤其是生产环境使用Docker官方APT仓库是最佳实践。它兼顾了版本新鲜度、安全可控性和可维护性。下面的步骤将基于此方案展开。3.2 添加Docker官方GPG密钥与软件源为了保证软件包的真实性和完整性APT需要GPG密钥来验证从Docker仓库下载的包。首先下载并添加Docker的官方GPG密钥。sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod ar /etc/apt/keyrings/docker.gpg这里我们做了几件事创建了一个目录/etc/apt/keyrings用于存放密钥如果不存在并设置合适的权限0755。使用curl安全地-f失败时静默-s静默模式-S显示错误-L跟随重定向下载密钥。通过管道|将下载的密钥流传递给gpg --dearmor命令。--dearmor是将ASCII格式的GPG密钥转换为二进制格式这是APT所要求的。将转换后的密钥保存到/etc/apt/keyrings/docker.gpg。最后将该密钥文件的权限设置为所有用户可读ar。接下来添加Docker的APT软件源。我们需要根据系统架构来构造正确的源地址。echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release echo $VERSION_CODENAME) stable | \ sudo tee /etc/apt/sources.list.d/docker.list /dev/null这条命令看起来复杂实际上是一个智能化的构造arch$(dpkg --print-architecture)自动获取当前系统的架构如amd64或arm64。signed-by/etc/apt/keyrings/docker.gpg明确指定用于验证此软件源的GPG密钥路径。$(. /etc/os-release echo $VERSION_CODENAME)自动获取当前系统的代号对于Ubuntu 22.04就是jammy。stable指定使用稳定版仓库。如果你想尝试测试版可以替换为test或nightly但生产环境务必使用stable。命令最终会将构造好的源字符串写入到/etc/apt/sources.list.d/docker.list这个独立文件中。这种将不同软件的源分开管理的做法非常清晰便于维护和移除。3.3 安装Docker引擎及相关组件添加源之后再次更新APT包索引让系统识别出新添加的Docker仓库。sudo apt update现在你可以看到更新列表中包含了来自download.docker.com的源。接下来安装Docker的核心包sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin这里安装了五个核心组件docker-ceDocker社区版Community Edition引擎是运行容器的核心。docker-ce-cliDocker命令行接口我们使用的docker命令就来自这里。containerd.io一个行业标准的容器运行时Docker引擎实际上是在其基础上构建的。它负责管理容器的生命周期创建、启动、停止、删除等。docker-buildx-plugin一个CLI插件用于扩展Docker的构建功能支持多平台构建比如在x86机器上构建ARM镜像、高效的构建缓存等是现代Docker工作流的重要组成部分。docker-compose-plugin这是新的Docker Compose V2它已集成到Docker CLI中通过docker compose命令使用。它用于定义和运行多容器应用比旧的独立docker-compose工具集成度更好。安装完成后Docker服务会自动启动并设置为开机自启。我们可以通过以下命令验证sudo systemctl status docker你应该看到绿色的“active (running)”状态。如果没有可以使用sudo systemctl start docker手动启动sudo systemctl enable docker设置开机自启。4. 权限配置与用户组管理安装完成后直接运行docker ps命令你很可能会遇到权限错误Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json: dial unix /var/run/docker.sock: connect: permission denied这是因为Docker守护进程daemon通过一个Unix套接字/var/run/docker.sock与客户端通信而这个套接字默认只允许root用户和docker用户组的成员访问。4.1 将当前用户加入docker组最安全便捷的做法不是每次都使用sudo而是将你的普通用户添加到docker用户组中。sudo usermod -aG docker $USERusermod修改用户属性的命令。-aG-a表示追加append-G指定要加入的附加组。这个组合至关重要它确保将用户添加到docker组的同时不会移除该用户原有的其他组。如果只用-G docker用户会只属于docker组这可能导致你无法登录图形界面或使用其他功能。docker目标组名。$USER环境变量代表当前登录的用户名。执行此命令后权限并不会立即生效。因为组信息是在用户登录时加载的。你需要完全注销当前会话然后重新登录最彻底。或者在当前终端中使用newgrp docker命令启动一个新的子shell使新的组权限立即生效。但更推荐第一种方式。4.2 验证非root用户权限重新登录后打开一个新终端运行docker run hello-world这个命令会尝试从Docker Hub拉取一个名为hello-world的极简镜像并运行它。如果一切正常你将看到一段欢迎信息最后以“Hello from Docker!”结尾。这证明Docker引擎安装成功且正在运行。你的用户已经拥有操作Docker的权限。你的网络可以访问Docker Hub或已配置的镜像加速器。重要安全提示将用户加入docker组实质上赋予了该用户等同于root的权限。因为容器内的root用户在默认配置下可以挂载主机目录、操作网络甚至通过--privileged标志获得几乎完全的主机访问权。因此请仅将你信任的用户或必要的工作账户加入docker组。在生产服务器上应严格管理docker组的成员。5. 核心配置优化与镜像加速默认安装的Docker可以工作但针对国内网络环境和生产需求进行一些配置优化能极大提升体验和性能。5.1 配置国内镜像加速器从Docker Hub拉取镜像在国内速度可能很慢甚至不稳定。配置一个国内镜像加速器是必做步骤。国内许多云服务商提供了免费的加速器。我们将修改Docker守护进程的配置文件/etc/docker/daemon.json。如果文件不存在就创建它。sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [ https://docker.mirrors.ustc.edu.cn, https://hub-mirror.c.163.com, https://mirror.baidubce.com ], exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 }, storage-driver: overlay2 } EOF这里我们一次性配置了多个关键项registry-mirrors镜像加速器地址列表。我添加了中国科学技术大学、网易和百度的镜像源。Docker会按顺序尝试如果一个失败则尝试下一个。你可以根据网络情况选择其中一个或保留多个。exec-opts:[native.cgroupdriversystemd]设置cgroup驱动为systemd。Ubuntu 22.04默认使用systemd作为初始化系统将Docker的cgroup驱动与之对齐可以提高系统稳定性特别是在使用Kubernetes时尤为重要。log-driver和log-opts配置Docker容器的日志。我们设置为json-file驱动并限制单个日志文件最大100MB最多保留3个文件避免日志无限增长占满磁盘。storage-driver:overlay2这是目前Linux内核支持的主流存储驱动性能好且稳定通常是Ubuntu 22.04的默认选项这里显式指定以确保一致。5.2 应用配置并重启服务修改配置后需要重启Docker守护进程以使更改生效。sudo systemctl daemon-reload sudo systemctl restart docker验证加速器是否生效docker info在输出信息中找到Registry Mirrors部分你应该能看到刚才配置的镜像地址列表。5.3 验证优化配置运行一个测试命令感受加速效果并检查其他配置docker run --rm alpine echo Hello, Docker Config!这个命令会拉取一个很小的alpineLinux镜像运行echo命令后自动删除容器--rm参数作用。如果拉取速度明显快于之前说明镜像加速器配置成功。6. Docker基础使用与常用命令速查安装和配置完成后我们来快速过一遍最核心的Docker命令建立基本的使用认知。这些命令是你日后每天都会打交道的工具。6.1 生命周期管理命令容器就像轻量级的虚拟机有其生命周期。命令作用常用参数示例说明docker run创建并启动一个新容器-d,-it,--name,-p,-v最核心的命令。-d后台运行-it交互式终端--name指定容器名-p端口映射-v目录挂载。docker ps列出正在运行的容器-a(查看所有包括已停止的)查看容器状态、ID、端口映射等信息的第一选择。docker stop停止一个运行中的容器docker stop 容器名或ID发送SIGTERM信号允许容器优雅退出。docker start启动一个已停止的容器docker start 容器名或ID启动之前停止的容器保留其配置和数据。docker restart重启容器docker restart 容器名或ID先停止再启动。docker rm删除一个已停止的容器-f(强制删除运行中的容器)-v(同时删除关联的匿名卷)注意删除容器会丢失容器内产生的所有未持久化的数据。docker exec在运行中的容器内执行命令-it 容器名 /bin/bash进入容器内部进行调试或操作的利器。实操示例运行一个Nginx Web服务器。# 后台运行一个名为myweb的nginx容器将主机的8080端口映射到容器的80端口 docker run -d --name myweb -p 8080:80 nginx:alpine # 查看运行状态 docker ps # 在浏览器访问 http://localhost:8080 应该能看到Nginx欢迎页 # 进入容器内部查看文件 docker exec -it myweb /bin/sh # alpine镜像通常用sh不是bash # 停止并删除容器 docker stop myweb docker rm myweb6.2 镜像管理命令镜像是容器的模板通常从镜像仓库拉取。命令作用常用参数示例说明docker pull拉取镜像到本地docker pull ubuntu:22.04指定镜像名和标签Tag不指定标签则拉取latest。docker images列出本地镜像docker images或docker image ls查看镜像ID、仓库名、标签和大小。docker rmi删除本地镜像docker rmi 镜像ID如果镜像有容器即使已停止依赖它需要先删除容器。使用-f强制删除。docker build根据Dockerfile构建镜像-t(指定镜像名和标签)-f(指定Dockerfile路径)自定义镜像的核心命令。docker tag为镜像打标签docker tag source:tag target:tag常用于在推送到私有仓库前重命名镜像。docker push将镜像推送到仓库docker push myrepo/myimage:tag需要先登录到对应仓库 (docker login)。实操心得关于latest标签。虽然很多镜像默认有latest标签但在生产环境中尽量避免使用它。因为latest是一个浮动标签指向的镜像版本可能会变。你应该明确指定稳定版本的标签如nginx:1.24-alpine、ubuntu:22.04这能保证部署的一致性避免因镜像更新引入意外变更。6.3 数据与网络管理初步这是Docker进阶使用的两个重要概念。数据持久化容器内的文件更改是临时的容器删除数据就没了。为了持久化数据有两种主要方式绑定挂载Bind Mount将主机上的一个目录或文件直接挂载到容器内。-v /host/path:/container/path卷Volume由Docker管理的数据卷独立于容器的生命周期。-v volume_name:/container/path。卷通常比绑定挂载更易于备份、迁移和管理。网络Docker提供了几种网络模式最常用的是bridge默认容器连接到名为docker0的虚拟网桥通过NAT与外部通信。-p端口映射就是基于此模式。host容器直接使用主机的网络命名空间没有隔离性能最好。--networkhostnone禁用所有网络。一个结合了数据卷和网络映射的复杂示例运行一个MySQL数据库。# 创建一个Docker卷来持久化数据库数据 docker volume create mysql_data # 运行MySQL容器 docker run -d \ --name mysql_db \ -e MYSQL_ROOT_PASSWORDmy-secret-pw \ # 设置环境变量这里是root密码 -v mysql_data:/var/lib/mysql \ # 将卷挂载到MySQL数据目录 -p 3306:3306 \ # 映射端口 mysql:8.0 # 查看卷信息 docker volume inspect mysql_data7. 使用Docker Compose编排多容器应用当你的应用需要多个容器协同工作时例如一个Web应用需要Web服务器、应用服务器和数据库手动管理每个容器的docker run命令会变得非常繁琐。Docker Compose就是用来解决这个问题的工具它允许你使用一个YAML文件docker-compose.yml来定义和运行整个应用栈。7.1 编写你的第一个Compose文件我们以部署一个简单的WordPress网站包含WordPress和MySQL两个服务为例。在项目目录下创建docker-compose.yml文件version: 3.8 # 指定Compose文件格式版本 services: db: image: mysql:8.0 # 容器重启时卷和数据会保留 restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress volumes: - db_data:/var/lib/mysql # 使用命名卷持久化数据库 networks: - wp-network wordpress: depends_on: - db # 确保先启动db服务 image: wordpress:latest restart: unless-stopped ports: - 8080:80 # 主机端口:容器端口 environment: WORDPRESS_DB_HOST: db:3306 # 使用服务名‘db’作为主机名Compose会自动进行服务发现 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_DB_NAME: wordpress volumes: - wp_data:/var/www/html # 持久化WordPress文件主题、插件等 networks: - wp-network volumes: db_data: # 声明一个名为db_data的卷供db服务使用 wp_data: # 声明一个名为wp_data的卷供wordpress服务使用 networks: wp-network: # 声明一个自定义网络两个服务将加入其中可以互相通过服务名通信7.2 启动与管理Compose项目在包含docker-compose.yml文件的目录下执行以下命令启动所有服务后台模式docker compose up -d使用docker compose命令注意是compose不是docker-compose。-d表示在后台运行。Compose会拉取镜像如果本地没有创建网络、卷然后按依赖顺序启动所有服务。查看服务状态docker compose ps查看服务日志可以指定服务名如docker compose logs wordpressdocker compose logs -f # -f 表示跟随日志输出停止服务docker compose down这个命令会停止并删除所有容器、网络默认的桥接网络不会被删除但不会删除数据卷。如果你想同时删除数据卷需要加上-v参数docker compose down -v请谨慎使用这会清除所有数据库和文件数据。停止服务但保留容器和卷docker compose stop之后可以用docker compose start重新启动。Compose的核心优势在于其声明式配置。整个应用栈的状态服务、网络、卷都定义在一个文件中版本可控一键部署和销毁极大地简化了多容器应用的管理是开发、测试和生产环境部署的标配工具。8. 常见问题排查与故障解决实录即使按照指引操作在实际环境中也可能遇到各种问题。这里记录了几个我亲自遇到过的高频问题及其解决方法。8.1 问题docker命令报错“Permission denied”现象执行docker ps等命令时提示权限被拒绝连接不到Docker守护进程套接字。原因当前用户不在docker用户组中。解决确保已执行sudo usermod -aG docker $USER。最关键的一步注销并重新登录或者重启系统。仅仅新开一个终端标签页是不够的因为用户会话的组信息在登录时加载。验证运行groups命令查看输出中是否包含docker。如果还不行可以临时用sudo docker ps测试是否是Docker服务本身的问题。8.2 问题拉取镜像速度极慢或超时现象docker pull命令卡住不动或最终报网络超时错误。原因网络连接到Docker Hub不稳定或被限制。解决首要检查确认已正确配置国内镜像加速器。执行docker info查看Registry Mirrors是否包含有效的国内地址。测试加速器可以尝试直接拉取一个小镜像测试如docker pull alpine。如果速度正常则问题可能出在某个特定镜像上。更换加速器如果配置的加速器失效尝试更换另一个。编辑/etc/docker/daemon.json替换registry-mirrors中的地址然后重启Docker服务。使用代理在某些企业网络可能需要配置HTTP/HTTPS代理。这需要配置Docker守护进程的代理设置步骤稍复杂涉及创建systemd drop-in目录和配置文件。8.3 问题容器启动后立即退出现象使用docker run -d启动容器后docker ps看不到该容器docker ps -a显示其状态为Exited (0)或其它非0代码。原因这是新手最常见的问题。容器的主进程PID 1执行完毕并退出了。Docker容器的生命周期与其主进程绑定主进程退出容器就停止。排查与解决查看退出日志docker logs 容器名或ID。这通常会给出主进程为什么退出的线索例如配置文件错误、依赖服务未启动等。交互式调试对于不熟悉的镜像不要直接后台运行。先以前台交互模式运行观察输出docker run -it --rm --name test 镜像名 /bin/bash这样你可以进入容器内部手动尝试启动应用看看报什么错。检查容器内进程有些镜像如某些基础镜像默认没有常驻前台进程。你需要确保docker run最后指定的命令或镜像的CMD是一个不会立即结束的进程比如一个Web服务器、一个循环脚本等。使用tail -f保持前台运行在调试时一个技巧是让容器执行一个永远不结束的命令比如tail -f /dev/null这样容器就会一直运行方便你docker exec进去排查。8.4 问题端口绑定冲突现象运行docker run -p 80:80 ...时提示Bind for 0.0.0.0:80 failed: port is already allocated。原因主机上的80端口已经被其他程序占用可能是另一个Docker容器也可能是Nginx、Apache等系统服务。解决找出占用端口的进程sudo ss -tulpn | grep :80或sudo lsof -i :80根据输出停止那个进程或者为你的Docker容器改用其他主机端口例如-p 8080:80。8.5 问题磁盘空间不足现象拉取镜像或构建镜像时失败提示no space left on device。原因Docker默认将所有镜像、容器、卷数据存储在/var/lib/docker目录下。随着使用这个目录会越来越大。解决与清理查看磁盘使用情况docker system df这个命令会详细显示镜像、容器、卷和构建缓存占用的空间。清理无用资源删除所有已停止的容器、未使用的网络、悬空镜像未被任何镜像引用的中间层镜像和构建缓存docker system prune -a警告-a参数会删除所有未被容器使用的镜像包括你可能暂时没用但以后想用的。如果不加-a则只删除悬空镜像。删除所有未使用的卷更危险确保卷内数据已备份或无用时再操作docker volume prune从根本上解决如果/var分区本身空间小可以考虑将Docker的数据根目录迁移到更大的磁盘分区这需要修改Docker的启动配置/etc/docker/daemon.json中的>docker run -d \ --name myapp \ --cpus1.5 \ # 限制最多使用1.5个CPU核心 --memory512m \ # 限制最多使用512MB内存 --memory-swap1g \ # 内存交换分区总共1G设置与memory相同即禁用swap nginx:alpine在docker-compose.yml中可以这样配置services: myapp: image: nginx:alpine deploy: # 注意在Compose v3中资源限制通常在deploy下特别是用于Swarm时 resources: limits: cpus: 0.5 memory: 256M reservations: cpus: 0.25 memory: 128M对于单机Compose也可以使用ulimits和mem_limit等部分已废弃建议用上面格式。监控容器资源使用docker stats这个命令会实时显示所有运行中容器的CPU、内存、网络IO、块IO使用率是快速定位资源瓶颈的好工具。9.2 日志管理与收集生产环境中容器的日志需要被妥善收集和分析而不是仅仅输出到终端或JSON文件。配置日志驱动我们之前在daemon.json中配置了json-file驱动并做了大小限制。你还可以考虑其他驱动如journald将日志发送到systemd journal、syslog或fluentd等以便集成到中央日志系统如ELK Stack。查看容器日志docker logs 容器名 # 查看全部日志 docker logs --tail 100 -f 容器名 # 查看最后100行并持续跟踪-f9.3 安全最佳实践非Root用户运行容器在Dockerfile中使用USER指令指定一个非root用户来运行应用进程减少容器突破带来的风险。最小化镜像使用alpine等小型基础镜像只安装必要的包。多阶段构建Multi-stage build是减少最终镜像大小的利器。扫描镜像漏洞使用docker scan命令集成Snyk或Trivy、Clair等工具定期扫描本地镜像中的已知安全漏洞。限制容器能力除非必要避免使用--privileged标志。可以使用更细粒度的--cap-add和--cap-drop来调整容器的Linux能力集。使用安全扫描的镜像从可信源如Docker Official Images拉取镜像并注意镜像的维护状态。9.4 备份与恢复策略对于有状态服务如数据库定期备份数据卷至关重要。备份一个卷docker run --rm \ -v mysql_data:/volume_to_backup \ # 挂载要备份的卷 -v $(pwd):/backup \ # 挂载主机当前目录为备份输出目录 alpine \ tar czf /backup/backup_$(date %Y%m%d_%H%M%S).tar.gz -C /volume_to_backup .这个命令启动一个临时Alpine容器将数据卷的内容打包压缩到主机当前目录。恢复一个卷docker run --rm \ -v mysql_data:/volume_to_restore \ # 挂载要恢复的卷 -v $(pwd):/backup \ # 挂载包含备份文件的目录 alpine \ sh -c rm -rf /volume_to_restore/* tar xzf /backup/backup_file.tar.gz -C /volume_to_restore注意恢复操作会覆盖卷内现有数据务必谨慎。从安装、配置、基础使用到进阶管理和生产环境考量Docker的世界远不止于此。我个人的体会是最好的学习方式就是“做”。找一个你熟悉的简单应用尝试用Docker容器化它编写Dockerfile再用Compose编排它依赖的服务。在这个过程中遇到问题、解决问题的经历远比阅读文档来得深刻。最后一个小技巧善用docker --help和docker command --help这是最权威、最及时的参考资料。当你对某个命令或参数不确定时先查帮助往往能更快地找到答案。
返回列表