當然懂!不懂 Docker?這篇入門文章絕對就夠了。
我們用最直觀、最容易理解的方式,帶你從“為什麼要用 Docker”到“親手運行你的第一個容器”。讓我們開始吧!
一、Docker 是什麼?為什麼需要它?
想象一下這個場景:
- 開發人員小張 在他的電腦上開發了一個應用程序,運行得非常完美。
- 他把代碼打包發給測試人員小李。小李安裝環境時發現缺少一個庫,程序跑不起來。
- 好不容易環境搞定了,測試通過。程序部署到生產服務器上,結果服務器操作系統版本和小張的開發機不一樣,程序又崩潰了...
這就是典型的 “在我機器上能跑” 問題。問題的根源在於環境不一致。
Docker 就是為了解決這個問題而生的。
你可以把 Docker 理解成一個輕量級的虛擬機,但它的原理更先進。
- 傳統虛擬機:模擬整個操作系統,包括硬件層、完整的系統內核,非常笨重,資源佔用高。
- Docker 容器:直接運行在宿主機的操作系統內核上,只是將應用程序和它所需要的依賴(庫、配置文件、環境變量等)打包在一起。它非常輕便、啓動速度極快。
簡單比喻:
- 虛擬機:就像在一棟大樓裏,為每個租户建了一整套帶牆的公寓(操作系統),隔離性好,但佔地大,建得慢。
- Docker 容器:就像在同一棟大樓裏,用更輕便的隔斷為每個租户劃分出一個單間。他們共享大樓的基礎設施(內核),但彼此擁有獨立的空間,搬家(部署)也非常方便。
Docker 的核心價值:一次構建,處處運行。
二、Docker 核心概念:三個關鍵詞
學習 Docker,你只需要先理解三個核心概念:
-
鏡像(Image)
- 是什麼? 一個只讀的模板。類似於安裝操作系統時用的
.iso文件,或者面向對象編程中的“類”。 - 作用:鏡像用來創建容器。它裏面包含了運行應用所需的所有代碼、運行時環境、庫、環境變量和配置文件。
- 舉例:一個 Ubuntu 鏡像、一個安裝了 Nginx 的鏡像、一個安裝了 Python 和你的應用的鏡像。
- 是什麼? 一個只讀的模板。類似於安裝操作系統時用的
-
容器(Container)
- 是什麼? 鏡像的一個運行實例。類似於根據
.iso文件安裝好的操作系統,或者根據“類”創建出來的“對象”。 - 作用:容器才是真正運行應用的地方。它是從鏡像創建出來的,是可讀寫的。
- 特點:容器之間相互隔離,保證安全。你可以啓動、停止、刪除容器。
- 是什麼? 鏡像的一個運行實例。類似於根據
-
倉庫(Registry)
- 是什麼? 存放鏡像的地方,類似於代碼倉庫 Git。
- 最著名的公共倉庫:Docker Hub (https://hub.docker.com/)。這裏有無數官方和個人上傳的鏡像,比如 Nginx, MySQL, Redis, Ubuntu 等,你可以直接下載使用。
- 私有倉庫:公司內部可以搭建自己的私有倉庫,存放保密的項目鏡像。
三者關係圖解:
Dockerfile -> 構建(Build) -> 鏡像(Image) -> 運行(Run) -> 容器(Container) -> 推送(Push) -> 倉庫(Registry)
三、手把手實戰:運行你的第一個容器
理論説再多不如動手一試。假設你已經在電腦上安裝好了 Docker(安裝教程簡單,官網下載對應版本即可)。
我們的目標是:在容器中運行一個 Nginx 服務器,並訪問它。
步驟 1:拉取鏡像 首先,我們需要 Nginx 的鏡像。打開你的終端(命令行),輸入:
docker pull nginx
這條命令會從 Docker Hub 下載最新的官方 Nginx 鏡像。
步驟 2:運行容器 鏡像下載完成後,用它來創建一個並運行一個容器:
docker run --name my-nginx -p 80:80 -d nginx
--name my-nginx:給容器起個名字,方便管理,這裏叫my-nginx。-p 80:80:進行端口映射。將宿主機的 80 端口映射到容器的 80 端口。這樣你訪問本機 IP 的 80 端口,流量就會轉到容器內。-d:讓容器在後台運行。nginx:指定使用哪個鏡像來運行容器。
步驟 3:驗證 運行成功後,打開你的瀏覽器,輸入 http://localhost。 如果看到 “Welcome to nginx!” 的頁面,恭喜你!你的第一個 Docker 容器已經成功運行!
步驟 4:常用管理命令
- 查看正在運行的容器:
docker ps - 查看所有容器(包括已停止的):
docker ps -a - 停止容器:
docker stop my-nginx - 啓動已停止的容器:
docker start my-nginx - 進入容器內部:
docker exec -it my-nginx bash(就像 SSH 進了一台虛擬機) - 刪除容器:
docker rm my-nginx(刪除前需先停止容器) - 查看鏡像列表:
docker images
四、進階一步:如何創建自己的鏡像?(使用 Dockerfile)
光會用別人的鏡像還不夠,如何把自己的應用打包成鏡像呢?答案是使用 Dockerfile。
Dockerfile 是一個文本文件,裏面包含了一條條指令,告訴 Docker 如何構建你的鏡像。
舉個例子:創建一個簡單的 Python Web 應用鏡像。
-
準備文件:在一個空文件夾裏,創建兩個文件。
app.py(你的 Python 應用)
from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return 'Hello, Docker!' if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)Dockerfile(沒有後綴名)
# 使用官方 Python 運行時作為父鏡像 FROM python:3.9-slim # 設置工作目錄為 /app WORKDIR /app # 將當前目錄內容複製到容器的 /app 下 COPY . /app # 安裝 requirements.txt 中指定的依賴 RUN pip install --trusted-host pypi.python.org -r requirements.txt # 暴露 5000 端口,讓外部可以訪問 EXPOSE 5000 # 定義環境變量 ENV NAME World # 容器啓動時運行 app.py CMD ["python", "app.py"]requirements.txt
Flask==2.0.1 -
構建鏡像:在終端中,進入這個文件夾,運行構建命令。
docker build -t my-python-app .-t my-python-app給鏡像打一個標籤(名字),最後的.表示 Dockerfile 在當前目錄。 -
運行容器:
docker run -p 5000:5000 -d my-python-app現在,訪問
http://localhost:5000,你就能看到 “Hello, Docker!” 了!
總結
| 概念 | 理解 | 類比 |
|---|---|---|
| 鏡像 (Image) | 只讀的模板,應用的“安裝包” | 類(Class)、.iso 系統鏡像 |
| 容器 (Container) | 鏡像的運行實例,隔離的環境 | 對象(Object)、安裝好的操作系統 |
| 倉庫 (Registry) | 存放鏡像的服務器 | GitHub、應用商店 |
| Dockerfile | 構建鏡像的“説明書” | 食譜、裝配手冊 |
通過這篇入門文章,你已經掌握了 Docker 的核心思想、基本概念和常用操作。接下來,你可以:
- 去 Docker Hub 探索更多有趣的鏡像。
- 學習
docker-compose來編排和管理多個容器。 - 嘗試將你自己的項目通過 Dockerfile 容器化。
Docker 的世界很大,但這篇文章足以讓你自信地邁出第一步!祝你玩得開心!