###### tags: `教學` `Docker` `troubleshooting` `學習筆記`
# Docker and Container A03 - Troubleshooting 疑難雜症
[TOC]
---
## 1. Centos 7 Docker容器啟動報錯
:::warning
WARNING: IPv4 forwarding is disabled. Networking will not work
:::
- 解法:
1. 修改檔案
`$ vi /etc/sysctl.conf` 或者
`$ vi /usr/lib/sysctl.d/00-system.conf`
在檔案中加入: `net.ipv4.ip_forward=1`
2. 重新啟動network服務:`$ systemctl restart network`
3. 查看是否修改成功:`$ sysctl net.ipv4.ip_forward`,正確結果應顯示為 `net.ipv4.ip_forward = 1`
4. 重新啟動容器:`$ docker run XXXXX`
- [連結1](https://stackoverflow.com/questions/41453263/docker-networking-disabled-warning-ipv4-forwarding-is-disabled-networking-wil)
- [連結2](https://blog.csdn.net/weiguang1017/article/details/76212203)
---
## 2. port被佔用
:::warning
docker: Error response from daemon: driver failed programming external connectivity on endpoint thirsty_joliot (b7556aa3a690089eecbcf0cbbb9d70ea3e0851d9add9a07843431086b6b84b5b): Bind for 0.0.0.0:8080 failed: port is already allocated.
:::
- 問題在於要使用的port被已有使用,更改port號即可
---
## 3. 找不到compose的指令
:::warning
bash: docker-compose: command not found
:::
- 可能是沒有裝compose,可參考[官方文件](https://docs.docker.com/compose/install/)或是 [參考解答](https://stackoverflow.com/questions/36685980/docker-is-installed-but-docker-compose-is-not-why)
- 步驟:
```linux=
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo mv /usr/local/bin/docker-compose /usr/bin/docker-compose
sudo chmod +x /usr/bin/docker-compose
```
- [其他參考連結](https://it001.pixnet.net/blog/post/344230772-it%E4%BA%8B%E4%BB%B6%E7%B0%BF-docker-compose%3A-command-not-found-%28%E5%AE%89%E8%A3%9D%E5%8F%8A%E4%BD%BF)
---
## 4. 在swarm模式下運行compose

- [解法](https://blog.csdn.net/weixx3/article/details/103970237)
- 在普通節點離開swarm模式:`docker swarm leave`
> - 在管理員節點離開swarm模式:docker swarm leave --force
---
## 5. [連接號(dash)](https://zh.wikipedia.org/wiki/%E8%BF%9E%E6%8E%A5%E5%8F%B7)
- 狀況:
- (在英數模式下)0右邊的`-`,會出現錯誤。(下圖第一個)
- 特殊符號的`–`,則會可以。(下圖第二個)
- 解法:一般的連接號按兩次,`--`(下圖第三個)
- 
---
## 6. 在ubuntu下,docker沒有在背景運行?
:::warning
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
See 'docker run --help'.
:::
https://www.google.com/search?q=docker%3A+Cannot+connect+to+the+Docker+daemon+at+unix%3A%2F%2F%2Fvar%2Frun%2Fdocker.sock.+Is+the+docker+daemon+running%3F.+See+%27docker+run+--help%27.&rlz=1C1SQJL_zh-TWTW946TW946&oq=docker%3A+Cannot+connect+to+the+Docker+daemon+at+unix%3A%2F%2F%2Fvar%2Frun%2Fdocker.sock.+Is+the+docker+daemon+running%3F.+See+%27docker+run+--help%27.&aqs=chrome..69i57j69i58.569j0j7&sourceid=chrome&ie=UTF-8
https://blog.yowko.com/cannot-connect-docker-daemon/
https://stackoverflow.com/questions/44678725/cannot-connect-to-the-docker-daemon-at-unix-var-run-docker-sock-is-the-docker
https://github.com/docker/for-linux/issues/535
https://phoenixnap.com/kb/cannot-connect-to-the-docker-daemon-error
## 7. 映像檔刪不掉
- 實例:
- 原因是docker已損壞,需要清除完整狀態
- 可進行如下操作
### 方法一
* 查看並紀錄欲刪除的image id
* `$ docker images`
* 直接到存放的資料夾刪除
* `$ cd /var/lib/docker/image/overlay2/imagedb/content/sha256`
* `$ rm 95bd6ff80985`,刪除指令+image id
### 方法二
> [參考資料](https://stackoverflow.com/questions/46381888/docker-images-shows-image-docker-rmi-says-no-such-image-or-reference-doe/46386670)
* `$ sudo service docker stop`
* `$ sudo rm -rf /var/lib/docker`,全部資料都會刪掉,包含映像檔、容器...
* `$ sudo service docker start`
---
## 8. 裝置上沒有容量了
### 1. 清除沒在用的
:::warning
docker: Error response from daemon: mkdir /var/lib/docker/overlay2/ad7d2435656d86289fbdf6c205dca0274c60e1abbd3dfd8b0dedb38462618342-init: **no space left on device**.
:::
1. 檢查現況:`$ docker system df`
2. 回收空間:`$ docker system -a --volume prune`
3. 清掉沒在用的東西:`$ docker system prune`(,或是清掉volume:`$ docker volume prune`)



4. 查看相關物件的空間使用情形:`$ du -d1 -h /var/lib/docker | sort -h`,這邊資料夾是最上層,可以繼續往下查

- [其他方法參考連結](https://jhooq.com/docker-error-no-space-left/)
### 2. 調整設定擴展容量
:::warning
open .docker_temp_ no space left on device
:::
1. `$ docker info`
1. To check current docker storage driver
1. Mine was : Storage Driver: devicemapper; If you have storage driver as overlay2 nothing to worry about. Solution will still work for you.
1. `$ df -h`
1. This is to check the available file systems on machine and the path where they are mounted. Two mounted path to have a note:
1. /dev/mapper/rootvg-var 7.6G 1.2G 6.1G 16% /var
1. /dev/mapper/rootvg-apps 60G 9.2G 48G 17% /apps
1. Note- By default docker storage path is /var/lib/docker. It has available space ~6 GB and hence all the space related issues. So basically, I have to move default storage to some other storage where available space is more. For me its File sysyem path '/dev/mapper/rootvg-apps' which is mounted on /apps. Now task is to move /var/lib/docker to something like /apps/newdocker/docker.
1. `$ mkdir /apps/newdocker/docker`
1. `$ chmod -R 777 /apps/newdocker/docker`
1. Update docker.serive file on linux which resides under: /usr/lib/systemd/system,`$ vi /usr/lib/systemd/system/docker.service`:
1. if storage device is **devicemapper** , comment existing ExecStart line and add below under [Service]:
1. ExecStart=/usr/bin/dockerd -s devicemapper --storage-opt dm.fs=xfs --storage-opt dm.basesize=40GB -g /apps/newdocker/docker --exec-opt native.cgroupdriver=cgroupfs
1. Or if storage device is **overlay2**:
1. just add `-g /apps/newdocker/docker` in the existing ExexStart statement.
1. Something like ExecStart=/usr/bin/dockerd `-g /apps/newdocker/docker` -H fd:// --containerd=/run/containerd/containerd.sock
1. rm -rf /var/lib/docker (It will delete all existing docker data)
1. `$ systemctl stop docker`
1. `$ ps aux | grep -i docker | grep -v grep`
1. If no output has been produced by the above command, reload systemd daemon by below command.
1. `$ systemctl daemon-reload`
1. `$ systemctl start docker`
1. `$ docker info`
1. Check out the Data Space Available: 62.15GB after mouting to docker to new File system.
1. DONE
- [參考連結](https://stackoverflow.com/questions/30604846/docker-error-no-space-left-on-device/56126715#56126715)
---
## 9. 原本可以運行的docker怎麼不行了
:::warning
```linux=
[root@xiaoi_docker ai-engine]# ./init.sh
0615a79ab053eb5a3418c1550e5c0f4bea4ed4fff9d210e247f72a3d3853feed
docker: Error response from daemon: driver failed programming external connectivity on endpoint AI-Engine_Container (0791fef8a0fe4b333d221f70ca49cb400e292e9d9560449202249c41da1fb359): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 9000 -j DNAT --to-destination 172.17.0.2:9000 ! -i docker0: iptables: No chain/target/match by that name.
(exit status 1)).
```
:::
> docker服務啟動時定義的**自定義鏈DOCKER**由於某種原因被清掉,重啟docker服務及可重新生成自定義鏈DOCKER
#### 參考指令
```linux=
啟動:$ systemctl start docker
守護程序重啟:$ sudo systemctl daemon-reload
重啟docker服務:$ systemctl restart docker
重啟docker服務:$ sudo service docker restart
關閉docker:$ service docker stop
關閉docker:$ systemctl stop docker
```
- [參考連結]([apple.com/tw/tv/](https://www.itread01.com/content/1543395490.html))
---
## 10. 檢查container裡面的port
- 有些container環境,如果最小安裝沒有net 相關tool的話,其實有一招echo可以用,用`echo -n > /dev/tcp/ip/port`,可以確認port有沒有通
---
- [回到目錄](https://hackmd.io/@Hualiteq/r1lye3M3d)