# Docker 在 windows 10 WSL2安裝採坑紀錄
###### tags: `docker` `wsl2` `windows` `linux` ` 工具安裝與部署`
最近想要直接在公司分配的window 10筆電直接安裝docker做Edge Device的佈署
預計在win10的Linux環境(WSL2)上直接安裝
## Dcker安裝
### 嘗試使用windows桌面版
[WSL|在 WSL2 中安装 Docker-Cynthia](https://cynthiachuang.github.io/Install-Docker-in-WSL2/)
> 在 WSL2 中安裝 Docker 最常見的方法是採用 Docker Desktop for Windows,這種方式是利用了 Docker 的 Client/Server 架構,由 Windows 這邊負責 docker.sock,WSL2 中則是只有 Client 端,並利用 Windows 的 Docker Server 端進行通訊。
- 主要操作參考微軟官方的指引[在 WSL 2 上開始使用 Docker 遠端容器](https://learn.microsoft.com/zh-tw/windows/wsl/tutorials/wsl-containers)
1. 滿足必要條件
- [x] 請確定您的電腦正在執行Windows 10,更新為版本 2004組建18362或更新版本。
- 筆電的win10版本,確認符合版本要求(`Win + R`,輸入`winver`)

> 2004組建18362或更新版本
- [x] 安裝 WSL,並為在 WSL 2 中執行的 Linux 發行版本設定使用者名稱和密碼。
- [x] 安裝Visual Studio Code (選擇性) 。 這會提供最佳體驗,包括能夠在遠端 Docker 容器內撰寫程式碼和偵錯,並聯機到您的 Linux 散發套件。
2. Docker安裝
- 參考[Docker Desktop WSL 2 backend on Windows](https://docs.docker.com/desktop/windows/wsl/#download)
在下載 Docker Desktop桌面板進行安裝後馬上碰到問題
Docker Desktop桌面板錯誤提示

懷疑是公司筆電權限限制但無解
查詢相關資料後發現其實不是一定需要在windows環境安裝桌面版
>
決定直接進入Vscode進入開啟WSL模式直接用指令安裝在Ubuntu20.4內

### 直接在在WSL使用指令模式安装Docker
我這邊是在已經運行好的WSL2環境,在Vscode的terminal中以指令安裝
依據官方文件指示[Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/)
#### 使用repository進行安裝
第一次在新主機安装Docker Engine 前,需要設置Docker倉庫。之後就可以從中安裝和更新
##### 設置repository
1. 更新apt package index and install packages,以允許apt通過HTTPS使用
```bash
sudo apt-get update
sudo apt-get install \
ca-certificates\\
curl \\
gnupg
lsb-release
```
2. 添加Docker的官方GPG key。
```bash
sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
```
3. 使用下面的命令來設置repository。
```bash
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```
##### 安裝Docker Engine
1. 更新apt package index
```bash
sudo apt-get update
```
:::warning
輸入 apt-get update 時收到 GPG 錯誤?
可能是默認umask可能配置不正確,導致無法檢測到版本庫的公鑰文件。在更新軟件包索引之前,嘗試授予Docker公鑰文件的讀取權限
```bash
sudo chmod a+r /etc/apt/keyrings/docker.gpg
sudo apt-get update
```
:::
2. 安裝Docker Engine、containerd和Docker Compose
安裝最新版本
``` bash
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```
3. 運行hello-world image來驗證Docker引擎安裝是否成功
``` bash
sudo docker run hello-world
```
我在這一步碰到問題,發現是docker沒有跑起來,因此以系統管理員身分進行啟動
```bash
sudo service docker start
```
成功的話會看到下面的歡迎字樣

---
#### permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
在執行`docker run -it ubuntu bash` 想要抓image使用時出現如下問題
無法連到Docker的常駐程式
>docker: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/create": dial unix /var/run/docker.sock: connect: permission denied.See 'docker run --help'.
點進這邊的問題指引
[I'm on Linux and get the error "connect EACCES /var/run/docker.sock"](https://github.com/microsoft/vscode-docker/wiki/Troubleshooting)
這是由於由於VS Code以非root用戶身份運行,需要按照[Linux post-installation steps for Docker Engine](https://docs.docker.com/engine/install/linux-postinstall/)中的 "以非root用戶身份管理Docker"的步驟,才能夠連接到docker
#### 以非root用戶身份管理Docker設置
- [Linux post-installation steps for Docker Engine](https://docs.docker.com/engine/install/linux-postinstall/)
如何以非root用戶身分管理Docker,需要取得部分root 權限
:::spoiler
> 這些可選的安裝後程序告訴你如何配置你的Linux主機以更好地與Docker一起工作。
> 以非root用戶身份管理Docker
> Docker守護進程綁定到一個Unix socket,而不是一個TCP端口。默認情況下,root用戶擁有Unix socket,其他用戶只能用sudo來訪問它。 Docker守護進程總是以root用戶的身份運行。
> 如果你不想在docker命令前加上sudo,可以創建一個名為docker的Unix組,並將用戶加入其中。當Docker守護程序啟動時,它會創建一個Unix套接字,供docker組的成員訪問。在一些Linux發行版上,使用軟件包管理器安裝Docker引擎時,系統會自動創建這個組。在這種情況下,你不需要手動創建該組。
:::
1. 建立docker群組
```bash
sudo groupadd docker
```
2. 將用戶名加入docker群組
sudo usermod -aG docker $USER
3. 退出並重新登錄,啟用群組設定
如果在虛擬機中運行Linux,可能需要重新啟動虛擬機,使變化生效
也可以運行下面的命令啟動設定
```bash
newgrp docker
```
設定好後重新執行`docker run -it ubuntu bash`指令就可以成功建立image了
- `-v 本機來源資料夾:docker目標資料夾`
- 由於資料夾要掛載在本機上,因此加上 -v的設定
- 於筆電是用WSL連接本機資料夾,內含空格,因此加上'單引號讓特殊字元則僅為一般字元 (純文字)
- image 名稱放在最後面
```bash
docker run --name openVino -it \
-v '/mnt/c/Users/11111024/OneDrive - Wistron Corporation/Documents/openVino':/openVino \
ubuntu:20.04
```

## 問題紀錄
### docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.

- 情境
- 在vscode 以WSL2連線時,docker相關服務消失
- termimal 輸入`docker`指令可以執行
- 輸入`docker run hello-world`出現錯誤訊息docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
- 原因
- daemon service沒有在背景執行,需要重新啟動
- 解決方案
```
sudo dockerd
```
- 結果
- 順利重啟
## 參考資料
- Docker安裝文件。[Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/)
- Docker安裝後設定。[Docker Desktop WSL 2 backend on Windows](https://docs.docker.com/desktop/windows/wsl/#download)
- [WSL|在 WSL2 中安装 Docker_Cynthia](https://hackmd.io/@CynthiaChuang/Install-Docker-in-WSL2)
- [wsl 2 是否需要启用 Hyper-V?](https://www.zhihu.com/question/439585675)
- [5天-搞清楚為何 WSL2 需不需要 Windows Docker Desktop](https://ithelp.ithome.com.tw/articles/10235035)
- [Does WSL2 docker need windows docker desktop?-Super User](https://superuser.com/questions/1583786/does-wsl2-docker-need-windows-docker-desktop)