Docker + VSCode組合丨學習記錄
theme: cyanosis highlight: monokai
零、前言:
本文是筆者從零開始學習Docker的學習記錄。
若筆者有任何疏忽紕漏之處,煩請不吝賜教。
一、Docker簡介:
Docker 是一個應用打包、分發、部署的工具 你也可以把它理解為一個輕量的虛擬機器,它只虛擬你軟體需要的執行環境,多餘的一點都不要, 而普通虛擬機器則是一個完整而龐大的系統,包含各種不管你要不要的軟體。
Docker 的入門知識還有以下幾點需要了解:
-
映象 (image) 和容器 (container) 的關係:映象是容器的模板,容器是映象執行時的例項。
-
Docker Hub:Docker Hub 是一個公共映象倉庫,可以在這裡搜尋和下載映象。
-
Dockerfile: 一個Dockerfile 檔案是一個文字檔案,包含了一條條指令,它告訴Docker如何構建一個映象.
-
容器網路:Docker支援多種網路模式,包括host,bridge,overlay等.
-
資料管理:Docker支援將容器中的資料掛載到宿主機上,或者將容器間共享資料.
-
使用docker-compose:docker-compose是一個用來管理多個容器的工具,可以通過一個配置檔案來管理多個容器,並且可以一鍵啟動和停止.
-
注意事項:
-
不要在root使用者下執行Docker,需要使用sudo
-
在開發過程中,需要注意容器的版本管理,保證不同環境的穩定性
-
需要注意容器的網路配置,確保容器之間可以互相訪問
-
容器中的資料需要及時備份
-
二、小試牛刀
快速開始:
一個非常簡單的辦法,結合vscode:
以一個Go專案舉例:
docker run -dit -v /d/goenv:/root/goenv golang
注意:地址可以自己更換
docker run
是用來啟動一個新的 Docker 容器的命令。
-d
: 後臺執行容器,即在後臺執行容器而不阻塞當前的終端。-i
: 保留標準輸入的活性,這樣可以在容器中使用命令列-t
: 分配一個偽終端(tty),這樣可以在容器中使用命令列-v /d/goenv:/root/goenv
: 使用-v
選項將主機的/d/goenv
目錄掛載到容器的/root/goenv
目錄。這樣就可以在容器中訪問主機上的檔案。golang
: 指定要使用的 Docker 映象的名稱。
然後使用VSCODE連線就行了
之後就是初始化等等的操作
go mod init goenv
編寫main.go
等等...
重要概念:
映象:可以理解為軟體安裝包,可以方便的進行傳播和安裝。 容器:軟體安裝後的狀態,每個軟體執行環境都是獨立的、隔離的,稱之為容器。
常用相關命令:
docker ps
檢視當前執行中的容器
docker images
檢視映象列表
docker rm container-id
刪除指定 id 的容器
docker stop/start container-id
停止/啟動指定 id 的容器
docker rmi image-id
刪除指定 id 的映象
docker volume ls
檢視 volume 列表
docker network ls
檢視網路列表
Docker VS 普通虛擬機器:
| 特性 | 普通虛擬機器 | Docker | | ------ | ------------------------------------------------------------ | ---------------------------------------------------- | | 跨平臺 | 通常只能在桌面級系統執行,例如 Windows/Mac,無法在不帶圖形介面的伺服器上執行 | 支援的系統非常多,各類 windows 和 Linux 都支援 | | 效能 | 效能損耗大,記憶體佔用高,因為是把整個完整系統都虛擬出來了 | 效能好,只虛擬軟體所需執行環境,最大化減少沒用的配置 | | 自動化 | 需要手動安裝所有東西 | 一個命令就可以自動部署好所需環境 | | 穩定性 | 穩定性不高,不同系統差異大 | 穩定性好,不同系統都一樣部署方式 |
開發方面與WSL2的對比:
Docker 和 WSL 2 兩者都可以在 Windows 系統上提供 Linux 環境,但是它們的工作原理和用途是有區別的。
WSL 2 是 Windows Subsystem for Linux 的第二版,可以在 Windows 系統上執行 Linux 子系統,並且支援執行原生 Linux 應用程式。WSL 2 可以讓開發者在 Windows 上使用 Linux 環境進行開發,並且可以直接訪問 Windows 系統上的檔案。
Docker 是一個容器化平臺,可以在宿主機上執行多個獨立的容器,每個容器都可以執行不同的應用程式。Docker 可以將應用程式和其所需的環境封裝在一起,方便進行部署和移植。使用Docker,可以在不同的環境下,方便的部署和除錯,並且可以隔離這些環境,不會相互影響.
總的來說,WSL 2 主要用於在 Windows 上使用 Linux 環境進行開發,而 Docker 則更多用於將應用程式和其所需的環境封裝在容器中,方便進行部署和移植。
映象加速源:
| 映象加速器 | 映象加速器地址 |
| ------------------- | --------------------------------------- |
| Docker 中國官方映象 | http://registry.docker-cn.com |
| DaoCloud 映象站 | http://f1361db2.m.daocloud.io |
| Azure 中國映象 | http://dockerhub.azk8s.cn |
| 科大映象站 | http://docker.mirrors.ustc.edu.cn |
| 阿里雲 | http://
Docker安裝軟體:
直接安裝的缺點
- 安裝麻煩,可能有各種依賴,執行報錯。例如:WordPress,ElasticSearch,Redis,ELK
- 可能對 Windows 並不友好,執行有各種相容問題,軟體只支援 Linux 上跑
- 不方便安裝多版本軟體,不能共存。
- 電腦安裝了一堆軟體,拖慢電腦速度。
- 不同系統和硬體,安裝方式不一樣
Docker 安裝的優點
- 一個命令就可以安裝好,快速方便
- 有大量的映象,可直接使用
- 沒有系統相容問題,Linux 專享軟體也照樣跑
- 支援軟體多版本共存
- 用完就丟,不拖慢電腦速度
- 不同系統和硬體,只要安裝好 Docker 其他都一樣了,一個命令搞定所有
VSCode + Docker
使用VSCode開啟Docker中已開啟的映象:
在VSCode中安裝Docker外掛之後,直接點選,會看到很多已建立好的映象,
右鍵然後在VSCode裡開啟就好了(具體的名字可能不是這個,翻譯問題)
.code-workspace檔案說明:
.code-workspace
檔案是 Visual Studio Code 的工作區檔案,它用於記錄開啟的資料夾和已安裝的外掛等配置資訊。
在 Visual Studio Code 中,你可以通過以下方式生成 .code-workspace
檔案:
- 在檔案資源管理器中,右鍵單擊資料夾並選擇 "Save Workspace As..." 來儲存當前工作區。
- 選擇 "File" 選單中的 "Save Workspace As..." 來儲存當前工作區。
- 在命令面板中輸入 "Save Workspace As..." 並回車來儲存當前工作區。
儲存後的工作區檔案將會以 .code-workspace
為副檔名儲存在你指定的位置.
三、繼續向前
DockerFile相關:
先看一個例子:
```dockerfile FROM node:11 MAINTAINER easydoc.net
複製程式碼
ADD . /app
設定容器啟動後的預設執行目錄
WORKDIR /app
執行命令,安裝依賴
RUN 命令可以有多個,但是可以用 && 連線多個命令來減少層級。
例如 RUN npm install && cd /app && mkdir logs
RUN npm install --registry=http://registry.npm.taobao.org
CMD 指令只能一個,是容器啟動後執行的命令,算是程式的入口。
如果還需要執行其他命令可以用 && 連線,也可以寫成一個shell指令碼去執行。
例如 CMD cd /app && ./start.sh
CMD node app.js ```
Dockerfile 是用來構建 Docker 映象的配置檔案。其中,RUN
指令是用來在映象構建過程中執行命令的。
在這個例子中,RUN npm install --registry=http://registry.npm.taobao.org
的作用是安裝 npm 包,並將 npm 的映象源設定為淘寶映象,為了加速npm 的安裝速度。
這個命令會在Docker容器中執行,會在容器中安裝npm的包,在這個命令執行完成後,npm包已經安裝在容器中了。
注意:使用 npm install 命令前需要先使用COPY或者ADD指令將專案檔案複製到容器中。
參考:Dockerfile reference | Docker Documentation
目錄掛載:
目錄掛載可以解決的問題:
- 使用 Docker 執行後,倘若修改專案程式碼不會立刻生效,需要重新
build
和run
,很麻煩。 - 容器裡面產生的資料,例如 log 檔案,資料庫備份檔案,容器刪除後就丟失了。
目錄掛載的方式:
bind mount
直接把宿主機目錄對映到容器內,適合掛程式碼目錄和配置檔案。可掛到多個容器上volume
由容器建立和管理,建立在宿主機,所以刪除容器不會丟失,官方推薦,更高效,Linux 檔案系統,適合儲存資料庫資料。可掛到多個容器上tmpfs mount
適合儲存臨時檔案,存宿主機記憶體中。不可多容器共享。
bind mount
方式用絕對路徑 -v D:/code:/app
volume
方式,只需要一個名字 -v db-data:/app
,注意,這裡的db-data
就是名字,這塊區域由容器自己來建立。
bind mount例:docker run -p 9090:8080 --name test-hello -v D:/code:/app -d golang:v1
- 這裡是把專案的程式碼目錄掛載到容器裡面的
/app
目錄 - 把容器的8080暴露到伺服器的9090埠
- 容器名字命名為test-hello
- 掛載絕對目錄
-d
表示在後臺執行golang:v1
指定映象的名字和版本
於是我們的程式碼就愉快的跑起來了;
餘下內容未完待續...
謝謝大家的閱讀,歡迎互動,也歡迎訪問我的部落格!