Docker + VSCode組合丨學習記錄

語言: CN / TW / HK

theme: cyanosis highlight: monokai


零、前言:

本文是筆者從零開始學習Docker的學習記錄。

若筆者有任何疏忽紕漏之處,煩請不吝賜教。

一、Docker簡介:

Docker 是一個應用打包、分發、部署的工具 你也可以把它理解為一個輕量的虛擬機器,它只虛擬你軟體需要的執行環境,多餘的一點都不要, 而普通虛擬機器則是一個完整而龐大的系統,包含各種不管你要不要的軟體。

Docker 的入門知識還有以下幾點需要了解:

  1. 映象 (image) 和容器 (container) 的關係:映象是容器的模板,容器是映象執行時的例項。

  2. Docker Hub:Docker Hub 是一個公共映象倉庫,可以在這裡搜尋和下載映象。

  3. Dockerfile: 一個Dockerfile 檔案是一個文字檔案,包含了一條條指令,它告訴Docker如何構建一個映象.

  4. 容器網路:Docker支援多種網路模式,包括host,bridge,overlay等.

  5. 資料管理:Docker支援將容器中的資料掛載到宿主機上,或者將容器間共享資料.

  6. 使用docker-compose:docker-compose是一個用來管理多個容器的工具,可以通過一個配置檔案來管理多個容器,並且可以一鍵啟動和停止.

  7. 注意事項:

    • 不要在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://.mirror.aliyuncs.com | | 七牛雲 | http://reg-mirror.qiniu.com | | 網易雲 | http://hub-mirror.c.163.com | | 騰訊雲 | http://mirror.ccs.tencentyun.com |


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 檔案:

  1. 在檔案資源管理器中,右鍵單擊資料夾並選擇 "Save Workspace As..." 來儲存當前工作區。
  2. 選擇 "File" 選單中的 "Save Workspace As..." 來儲存當前工作區。
  3. 在命令面板中輸入 "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 執行後,倘若修改專案程式碼不會立刻生效,需要重新buildrun,很麻煩。
  • 容器裡面產生的資料,例如 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指定映象的名字和版本

於是我們的程式碼就愉快的跑起來了;


餘下內容未完待續...

謝謝大家的閱讀,歡迎互動,也歡迎訪問我的部落格!

落雨乄天珀夜 (gitee.io)