【Docker】日常記錄

文章目錄

/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 container logs size

ls -lh $(find /var/lib/docker/containers/ -name *-json.log)

清理docker container logs

#!/bin/sh

echo "==================== start clean docker containers logs =========================="

logs=$(find /var/lib/docker/containers/ -name *-json.log)

for log in $logs
        do
                echo "clean logs : $log"
                cat /dev/null > $log
        done


echo "==================== end clean docker containers logs   =========================="

如何更改 docker-compose 啓動的正在運行中的服務配置

docker-compose up -d 

Linux安裝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.service

4、啓動docker容器

docker start <container-name/ID>

摘自:https://blog.csdn.net/zedelei/article/details/90208183

刪除所有無用容器

docker ps -a | awk '{ print $1}' | wc -l 統計共有多少容器
docker rm $(docker ps -a | awk '{ print $1}' | tail -n -num) //刪除倒數num個容器

如果無用的比較多,啓動所有有用的,再刪除,運行中的容器是不能被移除的

修改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/docker

Docker 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 www

docker 解決方式:

其他命令


摘自: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-trunc 

docker: 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

去掉 After中 的firewalld.service
重啓docker:

systemctl daemon-loaded 
systemctl start 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章