1 目錄掛載和單個(gè)文件掛載
例如下面一個(gè)掛載實(shí)例, /var/run/license_unix_sock
是個(gè)文件扬霜,docker 容器通過(guò)該 socket 文件和主機(jī)上的進(jìn)程進(jìn)行通信定鸟, /var/www/html/
是目錄。
- "/var/run/license_unix_sock:/var/run/license_unix_sock"
- "/var/www/html/:/var/www/html/"
- "/etc/localtime:/etc/localtime"
現(xiàn)象:當(dāng)運(yùn)行在主機(jī)上的程序重啟時(shí)候著瓶, /var/run/license_unix_sock
發(fā)生變化联予,但是在 docker 容器中掛載的文件并沒有發(fā)生改變,仍然是舊文件材原。
原因:對(duì)bind mount
這種掛載方式來(lái)說(shuō)躯泰,文件的改變會(huì)改變它的inode
,但是容器內(nèi)inode
保持不變华糖。
解決方案:修改為掛載目錄麦向。
相關(guān)案例:
https://serversforhackers.com/c/mounting-files-vs-directories
https://github.com/docker/docker/issues/15793#issuecomment-135411504
2 使用 docker swarm,容器莫名其妙重啟
某些情況下客叉,docker 容器全部重啟诵竭,經(jīng)過(guò)查看 docker 運(yùn)行日志,發(fā)現(xiàn)下面報(bào)錯(cuò):
Feb 26 11:43:16 sz-drip dockerd[5065]: time="2020-02-26T11:43:16.124650220+08:00" level=error msg="heartbeat to manager { } failed" error="rpc error: code = NotFound desc = node not register
Feb 26 11:43:16 sz-drip dockerd[5065]: time="2020-02-26T11:43:16.124764380+08:00" level=error msg="agent: session failed" backoff=100ms error="node not registered" module=node/agent node.id=
Feb 26 11:43:16 sz-drip dockerd[5065]: time="2020-02-26T11:43:16.124803737+08:00" level=info msg="manager selected by agent for new session: { }" module=node/agent node.id=a5drrk7eo59x4m6itl
Feb 26 11:43:16 sz-drip dockerd[5065]: time="2020-02-26T11:43:16.124835689+08:00" level=info msg="waiting 47.652971ms before registering session" module=node/agent node.id=a5drrk7eo59x4m6itl
Feb 26 11:43:16 sz-drip dockerd[5065]: time="2020-02-26T11:43:16.278198549+08:00" level=info msg="worker a5drrk7eo59x4m6itlbsf28pq was successfully registered" method="(*Dispatcher).register
原因:docker swarm 節(jié)點(diǎn)間通信默認(rèn)超時(shí)時(shí)間為 5s兼搏,在虛擬化環(huán)境下有時(shí)候會(huì)超時(shí)卵慰,導(dǎo)致節(jié)點(diǎn)重啟。
解決方案:使用以下命令將心跳超時(shí)時(shí)間更改為 30s佛呻。
docker swarm update --dispatcher-heartbeat 30s
centos 上查看日志方法:journalctl -u docker.service
相關(guān)案例:
https://github.com/moby/moby/issues/38107
備注:使用 docker-compose 有時(shí)候也會(huì)出現(xiàn)啟動(dòng)失敗的情況裳朋,可以使用下面兩個(gè)環(huán)境變量進(jìn)行設(shè)置:
export DOCKER_CLIENT_TIMEOUT=500
export COMPOSE_HTTP_TIMEOUT=500
3 docker 容器訪問(wèn)宿主機(jī)服務(wù)
需要在 docker 容器中訪問(wèn)部署在宿主機(jī)上的服務(wù),可以采用下面一些方法吓著。
-
采用 host 網(wǎng)絡(luò)模式
在啟動(dòng)容器時(shí)鲤嫡,使用 --net="host" 參數(shù)。
使用宿主機(jī)對(duì)外的IP绑莺,需要防火墻端口開放暖眼。
-
使用 docker0 訪問(wèn)
ip route show | awk '/default/ {print $3}'
注意:這種方式只能訪問(wèn)監(jiān)聽到 0.0.0.0 或者 docker0 上服務(wù)。
4 給 docker 指定 IP
首先需要?jiǎng)?chuàng)建自己的網(wǎng)絡(luò)纺裁。
docker network create --subnet=10.12.0.0/16 testnet
然后可以通過(guò)運(yùn)行參數(shù)指定 IP
docker run -d --net testnet --ip 10.12.1.32 ubuntu
5 宿主機(jī)與容器間文件拷貝
常用的有如下兩種方法:
第一種诫肠,將目錄掛載到容器司澎,然后可以通過(guò) ${PWD}/data 目錄將文件拷貝到容器中,或在容器中將文件拷貝至 /data
目錄栋豫。
docker run -i -v ${PWD}/data:/data ubuntu:latest
第二種挤安,較第一種更為方便快捷。
從容器中拷貝數(shù)據(jù)到宿主機(jī):
docker cp <containerId>:/file/path/within/container /host/path/target
拷貝文件到容器:
docker cp /host/path/target <containerId>:/file/path/within/container
6 如何啟動(dòng) docker-compose.yml 文件中的某個(gè)服務(wù)
在一個(gè) docker-compose.yml 文件中我們經(jīng)常會(huì)定義多個(gè)服務(wù)丧鸯,使用 docker-compose up -d
可以將服務(wù)全部啟動(dòng)蛤铜,當(dāng)我們修改某個(gè)服務(wù)配置后,再次運(yùn)行該命令就可以直接重啟更改后的服務(wù)骡送。
有時(shí)候,我們只需要啟動(dòng)其中的某一個(gè)服務(wù)絮记,而不需要全部啟動(dòng)摔踱,可以使用以下命令:
docker-compose up --detach --build xxxx
更新配置或代碼后,使用以上命令就可以重新生成容器怨愤。
或者
docker-compose up -d xxxx
7 如何清除無(wú)用鏡像
docker rmi $(docker images | grep -w "keyword" | awk -F " " '{print $3}') -f
或者刪除所有鏡像:
docker rmi -f $(docker images -q)
8 如何刪除磁盤空間
docker volume rm $(docker volume ls -q)
9 如何查看 docker daemon 日志的位置
在不同的系統(tǒng)派敷,查看方式也不同,參考下表:
系統(tǒng) | 查看方式 |
---|---|
RHEL, Oracle Linux | /var/log/messages |
Debian | /var/log/daemon.log |
Ubuntu 16.04+, CentOS | journalctl -u docker.service 或者查看 /var/log/syslog |
Ubuntu 14.10- | /var/log/upstart/docker.log |
macOS (Docker 18.01+) | ~/Library/Containers/com.docker.docker/Data/vms/0/console-ring |
macOS (Docker <18.01) | ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/console-ring |
Windows | AppData\Local |
參考鏈接如下:https://docs.docker.com/config/daemon/#read-the-logs
10 如何導(dǎo)入/導(dǎo)出鏡像文件
例如將鏡像文件 mongodb:4.0.11-xenial 導(dǎo)出至 mongodb.tar 文件中撰洗,可以使用以下命令:
docker save mongodb:4.0.11-xenial > mongodb.tar
使用以下命令導(dǎo)入鏡像:
docker load < mongodb.tar
11 執(zhí)行 docker 容器中的命令
例如 mongodb 運(yùn)行在 docker 容器中篮愉,需要使用 mongoimport 導(dǎo)入數(shù)據(jù),可以采用以下命令:
docker exec $(docker ps | grep "ms_mongodb" | awk -F " " '{print $1}') mongoimport -u ${MONGOUSER} -p ${MONGOPASSWORD} -d ${MONGODB} -c ${name} --file ${DOCKER_RESOURCE}/${name}.json
其中 ms_mongodb 是容器名差导。
未完待續(xù)