常用指令

  • 运行镜像
    1
    2
    3
    4
    5
    # bash可以换成其他需要执行的命令或者executable
    docker run -v 宿主机目录:镜像目录 -p 宿主机port:镜像port -it 镜像名:tag bash

    # 挂载当前目录
    docker run -v $PWD/:镜像目录 -it 镜像名:tag bash

windows系统中,如果使用git bash,可能需要添加winpty:

1
winpty docker run  -v 宿主机目录:镜像目录 -p 宿主机port:镜像port -it 镜像名:tag

windows系统中,宿主机目录使用绝对路径,盘符前有2个”/符号”,比如:

1
winpty docker run  -v //c/test/data:/data -it ubuntu:latest
  • 删除没有添加tag的所有镜像

    1
    docker images|grep none|awk '{print $3}'|xargs docker rmi
  • 停止所有容器

    1
    docker stop $(docker ps -aq)
  • 导出镜像save

    1
    docker save -o target.tar image_name
  • 导入镜像import

    1
    docker load --input target.tar
  • 查看镜像

    1
    docker image ls
  • 删除镜像

    1
    docker rmi image-name
  • 修改镜像tag

    1
    2
    3
    docker image ls # 查看image id
    docker tag imageID newName:newtag # backend:1.0
    docker rmi oldName
  • 导出容器:export

    1
    2
    3
    docker export 容器ID > target.img

    docker export -o target.img 容器ID

    target.img可以使tar文件,也可以是导出二进制镜像文件img。
    容器ID可以使用docker ps查看。

  • 容器打包成镜像

    1
    2
    3
    docker commit 容器ID 镜像名:1.0
    # 查看
    docker image ls

    可以使用docker save导出镜像。

  • 导入容器

    1
    docker import 容器文件
  • 查看所有容器

    1
    docker ps -a
  • 查看运行的容器

    1
    docker ps
  • 删除容器

    1
    docker rm containID
  • 删除所有停止的容器

    1
    docker container prune
  • 进入运行中的容器

    1
    2
    3
    4
    docker exec -i -t containerID/name /bin/bash

    ## windows上如果出错,使用:
    winpty docker exec -i -t containerID/name /bin/bash
  • 查看与导出日志

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # docker-compose 查看
    docker-compose logs -f <容器名>

    # 指定末尾行数
    docker-compose logs -n 1000 -f <容器名>

    # 导出到指定文件
    docker logs --since="2022-04-22T9:00:00" --until="2022-04-23T9:00:00" containerID >> file.log

    # 查看各容器日志的大小
    find /var/lib/docker/containers/ -name *-json.log |xargs du -sh

    # 清理日志
    cat /dev/null > /var/lib/docker/containers/id/id-json.log

注意:如果docker容器正在运行,那么使用rm -rf方式删除日志后,通过df -h会发现磁盘空间并没有释放。原因是在Linux或者Unix系统中,通过rm -rf或者文件管理器删除文件,将会从文件系统的目录结构上解除链接(unlink)。如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用。提供一个日志清理脚本clean_docker_log.sh,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/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 ========"
1
2
3
chmod +x clean_docker_log.sh

./clean_docker_log.sh

docker获取镜像构建

pull私人仓库镜像。

如果是http的仓库服务器,则需要新建或修改/etc/docker/daemon.json文件,其中修改对应的IP:Port:

1
2
3
4
5
{
"insecure-registries": [
"192.168.100.21:5000"
]
}
1
2
3
4
5
# pull docker image
docker pull 192.168.100.21:5000/library/grpc-ubuntu:1.0.0

# add tag for the image
docker tag 192.168.100.21:5000/library/grpc-ubuntu:1.0.0 grpc-ubuntu:latest