在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 /宿主機/路徑:/容器/路徑
),適合需要直接訪問宿主機文件的場景。