當然懂!不懂 Docker?這篇入門文章絕對就夠了。

我們用最直觀、最容易理解的方式,帶你從“為什麼要用 Docker”到“親手運行你的第一個容器”。讓我們開始吧!


一、Docker 是什麼?為什麼需要它?

想象一下這個場景:

  • 開發人員小張 在他的電腦上開發了一個應用程序,運行得非常完美。
  • 他把代碼打包發給測試人員小李。小李安裝環境時發現缺少一個庫,程序跑不起來。
  • 好不容易環境搞定了,測試通過。程序部署到生產服務器上,結果服務器操作系統版本和小張的開發機不一樣,程序又崩潰了...

這就是典型的 “在我機器上能跑” 問題。問題的根源在於環境不一致。

Docker 就是為了解決這個問題而生的。

你可以把 Docker 理解成一個輕量級的虛擬機,但它的原理更先進。

  • 傳統虛擬機:模擬整個操作系統,包括硬件層、完整的系統內核,非常笨重,資源佔用高。
  • Docker 容器:直接運行在宿主機的操作系統內核上,只是將應用程序和它所需要的依賴(庫、配置文件、環境變量等)打包在一起。它非常輕便、啓動速度極快。

簡單比喻:

  • 虛擬機:就像在一棟大樓裏,為每個租户建了一整套帶牆的公寓(操作系統),隔離性好,但佔地大,建得慢。
  • Docker 容器:就像在同一棟大樓裏,用更輕便的隔斷為每個租户劃分出一個單間。他們共享大樓的基礎設施(內核),但彼此擁有獨立的空間,搬家(部署)也非常方便。

Docker 的核心價值:一次構建,處處運行。


二、Docker 核心概念:三個關鍵詞

學習 Docker,你只需要先理解三個核心概念:

  1. 鏡像(Image)

    • 是什麼? 一個只讀的模板。類似於安裝操作系統時用的 .iso 文件,或者面向對象編程中的“類”。
    • 作用:鏡像用來創建容器。它裏面包含了運行應用所需的所有代碼、運行時環境、庫、環境變量和配置文件。
    • 舉例:一個 Ubuntu 鏡像、一個安裝了 Nginx 的鏡像、一個安裝了 Python 和你的應用的鏡像。
  2. 容器(Container)

    • 是什麼? 鏡像的一個運行實例。類似於根據 .iso 文件安裝好的操作系統,或者根據“類”創建出來的“對象”。
    • 作用:容器才是真正運行應用的地方。它是從鏡像創建出來的,是可讀寫的。
    • 特點:容器之間相互隔離,保證安全。你可以啓動、停止、刪除容器。
  3. 倉庫(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 應用鏡像。

  1. 準備文件:在一個空文件夾裏,創建兩個文件。

    • 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
    
  2. 構建鏡像:在終端中,進入這個文件夾,運行構建命令。

    docker build -t my-python-app .
    

    -t my-python-app 給鏡像打一個標籤(名字),最後的 . 表示 Dockerfile 在當前目錄。

  3. 運行容器

    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 的世界很大,但這篇文章足以讓你自信地邁出第一步!祝你玩得開心!