Docker命令大全

构建

根据当前目录中的dockerfile构建镜像

docker build -t <镜像名称>.

运行

使用 指定镜像 以 交互模式 运行容器,并监听服务端口开放外部(直接执行镜像startup CMD)

docker run -it -p <对外端口>:<服务端口> <镜像名称>

使用 指定镜像 以 交互模式 运行容器,并监听服务端口开放外部(直接执行镜像startup CMD),并按照 容器名称docker run -it --name <容器名称> -p <对外端口>:<服务端口> <镜像名称>

使用 指定镜像 以 交互模式 运行容器,并监听服务端口开放外部(不执行startup,开启终端)

docker run -it -p <对外端口>:<服务端口> <镜像名称> /bin/bash

映射目录

使用 指定镜像 以 交互模式 运行容器,并将本机文件映射到容器内部(不执行startup,开启终端)

docker run -it -v <本机文件地址>:<容器内部地址> <镜像名称> /bin/bash

指定网络

使用 指定镜像 以 交互模式 运行容器,并使用本机网络

docker run -it --network=host <镜像名称>

启动

如果已经有容器实例,可以直接启动(直接执行镜像startup CMD)

docker start <容器名称>

进入

容器运行过程中,开启一个终端

docker exec -it <容器名称> /bin/bash

查看镜像

docker images

删除

docker rmi docker_name

在Docker中,通常会有一些无标签(none)的镜像和悬空镜像(即不再任何容器中使用但未被删除的镜像)。这些无标签镜像和悬空镜像可能会占用磁盘空间。

要删除这些无标签的镜像,可以使用以下命令:

docker rmi $(docker images -f "dangling=true" -q)

这条命令会删除所有未被任何容器使用的悬空镜像。

如果你也想删除无标签的镜像,可以使用以下命令:

docker rmi $(docker images -f "dangling=true" -q) $(docker images | grep "<none>" | awk '{print $3}')

这条命令会先删除所有悬空镜像,然后删除所有无标签的镜像。

请注意,在执行删除操作前,确保不会删除任何你可能还需要的镜像。如果不确定,可以先使用 docker images 命令列出所有镜像,进行检查。

这两条都是只删除none的镜像,使用效果都一样

docker rmi $(docker images | grep "<none>" | awk '{print $3}')
docker rmi $(docker images | grep "none" | awk '{print $3}')

注意这里直接使用这个命令删除none的镜像时,有可能会因为空间不足报如下错误

Error response from daemon: open /var/lib/docker/image/overlay2/.tmp-repositories.json2277775052: no space left on device

这时建议先使用上面的docker rmi $(docker images -f "dangling=true" -q)命令删除悬空镜像清理出空间后再删除none的镜像

system

docker system df

提供Docker整体磁盘使用率的概况,包括镜像、容器和(本地)volume。所以我们现在随时都可以查看Docker使用了多少资源。

[root@localhost ~]# docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              10                  6                   2.652GB             1.953GB (73%)
Containers          6                   6                   6.922MB             0B (0%)
Local Volumes       0                   0                   0B                  0B

docker system prune

如果之前的命令展示出 docker 已经占用了太多空间,我们会开始清理。有一个包办一切的命令:

[root@localhost ~]# docker system prune

WARNING! This will remove:
        - all stopped containers # 清理停止的容器
        - all networks not used by at least one container #清理没有使用的网络
        - all dangling images #清理废弃的镜像
        - all build cache #清理构建缓存
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B

根据警告信息可知,这个命令会删除所有关闭的容器以及dangling镜像。示例中,含有3个1GB随机文件的镜像的名称被占用了,名称为:,为dangling镜像,因此会被删除。同时,所有的中间镜像也会被删除。

更进一步,使用-a选项可以做深度清理。这时我们会看到更加严重的WARNING信息:

$ docker system prune -a

WARNING! This will remove:
        - all stopped containers
        - all volumes not used by at least one container
        - all networks not used by at least one container
        - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y
Deleted Images:
untagged: test:latest
deleted: sha256:c515ebfa2...
deleted: sha256:07302c011...
deleted: sha256:37c0c6474...
deleted: sha256:5cc2b6bc4...
deleted: sha256:b283b9c35...
deleted: sha256:8a8b9bd8b...
untagged: alpine:latest
untagged: alpine@sha256:58e1a1bb75db1...
deleted: sha256:4a415e366...
deleted: sha256:23b9c7b43...
Total reclaimed space: 2.151GB

这个命令将清理整个系统,并且只会保留真正在使用的镜像,容器,数据卷以及网络,因此需要格外谨慎。比如,我们不能在生产环境中运行prune -a命令,因为一些备用镜像(用于备份,回滚等)有时候需要用到,如果这些镜像被删除了,则运行容器时需要重新下载。

此时,所有未绑定容器的镜像将会被删除。由于第一次prune命令删除了所有容器,因此所有镜像(它们没有绑定任何容器)都会被删除。

执行脚本

容器运行过程中,执行容器内 /root/test.sh 脚本

docker exec -it <容器名称> /bin/sh /root/test.sh

使用.env文件

创建.env文件

DB_HOST=localhost
DB_USER=root
DB_PASSWORD=password

使用

  1. 在启动容器时,可以通过--env-file参数指定.env文件的路径,让容器可以读取其中定义的环境变量,例如:

docker run --env-file=.env my_image

docker-compose注意事项

1. 不要把 docker 当做数据容器来使用,数据一定要用 volumes 放在容器外面

2. 不要把 docker-compose 文件暴露给别人, 因为上面有你的服务器信息

3. 多用 docker-compose 的命令去操作, 不要用 docker 手动命令&docker-compose 去同时操作

4. 写一个脚本类的东西,自动备份docker 映射出来的数据。

5. 不要把所有服务都放在一个 docker 容器里面