开始前先推荐一篇开源 docker 书籍:docker–从入门到实践
这两天由于需要使用 docker 新建一个镜像来给项目使用,然后在使用 docker 的过程中做了一点点小结,希望可以帮到大家。
常用命令
使用
docker help
可以查看所有命令帮助,使用docker xxx命令 --help
可以查看命令的语法,例如:docker pull --help
,可以看到命令行返回为:Usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST]
使用
docker pull xxx
获取镜像,如果带有 tag 标签,则为docker pull xxx:tag
使用
docker run
运行镜像,运行常用:docker run -it --rm -u root xxx bash/sh
, 其中:- -it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
- –rm:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 –rm 可以避免浪费空间。
- -u root 是指,使用 root 权限运行容器,这样可以进行一些权限操作。
- xxx:这是指用 xxx 镜像为基础来启动容器。
- bash:放在镜像名后的是 命令,这里我们希望有个交互式 Shell,因此用的是 bash。
使用
docker image ls
或docker images
列出镜像,列表包含了:仓库名、标签、镜像 ID、创建时间、所占用的空间,镜像 ID 是唯一标识,一个镜像可以对应多个标签,所以你可能会看到拥有相同的 ID 镜像,因为它们对应的是同一个镜像。- 还有如果你在使用 Docker Hub 的话,会发现这里标识的所占用空间和在 Docker Hub 上看到的镜像大小不同,Docker Hub 上的镜像大小会小很多,因为 Docker Hub 中显示的体积是压缩后的体积。
- docker image ls 列表中的镜像体积总和并非是所有镜像实际硬盘消耗。由于 Docker 镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为使用相同的基础镜像,从而拥有共同的层。由于 Docker 使用 Union FS,相同的层只需要保存一份即可,因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多。
使用
docker image rm [选项] <镜像1> [<镜像2> ...]
,其中,<镜像> 可以是 镜像短 ID、镜像长 ID、镜像名或者镜像摘要。- 可以用
docker image ls
、docker images
、docker ps
等命令来配合删除镜像,例如:docker image rm $(docker image ls -q xxx)
,该命令运行则会删除所有仓库中名为 xxx 的镜像,也可以删除所有镜像docker image rm $(docker image ls -q)
。可以充分利用你的想象力。
- 可以用
使用 Dockerfile 定制镜像:使用 Dockerfile 定制镜像
删除镜像问题
在删除 docker 镜像的时候,有时候,你可能会遇到一个错误提示:
1 | Error response from daemon: conflict: unable to delete xxx (cannot be forced) - image is being used by running container xxx |
发现怎么删除都删除不了,看报错信息的意思是:当前镜像正在被某个容器使用导致无法删除
so,怎么解决呢?
如果是不在 root 下,进入 root 权限:
sudo su
列出所有运行或者没有运行的镜像:
docker ps -a
停止对应 container 容器,这样才能删除对应的镜像:
docker stop xxx
,我一般是直接把所有的都停了,省得复制 id 单独停止:docker stop $(docker ps -a -q)
,停止了可以通过docker start
启动对应 container光停止还是不能删除,需要删除对用容器
docker rm $(docker ps -a -q)
,这里是删除了所有的相关容器关闭后,再来删除对应的镜像,我一般通过 image 的 id 来指定删除谁
docker image rm xxxx
即可
docker cp 复制文件问题
在 docker 中,可能经常会遇到需要将容器中的文件拷贝到宿主机或者将宿主机的文件拷贝到容器的操作,这样我们就会用到 docker cp
这个拷贝命令:
1 | docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- |
这里需要特别注意的是,很多人都会使用 image ID 进行拷贝操作,而这里要求使用的是 CONTAINER ID,也就是容器 id,这样会导致报错
1 | No such container:path:xxx |
正确的做法是通过 docker ps
命令或者 docker inspect -f '' xxx:tag容器名和对应标签
来获取容器的 id,然后通过 docker cp 命令进行操作。其中 docker ps -a
可以列出所以正在运行和停止的容器情况。