---
# System prepended metadata

title: Docker with wsl
tags: [Docker]

---

# Docker WSL ubuntu環境安裝
如果現有docker其他版本，先解除安裝
## 推薦直接使用docker desktop
#### Add Docker's official GPG key:
```
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
```
#### Add the repository to Apt sources:
```
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
```

#### 下載最新版本docker
``
sudo apt-get install docker-ce docker-ce-cli containerd.io
``
#### 切換iptables成legacy
```
sudo update-alternatives --config iptables
1
```
![image](https://hackmd.io/_uploads/BJX_s9iE6.png)

#### 重開docker service
``
sudo service docker restart
``

之後跑以下應該可以成功建立docker container 跑hello world

``
sudo docker run hello-world
``

若出現沒有權限
![image](https://hackmd.io/_uploads/BkzscfGrT.png)

輸入以下指令給予docker權限後重開terminal
```
$ sudo usermod -aG docker $USER
```
如果sudo service docker start後依然顯示docker daemon沒有開啟
1. 確認使用的要是wsl2
2. 印出 /var/log/docker.log內容 進行debug


若docker-compose 指令無法使用，可能是新版本指令改成 docker compose，可以在/bin 新增一個檔案叫docker-compose，並輸入以下文字
![image](https://hackmd.io/_uploads/B1tX3PlHp.png)

之後更改權限
``
chmod +x /bin/docker-compose
``

重開terminal之後docker-compose指令就可以使用了

### 參考資料
https://docs.docker.com/engine/install/ubuntu/


# 替 .net 應用程式建立docker

https://learn.microsoft.com/zh-tw/dotnet/core/docker/build-container?tabs=linux&pivots=dotnet-8-0

### 取得log
``
docker logs [OPTIONS] CONTAINER
``

### 進入docker console
``
docker exec -it [容器名稱或id] sh 
``

sh可以替換成任何指令

https://www.runoob.com/docker/docker-container-connection.html

# 建立客製化Mysql image
先建立Dockerfile
```dockerfile
#從遠端pull 預設 mysql image
FROM mysql:8.0.35

EXPOSE 3306
LABEL version="0.1" description="groupOrdering Mysql伺服器"

# 將設定檔複製到image底下
COPY ./my.cnf /etc/my.cnf
# 將所有/sql底下檔案移到docker內部自動執行位置
# /docker-entrypoint-initdb.d是mysql第一次建立時會執行得資料夾
# 裡面可以放sh檔和.sql檔來初始化，如果volume裡已有資料則不會被執行
COPY ./sql /docker-entrypoint-initdb.d
```

資料夾結構長這樣
![image](https://hackmd.io/_uploads/S1Ob8neHp.png)

# 將Image輸出成檔案和從檔案還原成image

輸出成檔案
```
docker save  [image] > [image].tar
```

還原成image
```
docker load -i [tar file]
```

https://peihsinsu.gitbooks.io/docker-note-book/content/docker-save-image.html

# 外部電腦連線到WSL的Docker

docker 內部可以直接經由WSL做port forwarding，但是WSL也算是Window底下的一台虛擬機，所以我們也必須先從windows port forwarding到wsl，再從wsl port forwarding 到 container

使用windows指令port forwarding到wsl
```
netsh interface portproxy add v4tov4 listenport=[port] listenaddress=0.0.0.0 connectport=[port] connectaddress=[wsl的IP]
```

使用以下指令輸出目前forwarding的port
```
netsh interface portproxy show v4tov4
```
https://jwstanly.com/blog/article/Port+Forwarding+WSL+2+to+Your+LAN/
