docker使用問題總結


1. docker報【Error response from daemon: Error running DeviceCreate (createSnapDevice) dm_task_run failed】錯
解決辦法:
# systemctl stop docker.service # thin_check /var/lib/docker/devicemapper/devicemapper/metadata 

If there were no errors then proceed with:

# thin_check --clear-needs-check-flag /var/lib/docker/devicemapper/devicemapper/metadata # systemctl start docker.service

If there were errors, you are on your own, but 'man thin_check' and 'man thin_repair' may be helpful...

========================================================

2. docker默認添加的iptables(ip相關的自己定制):

docker nat表部分:

docker0IP=`ifconfig docker0 |grep 'inet' | cut -d ' ' -f 10`
iptables -A POSTROUTING -t nat -s $docker0IP/30 ! -o docker0 -j MASQUERADE

DockerChain="DOCKER" 
iptables -t nat -nL $DockerChain
if [ "x$?" != "x0" ] ; then
iptables -t nat -N $DockerChain
fi
iptables -A PREROUTING -m addrtype --dst-type LOCAL -t nat -j $DockerChain
iptables -A OUTPUT -m addrtype --dst-type LOCAL -t nat -j $DockerChain ! --dst 127.0.0.0/8

iptables -P FORWARD ACCEPT

 

docker 默認添加為:

iptables -A POSTROUTING -t nat -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
DockerChain="DOCKER"
iptables -t nat -nL $DockerChain
iptables -A PREROUTING -m addrtype --dst-type LOCAL -t nat  -j $DockerChain
iptables -A OUTPUT  -m addrtype --dst-type LOCAL -t nat  -j $DockerChain ! --dst 127.0.0.0/8
iptables -P FORWARD ACCEPT 

 

參考代碼:
https://github.com/docker/docker/blob/2ad81da856c123acf91eeff7ab607376bd27d9ba/vendor/src/github.com/docker/libnetwork/drivers/bridge/setup_ip_tables.go
https://github.com/docker/docker/blob/2ad81da856c123acf91eeff7ab607376bd27d9ba/vendor/src/github.com/docker/libnetwork/iptables/iptables.go

=========================================================

3.docker報類似如下錯誤【chown socket at step GROUP: No such process】,導致啟動失敗:

# journalctl -xn
-- Logs begin at Tue 2014-12-30 13:07:53 EST, end at Tue 2014-12-30 13:25:23 EST. --
Dec 30 13:12:30 ITX kernel: ip_tables: (C) 2000-2006 Netfilter Core Team
Dec 30 13:22:53 ITX systemd[1]: Starting Cleanup of Temporary Directories...
-- Subject: Unit systemd-tmpfiles-clean.service has begun with start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit systemd-tmpfiles-clean.service has begun starting up.
Dec 30 13:22:53 ITX systemd[1]: Started Cleanup of Temporary Directories.
-- Subject: Unit systemd-tmpfiles-clean.service has finished start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit systemd-tmpfiles-clean.service has finished starting up.
--
-- The start-up result is done.
Dec 30 13:25:23 ITX systemd[1]: Starting Docker Socket for the API.
-- Subject: Unit docker.socket has begun with start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit docker.socket has begun starting up.
Dec 30 13:25:23 ITX systemd[1868]: Failed to chown socket at step GROUP: No such process
Dec 30 13:25:23 ITX systemd[1]: docker.socket control process exited, code=exited status=216
Dec 30 13:25:23 ITX systemd[1]: Failed to listen on Docker Socket for the API.
-- Subject: Unit docker.socket has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit docker.socket has failed.
--
-- The result is failed.
Dec 30 13:25:23 ITX systemd[1]: Dependency failed for Docker Application Container Engine.
-- Subject: Unit docker.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit docker.service has failed.
--
-- The result is dependency.
Dec 30 13:25:23 ITX systemd[1]: Unit docker.socket entered failed state.

解決辦法:

方法1.添加docker用戶組(groupadd docker,如果/etc/group用統一配置管理的話記得在源group文件中添加docker組信息)

方法2.修改/usr/lib/systemd/system/docker.socket文件:

 

[Unit]
Description=Docker Socket for the API
PartOf=docker.service

 

[Socket]
ListenStream=/var/run/docker.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker    這里改成:SocketGroup=root 或其他存在的組

 

[Install]
WantedBy=sockets.target

 

如下操作可選:

systemctl enable docker.service && systemctl enable docker.socket:

# systemctl list-unit-files | grep docker
docker.service disabled
docker.socket disabled

# chkconfig docker on #如果chkconfig不能使用則執行:systemctl enable docker.service
Note: Forwarding request to 'systemctl enable docker.service'.
ln -s '/usr/lib/systemd/system/docker.service' '/etc/systemd/system/multi-user.target.wants/docker.service'

# systemctl list-unit-files|grep docker
docker.service enabled
docker.socket disabled

# systemctl enable docker.socket
ln -s '/usr/lib/systemd/system/docker.socket' '/etc/systemd/system/sockets.target.wants/docker.socket'

# systemctl list-unit-files|grep docker
docker.service enabled
docker.socket enabled

參考鏈接:

http://www.milliondollarserver.com/?cat=7

===============================================================

4.當宿主機上只有一個容器時,刪除容器有時會導致宿主機網路瞬斷

解決方法:

1.修改/etc/sysconfig/ntpd配置文件增加"-L"選項,如

cat /etc/sysconfig/ntpd

# Command line options for ntpd

OPTIONS="-g -L"

2.重啟ntpd服務:systemctl restart ntpd

參考鏈接:

https://access.redhat.com/solutions/261123

ntp服務細節全解析

========================================================

5.docker1.6+按照官方文檔搭建的私有registry, 但是docker login的時候報錯

Username: ever
Password:
Email:
Error response from daemon: Unexpected status code [404] : <html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.6.3</center>
</body>
</html>

解決方法:大概說就是docker 1.6+ 需要registry 2.0, 此外還需要nginx的一個配置,而且這個配置官方文檔錯的,本來應該用set_more_header,文檔用的add_header

官方v1 image和 v2 image遷移工具,可以看一下 https://github.com/docker/migrator,推薦書籍浙大的《docker 容器和容器雲》

======================================================== 

6.docker1.8 pull鏡像服務端的訪問日志:

127.0.0.1 - - [16/Oct/2015:10:08:52 +0000] "GET /v2/ HTTP/1.1" 401 194 "-" "docker/1.8.3 go/go1.4.2 git-commit/f4bf5c7 kernel/4.2.0-1.el7.elrepo.x86_64 os/linux arch/amd64" "-"
127.0.0.1 - - [16/Oct/2015:10:08:52 +0000] "GET /v1/_ping HTTP/1.1" 404 168 "-" "docker/1.8.3 go/go1.4.2 git-commit/f4bf5c7 kernel/4.2.0-1.el7.elrepo.x86_64 os/linux arch/amd64" "-"
127.0.0.1 - - [16/Oct/2015:10:08:52 +0000] "POST /v1/users/ HTTP/1.1" 404 168 "-" "docker/1.8.3 go/go1.4.2 git-commit/f4bf5c7 kernel/4.2.0-1.el7.elrepo.x86_64 os/linux arch/amd64" "-"

docker應該訪問v2接口卻去訪問v1的接口了

解決方法:docker和registry之間通過一個header來協商api的版本

 ========================================================

7.docker容器重啟或宿主的iptables服務重啟后容器無法接收到udp數據包(Failed to receive UDP traffic):

原因:重啟容器或重啟宿主的iptables服務,在重啟過程中,因為在某個時間點,對docker服務做的nat會因為重啟失效,物理機會返回端口不可用(如:8888 port unreachable)的錯誤,這條返回會更新ip_conntrack表的緩存為類似這樣:

ipv4     2 udp      17 29 src=xx.xx.xx.xx dst=xx.xx.xx.xx sport=xxxx dport=xxxx [UNREPLIED] src=xx.xx.xx.xx dst=xx.xx.xx.xx sport=xxxx dport=xxxx mark=0 zone=0 use=2 

從而導致iptables啟動后,數據包再過來,也會依據已有的conntrack緩存,不會被轉發到docker容器里面。

解決方法:清理conntrack緩存(可以使用conntrack-tool: conntrack -F)

相關鏈接:https://github.com/docker/docker/issues/8795       清理conntrack

========================================================

8.docker宿主機新增分區(/ssd),docker必須重啟,起容器時在該分區的數據卷(-v /ssd:/ssd)才能生效

解決方法(慎用):修改/usr/lib/systemd/system/docker.service

[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target docker.socket
Requires=docker.socket

[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
ExecStart=/usr/bin/docker -d $OPTIONS $DOCKER_STORAGE_OPTIONS
ExecStartPost=/usr/bin/chmod 777 /var/run/docker.sock
LimitNOFILE=1048576
LimitNPROC=1048576
MountFlags=private   #將這里修改成 MountFlags=shared

[Install]
WantedBy=multi-user.target 

相關鏈接:https://huaminchen.wordpress.com/2015/05/19/how-docker-handles-mount-namespace/

========================================================

9.MFS+DOCKER的文件掛載問題

mfs在本地掛載如下
mfsmount /mnt -H ip -P port -S /
這樣本地就有一個/mnt的mfs目錄了
但是使用docker run -it -v /mnt:/mnt image:tags /bin/bash
之后發現容器內部還是本地的目錄,並不是mfs的掛載目錄。大小也不對。查看系統日志發現一個警告:
Jul 16 11:52:36 TENCENT64 docker: [error] mount.go:12 [warning]: couldn’t run auplink before unmount: exec: “auplink”: executable file not found
in $PATH

本地找不到這個auplink的命令,導致docker掛載異常,centos安裝如下:
yum install aufs-util
然后需要重啟docker
systemctl restart docker
重啟容器就可以了

到現在為止docker掛載mfs總共莫名其妙的出過兩次問題:

1.mfs修改了掛載目錄,但是沒有重啟docker,結果不論如何啟動,抓取日志,依舊沒有辦法在docker容器中看到mfs的掛載目錄。

2.在啟動進入容器之后,刪除了大量的文件,操作過程已經結束,但是mfs有回收站機制,文件沒放到了回收站,真正的數據清理其實並沒有進行。這個狀態你可以在mfs.cgi頁面可以看到。結果在容器中mkdir創建文件夾的時候報device is busy.

這兩個錯誤,我都是重啟docker之后才解決的。我認為可能是docker底層的文件服務,cgroup或者aufs有點問題。這個問題暫且留着。

其他網友總結的問題 

========================================================

10.docker v1版私有倉庫,鏡像第一次上傳時索引寫入db,但是鏡像上傳失敗(search可以找到,但是delete接口刪除失敗),倉庫報錯如下:

原因:索引已經寫入db,但是鏡像上傳失敗,此時會再次寫入索引,進而引起name不唯一的報錯

解決方法:索引存在sqlite數據庫中,去數據庫中把報錯的鏡像索引刪掉即可(sqlite3 docker-registry.db;.tables;select * from repository;)。

========================================================

11.device mapper discard的宕機。

原因:這個問題反復出現在某些服務器上,宕機重啟后通過IPMI consule進入時系統已經重新掛載了CoreDump的Kernel,看到CoreDump生成dump之前進行Recover操作和Data Copying操作,導致恢復時間很慢。通過Coredump分析屬於Kernel在DM discard方面的一個BUG,方法為禁用docker devicemapper的discard。

解決方法:設置docker啟動參數"--storage-opt dm.mountopt=nodiscard --storage-opt dm.blkdiscard=false"

========================================================

12.docker啟動報錯[error] attach_loopback.go:42 There are no more loopback devices available,完整錯誤日志:

systemd[1]: Starting Docker Application Container Engine...
docker[47518]: 2016/02/03 14:50:32 docker daemon: 1.3.2 39fa2fa/1.3.2; execdriver: native; graphdriver:
docker[47518]: [b98612a1] +job serveapi(fd://, tcp://0.0.0.0:2375, unix:///var/run/docker.sock)
docker[47518]: [error] attach_loopback.go:42 There are no more loopback devices available.
docker[47518]: 2016/02/03 14:50:32 loopback mounting failed
systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE
systemd[1]: Failed to start Docker Application Container Engine.
systemd[1]: Unit docker.service entered failed state.
systemd[1]: docker.service failed.

原因:because your host system does not have the loopback files in it's dev for docker to use.

解決方法:Use something like this on your host then run the container and it will pick up the devices.

#!/bin/bash

for i in {0..6}

do

    mknod -m 0660 /dev/loop$i b 7 $i

done

docker 官方issue:git issue

====================================================================

13.docker執行命令(如docker rm等)報錯:

runtime/cgo: pthread_create failed: Resource temporarily unavailable

SIGABRT: abort

PC=0x7f4d400d45d7

goroutine 0 [idle]:

goroutine 16 [running]:

runtime.asmcgocall(0x403ea0, 0x7f4d40bc1f20) 。。。。。。

原因:機器資源達到上限

解決辦法:找到達到上限的資源,查明具體原因,並解決(如將limit值加大,/usr/lib/systemd/system/docker.service中增加LimitCORE=infinity,TasksMax=1048576)

[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target docker.socket
Requires=docker.socket

[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
ExecStart=/usr/bin/docker -d $OPTIONS $DOCKER_STORAGE_OPTIONS
ExecStartPost=/usr/bin/chmod 777 /var/run/docker.sock
LimitNOFILE=1048576
LimitNPROC=1048576

LimitCORE=infinity

TasksMax=1048576

MountFlags=private

[Install]
WantedBy=multi-user.target

git issue

=============================================================

14.使用pipework給容器設置IP報錯(Error: argument "veth1pl1.507589e+06" is wrong: "name" too long)

原因:

       pipework在設置容器的ip時需要添加vethpair,而虛擬網卡名默認為v${CONTAINER_IFNAME}pl${NSPID},其中CONTAINER_IFNAME為容器內虛擬網卡名,如eth0,NSPID為容器在宿主機上的pid,當pid過大時會轉為科學計數法顯示(如1507589顯示為1.507589e+06),但內核要求虛擬網卡名長度不能超過16 bytes,而此時

v${CONTAINER_IFNAME}pl${NSPID}長度超過了內核的限制,因此在執行:ip link add name $LOCAL_IFNAME mtu $MTU type veth peer name $GUEST_IFNAME mtu $MTU 時報錯 (如:ip link add name veth1pl1.507589e+06 mtu 1500 type veth peer name veth1pg1.507589e+06 mtu 1500報錯Error: argument "veth1pl1.507589e+06" is wrong: "name" too long)

相關代碼:

DOCKERPID=$(docker inspect --format='{{ .State.Pid }}' $GUESTNAME)

NSPID=$DOCKERPID

LOCAL_IFNAME="v${CONTAINER_IFNAME}pl${NSPID}"  

ip link add name $LOCAL_IFNAME mtu $MTU type veth peer name $GUEST_IFNAME mtu $MTU

解決辦法:

1.pid過大時不要轉為科學計數法,修改pipework中

DOCKERPID=$(docker inspect --format='{{ .State.Pid }}' $GUESTNAME) 為

DOCKERPID=$(docker inspect --format='{{ .State.Pid }}' $GUESTNAME|awk '{printf("%d",$0)}') 即可

2.虛擬網卡名生成方法修改為其他方式,保證長度不超過16 byets即可

==============================================

15.docker不設置privileged,無法ssh進容器(centos7安裝了ssh的鏡像)

解決方法:

將ssh配置中的 UsePAM yes改成UsePAM no就可以不用設置privileged了(UsePAM 做一些用戶記接入控制)

==============================================

16.docker rmi $image報錯:(Error response from daemon: No such id: xxxxxxxxxxxx

2017/05/10 13:53:59 Error: failed to remove one or more images)

解決方法:

某個容器使用的鏡像不存在了(docker ps -a某個容器的鏡像顯示是報錯中的id就是這個容器),將此容器刪除即可。

=============================================================

17. docker run|start container報Unit docker-${container_id}.scope already exists錯誤

原因:之前的容器在停止或刪除時,scope沒有被systemd清楚掉

解決辦法:

方法1. systemctl stop docker-${container_id}.scope

方法2. 重啟機器(如果機器可以重啟的話)

相關問題官方鏈接

==============================================================

18.docker使用centos7鏡像,yum報fakesystemd-1-17.el7.centos.noarch has installed conflicts systemd: fakesystemd-1-17.el7.centos.noarch錯

解決方法:yum swap -y fakesystemd systemd && yum install -y systemd-devel

======================網上發現的其他問題================================

5. 遇到的問題

5.1 幽靈容器問題

我們環境中早期的Docker 是1.5版本的,在升級1.7的時候,部分container的進程從容器逃逸,容器處於Destroyed狀態,容器進行任何stop、remove都會出現如下報錯

Container does not exist: container destroyed。這是個社區已知的問題,目前社區沒有完整的解決方案。升級過程中先關閉老的容器后再升級Docker可以避免該問題。出現問題之后要恢復相對麻煩。

5.2 用戶隔離不足

我們測試環境中,容器密度較大。Container新建用戶對外全部映射為 UID 500或者501,出現了Resource Temporarily unavailable。

CentOS默認用戶UID從500開始,雖然ulimit設置上限是相對獨立的,但是統計已經使用資源時卻是一起統計的。所以在密度較大的測試和預生產環境可能會出現這樣的問題。我們的解法是在我們添加的FirstBoot中創建一個隨機UID的用戶。這樣相同的鏡像創建出的用戶UID也不同。大家各自統計,盡可能避免問題。

5.3 NFS Server無法啟動

這個問題是兩個小問題:

1. kernel模塊的reload設置。

2. kthreadd創建進程。

第一個問題代表了一系列問題,這個是由於因為文件系統沒有kernel的目錄,模塊依賴關系無從查起。通常此類服務都可以在配置文件中關閉模塊的reload過程,例如NFS就可以配置。第二個問題是rpc.nfsd 通知kernel去建立nfsd服務,kernel通過kthreadd來創建nfsd服務。所以nfsd進程不會出現在Container內部,而是暴露在宿主機上。

5.4 線程數量上限” fork: Cannot allocate memory”

我們的環境中出現過1次,表現為宿主機無法ssh登錄,通過IPMI Console進行登錄閃斷。這個問題原因是由於某個應用的問題導致生成大量的線程,達到了系統線程的上線。

我們認為:

1. pid_max 和 threads-max 值如何設置不影響單個進程的線程數量,上限目前為32768

2. pid_max 和 threads-max 影響所有線程的總量,二者較小者為系統上限。超過系統上限后部分系統命令都無法使用。

3. 調整系統上限后雖然可以有更多的線程,但是太多的線程將會對系統穩定性造成影響。

解決思路

1. 環境中所有宿主機將/proc/sys/kernel/pid-max設置為65535,並通過nagios監控告警宿主機上的線程數量。

2. 從應用層(tomcat)限制線程上限。

5.5 .device mapper discard導致的宕機

這個問題反復出現在某些服務器上,宕機重啟后通過IPMI consule進入時系統已經重新掛載了CoreDump的Kernel,看到CoreDump生成dump之前進行Recover操作和Data Copying操作,導致恢復時間很慢。通過Coredump分析屬於Kernel在DM discard方面的一個BUG,方法為禁用docker devicemapper的discard。具體為設置docker啟動參數”–storage-opt dm.mountopt=nodiscard –storage-opt dm.blkdiscard=false”。該問題已經在多個公司分享中看到,解決思路也基本一致。

原文鏈接

=========================其他鏈接================================

 

Linux內核bug引起Mesos、Kubernetes、Docker的TCP/IP數據包失效

docker容器根目錄為只讀的解決辦法

使用 Device Mapper來改變Docker容器的大小,獲取更快的池

Docker Device Mapper 使用 direct-lvm 

Docker內部存儲結構(devicemapper)解析(下篇)

Docker基礎技術:DeviceMapper   Docker內部存儲結構(devicemapper)解析

docker 跨主機網絡:overlay 簡介

Docker網絡解決方案        Docker 網絡配置       docker網絡配置方法總結

使用mesos管理docker集群(mesos,marathon,chronos) 

docker的跨主機解決方案weave----遇到的坑(1)       

docker的跨主機解決方案weave----遇到的坑(2) 

蘑菇街基於Docker的私有雲實踐


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM