###### 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://i.imgur.com/COqGYh4.jpg) - [解法](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右邊的`-`,會出現錯誤。(下圖第一個) - 特殊符號的`–`,則會可以。(下圖第二個) - 解法:一般的連接號按兩次,`--`(下圖第三個) - ![](https://i.imgur.com/IaXa414.jpg) --- ## 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. 映像檔刪不掉 - 實例:![](https://i.imgur.com/vZ4JNKE.jpg) - 原因是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`) ![no space left on device](https://i.imgur.com/mTBTr0j.jpg) ![docker volume prune](https://i.imgur.com/bIHxJMo.jpg) ![docker system prune](https://i.imgur.com/9wHHW3T.jpg) 4. 查看相關物件的空間使用情形:`$ du -d1 -h /var/lib/docker | sort -h`,這邊資料夾是最上層,可以繼續往下查 ![docker_查看相關物件的空間使用情形](https://i.imgur.com/Mwl4RAS.jpg) - [其他方法參考連結](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)