在Linux系統(tǒng)中使用Dockerfile創(chuàng)建Docker的完整步驟
1. Docker 簡介
Docker 是一種輕量級(jí)的容器化技術(shù),它可以將應(yīng)用程序及其運(yùn)行環(huán)境打包成一個(gè)獨(dú)立的“容器”(Container)。這個(gè)容器包含運(yùn)行所需的一切依賴,如操作系統(tǒng)環(huán)境、庫、配置文件等,從而實(shí)現(xiàn)“一次構(gòu)建,處處運(yùn)行”。
相比傳統(tǒng)的虛擬機(jī),Docker 啟動(dòng)速度更快、占用資源更少,因?yàn)樗苯踊谒拗鳈C(jī)的 Linux 內(nèi)核運(yùn)行,不需要額外的系統(tǒng)虛擬化層。開發(fā)者可以使用 Docker 來:
- 快速搭建統(tǒng)一的開發(fā)環(huán)境;
- 將應(yīng)用打包成可移植的鏡像;
- 實(shí)現(xiàn)自動(dòng)化部署與持續(xù)集成;
- 避免“在我電腦上能跑”的環(huán)境不一致問題。
在實(shí)際使用中,我們通常通過 Dockerfile 來定義鏡像的構(gòu)建過程。Dockerfile 是一個(gè)包含多條指令的文本文件,描述了從基礎(chǔ)鏡像開始,如何安裝依賴、復(fù)制文件、設(shè)置環(huán)境變量、以及定義容器啟動(dòng)命令。
構(gòu)建完成后,只需一條命令即可生成鏡像,并在任意安裝了 Docker 的系統(tǒng)上運(yùn)行。
2. 編寫Dockerfile文本文件
2.1 創(chuàng)建文件
終端先cd到你要保存此文件的路徑下,再執(zhí)行下面的命令,創(chuàng)建一個(gè)空的Dockerfile文件:
echo "" > Dockerfile # Dockerfile 名字不能改,區(qū)分大小寫
2.2 編寫Dockerfile內(nèi)容
使用gedit 或 Vs Code打開Dockerfile:
# gedit 安裝命令 # sudo apt install gedit gedit Dockerfile
構(gòu)造方式分為單階段和多階段,區(qū)別就是多階段構(gòu)造出來的Docker體積可能更?。ㄈQ于你的具體情況),也就是存在某些包是你Docker中不需要但是在創(chuàng)建Docker過程中必須需要的包,否則,這一優(yōu)勢并得不到體現(xiàn),通?;居脝坞A段構(gòu)造沒有任何問題,通常多一個(gè)包也不會(huì)多多大的體積。要想減小Docker體積,最有效的方法是刪除構(gòu)建過程中的臨時(shí)/緩存文件。
2.2.1 單階段構(gòu)造
在Dockerfile中添加你需要的內(nèi)容,以下為示例,應(yīng)根據(jù)自己需求添加或刪減,推薦這種方式,簡單不傷腦:
# 使用 Ubuntu 22.04 作為基礎(chǔ)鏡像(基礎(chǔ)鏡像可自選)
FROM ubuntu:22.04
# 設(shè)置非交互模式,避免安裝過程中彈出提示
ENV DEBIAN_FRONTEND=noninteractive
# 前面設(shè)置了非交互式,可不用設(shè)置時(shí)區(qū)
# 設(shè)置時(shí)區(qū)為 UTC (0時(shí)區(qū)),避免交互式選擇時(shí)產(chǎn)生錯(cuò)誤
# ENV TZ=UTC
# 設(shè)置時(shí)區(qū)為北京時(shí)間(東八區(qū)),并連接正確的時(shí)區(qū)文件
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 安裝必要的一些工具和 Python 3.10 (可以根據(jù)需要修改)
RUN apt-get update && apt-get install -y \
python3.10 \
python3.10-dev \
python3.10-venv \
python3-pip \
python3-setuptools \
build-essential \
gcc-9 \
g++-9 \
cmake \
gdb \
curl \
wget \
git \
vim \
tzdata && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* #刪除臨時(shí)/緩存構(gòu)造文件
# 更新 pip 為最新版
RUN python3.10 -m pip install --upgrade pip
# 安裝常用的 Python 庫(可以根據(jù)需要修改)
RUN python3.10 -m pip install --no-cache-dir \
wheel \
setuptools \
pandas \
numpy \
requests \
flask \
pytest \
opencv-python \
PyYAML
# 設(shè)置工作目錄(workspace 可自定義)
WORKDIR /workspace
# 默認(rèn)命令
CMD ["/bin/bash"]
2.2.2 多階段構(gòu)建
以下為多階段構(gòu)建Docker的Dockerfile示例,這種情況一定清楚有哪些包是構(gòu)建過程必須而最終產(chǎn)物無需的,否則付出和收益可能達(dá)不到預(yù)期。
# 第一階段:構(gòu)建階段
FROM ubuntu:22.04 AS builder
# 設(shè)置非交互模式,避免安裝過程中彈出提示
ENV DEBIAN_FRONTEND=noninteractive
# 設(shè)置時(shí)區(qū)為上海時(shí)間
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 安裝構(gòu)建工具和 Python 3.10
RUN apt-get update && apt-get install -y \
python3.10 \
python3.10-dev \
python3.10-venv \
python3-pip \
python3-setuptools \
build-essential \
gcc-9 \
g++-9 \
cmake \
gdb \
wget \
unzip \
tar \
curl \
wget \
git \
vim \
tzdata && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# 更新 pip 為最新版
RUN python3.10 -m pip install --upgrade pip
# 安裝常用的 Python 庫(可以根據(jù)需要修改)
RUN python3.10 -m pip install --no-cache-dir \
wheel \
setuptools \
pandas \
numpy \
requests \
flask \
pytest \
opencv-python \
PyYAML
# 第二階段:運(yùn)行環(huán)境
FROM ubuntu:22.04 AS runtime
# 設(shè)置非交互模式,避免安裝過程中彈出提示
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 安裝生產(chǎn)環(huán)境所需的基礎(chǔ)依賴
RUN apt-get update && apt-get install -y \
python3.10 \
python3.10-venv \
python3-pip \
python3-setuptools \
tzdata && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# 從構(gòu)建階段復(fù)制已安裝的 Python 包到運(yùn)行時(shí)階段
COPY --from=builder /root/.local /root/.local
COPY --from=builder /usr/local /usr/local
# 設(shè)置工作目錄
WORKDIR /workspace
# 默認(rèn)命令
CMD ["/bin/bash"]
3. 使用Dockerfile文件創(chuàng)建Docker
3.1 (可選)添加中國大陸Docker Hub 鏡像源
如果你在中國大陸,Docker Hub 的官方鏡像源可能比較慢,可以嘗試配置國內(nèi)的鏡像源進(jìn)行加速下載。
# vim 安裝命令 # sudo apt install vim sudo vim /etc/docker/daemon.json
運(yùn)行上面的命令,將下面的內(nèi)容添加到daemon.json中:
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.1panel.live",
"https://hub.rat.dev"
]
}
你也可以嘗試添加別的鏡像源來加速。
添加后,重啟Docker服務(wù):
systemctl daemon-reexec systemctl restart docker
3.2 創(chuàng)建Docker
有了Dockerfile之后,就可以開始使用命令創(chuàng)建Docker了,打開終端,cd到存放Dockerfile的路徑下,執(zhí)行命令,開始構(gòu)建Docker:
docker build -t <docker name>:<tag> . # for example docker build -t ubuntu22-04:base . docker build -t first_docker:v1.0.0 .
輸入準(zhǔn)確命令后回車執(zhí)行,如下終端截圖,耐心等待,受網(wǎng)絡(luò)和機(jī)器性能影響,耗時(shí)不太確定:

創(chuàng)建完成后,執(zhí)行 docker images 來查看當(dāng)前機(jī)器中的鏡像。
3.3 測試/使用鏡像
使用創(chuàng)建好的Docker來起一個(gè)容器,測試Docker是否符合預(yù)期:
docker run -it --rm --name Test-Docker -v /home/solun/Docker:/workspace/Docker_map ubuntu22-04:base # 參數(shù)解釋 --rm #加上這個(gè)參數(shù),當(dāng)退出容器,容器停止運(yùn)行時(shí),容器會(huì)自動(dòng)刪除 --name #指定容器的名字 -v #用于指定宿主機(jī)和容器的路徑映射,映射后,容器便可訪問宿主機(jī)被映射的路徑下的資源, #-v 可以有多個(gè),一個(gè) -v 指定一個(gè)路徑映射關(guān)系,當(dāng)你要映射多個(gè)路徑到容器中,那就多來幾個(gè)-v
運(yùn)行后,就直接進(jìn)入了容器:

在另一個(gè)終端中使用命令 docker ps -a 查看當(dāng)前機(jī)器中所有的容器:

我映射了宿主機(jī)的/home/solun/Docker 到容器的 /workspace/Docker_map,因此容器中Docker_map內(nèi)的內(nèi)容就是宿主機(jī)的Docker中的內(nèi)容:

查看容器中是否包含Dockerfile中指定的那些pip包:
pip list

到這里基本就沒什么問題了,可以使用你的Docker或容器了。
4. 保存/分享Docker
4.1 保存Docker
將Docker保存成.tar文件
docker save -o <tar_name>.tar <docker_name>:tag # 參數(shù)解釋 tar_name #要保存的.tar文件名 docker_name #剛才創(chuàng)建的Docker的名字 tag #剛才創(chuàng)建的Docker的tag # for example docker save -o Ubuntu_22-04.tar ubuntu22-04:base

4.2 分享Docker
上面保存的tar文件可以隨意分享給他人,而他人在安裝了Docker的機(jī)器上只需使用下面的命令加載tar文件里的Docker即可:
docker load -i <tar_name>.tar # for example docker load -i Ubuntu_22-04.tar
加載后,使用docker images即可查看電腦上新加載的鏡像。
5. Docker容器基礎(chǔ)常用命令
5.1 創(chuàng)建容器
docker run -it --name <容器名稱> -v <宿主機(jī)絕對(duì)路徑>:<容器內(nèi)的絕對(duì)路徑> <docker名>:<docker tag> # for example docker run -it --name Test-Docker -v /home/solun/Docker:/workspace/Docker_map ubuntu22-04:base
5.2 停止/啟動(dòng)/重啟已有容器
docker stop <容器名/容器ID> docker start <容器名/容器ID> docker restart <容器名/容器ID>
5.3 進(jìn)入容器
docker exec -it <容器名/容器ID> /bin/bash
5.4 退出容器
exit # 容器會(huì)被關(guān)閉 exit -d # 容器不會(huì)被關(guān)閉 ctrl + p +q # 容器不會(huì)被關(guān)閉
5.5 刪除容器
docker rm <容器名/容器ID>
5.6 復(fù)制文件
# 從容器內(nèi) 復(fù)制到 容器外 docker cp <容器ID/名稱>:<容器內(nèi)路徑> <容器外路徑> # 從容器外 復(fù)制到 容器內(nèi) docker cp <容器外路徑> <容器ID/名稱>:<容器內(nèi)路徑>
5.7 設(shè)置容器自動(dòng)啟動(dòng)
# 在創(chuàng)建時(shí)設(shè)置 docker run -it --name <容器名稱> --restart=always -v <宿主機(jī)絕對(duì)路徑>:<容器內(nèi)的絕對(duì)路徑> <docker名>:<docker tag> # 已存在容器設(shè)置自啟動(dòng) docker update --restart=always <容器名/容器ID> or docker container update --restart=always <容器名/容器ID>
5.8 容器端口映射
docker run -it --name <容器名> -p <宿主機(jī)端口>:<容器端口> <docker名>:<docker tag>
總結(jié)
到此這篇關(guān)于在Linux系統(tǒng)中使用Dockerfile創(chuàng)建Docker的文章就介紹到這了,更多相關(guān)Linux使用Dockerfile創(chuàng)建Docker內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker build創(chuàng)建鏡像命令示例實(shí)踐
本文講解Dockerfile的核心概念、基礎(chǔ)指令、構(gòu)建流程及優(yōu)化技巧,涵蓋鏡像層結(jié)構(gòu)、構(gòu)建上下文、常用命令參數(shù),強(qiáng)調(diào)多階段構(gòu)建、輕量鏡像等最佳實(shí)踐,感興趣的朋友跟隨小編一起看看吧2025-08-08
淺談docker-compose網(wǎng)絡(luò)設(shè)置之networks
這篇文章主要介紹了淺談docker-compose網(wǎng)絡(luò)設(shè)置之networks,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-09-09
Mysql 在 Docker 中的時(shí)區(qū)問題記錄
Mysql 時(shí)區(qū)一般是跟著系統(tǒng)走的,而在 Docker 中安裝 Mysql 默認(rèn)時(shí)區(qū)是 UTC,下面介紹,創(chuàng)建Docker容器前、后,分別如何設(shè)置 Mysql 時(shí)區(qū),感興趣的朋友跟隨小編一起看看吧2024-07-07
關(guān)于Docker網(wǎng)絡(luò)配置及部署SpringCloud項(xiàng)目詳解
這篇文章主要介紹了關(guān)于Docker網(wǎng)絡(luò)配置及部署SpringCloud項(xiàng)目詳解,Docker在創(chuàng)建容器時(shí)有四種網(wǎng)絡(luò)模式,bridge為默認(rèn)不需要去指定,其他三種模式需要在創(chuàng)建容器時(shí)使用–net去指定,需要的朋友可以參考下2023-07-07
使用?Docker?Compose?構(gòu)建復(fù)雜的多容器?App的方法
Docker Compose 工具相當(dāng)于 C/C++ 的 make 工具,使用 make 需要 Makefile,所有的編譯鏈接設(shè)置都在Makefile 中指定,不需要為了運(yùn)行程序而每次都在終端手動(dòng)輸入長串的指令,這篇文章主要介紹了使用?Docker?Compose?構(gòu)建復(fù)雜的多容器?App,需要的朋友可以參考下2022-04-04
解決docker中mysql時(shí)間與系統(tǒng)時(shí)間不一致問題
最近在Docker中裝mysql時(shí),發(fā)現(xiàn)數(shù)據(jù)庫時(shí)間與系統(tǒng)時(shí)間相差8個(gè)小時(shí)。查詢資料發(fā)現(xiàn),docker的默認(rèn)時(shí)區(qū)是0區(qū),其實(shí)這會(huì)對(duì)安裝的容器造成不少麻煩,比如執(zhí)行日志的記錄不準(zhǔn)確等2021-12-12
docker搭建minio集群的實(shí)現(xiàn)示例
Docker MinIO集群是一種基于Docker的MinIO分布式存儲(chǔ)解決方案,本文主要介紹了docker搭建minio集群的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
Docker 拉取鏡像及標(biāo)簽操作 pull | tag
這篇文章主要介紹了Docker 拉取鏡像及標(biāo)簽操作 pull | tag,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11

