文章目录
-
-
- /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 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 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/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
手动清理
删除所有无用容器
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 image prune:删除悬空的镜像。
docker container prune:删除无用的容器。
- 默认情况下docker container prune命令会清理掉所有处于stopped状态的容器
- 如果不想那么残忍统统都删掉,也可以使用--filter标志来筛选出不希望被清理掉的容器。例子:清除掉所有停掉的容器,但24内创建的除外:
- $ docker container prune --filter "until=24h"
docker volume prune:删除无用的卷。
docker network prune:删除无用的网络
修改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
重启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