使用 Docker/LXC 迅速启动一个桌面系统

2024-01-26 21:20

本文主要是介绍使用 Docker/LXC 迅速启动一个桌面系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用 Docker/LXC 迅速启动一个桌面系统

Docker 是 dotCloud 最近几个月刚宣布的开源引擎,旨在提供一种应用程序的自动化部署解决方案,简单的说就是,在 Linux 系统上迅速创建一个容器(类似虚拟机)并在容器上部署和运行应用程序,并通过配置文件可以轻松实现应用程序的自动化安装、部署和升级,非常方便。因为使用 了容器,所以可以很方便的把生产环境和开发环境分开,互不影响,这是 docker 最普遍的一个玩法。更多的玩法还有大规模 web 应用、数据库部署、持续部署、集群、测试环境、面向服务的云计算、虚拟桌面 VDI 等等。

Docker 使用 Go 语言编写,用 cgroup 实现资源隔离,容器技术采用 LXC. LXC 已经足够成熟,被多个主流 PaaS 服务商采用(比如 dotCloud),国内的一些互联网公司也在用(比如腾讯)。虽然都是企图解决自动化部署方面的问题,Docker 的解决方式有别于我们常提到的 Puppet/Chef,他们虽然走的是不同的路,但也可以拿来一起用。

上面说了 Docker 有很多玩法,下面介绍的玩法是:在服务器上用 docker 创建桌面系统,然后在客户端上通过 ssh 远程连接桌面,可以看作是平民化的 VDI 解决方案。

安装 Docker/LXC

如果 Linux kernel 是 3.8 以前的内核,或者内核缺少 aufs 模块需要安装额外的扩展模块:

$ sudo apt-get install linux-image-extra-`uname -r`

安装 lxc-docker:

$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:dotcloud/lxc-docker
$ sudo apt-get update
$ sudo apt-get install lxc-docker

运行一个简单系统

运行 docker 就会自动下载一个 ubuntu 镜像(第一次运行才需要下载),并在一个 container(容器)里运行一个 ubuntu 系统(类似虚拟机)和 shell:

$ docker run -i -t ubuntu /bin/bash

在 host 上 ps 一下发现 docker 使用 lxc-start 工具和 /var/lib/docker/containers/…/config.lxc 里的参数启动1个 lxc 容器并运行 /bin/bash 程序:

$ ps aux | grep docker
root     28103  0.0  0.0  21164  1116 ?        S    10:52   0:00 lxc-start -n a581df505cb9ea07e93de28d76fc9b4e1ee48b981ce994740efdaa65d0d307a3 -f /var/lib/docker/containers/a581df505cb9ea07e93de28d76fc9b4e1ee48b981ce994740efdaa65d0d307a3/config.lxc -- /sbin/init -g 172.16.42.1 -e HOME=/ -e PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin -e DEBIAN_FRONTEND=noninteractive -- /bin/bash /src/startup.sh

运行一个 Hello world

启动一个 ubuntu 系统然后打印 hello world,囧,一个 ubuntu 系统的存在就是为了打印一个 hello world,世界变了,反了,操作系统和应用程序的地位颠倒了~

$ docker run -i -t ubuntu echo hello world
hello world

运行一个 “桌面” 系统

来看看如何启动一个 “桌面” 系统,按照 docker-desktop 项目给的方法和这里的 Dockerfile开始 build 一个简单的 “桌面系统”:

$ docker build -t vpsee/docker-desktop git://github.com/rogaha/docker-desktop.git
Step 1 : FROM ubuntu:12.10---> b750fe79269d
...
Successfully built 7774f89504e5

build 完后就可以用 docker images 命令看到:

$ docker images
REPOSITORY             TAG                 ID                  CREATED             SIZE
ubuntu                 12.04               8dbd9e392a96        3 months ago        131.5 MB (virtual 131.5 MB)
ubuntu                 12.10               b750fe79269d        3 months ago        24.65 kB (virtual 180.1 MB)
ubuntu                 latest              8dbd9e392a96        3 months ago        131.5 MB (virtual 131.5 MB)
ubuntu                 precise             8dbd9e392a96        3 months ago        131.5 MB (virtual 131.5 MB)
ubuntu                 quantal             b750fe79269d        3 months ago        24.65 kB (virtual 180.1 MB)
base                   latest              b750fe79269d        3 months ago        24.65 kB (virtual 180.1 MB)
base                   ubuntu-12.10        b750fe79269d        3 months ago        24.65 kB (virtual 180.1 MB)
base                   ubuntu-quantal      b750fe79269d        3 months ago        24.65 kB (virtual 180.1 MB)
base                   ubuntu-quantl       b750fe79269d        3 months ago        24.65 kB (virtual 180.1 MB)
vpsee/docker-desktop   latest              7774f89504e5        18 minutes ago      12.29 kB (virtual 1.576 GB)

启动这个刚 build 好的 “桌面系统” 吧,注意 a581df505cb9 是这个容器的 ID:

$ docker run -d vpsee/docker-desktop
a581df505cb9

这个系统有自己的内部 IP 地址,外界不能直接访问,所以要想从外界 ssh 登陆的话,需要把它的 ssh 服务端口(22)和 host 上某个端口通过 docker port 命令做个映射,这样访问 host 上的 49153 端口就是访问某个 container 里面的 22 端口了:

$ docker port a581df505cb9 22
49153

查看一下当前运行的容器:

$ docker ps
ID                  IMAGE                         COMMAND                CREATED             STATUS              PORTS
a581df505cb9        vpsee/docker-desktop:latest   /bin/bash /src/start   24 minutes ago      Up 24 minutes       49153->22

然后我们可以在 Mac/Linux 客户端上通过 ssh 访问这个 “桌面” 了:

$ ssh -YC -c blowfish docker@192.168.2.45 -p 49153 ./docker-desktop
docker@192.168.2.45's password:

注意上面的 password 是随机生成的(每次创建新系统密码都会变),那密码是什么呢?通过 docker logs 可以找到:

$ docker logs a581df505cb9
User: docker Password: ieFi2iu1Phie
Adding user `docker' to group `sudo' ...
Adding user docker to group sudo
Done.
.bashrc
.config/
.config/rox.sourceforge.net/
.config/rox.sourceforge.net/ROX-Filer/
.config/rox.sourceforge.net/ROX-Filer/pb_Default
.config/rox.sourceforge.net/ROX-Filer/globicons
.config/rox.sourceforge.net/ROX-Filer/panels
.config/rox.sourceforge.net/ROX-Filer/menus2
.config/rox.sourceforge.net/ROX-Filer/Options
spring-desktop-wallpaper-1920x1200-0911085.jpg
docker-desktop

从 Mac 上访问远端桌面的话需要有 X 环境(下载 XQuartz 安装即可);从 Linux 上可以直接访问。登陆后界面如下:

docker desktop

这篇关于使用 Docker/LXC 迅速启动一个桌面系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/648088

相关文章

使用Python实现Word文档的自动化对比方案

《使用Python实现Word文档的自动化对比方案》我们经常需要比较两个Word文档的版本差异,无论是合同修订、论文修改还是代码文档更新,人工比对不仅效率低下,还容易遗漏关键改动,下面通过一个实际案例... 目录引言一、使用python-docx库解析文档结构二、使用difflib进行差异比对三、高级对比方

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca

C#下Newtonsoft.Json的具体使用

《C#下Newtonsoft.Json的具体使用》Newtonsoft.Json是一个非常流行的C#JSON序列化和反序列化库,它可以方便地将C#对象转换为JSON格式,或者将JSON数据解析为C#对... 目录安装 Newtonsoft.json基本用法1. 序列化 C# 对象为 JSON2. 反序列化

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队

Python ORM神器之SQLAlchemy基本使用完全指南

《PythonORM神器之SQLAlchemy基本使用完全指南》SQLAlchemy是Python主流ORM框架,通过对象化方式简化数据库操作,支持多数据库,提供引擎、会话、模型等核心组件,实现事务... 目录一、什么是SQLAlchemy?二、安装SQLAlchemy三、核心概念1. Engine(引擎)

Java Stream 并行流简介、使用与注意事项小结

《JavaStream并行流简介、使用与注意事项小结》Java8并行流基于StreamAPI,利用多核CPU提升计算密集型任务效率,但需注意线程安全、顺序不确定及线程池管理,可通过自定义线程池与C... 目录1. 并行流简介​特点:​2. 并行流的简单使用​示例:并行流的基本使用​3. 配合自定义线程池​示

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境