基础概念
Docker 引擎主要的组件构成为:
- Docker client
- Docker daemon
- containerd
- runc
它们的关系如下:
Docker daemon 实现了 Docker 引擎的 API,默认情况下,Docker client 与 Docker daemon 之间的通信有本地的 IPC/UNIX socket 完成(/var/run/docker.sock
)。
Cheat Sheet
Image
列出本地镜像
1$ docker image ls # 列出本地镜像2$ docker images # 两条命令等效
可以使用--filter
来过滤docker image ls
返回的镜像列表:
- dangling:
true/false
,是否为悬虚镜像。 - before:
<image name or id>
,返回在其之前被创建的全部镜像 - since:
<image name or id>
,返回在其之后被创建的全部镜像 - label:标注(label)的名称或值。标注在Dockerfile通过 LABEL 指定,但是
docker image ls
不显示。 - reference:用正则表达式对镜像名称和标签过滤
Example:
1$ docker image ls --filter dangling=true2$ docker image ls -f before=alpine # -f 是 --filter 的简写3$ docker image ls -f reference="*:latest"
使用--format
可以对输出内容镜像格式化输出:
1$ docker image ls --format "{{.Size}}" # 只输出 SIZE
如果只是想要IMAGE ID
的话,可以直接用-q
,这个和删除命令结合可以快速删除所有镜像:
1$ docker image ls -q # 只输出 IMAGE ID2$ docker image rm $(docker image ls -q) # 删除所有镜像
拉取镜像
1$ docker pull ubuntu:latest # 拉取镜像2$ docker image pull <repository>:<tag> # 加上 -a 表示拉取所有标签
- 如果没有指定标签,则默认为 latest
- latest 不保证这是仓库中最新的镜像。
- 从非官方仓库中拉取镜像需要在仓库名称加上 Docker Hub的用户名或组织名,如
docker image pull wuxiaobai24/demo:v2
- 如果希望在第三方镜像仓库服务获取镜像,则需要在仓库名称前面加上第三方镜像仓库服务的 DNS 名称,如
docker image pull grc.io/wuxiaobai24/demo:v2
我们可以用docker search
来对 Docker Hug 进行搜索:
1$ docker search alpine
- 搜索时可以使用过滤器:
- is-official:true/false,是否为官方镜像
- is-automated/false,是否为自动创建的镜像
- 搜索结果默认返回 25 个结果,可以用
--limit
来指定个数
删除镜像
1$ docker image rm 0267 # 通过镜像ID来删除 docker 镜像2$ docker image rm $(docker image ls -q) # 删除所有镜像3$ docker image rm -f 0267 # -f mean --force
- 一个
Docker
镜像是由多个镜像层组成的,如果一个在删除某个镜像时,其中某个镜像层还被本地某个镜像引用的话,那么该镜像层不会被删除。 - 如果某个镜像存在正在运行的容器的话,删除操作不会被允许
- 可以用
docker image prune
来移除所有悬挂镜像。- 悬虚镜像:没有标签的镜像,
<none>:<none>
。通常是因为构建了一个新的镜像并为该镜像打了一个已经存在的标签。这时候旧镜像就会变成悬虚镜像。
- 悬虚镜像:没有标签的镜像,
构造镜像
1# Dockerfile 在当前目录(注意最后面那个`.`), -t 表示设置镜像2$ docker image build -t web:latest .3$ docker image tag web:1.0 wuxiaobai24/web:latest # 给镜像重新打标签4$ docker image build --squash # 将多个镜像层合并成一层
Container
启动容器
1$ docker container run <image> <app> # 基础格式2$ docker container run -it <image> <app> # -it 表示启动一个交互性程序,并将当前终端连接到容器的Shell终端上3$ docker container run -d <image> <app> # -d 表示以后台的方式启动容器4$ docker container run -d --name <container-name> <image> <app> # --name 给容器命名5$ docker container run -d -p <host-port>:<container-port> <image> # -p 配置端口转发,不指定 <app>的话会运行默认应用6$ docker container run -it 67fa /bin/bash # -it 表示以交互模式启动,并attach到tty上
在容器中可以用 Ctrl-PQ 来退出容器(同时保持容器继续运行)
在退出容器后可以用下面的命令来attach
到已运行的容器:
1$ docker container exec -it <container name or id> bash # 连接到在运行中的容器
列出镜像
1$ docker container ls # 查看系统内处于运行状态的容器2$ docker ps # 同上3$ docker container ls --all # 查看系统内所有容器,包已经stop的。4$ docker container ls -a # 同上5$ docker container ls -q # 显示运行中容器的 id
停止/删除容器
1$ docker container stop <container name or id> # 停止容器2$ docker container start <container id or name> # 再次启动该容器3$ docker container rm <container name or id> # 删除容器4$ docker container rm $(docker container ls -aq) -f # 快速删除所有容器
Others
查看 Docker 相关信息:
1$ docker system info
将用户加入到本地 Docker 组中
这样可以将sudo docker ...
省略成docker ...
。
1$ usermod -aG docker <user>
查看 Image 信息
1$ docker image inspect <image> # 显示关于 Image 的信息,可以用来看默认运行的应用