1
0
1Panel-Appstore/apps/docker-lxc/README.md

157 lines
6.1 KiB
Markdown
Raw Normal View History

2025-07-03 11:40:55 +08:00
# 运行具有状态的 Linux 容器在 Docker 中![](https://img.shields.io/docker/pulls/micwy/lxc.svg?v_DATE)
2023-11-09 19:15:01 +08:00
2025-07-03 11:40:55 +08:00
> :warning: 这是一个完整的重写,仅使用 LXC不使用 vagrant。它可以运行使用 v0.1 创建的 LXC 容器,但配置和使用方式不同。使用标签 v0.1 获取旧版本。
2023-11-09 19:15:01 +08:00
2025-07-03 11:40:55 +08:00
Docker Hub: [micwy/lxc](https://hub.docker.com/r/micwy/lxc)
2023-11-09 19:15:01 +08:00
2025-07-03 11:40:55 +08:00
我非常惊讶,这个镜像的拉取次数有多少。请告诉我你是如何使用它的(只需在 github 上创建一个问题),我会将其添加到“用例”部分。
2023-11-09 19:15:01 +08:00
2025-07-03 11:40:55 +08:00
## 为什么?
2023-11-09 19:15:01 +08:00
2025-07-03 11:40:55 +08:00
在某些情况下,在具有“状态”的 docker 环境中运行完整的操作系统可能很有用,这主要意味着拥有一个持久的根卷。仅使用 docker 是不可能的,因为 docker 不允许/成为一个卷。这就是 LXC 发挥作用的地方。LXC 提供与 docker 类似的过程隔离,但具有状态化的根文件系统。不幸的是,随着 docker 的兴起docker 的管理工具比 LXC 的管理工具更为广泛和复杂。
2023-11-09 19:15:01 +08:00
2025-07-03 11:40:55 +08:00
这个项目允许在 docker 容器内使用单个 LXC 容器,以获得两者的最佳效果。
2023-11-09 19:15:01 +08:00
2025-07-03 11:40:55 +08:00
## 功能
2023-11-09 19:15:01 +08:00
2025-07-03 11:40:55 +08:00
* 在 docker 中运行单个 LXC 容器,具有完整的操作系统和持久的根
* 使用 docker 特有的功能为您的 LXC 容器例如docker-compose、暴露端口、traefik 用于入口、Kubernetes 作为平台)
* LXC 容器使用与 docker 容器相同的限制和网络堆栈,因此像暴露端口这样的功能按预期工作
* 双向正确的信号处理(正确关闭 docker 容器可以正确关闭 LXC 容器。在 LXC 中关机可以关闭 docker 容器)
* LXCFS 支持:在容器内,显示正确的运行时间和限制
* Shell-Wrapper如果使用“docker exec”调用/bin/sh则会在 LXC 容器中启动一个 shell。因此大多数管理工具中的控制台会直接在 LXC 容器内打开,而不是在周围的 docker 容器中
* 创建初始根文件系统:对于某些发行版,可以通过环境变量简单地设置初始根文件系统
* 通过环境变量添加初始 SSH 密钥以实现即时登录
2023-11-09 19:15:01 +08:00
2025-07-03 11:40:55 +08:00
### 一些用例
2023-11-09 19:15:01 +08:00
2025-07-03 11:40:55 +08:00
* 为您的用户提供“家庭容器”,每个容器都有自己的 ssh 访问权限和持久状态
* 在 Kubernetes 上运行 Linux 远程桌面服务器
* 轻松在 Docker/Kubernetes 上运行有状态软件(如 froxlor 控制面板或 plesk
2023-11-09 19:15:01 +08:00
2025-07-03 11:40:55 +08:00
### 想法 / 待办事项
2023-11-09 19:15:01 +08:00
2025-07-03 11:40:55 +08:00
* 支持更多分发根文件系统
* 从 vagrant-lxc 盒子导入 rootfs
2023-11-09 19:15:01 +08:00
2025-07-03 11:40:55 +08:00
## 如何运行
2023-11-09 19:15:01 +08:00
```
docker run -d \
--name lxc \
--privileged \
--hostname lxctest1 \
-v /path/to/data:/data \
-v /path/to/somedir:/vol/somedir \
-e DISTRIBUTION=alpine \
-e INITIAL_SSH_KEY="ssh-rsa AAAA...Q== my-initial-ssh-key" \
micwy/lxc
2025-07-03 11:40:55 +08:00
```
2023-11-09 19:15:01 +08:00
2025-07-03 11:40:55 +08:00
* 目前运行 LXC 在容器中需要"privileged"权限
* 主机名传递到 lxc 容器
* 卷/data 包含根文件系统(位于/data/rootfs和一些附加文件系统创建期间的临时根文件系统lxc 配置)
2023-11-09 19:15:01 +08:00
2025-07-03 11:40:55 +08:00
### 运行于 Kubernetes
2023-11-09 19:15:01 +08:00
2025-07-03 11:40:55 +08:00
以下是一个在 Kubernetes 上运行的 yaml 示例。如果有兴趣,我也可以提供 helm 图表。
2023-11-09 19:15:01 +08:00
```
---
# Source: lxc/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mylxcbox
labels:
app.kubernetes.io/name: lxc
app.kubernetes.io/instance: mylxcbox
spec:
replicas:
selector:
matchLabels:
app.kubernetes.io/name: lxc
app.kubernetes.io/instance: mylxcbox
template:
metadata:
labels:
app.kubernetes.io/name: lxc
app.kubernetes.io/instance: mylxcbox
spec:
containers:
- name: lxc
image: "micwy/lxc:latest"
imagePullPolicy: Always
# Required to launch lxc containers in the docker container
securityContext:
privileged: true
# Required to make LXC console work
stdin: true
tty: true
ports:
- name: ssh
containerPort: 22
protocol: TCP
hostPort: 2201
env:
- name: "DISTRIBUTION"
value: "archlinux"
- name: "INITIAL_SSH_KEY"
value: "ssh-rsa ...DVs= my-ssh-key"
volumeMounts:
- mountPath: /data
name: data
# Will be passed into the lxc container
hostname: mylxcbox
volumes:
- name: data
hostPath:
path: /data/mylxcbox
# Strategy must be recreate if hostPort is used
strategy:
type: Recreate
```
2025-07-03 11:40:55 +08:00
### 环境变量
2023-11-09 19:15:01 +08:00
2025-07-03 11:40:55 +08:00
* DISTRIBUTION如果/data/rootfs 不存在,则触发特定分布的设置脚本(见下文)
* INITIAL\_SSH\_KEY如果设置则在启动时将其复制到/root/.ssh/authorized\_keys如果该文件尚不存在
* USE\_LXCFS默认为 false如果为 true则将 [LXCFS](https://github.com/lxc/lxcfs) 挂载到 LXC 容器中
* :warning: 可能与 systemd 不兼容!
* COPY\_RESOLV\_CONF默认为 true如果为 true则将 docker 容器中的 resolv.conf 复制到 LXC 容器中
2023-11-09 19:15:01 +08:00
2025-07-03 11:40:55 +08:00
### 附加卷
2023-11-09 19:15:01 +08:00
2025-07-03 11:40:55 +08:00
* docker 容器的目录/vol 使用“rbind”挂载到 LXC 容器的/vol 上
* 每个挂载到/vol/something 的 docker-volume 将显示为/vol/something 在 LXC 上
2023-11-09 19:15:01 +08:00
2025-07-03 11:40:55 +08:00
### 可用的分发设置脚本
2023-11-09 19:15:01 +08:00
#### DISTRIBUTION: alpine
2025-07-03 11:40:55 +08:00
如果 rootfs 不存在,则安装 alpine。
特性:
* 非常简约的 bash、nano 和 openssh 图像
支持的环镜变量:
* ALPINE\_ARCH:(默认 x86\_64rootfs 的架构
* ALPINE\_VERSION: (默认最新稳定版): 安装的 alpine 版本
* ALPINE\_EXTRA\_PACKAGES: 伴随 rootfs 一起安装的额外软件包
2023-11-09 19:15:01 +08:00
2025-07-03 11:40:55 +08:00
#### 分发archlinux
2023-11-09 19:15:01 +08:00
2025-07-03 11:40:55 +08:00
如果 rootfs 不存在,则安装 archlinux。
2023-11-09 19:15:01 +08:00
2025-07-03 11:40:55 +08:00
特性:
2023-11-09 19:15:01 +08:00
2025-07-03 11:40:55 +08:00
* 基本系统镜像,包含常用工具和 openssh
2023-11-09 19:15:01 +08:00
2025-07-03 11:40:55 +08:00
支持的环镜变量:
2023-11-09 19:15:01 +08:00
2025-07-03 11:40:55 +08:00
* ARCHLINUX\_INSTALL\_TRIZEN: 默认true如果为 true则为 AUR 软件包安装 trizen 包管理器
* ARCHLINUX\_EXTRA\_PACKAGES与 rootfs 一起安装的附加包。如果已安装,将使用 trizen 运行安装,否则使用 pacman。
* ARCHLINUX\_MIRRORLIST\_COUNTRY默认德国 - 我必须承认,我有偏见):用于创建初始 packman 镜像列表的国家。