- 1. 1. 为什么有很多<none>:</none>镜像,有的删除不掉,有些却删除不掉?
- 2. 如何删除已退出的容器的镜像?
- 3. 如何查看容器完整ID?
- 4. 如何查看容器运行的命令?
- 5. docker stack不支持加载.env文件,怎么解决?
- 6. 生成环境怎么使用docker部署nodejs应用?
- 7. docker swarm模式下使用traefik做负载均衡时候无法获取到客户端IP?
- 8. docker swarm模式下一个容器有多个端口,使用traefik做复制该如何配置?
- 9. 当我们构建nodejs应用镜像,全局安装某依赖时候,有时候出现权限拒绝该怎么解决?
- 10. docker部署mysql时候,日志目录不可写问题?
- 11. docker部署grafana数据目录权限导致问题
- 12. docker容器内外相互拷贝数据
下面是我在使用docker过程中遇到的一些问题以及解答,现记录下来备查。
1. 为什么有很多<none>:</none>
镜像,有的删除不掉,有些却删除不掉?
我们执行命令docker images -a
有时候会发现不少docker rmi image_name
删除这些none镜像时候,有时候能够成功,有时候却不能成功。这究竟为什么?
我们知道镜像是分层的,上面一层依赖下一层,下一层是上一次的父镜像层。就像下面这样:
我们可以通过docker inspect
查看镜像ID 和父层镜像ID
上图中镜像ip-scout的ID是28ee11309524
,它的父镜像层ID是a8e836f776fa
, 接着我们看看上图父镜像层信息:
我们发现ip-scout镜像的父镜像层就是docker build
或docker pull
过程中产生的中间层镜像,这些none镜像是无法删除的。最上层镜像由于我们命名了所以不再是你none,就好比28ee11309524
的名称就是ip-scout:latest
我们可以通过docker history
查看所有层:
untagged
和dangling
,这类镜像占用空间,可以使用下面命令进行删除的:
1 | docker rmi $(docker images -f "dangling=true" -q) |
如何删除已退出的容器的镜像?
我们可以使用下面命令
1 | docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }') |
如何查看容器完整ID?
我们使用docker ps命令查看到的容器ID是短ID,我们可以使用以下命令查看完整ID:
1 | docker inspect --format="{{.Id}}" container_name |
如何查看容器运行的命令?
有时候我们忘记当时是怎么运行容器的,可以通过以下命令查看:
1 | docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike container_id |
docker stack不支持加载.env文件,怎么解决?
docker compose
支持.env文件来设置环境变量,但是docker swarm集群部署模式下不支持.env环境,有时候我们确实很需要,可以这样:
1 | export $(cat .env) && docker stack deploy -c docker-stack.yml web |
生成环境怎么使用docker部署nodejs应用?
生产推荐使用pm2部署nodejs应用,支持自动重启,集群部署。
下面是构建nodejs应用镜像Dockerfile
1 | FROM node |
后续步骤略
docker swarm模式下使用traefik做负载均衡时候无法获取到客户端IP?
问题原因是docker swarm模式本身问题moby/moby#25526。
通过配置traefik服务对外暴露端口可以解决此问题:
1 | traefik: |
docker swarm模式下一个容器有多个端口,使用traefik做复制该如何配置?
我们可以配置traefik的段标签(segment labels)来解决此问题,格式如下:
1 | traefik.<segment_name>.backend=BACKEND |
更多查看traefik On containers with Multiple Ports (segment labels)
当我们构建nodejs应用镜像,全局安装某依赖时候,有时候出现权限拒绝该怎么解决?
我们一般使用官方镜像作为父镜像构建我们应用的镜像,有时候在运行npm install xxx -g
命令时候会提示类似如下的权限问题:
1 | { Error: EACCES: permission denied xxxx } |
这是由于镜像默认用户是root,我们全局安装某些依赖时候,限制使用root安装。这时候可以更改镜像用户和依赖安装目录:
1 | USER node |
docker部署mysql时候,日志目录不可写问题?
使用docker-compose进行编排:
1 | # docker-compose.yml |
容器启动时候,提示日志目录写入失败:
1 | sudo chown 999:999 /opt/mysql-master-slave/log/master |
docker部署grafana数据目录权限导致问题
部署grafana时候由于挂载的数据目录权限问题会导致:
1 | GF_PATHS_DATA='/var/lib/grafana' is not writable. |
docker-composer.yml文件:
1 | grafana: |
解决办法:更改挂载目录的用户和组
1 | sudo chown -R 472:472 $PWD/data/grafana |
docker容器内外相互拷贝数据
从宿主机上拷贝文件或目录到容器内:
1 | docker cp 文件 容器名:目录 |
从容器内拷贝文件或目录到宿主机上:
1 | docker cp 容器名:文件 目录 |