【Docker】日常记录
文章目錄
- /var/lib/docker 目錄解釋
- [Docker Volume - 目錄掛載以及文件共享](https://kebingzao.com/2019/02/25/docker-volume/#dockerfile-volume-%E7%9A%84%E6%9D%83%E9%99%90%E5%92%8C%E8%AE%B8%E5%8F%AF)
- Docker-compose ports 與 Dockerfile EXPOSE 區別
- docker 內“Temporary failure resolving 'security.ubuntu.com” 報錯信息
- 查看各容器IP地址
- 查看docker container logs size
- 清理docker container logs
- 如何更改 docker-compose 啟動的正在運行中的服務配置
- Linux安裝docker-compose
- 修改已運行的Docker容器啟動配置參數
- 方法一:Docker 命令修改
- 方法二:直接改配置文件
- 修改docker container 的掛載路徑
- 清理docker
- 手動清理
- 自動清理
- 修改docker默認的存儲位置
- Docker mysql 導出、導入數據
- [emerg] getpwnam("www") failed in /etc/nginx/nginx.conf
- 其他命令
- docker: Error response from daemon: oci runtime error: container_linux.go:265: starting container process caused "exec: \"prom/pushgateway\": stat prom/pushgateway: no such file or directory".
- docker ps 完整輸出
- docker: Error response from daemon: conflicting options: port publishing and the container type network mode.
- docker: Error response from daemon: driver failed programming external connectivity on endpoint nginx (d639abcca455cfb2ae23110a56b08732522da0cb64146f7141ca99a8c54704b7): Error starting userland proxy: listen tcp 0.0.0.0:80: listen: address already in use.
- Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
- 運行容器之后,一直處于restarting 狀態
- docker 服務啟動失敗
- iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 80 -j DNAT ...
- failed to start daemon: Error initializing network controller: Error creating default "bridge" network: could not find an available, non-overlapping
- iptables no chain/target/match by that name
- root 進入docker 容器(加參數 -u root)
/var/lib/docker 目錄解釋
* /var/lib/docker/devicemapper/devicemapper/data * 用來存儲相關的存儲池數據 * /var/lib/docker/devicemapper/devicemapper/metadata * 用來存儲相關的元數據。* /var/lib/docker/devicemapper/metadata/ * 用來存儲 device_id、大小、以及傳輸_id、初始化信息* /var/lib/docker/devicemapper/mnt * 用來存儲掛載信息 * /var/lib/docker/container/ * 用來存儲容器信息* /var/lib/docker/graph/ * 用來存儲鏡像中間件及本身詳細信息和大小 、以及依賴信息* /var/lib/docker/repositores-devicemapper * 用來存儲鏡像基本信息* /var/lib/docker/tmp * docker臨時目錄 * /var/lib/docker/trust * docker信任目錄* /var/lib/docker/volumes * docker卷目錄Docker Volume - 目錄掛載以及文件共享
Docker-compose ports 與 Dockerfile EXPOSE 區別
# ports:暴露容器端口到主機任意端口或指定端口,用法: # docker-compose.yml ports:- "80:80"- "91:81"# expose:將當前容器的端口暴露給同一個networks 的其他容器,用法:# docker-compose.yml expose: - '3000'- '9000'# Dockerfile EXPOSE "3000"docker 內“Temporary failure resolving 'security.ubuntu.com” 報錯信息
解決方案: vim /etc/docker/daemon.json { "dns": ["8.8.8.8", "114.114.114.114"] } 重啟docker systemctl restart docker查看各容器IP地址
docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)查看docker container logs size
ls -lh $(find /var/lib/docker/containers/ -name *-json.log)清理docker container logs
#!/bin/shecho "==================== start clean docker containers logs =========================="logs=$(find /var/lib/docker/containers/ -name *-json.log)for log in $logsdoecho "clean logs : $log"cat /dev/null > $logdoneecho "==================== end clean docker containers logs =========================="如何更改 docker-compose 啟動的正在運行中的服務配置
docker-compose up -dLinux安裝docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
修改已運行的Docker容器啟動配置參數
我們創建容器時忘了添加參數 --restart=always ,當 Docker 重啟時,容器未能自動啟動
方法一:Docker 命令修改
docker container update --restart=always 容器名字方法二:直接改配置文件
-
首先停止容器,不然無法修改配置文件
-
配置文件路徑為:/var/lib/docker/containers/容器ID
在該目錄下找到一個文件 hostconfig.json ,找到該文件中關鍵字 RestartPolicy
修改前配置:“RestartPolicy”:{“Name”:“no”,“MaximumRetryCount”:0}
修改后配置:“RestartPolicy”:{“Name”:“always”,“MaximumRetryCount”:0}
-
最后啟動容器。
修改docker container 的掛載路徑
1、停止docker服務
systemctl stop docker.service(關鍵,修改之前必須停止docker服務)2、vim /var/lib/docker/containers/container-ID/hostconfig.json
“Binds”:["/home/website:/usr/share/nginx/website"]
2、vim /var/lib/docker/containers/container-ID/config.v2.json
- 修改配置文件中的目錄位置,然后保存退出
- 大致格式如下:
“MountPoints”:{
“容器內文件路徑”:{“Source”:“宿主機文件路徑”,“Destination”:“容器內文件路徑”,“RW”:true,“Name”:"",“Driver”:"",“Type”:“bind”,“Relabel”:“rw”,“Propagation”:“rprivate”,“Spec”:{“Type”:“bind”,“Source”:"宿主機文件路徑,“Target”:“容器內文件路徑”}}
}
- 示例:-v /home/website:/usr/share/nginx/website
“MountPoints”:{
“/usr/share/nginx/website”:{“Source”:"/home/website",“Destination”:"/usr/share/nginx/website",“RW”:true,“Name”:"",“Driver”:"",“Type”:“bind”,“Relabel”:“rw”,“Propagation”:“rprivate”,“Spec”:{“Type”:“bind”,“Source”:"/home/website",“Target”:"/usr/share/nginx/website"}}
}
3、啟動docker服務
systemctl start docker.service4、啟動docker容器
docker start <container-name/ID>摘自:https://blog.csdn.net/zedelei/article/details/90208183
清理docker
手動清理
刪除所有無用容器
docker ps -a | awk '{ print $1}' | wc -l 統計共有多少容器 docker rm $(docker ps -a | awk '{ print $1}' | tail -n -num) //刪除倒數num個容器如果無用的比較多,啟動所有有用的,再刪除,運行中的容器是不能被移除的1、刪除所有懸空鏡像,不刪除未使用鏡像: docker rmi $(docker images -f "dangling=true" -q) 2、刪除所有未使用鏡像和懸空鏡像 docker rmi $(docker images -q) 3、清理卷 如果卷占用空間過高,可以清除一些不使用的卷,包括一些未被任何容器調用的卷(-v 詳細信息中若顯示 LINKS = 0,則是未被調用): 刪除所有未被容器引用的卷: docker volume rm $(docker volume ls -qf dangling=true) 4、容器清理 如果發現是容器占用過高的空間,可以手動刪除一些: 刪除所有已退出的容器: docker rm -v $(docker ps -aq -f status=exited) 刪除所有狀態為dead的容器 docker rm -v $(docker ps -aq -f status=dead)自動清理
docker system prune docker system prune -a : 一并清除所有未被使用的鏡像和懸空鏡像。 docker system prune -f : 用以強制刪除,不提示信息。docker system prune可對空間進行自動清理。
該命令所清理的對象如下:
- all stopped containers (已停止容器)
- all networks not used by at least one container (未被任何容器所關聯的網絡)
- all dangling images (未被任何容器使用的卷)
- all dangling build cache (所有懸空的鏡像)
已使用的鏡像:指所有已被容器(包括stop的)關聯的鏡像,也就是docker ps -a所看到的所有容器對應的image。
未引用鏡像:沒有被分配或使用在容器中的鏡像
懸空鏡像(dangling image):未配置任何Tag(也就是無法被引用)的鏡像。通常是由于鏡像編譯過程中未指定-t參數配置Tag導致的。
修改docker默認的存儲位置
摘自:https://blog.csdn.net/qq_35119422/article/details/85869361
docker 的所有images及相關信息存儲位置為:/var/lib/docker
查看默認的docker存儲路徑
docker info |grep ‘Docker Root Dir’ WARNING: No swap limit support Docker Root Dir: /var/lib/docker停止所有docker容器
sudo docker stop $(docker ps -a | awk ‘{ print $1}’ | tail -n +2)停止docker服務
sudo service docker stop打包docker目錄
cd /var/lib sudo tar -czvf /usr/docker.tar.gz docker/ cd /usr/ sudo tar -xzvf docker.tar.gz修改docker默認的存儲位置
sudo vim /etc/docker/daemon.json {“graph”: “/home/server/docker” }啟動docker服務
sudo service docker start啟動所有docker容器
sudo docker start $(docker ps -a | awk ‘{ print $1}’ | tail -n +2)查看修改后docker存儲路徑
docker info |grep ‘Docker Root Dir’ WARNING: No swap limit support Docker Root Dir: /usr/dockerDocker mysql 導出、導入數據
// 導出數據和表結構: # docker exec -i mysql mysqldump -uroot -p12345678 db > db.sql // 導出表結構: # docker exec -i mysql mysqldump -uroot -p12345678 -d db > db.sql// 導入 # scp db.sql root@<ip地址>:/tmp/db.sql # docker cp db.sql mysql_container:/opt/ms.sql # docker exec -it mysql_container bash > mysql -uroot -p12345678 > create database db; > use db; > source <路徑>/db.sql;[emerg] getpwnam(“www”) failed in /etc/nginx/nginx.conf
root@xxx:/home/xxx# docker logs nginx nginx: [emerg] getpwnam("www") failed in /etc/nginx/nginx.conf:6本地解決方法: useradd www groupadd wwwdocker 解決方式:其他命令
摘自:https://blog.csdn.net/qq_35119422/article/details/85869361
停止所有docker容器
sudo docker stop $(docker ps -a | awk ‘{ print $1}’ | tail -n +2)停止docker服務
sudo service docker stop修改mysql路徑
cd ~ sudo cp -r mysql/ /home/server/備份容器配置文件
cd /var/lib/docker/containers/de9c6501cdd3 cp hostconfig.json hostconfig.json.bak cp config.v2.json config.v2.json.bak修改hostconfig的冒號前的配置路徑
vi hostconfig.json“Binds”: ["/home/server/mysql/conf/my.cnf:/etc/mysql/my.cnf", “/home/server/mysql/logs:/logs”, “/home/server/mysql/data:/mysql_data”],修改config的Source的配置路徑
vi config.v2.json啟動docker服務
sudo service docker start啟動所有docker容器
sudo docker start $(docker ps -a | awk ‘{ print $1}’ | tail -n +2)docker: Error response from daemon: oci runtime error: container_linux.go:265: starting container process caused “exec: “prom/pushgateway”: stat prom/pushgateway: no such file or directory”.
xxxx@debian:~/docker_package$ sudo docker run -d --name pushgateway -p 9091:9091 --network=prometheus_net test_pushgateway prom/pushgateway
[sudo] password for xxxx:
a6e9041545eb1208af80de45a60b1b8b627d0c51036d20dd781c968b3a7b5566
docker: Error response from daemon: oci runtime error: container_linux.go:265: starting container process caused “exec: “prom/pushgateway”: stat prom/pushgateway: no such file or directory”.
解決方式:
因為commad 方式錯誤
那么進程為什么會退出?
如果是執行 service nginx start 這類啟動后臺服務程序的命令,那說明還是把 Docker 當做虛擬機了。Docker 啟動的是進程,因此所謂的后臺服務應該放到前臺,比如應該 nginx -g ‘daemon off;’ 這樣直接前臺啟動應用才對。
如果發現 COMMAND 一欄是 /bin/bash,那還是說明把 Docker 當虛擬機了。COMMAND 應該是應用程序,而不交互式操作界面,容器不需要交互式操作界面。此外,如果使用 /bin/bash 希望起一個交互式的界面,那么也必須提供給其輸入和終端,因此必須加 -it 選項,比如 docker run -it ubuntu /bin/bash
那么如何查看使用的是什么commad 啟動方式呢?
docker inspect <容器名稱> 查看Cmd
或
docker ps -a
進入容器find / |grep <你看到COMMAND的部分命令>
或
進入容器 ps -fe ,但是我們沒有成功,容器內沒有ps 命令
解決問題:
查看完整輸出:docker ps --no-trunc
docker ps 完整輸出
關于 command 顯示不全問題 顯示完整輸出 docker ps --no-truncdocker: Error response from daemon: conflicting options: port publishing and the container type network mode.
See ‘docker run --help’.
xxxx@debian:~$ sudo docker run -d
–name=mysql
-p 3306:3306
–network=container:nginx
-v /home/xxxx/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=xxxxx
-e TZ=Asia/Shanghai
test_mysql
/docker-entrypoint-initdb.d
docker: Error response from daemon: conflicting options: port publishing and the container type network mode.
See ‘docker run --help’.
沖突的選項:端口發布和容器類型網絡模式
解決:
刪除-p 3306:3306
docker: Error response from daemon: driver failed programming external connectivity on endpoint nginx (d639abcca455cfb2ae23110a56b08732522da0cb64146f7141ca99a8c54704b7): Error starting userland proxy: listen tcp 0.0.0.0:80: listen: address already in use.
解決: netstat -tlnp 查看占用的端口Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
解決方案: 查看/etc/docker/daemon.json 這個文件中的 用 {} 括起來運行容器之后,一直處于restarting 狀態
查看日志 docker logs <容器名稱> 可能存在以下問題: 1. 缺少執行文件 2. 執行文件中語法錯誤docker 服務啟動失敗
iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 80 -j DNAT …
解決方案:
cd /etc/systemd/system/multi-user.target.wants vim docker.service 去掉 After中 的firewalld.service
重啟docker:
failed to start daemon: Error initializing network controller: Error creating default “bridge” network: could not find an available, non-overlapping
解決方案:
vim /etc/docker/daemon.json {"ipv6": false }iptables no chain/target/match by that name
docker-compose up -d之后報錯 iptables no chain/target/match by that name
查看 iptables-save|grep docker 發現沒有了 docker相關配置,
于是,重啟docker服務 systemctl restart docker 自動生成 iptables 配置信息
再次執行
docker-compose up -d問題解決!!!
root 進入docker 容器(加參數 -u root)
docker exec -it -u root <容器名> bash總結
以上是生活随笔為你收集整理的【Docker】日常记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Prometheus Pushgat
- 下一篇: 自定义一个SharedPreferenc