1. 概述
LXC(Linux Containers)提供了一种在用户空间使用内核容器化特性的低级接口。它通过 命名空间和控制组 创建隔离的应用环境,并提供了命令行工具、模板、库以及语言绑定。
在某些场景下,我们可能需要在 LXC 容器与其宿主机之间共享某个目录。本文将介绍如何实现这一操作。
2. 环境准备
本实验使用的是 Ubuntu 22.04 系统,容器内使用的是 Alpine 3.20。
2.1. 创建 LXC 容器
使用 lxc-create
命令创建一个容器:
$ sudo lxc-create -n alpine-container -t download -- -d alpine -r 3.20 -a amd64
Downloading the image index
Downloading the rootfs
Downloading the metadata
The image cache is now ready
Unpacking the rootfs
---
You just created an Alpinelinux 3.20 x86_64 (20240610_13:00) container.
该命令会下载镜像并初始化容器的 rootfs(根文件系统)。我们使用了 download
模板,它会从 LXC 官方仓库 获取预构建镜像。
容器名称为 alpine-container
,由 -n
参数指定。LXC 工具集的命令都需要 root 权限,因此需要配合 sudo
使用。
查看当前系统中的容器:
$ sudo lxc-ls
alpine-container
容器的文件结构位于 /var/lib/lxc
目录下:
$ sudo ls -l /var/lib/lxc/alpine-container
total 8
-rw-r----- 1 root root 740 Jun 30 14:33 config
drwxr-xr-x 19 root root 4096 Jun 30 09:00 rootfs
2.2. 启动 LXC 容器
使用 lxc-start
启动容器:
$ sudo lxc-start -n alpine-container
检查容器是否运行成功:
$ sudo lxc-attach -n alpine-container hostname
alpine-container
进入容器终端:
$ sudo lxc-attach -n alpine-container
/ #
运行命令验证:
/ # hostname
alpine-container
容器已成功启动,接下来可以配置目录共享。
3. 配置目录共享
LXC 容器的配置文件位于 /var/lib/lxc/<容器名>/config
,我们可以在此文件中配置共享目录。
查看当前配置:
$ sudo cat /var/lib/lxc/alpine-container/config
# Template used to create this container: /usr/share/lxc/templates/lxc-download
# Parameters passed to the template: -a amd64 -d alpine -r 3.20
# For additional config options, please look at lxc.container.conf(5)
# Uncomment the following line to support nesting containers:
# lxc.include = /usr/share/lxc/config/nesting.conf
# (Be aware this has security implications)
# Distribution configuration
lxc.include = /usr/share/lxc/config/common.conf
lxc.arch = linux64
# Container specific configuration
lxc.rootfs.path = dir:/var/lib/lxc/alpine-container/rootfs
lxc.uts.name = alpine-container
# Network configuration
lxc.net.0.type = veth
lxc.net.0.link = lxcbr0
lxc.net.0.flags = up
lxc.net.0.hwaddr = 00:16:3e:1b:16:54
在配置文件中添加以下行以共享目录:
lxc.mount.entry = /home/baeldung/work/shared_directory tmp/share none bind,create=dir
该配置项含义如下:
/home/baeldung/work/shared_directory
:宿主机上的共享目录。tmp/share
:容器内的挂载点(相对路径)。none
:文件系统类型(此处无需指定)。bind,create=dir
:挂载选项,bind
表示绑定挂载,create=dir
表示自动创建挂载目录。
⚠️ 注意:挂载点路径应为相对路径,不要加
/
开头。
4. 验证配置
4.1. 停止容器
先停止容器以应用配置:
$ sudo lxc-stop -n alpine-container
4.2. 创建共享目录
在宿主机上创建共享目录并写入文件:
$ mkdir -p /home/baeldung/work/shared_directory
$ cd /home/baeldung/work/shared_directory
$ echo "Hello from host" > greeting
4.3. 重启容器并测试
启动容器并进入容器内查看文件:
$ sudo lxc-start -n alpine-container
$ sudo lxc-attach -n alpine-container
/ # cat /tmp/share/greeting
Hello from host
在容器中修改文件内容:
/ # echo "Hello from container" >> /tmp/share/greeting
/ # cat /tmp/share/greeting
Hello from host
Hello from container
回到宿主机验证:
$ cat /home/baeldung/work/shared_directory/greeting
Hello from host
Hello from container
✅ 成功实现双向共享!
4.4. 可选:只读挂载
若希望容器只能读取不能修改,可在配置中添加 ro
选项:
lxc.mount.entry = /home/baeldung/work/shared_directory tmp/share none bind,ro,create=dir
5. 小结
本文介绍了如何在 LXC 容器与宿主机之间共享目录,主要步骤如下:
- 使用
lxc-create
创建容器 - 修改容器配置文件,添加
lxc.mount.entry
配置项 - 宿主机创建共享目录,容器内挂载该目录
- 双向验证文件读写能力
- 可选配置为只读挂载
通过这种方式,我们可以轻松实现容器与宿主机之间的文件共享,适用于日志同步、数据持久化等常见场景。