更多云服務器知識,盡在hostol.com
“在我電腦上明明是好的啊!”
這句話,是不是堪稱程序員“甩鍋”排行榜第一名的金句?當你辛辛苦苦開發完一個應用,把它交給同事或者部署到服務器上時,卻發現因為它依賴的某個函數庫版本不對、或者操作系統的配置有差異,程序壓根就跑不起來。那種挫敗感,足以摧毀一個美好的下午。
環境不一致,就是那個永遠潛伏在開發與運維之間、制造了無數麻煩的“幽靈”。
那么,有沒有一種方法,能把我的應用程序,連同它運行所需的所有環境(比如特定版本的Python、所有的依賴庫、所有的配置文件),像制作一個“愛心便當”一樣,完美地打包在一起?這個“便當盒”本身就是一個隔離的、干凈的迷你操作系統。無論我把這個“便當”帶到誰的電腦上,或者哪臺服務器上,只要對方安裝了“微波爐”(也就是Docker環境),就能一鍵“加熱”,百分之百地還原出和我電腦上一模一樣的、熱氣騰騰的飯菜(應用程序)。
有!這個神奇的“便當盒”制作技術,就是Docker。而Docker,就是那位來消滅“環境不一致”這個幽靈的“捉鬼天師”。
拆解“魔法便當盒”:Docker的三大核心概念
在動手之前,我們必須先花三分鐘,用大白話理解Docker的三個核心“零件”。
- 鏡像 (Image): 這就是制作“便當”的**“菜譜和配料清單”**。它是一個只讀的模板,詳細地記錄了制作某個特定便當(比如“宮保雞丁便當”)需要哪些米飯、哪些雞肉、哪些配菜(應用程序和依賴庫),以及制作的先后順序。
- 容器 (Container): 這就是根據菜譜,做出來的、那個熱氣騰騰的、可以吃的“便當”本身。鏡像是靜態的模板,而容器是動態的、正在運行的實例。你可以用同一份“宮保雞丁”菜譜(鏡像),做出無數份一模一樣的“宮保雞丁便當”(容器)。每個便當(容器)都是獨立、隔離的。
- 倉庫 (Repository): 這就是存放各種“菜譜”(鏡像)的**“巨型線上菜譜圖書館”**。其中最大、最官方的那個,叫Docker Hub。你可以從里面找到幾乎所有流行軟件的官方菜譜,比如Nginx、MySQL、Python等等。
理解了這三點,我們就可以開始制作我們的第一個“便當”了。
第一步:準備“廚房”——在騰訊云上請一位“自帶廚具”的大廚
我們首先需要一個裝好了全套“廚具”(Docker環境)的“廚房”(服務器)。而騰訊云的輕量應用服務器,為我們提供了一個極其方便的“作弊”選項。
- 登錄騰訊云,進入輕量應用服務器的購買頁面。
- 選擇地域和配置。 對于學習Docker來說,最便宜的2核4G配置,就已經綽綽有余。
- 關鍵一步:選擇鏡像! 在“鏡像”這一欄,不要選擇常規的操作系統(比如Ubuntu或CentOS)。請點擊**“應用鏡像”,然后在下方的列表或搜索框里,找到“Docker CE”**。
- 這是什么意思? 這意味著,你下單購買的這臺服務器,騰訊云在把它交給你之前,就已經幫你把最新、最穩定的Docker環境,連同所有相關的工具,全都預裝好了。
- 比喻一下: 這就像你買的不是一套毛坯房,而是一套已經通好了水電煤、并且配備了全套德國進口廚具的“精裝公寓”。你只需要拎包入住,直接開始“做菜”就行了。
選中Docker CE鏡像,完成支付。一兩分鐘后,你的“頂級廚房”就已經在云端準備就緒了。
第二步:“叮!微波爐加熱”——運行你的第一個Nginx容器
現在,我們已經有了一個裝好Docker的服務器。讓我們來小試牛刀,從“菜譜圖書館”(Docker Hub)里,拿一份最簡單的“Nginx官方菜譜”,來加熱一份“Nginx網站便當”。
1登錄你的服務器。 在騰訊云后臺找到你服務器的IP地址和密碼,通過SSH登錄進去。
2驗證Docker是否就位。 在命令行輸入:
Bash
docker --version
如果你看到一串版本號信息,說明你的“廚具”工作正常。
念出咒語,啟動Nginx! 在命令行里,輸入下面這行命令,然后回車:
Bash
docker run -d -p 8080:80 --name my-first-nginx nginx
別怕,我們來拆解一下這行“咒語”:
命令執行后,你會看到Docker開始下載鏡像,然后返回一長串字符,代表你的容器已經成功啟動了!
見證奇跡的時刻:
現在,打開你本地電腦的瀏覽器,在地址欄輸入:http://你的服務器IP地址:8080
,然后回車。
如果你看到了那個經典的**“Welcome to nginx!”**頁面,那么,請為你自己鼓掌!你已經成功地啟動了你人生中第一個Docker容器。你已經掌握了“熱別人做好的便當”的技能。
第三步:成為“大廚”——親手打包一個屬于你自己的應用
熱別人的便當固然方便,但真正的樂趣,在于親手制作屬于自己的“獨家私房菜”。現在,我們就來把一個我們自己寫的、極簡的Python網站,打包成一個Docker鏡像,并運行起來。
1準備“食材”。 我們先創建一個項目目錄,并在里面創建兩個文件。
Bash
mkdir my-hello-app
cd my-hello-app
創建Python應用文件 app.py
:
Bash
nano app.py
在里面輸入以下內容:
Python
from flask import Flask
app = Flask(__name__)@app.route('/')
def hello_world():return 'Hello, Docker! 這是我親手打包的應用!'if __name__ == '__main__':app.run(debug=True, host='0.0.0.0')
創建依賴清單 requirements.txt
:
Bash
nano requirements.txt
在里面只寫一行:
Flask==2.0.1
2撰寫你的“獨家菜譜”——Dockerfile。 在my-hello-app
目錄下,創建一個名為Dockerfile
的文件(沒有后綴名!):
Bash
nano Dockerfile
在里面,輸入我們這份“私房菜”的制作步驟:
Dockerfile
# 步驟1:選擇一個帶有Python 3.9的基礎廚房
FROM python:3.9-slim# 步驟2:在廚房里,創建一個叫/app的操作臺
WORKDIR /app# 步驟3:把廚房外所有準備好的食材,都復制到操作臺上
COPY . .# 步驟4:根據食材清單,安裝所有配料
RUN pip install -r requirements.txt# 步驟5:告訴大家,這份便當的出餐口在5000
EXPOSE 5000# 步驟6:最后,規定加熱這份便當時,要執行的主菜制作命令
CMD ["python", "app.py"]
這份Dockerfile,是不是像一份注釋極其詳細的菜譜,清晰地記錄了每一步操作?
3讓Docker照著“菜譜”做“菜”——構建鏡像。 在my-hello-app
目錄下,執行以下命令:
Bash
docker build -t my-python-app .
docker build
:告訴Docker:“開始做菜!”
-t my-python-app
:給做出來的這份“菜譜”(鏡像)起個名字。
告訴Docker,菜譜(Dockerfile)就在當前目錄下。 Docker會嚴格按照你的Dockerfile,一步一步地執行,最終生成一個屬于你自己的、獨一無二的鏡像。
4上菜!——運行你自己的容器。 現在,我們用自己的“菜譜”,做一份“便當”出來:
Bash
docker run -d -p 5000:5000 --name my-app my-python-app
- 這次的端口映射是
-p 5000:5000
,因為我們的Flask應用,內部的出餐口是在5000。
最終的凱旋:
再次打開你本地的瀏覽器,這次,在地址欄輸入:http://你的服務器IP地址:5000
。
當你看到屏幕上顯示出**“Hello, Docker! 這是我親手打包的應用!”**這行你親手寫下的文字時,那種成就感,無與倫比。你不再只是一個“消費者”,你已經成了一個真正的“創造者”。
你的旅程,才剛剛開始
今天,你親手打包并啟動了你的第一個“魔法便當”。這個小小的“Hello, Docker!”,是你通往云原生、DevOps等廣闊世界的第一張門票。
你已經掌握了將任何應用,封裝成一個標準、可移植、處處運行的“集裝箱”的超能力。從此以后,“在我電腦上是好的”將不再是你的借口,而是你的自信宣言。因為你知道,你的應用,已經被裝進了那個標準、可靠、隨處可行的魔法盒子里。
去吧,去打包你的下一個偉大創意吧!