淺析Docker如何創(chuàng)建自定義容器(附通用Python 3.12模板)
一、 準(zhǔn)備工作
在開始我們的 Docker 之旅前,唯一需要準(zhǔn)備的“利器”就是 Docker 本身。
核心依賴:Docker Engine
這是 Docker 的核心組件,負(fù)責(zé)構(gòu)建和運(yùn)行容器。請(qǐng)根據(jù)你的操作系統(tǒng),訪問 Docker 官方文檔進(jìn)行安裝:
- Docker Desktop for Mac (適用于 macOS)
- Docker Desktop for Windows (適用于 Windows 10/11)
- Docker Engine for Linux (適用于各種 Linux 發(fā)行版)
強(qiáng)烈推薦:Docker Compose
雖然不是強(qiáng)制性的,但 Docker Compose 是一個(gè)能極大提升我們開發(fā)體驗(yàn)的工具。它允許我們通過一個(gè)簡單的 yaml 文件來定義和配置多容器應(yīng)用,一條命令即可啟動(dòng)所有服務(wù)。通常,安裝 Docker Desktop 時(shí)會(huì)自帶 Docker Compose。
安裝完成后,打開終端(或 PowerShell/CMD),輸入以下命令驗(yàn)證安裝是否成功:
docker --version docker-compose --version
如果能看到版本號(hào),恭喜你,準(zhǔn)備工作已完成!
二、 核心步驟
創(chuàng)建自定義容器的核心在于編寫一個(gè)名為 Dockerfile 的文本文件。它就像是容器的“建筑設(shè)計(jì)圖”,詳細(xì)描述了容器應(yīng)該如何構(gòu)建。
步驟 1:編寫Dockerfile
讓我們先從一個(gè)最基礎(chǔ)的通用模板開始理解它的結(jié)構(gòu)。
# 1. 指定基礎(chǔ)鏡像 # 所有構(gòu)建都從這個(gè)“地基”開始 FROM <基礎(chǔ)鏡像名>:<標(biāo)簽> # 2. 設(shè)置維護(hù)者信息(可選) LABEL maintainer="your-email@example.com" # 3. 設(shè)置工作目錄 # 之后的所有命令都會(huì)在這個(gè)目錄下執(zhí)行 WORKDIR /app # 4. 復(fù)制文件 # 將本地的項(xiàng)目文件復(fù)制到容器的指定目錄 COPY . . # 5. 執(zhí)行命令 # 在鏡像構(gòu)建過程中執(zhí)行任何命令,如安裝依賴 RUN <你的安裝命令> # 6. 指定容器啟動(dòng)時(shí)執(zhí)行的命令 CMD ["<可執(zhí)行文件>", "參數(shù)1", "參數(shù)2"]
指令解析:
FROM: 必須是第一條指令,指定你的鏡像基于哪個(gè)鏡像構(gòu)建。例如ubuntu:latest或python:3.12。WORKDIR: 相當(dāng)于cd命令,為后續(xù)操作設(shè)置一個(gè)工作目錄。COPY: 將宿主機(jī)(你的電腦)的文件或目錄復(fù)制到鏡像中。格式為COPY <宿主機(jī)路徑> <容器路徑>。RUN: 在鏡像構(gòu)建時(shí)執(zhí)行的命令,常用于安裝軟件包。例如RUN apt-get update && apt-get install -y git。CMD: 容器啟動(dòng)后默認(rèn)執(zhí)行的命令。一個(gè)Dockerfile中只有最后一個(gè)CMD會(huì)生效。
步驟 2:構(gòu)建鏡像
編寫好 Dockerfile 后,在它所在的目錄下打開終端,運(yùn)行 docker build 命令來創(chuàng)建鏡像。
docker build -t my-custom-app:v1.0 .
-t my-custom-app:v1.0:-t參數(shù)用于給鏡像打上一個(gè)標(biāo)簽(tag),格式為名稱:版本號(hào),方便管理。.: 這個(gè)點(diǎn)號(hào)非常重要,它表示構(gòu)建上下文(context)的路徑,通常就是當(dāng)前目錄。Docker 會(huì)在這個(gè)目錄下尋找Dockerfile和相關(guān)文件。
步驟 3:運(yùn)行容器
鏡像構(gòu)建成功后,就可以用它來創(chuàng)建和運(yùn)行容器了。
docker run -d -p 8080:80 --name my-running-app my-custom-app:v1.0
-d: 表示“分離模式”,容器會(huì)在后臺(tái)運(yùn)行。-p 8080:80: 端口映射。將宿主機(jī)的8080端口映射到容器的80端口。這樣你就可以通過訪問localhost:8080來訪問容器內(nèi)的服務(wù)。--name my-running-app: 給容器起一個(gè)容易記住的名字。my-custom-app:v1.0: 你要使用的鏡像名稱和標(biāo)簽。
三、 與容器交互
容器運(yùn)行起來后,我們經(jīng)常需要進(jìn)入其內(nèi)部進(jìn)行調(diào)試或配置。
如何進(jìn)入容器環(huán)境
最常用、最安全的方式是使用 docker exec 命令:
docker exec -it my-running-app /bin/bash
exec: 在一個(gè)運(yùn)行中的容器里執(zhí)行新命令。-it: 這是-i(交互式)和-t(分配一個(gè)偽終端)的縮寫,組合起來讓我們能像操作普通終端一樣操作容器。/bin/bash: 你想在容器內(nèi)啟動(dòng)的 Shell 程序。如果基礎(chǔ)鏡像非常精簡,可能沒有bash,可以嘗試/bin/sh。
執(zhí)行后,你就會(huì)看到命令行提示符變了,這表示你已經(jīng)成功進(jìn)入了容器的內(nèi)部環(huán)境。
如何配置容器
最佳實(shí)踐:配置優(yōu)先在 Dockerfile 中完成。
任何你希望在容器中永久存在的軟件、配置或環(huán)境變量,都應(yīng)該通過 RUN、COPY、ENV 等指令寫入 Dockerfile。然后重新構(gòu)建鏡像,這樣才能保證環(huán)境的一致性和可復(fù)現(xiàn)性。
臨時(shí)調(diào)試:在容器內(nèi)手動(dòng)配置。
進(jìn)入容器后,你可以像在普通 Linux 環(huán)境中一樣安裝軟件、修改文件。但請(qǐng)記住,這些修改是臨時(shí)的!一旦容器被刪除,所有修改都會(huì)丟失。這種方式僅用于快速調(diào)試和驗(yàn)證。
四、 通用模板
理論說再多,不如一個(gè)實(shí)用的模板。下面提供兩個(gè)模板,你可以直接復(fù)制使用,稍作修改即可滿足你的需求。
1. 通用自定義模板
這個(gè)模板適用于大多數(shù)基于 Debian/Ubuntu 的應(yīng)用。
Dockerfile
# 使用一個(gè)輕量級(jí)的 Debian 版本作為基礎(chǔ)
FROM debian:bullseye-slim
# 設(shè)置環(huán)境變量,避免交互式安裝
ENV DEBIAN_FRONTEND=noninteractive
# 設(shè)置工作目錄
WORKDIR /workspace
# 更新包列表并安裝基礎(chǔ)工具(根據(jù)需要增刪)
RUN apt-get update && apt-get install -y \
curl \
vim \
git \
&& rm -rf /var/lib/apt/lists/*
# 復(fù)制你的項(xiàng)目代碼到工作目錄
COPY . .
# 定義容器啟動(dòng)后執(zhí)行的默認(rèn)命令
# 例如,啟動(dòng)一個(gè)簡單的 Web 服務(wù)器或你的應(yīng)用
CMD ["echo", "Hello from my custom container!"]
docker-compose.yml (配套使用,強(qiáng)烈推薦)
version: '3.8'
services:
app:
build: . # 在當(dāng)前目錄下構(gòu)建 Dockerfile
container_name: my-generic-app
ports:
- "8080:8080" # 將主機(jī)的 8080 端口映射到容器的 8080 端口
volumes:
- .:/workspace # 將當(dāng)前目錄掛載到容器的 /workspace,實(shí)現(xiàn)代碼實(shí)時(shí)同步
stdin_open: true # 保持標(biāo)準(zhǔn)輸入開放
tty: true # 分配一個(gè)偽終端
使用方法:將以上兩個(gè)文件放在你的項(xiàng)目根目錄,然后運(yùn)行 docker-compose up -d 即可。
2. Python 3.12 開發(fā)環(huán)境專屬模板
這個(gè)模板專為 Python 3.12 開發(fā)優(yōu)化,包含了依賴管理和緩存優(yōu)化等最佳實(shí)踐。
項(xiàng)目結(jié)構(gòu):
my-python-project/
├── Dockerfile
├── docker-compose.yml
├── requirements.txt
└── main.py
requirements.txt
flask==3.0.0 requests==2.31.0 # 在這里添加你需要的所有 Python 包
main.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return "<h1>Hello, Docker with Python 3.12!</h1>"
if __name__ == '__main__':
# 監(jiān)聽所有網(wǎng)絡(luò)接口,端口 5000
app.run(host='0.0.0.0', port=5000)
Dockerfile
# 1. 使用官方 Python 3.12 slim 版本作為基礎(chǔ)鏡像 FROM python:3.12-slim # 2. 設(shè)置環(huán)境變量,優(yōu)化 Python 行為 ENV PYTHONDONTWRITEBYTECODE=1 # 不生成 .pyc 文件 ENV PYTHONUNBUFFERED=1 # 確保 Python 輸出直接發(fā)送到終端 # 3. 設(shè)置工作目錄 WORKDIR /app # 4. 【緩存優(yōu)化】先復(fù)制依賴文件并安裝依賴 # 這樣做的好處是,當(dāng)代碼變化時(shí),只要 requirements.txt 不變, # Docker 就會(huì)使用緩存,無需重新安裝依賴,大大加快構(gòu)建速度。 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 5. 復(fù)制項(xiàng)目代碼 COPY . . # 6. 暴露應(yīng)用端口(可選,但推薦) EXPOSE 5000 # 7. 定義容器啟動(dòng)時(shí)執(zhí)行的命令 CMD ["python", "main.py"]
docker-compose.yml
version: '3.8'
services:
python-app:
build: .
container_name: my-python312-app
ports:
- "5000:5000" # 將主機(jī)的 5000 端口映射到容器的 5000 端口
volumes:
- .:/app # 掛載代碼目錄,實(shí)現(xiàn)熱重載(部分框架支持)
restart: unless-stopped # 除非手動(dòng)停止,否則容器會(huì)在退出后自動(dòng)重啟
使用方法:
- 創(chuàng)建以上文件和目錄。
- 在
my-python-project目錄下運(yùn)行docker-compose up -d --build。 - 打開瀏覽器訪問
http://localhost:5000,你就能看到 “Hello, Docker with Python 3.12!” 了。
五、 保存與遷移
當(dāng)你辛辛苦苦配置好一個(gè)完美的環(huán)境后,如何將它保存并遷移到另一臺(tái)機(jī)器上呢?
方法一:推送到鏡像倉庫(推薦)
這是最專業(yè)、最常用的方式,尤其適合團(tuán)隊(duì)協(xié)作。
登錄 Docker Hub(或其他私有倉庫):
docker login
給鏡像打上遠(yuǎn)程倉庫標(biāo)簽:
# 格式:docker tag <本地鏡像名> <你的DockerHub用戶名>/<鏡像名>:<標(biāo)簽> docker tag my-custom-app:v1.0 your-dockerhub-username/my-custom-app:v1.0
推送鏡像:
docker push your-dockerhub-username/my-custom-app:v1.0
在另一臺(tái)機(jī)器上,只需 docker pull your-dockerhub-username/my-custom-app:v1.0 即可獲取該鏡像。
方法二:導(dǎo)出/導(dǎo)入鏡像文件
適用于離線環(huán)境或一次性遷移。
導(dǎo)出鏡像為 .tar 文件:
docker save -o my-custom-app.tar my-custom-app:v1.0
將 my-custom-app.tar 文件拷貝到目標(biāo)機(jī)器。
在目標(biāo)機(jī)器上導(dǎo)入鏡像:
docker load -i my-custom-app.tar
到此這篇關(guān)于淺析Docker如何創(chuàng)建自定義容器(附通用Python 3.12模板)的文章就介紹到這了,更多相關(guān)Docker創(chuàng)建自定義容器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何解決對(duì)Docker容器內(nèi)存限制警告或未實(shí)際限制的問題
這篇文章主要介紹了如何解決對(duì)Docker容器內(nèi)存限制警告或未實(shí)際限制的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
淺析SpringBoot打包上傳到docker并實(shí)現(xiàn)多實(shí)例部署(IDEA版)
這篇文章主要介紹了SpringBoot打包上傳到docker并實(shí)現(xiàn)多實(shí)例部署(IDEA版),本文通過圖文并茂實(shí)例詳解的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
Docker部署Mysql8的實(shí)現(xiàn)步驟
本文主要介紹了Docker部署Mysql8的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
docker搭建CMS點(diǎn)播系統(tǒng)帶播放器功能
熟悉docker的童鞋都知道,安裝是非常的便利的,也可以在線體驗(yàn)的,今天通過本文給大家介紹docker搭建CMS點(diǎn)播系統(tǒng)帶播放器功能,感興趣的朋友跟隨小編一起看看吧2021-05-05
如何在Docker容器內(nèi)外互相拷貝數(shù)據(jù)
本篇文章主要介紹了如何在Docker容器內(nèi)外互相拷貝數(shù)據(jù),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12
Docker CentOS7的系統(tǒng)上安裝部署以及基礎(chǔ)教程
這篇文章主要介紹了Docker CentOS7的系統(tǒng)上安裝部署以及基礎(chǔ)教程的相關(guān)資料,需要的朋友可以參考下2016-10-10
Docker安裝方法與Docker四種網(wǎng)絡(luò)模式詳解
今天小編就為大家分享一篇關(guān)于Docker安裝方法與Docker四種網(wǎng)絡(luò)模式的詳解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-09-09
使用docker部署django技術(shù)棧項(xiàng)目的方法步驟
這篇文章主要介紹了使用docker部署django技術(shù)棧項(xiàng)目的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09

