一、Docker 的用途#
Docker 的出現讓應用環境配置、發布和測試變得更加輕鬆
比如你寫了一個 web 應用,並且本地調試沒有任何問題,這時候想要發給朋友看看,或則部署到伺服器上
那首先,就需要配置相同的軟體與環境,比如資料庫,Web 伺服器,必要的插件和庫等等
而且也不能保證軟體一定能夠正常的運行
因為用的可能是完全不同的操作系統,即便同樣使用的是 Linux,每一個發行版也會有微小的差別
所以,為了完全模擬相同的本地開發環境,自然會想到虛擬機
但是虛擬機需要模擬整個硬體,運行整個操作系統,不但體積臃腫內存佔用高,程序性能也會受到影響
這是就需要使用到 Docker
二、Docker 介紹#
Docker 就類似於虛擬機,但卻輕量很多
他不會模擬底層的硬體,只會為每個應用提供一個完全隔離的運行環境
可以在環境中配置不同的工具軟體,不同環境之間不會受到影響
這個環境在 Docker 中,就稱為 Container (容器)
這時候,就不得不提到 Docker 中三個重要的概念
1、Image / 鏡像#
可以把鏡像理解成一個虛擬機的快照
裡面包含了要部署的 應用程序以及它所關聯的所有庫、軟體
通過鏡像,可以創建多個不同 Container
2、Container / 容器#
這裡的 Container 就像是虛擬機
裡面運行了部署上的應用程序
每個 Container 都是 獨立運行的,他們之間互不影響
3、Dockerfile#
它主要用來創建 Image 鏡像
可以理解成在虛擬機中安裝操作系統和運行環境一樣
只不過通過 Dockerfile 這個 自動化腳本 完成了
三、Docker 安裝#
詳見筆記
四、Dockerfile 的配置#
在項目中創建一個 dockerfile 文件
FROM node:latest
WORKDIR /app
COPY . .
RUN npm install
EXPOSE 3000
CMD ["npm", "start"]
1、首先需要用 FROM 命令指定一個基礎鏡像 (Base Image)#
在 Docker Hub 上也提供了很多高質量操作系統鏡像不同的操作系統提供不同的包管理工具,比如 Ubuntu 上的 apt
還有為某種語言或則某種框架開發的鏡像,比如 Python、Nginx、Node、Tomcat 等
FROM Node:Latest
後面跟的是版本或則標籤
2、指定 Docker 命令的工作路徑 (work directory)#
WORKDIR /app
這個命令指定了,這個命令之後所有的 Docker 命令的工作路徑
如果這個路徑不存在,Docker 會自動創建,這樣可以避免使用絕對路徑或則手動 cd 切換路徑,增加程序的可讀性
3、拷貝程序到 Docker 鏡像中#
COPY . .
COPY <本地路徑> < 目標路徑 >
第一个參數為本地路徑, “.” 代表了程序根目錄下的所有文件
第二個參數為 Docker 鏡像中的路徑,而這裡的 “.” 代表了當前的工作路徑
除了 .dockerignore 排除的路徑都會拷貝進去
4、運行命令#
在創建鏡像時運行任意的 Shell 命令
因為這裡使用的是 node , 所以使用 npm install 來安裝這個程序的所有關聯
RUN npm install
5、暴露端口#
EXPOSE 3000
將容器的 3000 端口暴露出來,允許外部連接這個端口。
6、Docker 容器運行後執行命令#
最後用 CMD 來指定當 Docker 容器運行起來後要執行的命令
CMD ["npm", "start"]
需要注意這裡的 容器 ≠ 鏡像
並且和 RUN 不同,RUN 是創建鏡像的時候使用的,而 CMD 是運行容器時使用的
到此,就完成了自動化腳本 dockerfile
五、創建鏡像#
運行命令 docker build 來創建一個鏡像
docker build -t my-blog .
-t 指定了鏡像的名字
最後的 . 告訴 docker 應該在當前目錄下尋找 dockerfile
第一次執行,會等待稍長時間
因為 Docker 會下載必要的鏡像文件,
以後再執行會快很多,因為 Docker 會緩存之前的每一個操作
這個在 Docker 中也被稱作 分層 (Layers)
六、啟動容器#
有了鏡像之後,可以通過 docker run 來啟動一個容器
docker run -p 3000:3000 -d my-blog
這裡的 -p 他會將容器上的某一個端口,映射到本地主機上
這樣才能從主機上訪問容器中的 Web 應用
前面的 3000 是本地主機上的端口,後面的 3000 是容器上的端口
後面的 -d 是讓容器在後台運行,這樣容器的輸出就不會直接顯示在控制台
這時候打開本地 localhost:3000 就可以訪問到
七、Docker Desktop 操作#
在 Docker Desktop 中 看到這個應用在後台的所有輸出
Container 面板#
Container面板中,顯示了當前運行的所有容器,可以選擇 **停止、重啟或者刪除**
還可以通過 Shell 遠程調試這個容器
以下是他們所對應的命令行指令
但是需要注意的是,當刪除這個容器時,之前所做的修改、新添加的數據都會全部丟失
就好比刪除了虛擬機,裡面的數據也會全部銷毀
如果需要保留容器中的數據,可以使用 Docker 提供的 volume 數據卷
八、Volume 數據卷#
可以把它當作是一個 **在本地主機和不同容器中共享的文件夾**
比如在某個容器中修改了某一個 volume 的數據,他會同時反應在其他的容器上
1、創建數據卷#
docker volume create my-blog-data
可以通過上面的命令來創建一個數據卷
2、指定數據卷#
在啟動容器的時候 透過 -v 參數來指定數據卷
將這個數據卷掛載 (mount) 到容器中的哪一個路徑下
docker run -p 3000:3000 -v my-blog-data:/etc/blogData my-blog
這裡將 my-blog-data 挂載到了 /etc/blogData 這個路徑下
向這個路徑寫入的任何數據都會被永久保存在這個數據卷中
九、多個容器協作#
在實際使用中,常常會使用到多個容器
比如使用一個容器來運行 Web 應用,另一個容器來運行資料庫
這樣可以做到數據和應用邏輯的有效分離
當 Web 程序宕機了,資料庫依然在有效運轉,這時只需要修復 Web 容器即可
而 docker compose 可以做到這一點
十、Docker Compose#
1、創建一個 docker-compose.yml 文件#
version: '3'
services:
web:
build:
ports:
- "3000:3000"
db:
image: "mysql"
environment:
MYSQL_DATABASE: blog
MYSQL_ROOT_PASSWORD: password
volumes:
- my-blog-data:/var/lib/mysql
volumes:
my-blog-data:
在這個文件下,通過 services 來定義多個 container
比如一個 web 容器,運行 web 應用,一個 mysql 容器,運行資料庫
在資料庫的容器中,可以添加環境變量 資料庫名和連接密碼
還可以指定一個數據卷,用來 永久存放數據
2、運行 docker compose#
使用 docker compose up -d
命令,運行所有的容器
這裡的 -d 同樣代表在後台運行所有的容器
3、停止並刪除所有容器#
docker compose down
不過新創建的數據卷需要手動在 Docker Desktop 中刪除
或者在命令後添加 --volumes
參數
以上的操作也都可以在 Docker Desktop 中完成