# Docker ## 前言 在Windows系統上使用Docker其實本質上是建構在所謂的WSL(Windows Subsystem Linux)上,因此你可以將volume掛載到WSL路徑上,也可以掛載宿主機路徑上,但兩者速度、耗能都有所不同,例如掛載到宿主機路徑上時會導致前端框架的hmr無法作用、container系統速度緩慢...等 ## WSL ### <span style='color: red'>將volume掛載到WSL上才是Docker的正確使用方式</span> Docker本身就會建置兩個WSL,如下圖所示 <span style='color: red'> **#這兩個不能註銷,否則將遺失所有現存的Images及Containers** </span> 除此之外還我們也可以自行建置一個或以上的Linux系統作供Docker與WSL做整合(integration) 到Microsoft Store選擇一個Linux安裝即可(如: Ubuntu),安裝後檔案總管應呈現如下圖  建置完畢後即可將volume掛載到wsl路徑上,指定路徑應遵從以下形式 | 情境 | 範例 | | ------ |:---------------------------------------:| | 正確⭕ | \\wsl$\exampleLinuxOS\yourPath | | 錯誤❌ | \\wsl.localhost\exampleLinuxOS\yourPath | ## Docker Compose 可以透過docker-compose.yml設置所需的相關服務,以便一次性啟動多個服務,例如同時建置/啟動php, node, mysql,啟動後容器們將在Docker-Desktop中被歸類在同個群組內,群組將以docker-compose.yml所在之資料夾自動命名,除首次啟動及更改設定換外,不須再透過 docker-compose up啟動,透過Docker-Desktop啟動即可。 ### 補充說明 在docker-compose.yml所在的位置透過cmd執行docker-compose up即可透過docker-compose.yml建置容器群組,docker-compose up -d 加上 -d 可以在啟動所有容器後立即釋放cmd,而不用保持開啟狀態。 ## 重要 :::danger 1. 建議透過VSCode連線進入Container,再依據需求於Container中安裝不同的VSCode Extensions,這樣能使VSCode更加精準的識別不同開發環境中的套件、庫、語言(包含snippets的運作)。 2. 修改docker-compose.yml並重新執行docker-compose up -d會導致容器重建,若要保留已安裝的套件、庫、設置...等,則須將其持久化,若無需管理只想持久化,可以使用匿名卷。 ::: ## docker-composer.yml 範例 ```yaml= #範例 version: '3' services: mysql: # 自訂名稱,不重複即可 image: mysql:latest # 使用的鏡像name:tag ports: - "8080:3306" # 暴露port號:容器服務預設port號 working_dir: /home # 指定後續command執行的起始目錄 tty: true # 用以指定容器常駐啟動 stdin_open: true # 允許容器進行終端交互 networks: - my-network # 欲使用的網路(networks中設置) volumes: - {wslVolumePath}:/var/www/html # wsl路徑:容器內需持久化的路徑 - /example # 匿名持久卷,意即不會出現在宿主機中,單純將容器指定資料夾持久化 # 例:\wsl$\exampleLinuxOS\yourPath:/var/www/html # 說明:wsl路徑:容器中的路徑,指wsl指定路徑的資料要被同步進容器的哪個指定路徑 environment: # 環境變數 MYSQL_ALLOW_EMPTY_PASSWORD: "yes" # 有些服務非常依賴環境變數,例如phpmyadmin連接mysql需要PMA_HOST, PMA_PORT command: ... # 啟動後立即執行的指令,如nuxt可以執行npm run dev #其他服務... networks: # 用以設置網路,相同網路內的容器間可以互相請求、交互 my-network: driver: bridge ``` ## 補充 若是不清楚image預設有哪些environment variable提供設定,可以在啟動container後執行env條列出所有現有的環境變數。 ## 最後 剛開始使用Docker時將volume路徑掛載在windows(宿主機)上而不是WSL,而導致Nuxt3 hmr一直無法正常運行、Laravel運行速度極慢,讓我頭痛了好久,最後下定決心好好了解WSL並重新掛載,才發現原來這才是正確使用方式
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up