在Ubuntu虚拟机中实现容器化,需先确保虚拟机环境满足容器运行要求。推荐使用VirtualBox或KVM创建Ubuntu虚拟机(如Ubuntu 22.04 LTS),分配至少2GB内存、2核CPU及20GB磁盘空间(容器化对资源要求低于传统虚拟机,但需满足基础运行需求)。
虚拟机创建完成后,需安装Docker引擎(容器化核心工具)。以Ubuntu 22.04为例,执行以下命令:
# 更新软件包索引
sudo apt update
# 安装Docker依赖
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加Docker软件源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker引擎
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
# 启动Docker服务并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
验证Docker安装:docker --version(应输出Docker版本信息)。
通过Docker Hub官方镜像快速启动Ubuntu容器,用于测试环境或临时任务:
docker run -it --rm ubuntu:22.04 /bin/bash
-it:以交互模式运行容器,分配伪终端;--rm:容器退出后自动删除(避免残留);ubuntu:22.04:指定基础镜像(可从Docker Hub选择其他版本,如ubuntu:20.04);/bin/bash:容器启动后执行的命令(进入bash shell)。通过Dockerfile定义应用环境,实现“一次构建,到处运行”。假设应用目录结构如下:
my-python-app/
├── app.py
├── requirements.txt
└── Dockerfile
# 使用官方Python轻量级镜像(slim版本减少体积)
FROM python:3.8-slim
# 设置工作目录(容器内的路径)
WORKDIR /app
# 复制应用代码到容器(.表示当前目录)
COPY . /app
# 安装Python依赖(--no-cache-dir避免缓存增加体积)
RUN pip install --no-cache-dir -r requirements.txt
# 暴露应用端口(容器内端口,需与宿主机映射一致)
EXPOSE 5000
# 定义容器启动命令(应用入口)
CMD ["python", "app.py"]
docker build -t my-python-app .
docker run -d -p 5000:5000 --name my-python-container my-python-app
http://宿主机IP:5000,应显示应用页面。为防止容器占用过多宿主机资源,可通过以下命令限制:
# 限制CPU使用(最多使用1.5核)
docker run -it --cpus="1.5" ubuntu
# 限制内存使用(最多使用512MB,禁用交换分区)
docker run -it --memory="512m" --memory-swap=0 ubuntu
--cpus:指定CPU核心数(支持小数,如0.5表示半核);--memory:指定内存上限(格式为数字+单位,如512m、1g);--memory-swap=0:禁用交换分区,避免容器使用宿主机磁盘作为内存(提升性能)。若已有Ubuntu虚拟机(如VirtualBox创建的.vdi镜像),可将其转换为Docker镜像:
# 导出虚拟机磁盘为raw格式(假设虚拟机名为ubuntu-vm,镜像路径为~/ubuntu.vdi)
qemu-img convert -O raw ~/ubuntu.vdi ~/ubuntu.raw
# 导入raw镜像到Docker(生成名为ubuntu-vm-image的镜像)
docker import ~/ubuntu.raw ubuntu-vm-image
# 运行容器(基于转换后的镜像)
docker run -it --name my-converted-vm ubuntu-vm-image /bin/bash
注意:转换前需备份虚拟机数据,避免丢失;转换后的镜像可能较大(需优化以减小体积)。
默认情况下,容器使用Docker的bridge网络(隔离性强但无法直接通信)。若需容器间通信,可创建自定义网络:
# 创建自定义网络(名为my-net,驱动为bridge)
docker network create my-net
# 运行容器并连接到自定义网络(--network指定网络)
docker run -d --name web --network my-net nginx
docker run -d --name app --network my-net my-python-app
优势:同一网络内的容器可通过容器名直接访问(如app容器可通过http://web:80访问web容器的Nginx服务)。
Docker要求宿主机内核支持特定配置(如cgroup、namespace)。可通过以下脚本检查:
# 下载并运行Docker官方检查脚本
curl -fsSL https://raw.githubusercontent.com/moby/moby/master/contrib/check-config.sh | sudo bash
MISSING项,需修改内核配置(如CONFIG_CGROUPS=y、CONFIG_NAMESPACES=y),重新编译内核并重启虚拟机。ubuntu:slim、alpine替代ubuntu:latest);RUN指令(减少镜像层数,如RUN apt update && apt install -y package1 package2);RUN apt clean && rm -rf /var/lib/apt/lists/*)。容器内的数据默认随容器删除而消失,需通过**卷(Volume)或绑定挂载(Bind Mount)**实现持久化:
# 创建命名卷(宿主机自动管理路径)
docker volume create my-volume
# 运行容器并挂载卷(-v指定卷名:容器内路径)
docker run -d -v my-volume:/app/data --name my-data-container ubuntu
/var/lib/docker/volumes/my-volume/_data目录(默认路径,可通过docker volume inspect my-volume查看);-v /宿主机/路径:/容器/路径),适合需要直接访问宿主机文件的场景。