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