Docker的安装使用以及常见问题和解决方案

记录了 Docker 在使用过程中常见的问题和解决方案

安装

如果提示下列警告就先删除原有Docker PS:自己保存需要的数据

1
2
3
4
5
6
7
8
9
10
11
12
# Executing docker install script, commit: 11aa13e
Warning: the "docker" command appears to already exist on this system.

If you already have Docker installed, this script can cause trouble, which is
why we're displaying this warning and provide the opportunity to cancel the
installation.

If you installed the current Docker package using this script and are using it
again to update Docker, you can safely ignore this message.

You may press Ctrl+C now to abort this script.
+ sleep 20

安装命令

Docker 本体

1
curl -q https://get.docker.com | sh

Docker Machine

1
2
curl -L https://github.com/docker/machine/releases/download/v0.14.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && \
sudo install /tmp/docker-machine /usr/local/bin/docker-machine

Docker Compose

1
2
sudo curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

卸载

1
2
yum remove docker
yum remove docker-common

Docker 相关配置

添加镜像地址

注意 如果已经配置过 daemon.json 请手动添加

1
2
echo '{"registry-mirrors": ["https://registry.docker-cn.com"]}' > /etc/docker/daemon.json
service docker restart

私有源 开启HTTP

注意 如果已经配置过 daemon.json 请手动添加

1
2
echo '{ "insecure-registries": ["docker.internal.sixi.com"] }' > /etc/docker/daemon.json
service docker restart

登录私有源

1
docker login registry.internal.sixi.com

配置Docker容器镜像存储路径

  • 修改 nano /lib/systemd/system/docker.service 文件
  • 调整启动命令为 ExecStart=/usr/bin/dockerd --graph=/home/lib/docker
  • 执行 systemctl daemon-reload
  • 移动原有数据 mv /var/lib/docker /home/lib
  • 创建软连接 ln -s /home/lib/docker /var/lib/docker (可以不执行 但是防止配置失败 重新创建 还是连接一下)
  • 重启 Docker service docker restart

  • 如果是首次安装 直接创建软连接即可 (PS: 这种方式会丢失Volume的数据 小心!!!)

    1
    2
    3
    4
    5
    service docker stop
    rm -rf /var/lib/docker
    mkdir -p /home/lib/docker
    ln -s /home/lib/docker /var/lib/docker
    service docker start

垃圾清理(仅支持1.13之后的版本)

  • 全局清理
    1
    docker system prune --volumes -f

批量删除容器

1
docker rm $(docker ps -a |awk '{print $1}' | grep [0-9a-z])

批量删除镜像

1
docker rmi $(docker images | awk '{print $3}' | grep [0-9a-z])

批量删除孤立的Volume

1
docker volume rm $(docker volume ls -qf dangling=true)

Docker清理脚本(基于DockerMachine)

1
2
3
4
5
6
7
8
for i in $(docker-machine ls | awk '{print $1}' | grep -v "NAME"); do
echo "开始清理 ${i} 的已停止容器..."
docker-machine ssh ${i} docker rm $(docker-machine ssh ${i} docker ps -a |awk '{print $1}' | grep [0-9a-z])
echo "开始清理 ${i} 的未被使用镜像..."
docker-machine ssh ${i} docker rmi $(docker-machine ssh ${i} docker images |awk '{print $3}' | grep [0-9a-z]) -f
echo "开始清理 ${i} 的孤立数据卷..."
docker-machine ssh ${i} docker volume rm $(docker-machine ssh ${i} docker volume ls -qf dangling=true)
done

常见问题和注意事项

  • 重启firewall服务导致Docker对外端口无法访问
    • 问题原因: 因为Docker是通过iptables转发实现容器和宿主机互通的 重启firewall会导致 转发链丢失
    • 解决方案: 重启Docker即可恢复