在Alpine虚拟机中部署Docker与Docker Compose的完整实践指南
2026/8/12 12:52:02 网站建设 项目流程

1. 项目概述:为什么选择Alpine作为Docker的“家”?

最近在折腾一个轻量级的开发测试环境,手头资源有限,又不想在宿主机上搞得一团糟,于是把目光投向了虚拟机。在众多Linux发行版里,Alpine Linux以其极致的轻量化和安全性脱颖而出,特别适合作为容器运行的底层系统。它基于musl libc和BusyBox,一个基础安装镜像只有几MB大小,运行起来内存占用极低。对于我这种需要在本地快速拉起多个隔离环境,又不想让笔记本风扇狂转的场景,Alpine虚拟机搭配Docker和Docker Compose,几乎是一个完美的组合方案。这个方案特别适合开发者、运维人员,或者任何想在一个干净、可控的环境里学习和实践容器技术的人。接下来,我就把从零开始,在虚拟机里安装Alpine,并配置好Docker生态的完整过程,以及我踩过的坑和总结的技巧,详细分享出来。

2. 环境准备与Alpine虚拟机安装

2.1 虚拟机平台选择与镜像下载

首先得有个地方跑Alpine。VMware Workstation Player(个人免费)和VirtualBox都是不错的选择,我这次用的是VMware。选择它们是因为兼容性好,网络和硬件模拟相对稳定,对于后续Docker的运行也更友好。

Alpine的镜像需要去官网下载。进入 alpinelinux.org/downloads ,你会看到针对不同架构的镜像。对于x86_64的电脑,我们选择“Standard x86_64”版本。这里有“Extended”和“Standard”可选,区别在于“Extended”包含了一些额外的硬件驱动和固件。对于虚拟机环境,“Standard”版本完全足够,也更精简。下载下来的是一个.iso格式的光盘镜像文件,大概130MB左右,这就是我们安装系统的“安装盘”。

注意:官网还提供了“Virtual”镜像,这是一个预配置了虚拟化相关优化的版本,但它是为类似KVM这样的虚拟化平台准备的。对于VMware/VirtualBox,使用标准的“Standard”镜像即可,兼容性更好。

2.2 虚拟机创建与关键参数配置

在VMware里新建虚拟机,选择“典型”配置即可。在安装客户机操作系统时,选择“稍后安装操作系统”,然后在客户机操作系统版本里,如果列表里有“Linux” -> “其他Linux 5.x及更高版本内核64位”就选它,没有的话选“其他Linux 4.x或更高版本内核64位”也行。

关键步骤在于虚拟硬件配置:

  1. 内存:至少分配1GB(1024MB)。虽然Alpine自己可能只需要几十MB,但后续要运行Docker Daemon和容器,1GB是一个比较稳妥的起步配置。如果计划运行稍复杂的服务,建议给到2GB。
  2. 硬盘:选择“创建新虚拟磁盘”,类型用默认的SCSI就好。磁盘大小建议至少20GB。虽然Alpine系统本身很小,但Docker镜像和容器数据会占用空间。我分配了30GB,并选择“将虚拟磁盘拆分成多个文件”,这样迁移和备份会灵活一些。
  3. 处理器:至少1个CPU核心,建议2个。这会影响后续Docker容器内应用的运行速度。
  4. 网络适配器:这里有个非常重要的点!务必选择“NAT模式”。桥接模式虽然能让虚拟机获得局域网独立IP,但在某些网络环境下(如公司内网有IP绑定或特殊防火墙规则)可能会遇到问题。NAT模式让虚拟机通过宿主机的网络出口上网,是最通用、最少麻烦的选择,对于后续通过宿主机SSH连接、拉取Docker镜像都至关重要。

配置完成后,在虚拟机的设置里,将下载好的Alpine ISO文件指定为CD/DVD驱动器,并确保连接状态是“已连接”。

2.3 Alpine系统安装详解

启动虚拟机,从ISO镜像引导后,会进入Alpine的启动菜单。直接回车,使用默认的“boot”选项。系统会快速加载到内存中,出现一个命令行登录提示。默认用户是root,密码为空,直接回车即可登录。

这时你进入的是一个运行在内存中的“Live”环境,所有更改重启后会消失。我们需要运行安装命令:setup-alpine。这是一个交互式的文本安装向导,步骤清晰:

  1. 键盘布局:输入对应编号,我们一般用us(美式键盘)。
  2. 主机名:给你的虚拟机起个名字,比如alpine-docker
  3. 网卡:通常就是eth0,直接回车。
  4. IP地址:这里选择dhcp(动态获取)。因为我们的虚拟机网络是NAT模式,宿主机的VMware NAT服务(或VirtualBox的DHCP服务器)会自动为它分配一个IP,通常是192.168.xxx.xxx网段的。这是最省心的方式。
  5. 手动配置:是否手动配置?直接回车选“no”。
  6. 设置root密码:输入两遍强密码,这是后续SSH和管理系统的关键。
  7. 时区:输入Asia/Shanghai
  8. HTTP代理:如果没有特殊网络要求,直接回车跳过。
  9. 镜像源:这一步很重要!Alpine会列出全球的镜像源(mirror)让你选择。输入f(代表fetch)来获取最新列表。然后输入离你地理位置近的源编号,比如中国的镜像源(如清华源mirrors.tuna.tsinghua.edu.cn、阿里云mirrors.aliyun.com等对应的地址)。选择一个快的源能极大提升后续软件包安装的速度。
  10. SSH服务:选择openssh(输入openssh),这样我们才能从宿主机远程连接。
  11. 安装到哪个磁盘:通常就是sda(你的虚拟硬盘)。
  12. 如何使用磁盘:对于新手,选择sys(整个磁盘用于系统)。它会自动分区。
  13. 擦除磁盘并安装:确认后输入y

安装程序会格式化磁盘、复制文件,最后问你是否重启。输入y,虚拟机将重启。重启前,务必在VMware的虚拟机设置里,将CD/DVD驱动器“连接”状态取消,或者指向一个空设备,否则又会从ISO启动进入Live环境。

重启后,用root用户和刚才设置的密码登录。运行ip addr show eth0命令,查看虚拟机获取到的IP地址(在inet后面)。记下这个IP,比如192.168.137.128

2.4 宿主机SSH连接与基础配置

现在,我们可以从宿主机的终端(Windows用PowerShell或CMD,Mac/Linux用系统终端)通过SSH连接到Alpine虚拟机了,这样操作起来更方便。

ssh root@<你的Alpine虚拟机IP> # 例如:ssh root@192.168.137.128

首次连接会提示确认主机密钥,输入yes。然后输入root密码,就进入了虚拟机的命令行。

为了让系统更顺手,我们先做几个基础配置:

  1. 更新软件包索引apk update。这不会升级任何软件,只是刷新本地软件包列表。
  2. 升级已有软件包apk upgrade。这将把所有已安装的包升级到仓库中的最新版本。
  3. 安装常用工具apk add vim curl wget bash sudo。Alpine默认使用ashshell和vi编辑器,安装bashvim更符合大多数人的习惯。sudo则方便后续创建普通用户并授权。

实操心得:Alpine的包管理命令apk非常高效。apk add是安装,apk del是删除,apk search是搜索。记住这个模式即可。

3. Docker引擎的安装与配置

3.1 安装Docker前的准备工作

Alpine安装Docker非常简洁,因为它有官方维护的docker包。但在此之前,我们需要确保系统是最新的,并且安装一些必要的依赖。

# 再次确保系统更新 apk update && apk upgrade # 安装Docker运行所需的依赖 apk add docker

是的,就这么简单,一条命令。apk会自动处理所有依赖,包括containerdruncdocker-cli等。安装完成后,Docker服务(dockerd)还不会自动启动。

3.2 启动Docker服务并设置开机自启

在Alpine上,服务的生命周期是由OpenRC管理的(而不是常见的systemd)。因此,启动和启用服务的命令有所不同。

# 将docker服务添加到开机启动列表 rc-update add docker boot # 立即启动docker服务 service docker start # 或者使用 rc-service docker start

运行service docker status可以查看Docker服务状态,确认它正在运行(* status: started)。

3.3 验证Docker安装与权限配置

安装并启动后,我们先验证一下Docker是否能正常工作:

docker version

这条命令会输出Client和Server的版本信息。如果看到Server版本信息,说明Docker引擎已经成功运行。

默认情况下,只有root用户和docker组的成员才能执行Docker命令。为了避免每次都用sudo,我们可以将当前用户(或者新建一个日常使用的用户)加入到docker组。

首先,创建一个用于日常操作的非root用户(如果尚未创建):

# 创建用户,例如叫 devuser adduser -D devuser # 为用户设置密码 passwd devuser

然后将该用户加入docker组:

adduser devuser docker

重要提示:修改组关系后,需要用户重新登录才能生效。你可以先退出SSH(exit),然后用新用户重新登录(ssh devuser@<虚拟机IP>),或者在当前root会话中切换到该用户(su - devuser)来验证。

验证非root用户权限:

# 切换到devuser,或在devuser的SSH会话中执行 whoami # 应显示 devuser docker run hello-world

如果能看到来自Docker的“Hello from Docker!”欢迎信息,说明Docker安装和用户组配置完全成功。这个hello-world镜像非常小,它会运行一个容器,打印信息后自动退出,是完美的“冒烟测试”。

3.4 配置国内Docker镜像加速器

从Docker Hub拉取镜像,在国内速度可能不理想。我们需要配置镜像加速器。常见的加速器地址有阿里云、腾讯云、中科大等。

这里以阿里云加速器为例(你需要有一个阿里云账号,在容器镜像服务控制台可以免费获取专属加速器地址):

  1. 编辑Docker的守护进程配置文件:sudo vim /etc/docker/daemon.json(如果文件不存在则新建)。
  2. 输入以下内容(将https://xxxx.mirror.aliyuncs.com替换为你自己的加速器地址):
    { "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"] }

    注意:可以配置多个镜像源,用逗号隔开。例如还可以加上中科大的源"https://docker.mirrors.ustc.edu.cn"

  3. 保存并退出编辑器。
  4. 重新加载配置并重启Docker服务:
    sudo systemctl daemon-reload # 注意:Alpine下这条命令可能无效,但执行无害 sudo service docker restart # 或者 rc-service docker restart
  5. 验证加速器是否生效:docker info。在输出信息中查找Registry Mirrors,如果看到了你配置的地址,说明成功。

4. Docker Compose的安装与使用

4.1 安装Docker Compose的两种方式

Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。在Alpine上安装它,推荐以下两种方式:

方式一:使用apk包管理器安装(推荐)这是最简单的方法,但仓库中的版本可能不是最新的稳定版。

sudo apk add docker-compose

安装完成后,用docker-compose --version检查版本。

方式二:从GitHub Releases直接下载二进制文件(获取最新版)

  1. 访问 Docker Compose的GitHub Releases页面 ,找到最新稳定版的下载链接。例如,对于linux-x86_64架构。
  2. 在Alpine虚拟机中,使用curlwget下载。
    # 以v2.28.1为例,请替换为最新版本号 sudo curl -L "https://github.com/docker/compose/releases/download/v2.28.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  3. 授予二进制文件可执行权限:
    sudo chmod +x /usr/local/bin/docker-compose
  4. 验证安装:docker-compose --version

注意事项:如果系统提示/usr/local/bin不在PATH环境变量中(虽然通常都在),你可以创建软链接到/usr/bin/sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

4.2 Docker Compose快速入门示例

为了验证Docker Compose工作正常,我们创建一个最简单的docker-compose.yml文件来运行一个Nginx服务。

  1. 创建一个项目目录并进入:
    mkdir ~/compose-demo && cd ~/compose-demo
  2. 创建docker-compose.yml文件:
    vim docker-compose.yml
    输入以下内容:
    version: '3.8' # 指定Compose文件格式版本 services: web: image: nginx:alpine # 使用Alpine版本的Nginx镜像,更轻量 container_name: my-nginx ports: - "8080:80" # 将宿主机的8080端口映射到容器的80端口 volumes: - ./html:/usr/share/nginx/html # 挂载本地html目录到容器 restart: unless-stopped # 容器退出时自动重启(除非手动停止)
  3. 创建一个简单的HTML文件:
    mkdir html echo "<h1>Hello from Docker Compose on Alpine!</h1>" > html/index.html
  4. docker-compose.yml所在目录,启动服务:
    docker-compose up -d
    -d参数表示在后台运行(detached mode)。
  5. 验证服务:
    • 运行docker-compose ps,应该看到my-nginx容器状态为Up
    • 在宿主机浏览器中访问http://<你的Alpine虚拟机IP>:8080,应该能看到“Hello from Docker Compose on Alpine!”的标题。
  6. 停止并清理服务:
    docker-compose down
    这个命令会停止并移除容器、网络,但不会删除镜像和挂载卷(./html目录下的文件会保留)。

这个简单的流程展示了Docker Compose的核心价值:用一个声明式的YAML文件,定义服务、网络、卷,然后通过一条命令管理整个应用的生命周期。

5. 存储与网络配置优化

5.1 Docker数据存储路径管理

默认情况下,Docker的所有数据(镜像、容器、卷、网络配置)都存储在/var/lib/docker目录。在虚拟机环境中,这个目录位于虚拟磁盘上。虽然Alpine和Docker本身很轻量,但随着使用,镜像和容器数据会逐渐增多。

查看磁盘使用情况: 定期使用df -h命令查看根目录(/)的使用率。如果发现空间紧张,可以考虑以下策略:

  1. 清理无用数据

    # 删除所有已停止的容器 docker container prune # 删除所有未被任何容器引用的镜像(悬空镜像) docker image prune # 删除所有未被使用的卷(谨慎!确保数据已备份) docker volume prune # 一键清理所有未使用的镜像、容器、卷和网络 docker system prune -a

    警告:docker system prune -a会删除所有未被使用的镜像(包括可能被其他镜像依赖的中间层镜像),以及停止的容器和卷,执行前请确认。

  2. 迁移Docker数据目录(高级):如果虚拟磁盘空间确实不足,可以考虑将Docker的数据目录迁移到挂载的额外虚拟硬盘上。这需要停止Docker服务,移动数据,并修改Docker启动配置(/etc/docker/daemon.json中的>apk add iptables modprobe ip_tables iptable_nat iptable_filter然后再次尝试启动Docker。为了让模块开机自动加载,可以将模块名添加到/etc/modules文件中(每行一个)。

  3. 常见原因二:存储驱动问题或/var/lib/docker权限问题
    • 解决方案:尝试在/etc/docker/daemon.json中指定存储驱动(Alpine通常用overlay2):
      { "storage-driver": "overlay2" }
      检查/var/lib/docker目录的权限是否属于root:root

6.2 Docker命令执行报权限错误

问题现象:非root用户执行docker ps等命令时,报错:Got permission denied while trying to connect to the Docker daemon socket

解决方案

  1. 确保用户已加入docker组:groups <用户名>查看输出中是否有docker
  2. 如果已加入,可能是用户会话未更新组信息。需要退出当前SSH会话,并重新登录,这是最关键的一步。
  3. 检查Docker套接字文件权限:ls -l /var/run/docker.sock。正常情况下,它应该属于root:docker组,且组有读写权限(srw-rw----)。如果不是,可以手动修正(需root):sudo chown root:docker /var/run/docker.sock && sudo chmod 660 /var/run/docker.sock

6.3 拉取Docker镜像速度慢或失败

问题现象docker pull命令长时间无响应或报网络错误。

排查与解决

  1. 确认镜像加速器配置正确docker info | grep -A 5 Mirrors。如果没生效,检查/etc/docker/daemon.json格式是否正确(必须是有效的JSON),然后重启Docker服务。
  2. 尝试其他国内镜像源:在registry-mirrors数组中多添加几个源。
  3. 检查虚拟机网络连通性:在Alpine虚拟机内,ping -c 4 baidu.com,看是否能通外网。如果不通,检查虚拟机网络适配器设置(确保是NAT),并尝试在Alpine内重启网络:service networking restartrc-service networking restart
  4. 对于特定镜像:有些镜像(如某些数据库官方镜像)可能从特定仓库拉取,不受加速器影响。可以尝试在拉取时指定国内镜像站的标签,或者寻找该镜像在国内的替代源(如阿里云镜像仓库)。

6.4 Docker Compose命令未找到或版本不对

问题现象:执行docker-compose提示command not found,或者版本很旧。

解决方案

  1. 命令未找到:检查安装路径。如果用apk安装,通常在/usr/bin/docker-compose。如果用curl下载到/usr/local/bin,确保该目录在PATH中(echo $PATH)。可以创建软链接:sudo ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose
  2. 版本过旧apk仓库的版本可能滞后。建议卸载后,采用从GitHub下载二进制文件的方式安装最新版。
    sudo apk del docker-compose # 然后按照4.1节“方式二”重新安装
  3. 注意新老版本命令差异:Docker Compose V2版本,命令可以是docker-compose(如果以独立脚本安装)或docker compose(作为Docker CLI插件)。我们安装的独立脚本,使用docker-compose命令。如果遇到语法错误,请确认docker-compose.yml文件的版本号(version)与你安装的Compose版本兼容。

6.5 虚拟机与宿主机之间文件传输

需求:如何在宿主机和Alpine虚拟机之间方便地传输文件(如代码、配置文件)?

方法一:使用SCP命令(推荐)在宿主机终端执行:

# 从宿主机复制到虚拟机 scp /宿主机/路径/文件.txt devuser@<虚拟机IP>:/home/devuser/ # 从虚拟机复制到宿主机 scp devuser@<虚拟机IP>:/home/devuser/文件.txt /宿主机/路径/

方法二:使用共享文件夹(VMware/VirtualBox功能)这需要在虚拟机软件设置中配置,并在Alpine虚拟机内安装“增强功能”或“客户机插件”。对于Alpine,需要安装open-vm-tools(VMware)或virtualbox-guest-additions(VirtualBox)包,并加载内核模块。配置相对复杂,但设置好后可以像访问本地文件夹一样方便。对于轻量级临时传输,SCP通常更快捷。

方法三:在Docker Compose中使用卷挂载这是最“Docker”的方式。就像我们示例中做的,将宿主机(或虚拟机内)的目录(如./html)通过volumes指令挂载到容器内。这样,你在宿主机上编辑文件,容器内立即生效。这实际上是通过虚拟机文件系统进行的,但对于开发来说,感知上就像直接在和容器交互。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询