1.(在官方仓库中)查询某镜像:docker search <镜像名>
Docker Hub 是 Docker 官方提供的中央仓库的门户网站,类似于,Maven 世界中的 www.mvnrepository.com 。
想知道在 Docker Hub 中包含了哪些镜像,除了可以访问 Docker Hub 的官网进行搜索外,还可以直接通过 Docker 命令
docker search
进行搜索。例如:# 查询结果包含官方和非官方镜像信息 docker search mysql # -f is-official=true 表示仅显示官方镜像信息 docker search -f is-official=true mysql
显示出来的搜索结果中包含了镜像的如下信息:
字段名 说明 NAME 镜像的名称 DESCRIPTION 镜像的简单描述 STARTS 镜像在的点赞数 OFFICIAL 镜像是否为 Docker 官方提供(建议使用官方提供的镜像) AUTOMATED 镜像是否使用了自动构建
2. 列举已下载的所有镜像:docker images
通过
docker images
指令可以查看本地镜像列表中已有的镜像:它所返回的镜像列表信息包含了一下 5 个字段:
字段名 说明 REPOSITORY 镜像的名称。会一并显示它的 Namespace TAG 镜像的标签 IMAGE ID 镜像的 ID。一个长 64 位的十六进制字符串(SHA256 算法的运算结果) CREATE 镜像的创建时间 SIZE 镜像所占用的硬盘空间(包括被共享的镜像层的大小) 当本地镜像较多时,还可以使用通配符过滤出符合条件的镜像。例如:
sudo docker images ph*
3.拉取、下载镜像:docker pull <镜像三要素>
通过
docker pull
指令可以拉取仓库镜像到本地(默认都是拉取 Docker Hub 仓库镜像)。例如:docker pull nginx # 等价于 docker pull library/nginx:latest
Docker 会利用镜像的分层机制,将镜像分为多个包进行下载,我们可以在终端输出中看到每层的下载状态。
- 按照镜像的命名规则(
Namespace/Repository:Tag
),上例中的 nginx 就是一个镜像的 Repository 名。- 没有指明 Namespace,就表示 Docker 官方管理的镜像。
- 没有指明 Tag,Docker 默认会使用
latest
标签,表示最新版本。- 通常情况下,还是倾向于提供更确定的镜像信息,以减少镜像版本带来的不确定性。
4.删除镜像:docker rmi <镜像名 or 镜像ID>
当本地存放过多不需要的镜像时,可以通过
docker rmi
指令将其删除。在删除镜像时,需要指定镜像名称或镜像 ID 。例如docker rmi -f mysql:8.0 # 或 docker rmi -f c20987f18b13
默认情况下,如果至少还存在一个容器使用该镜像,那么该镜像无法删除。
-f 选项表示停止容器,并强制删除该镜像。不过并不推荐强制删除。
如果一个镜像中含有某些与其它镜像共享的镜像层,这些被共享的镜像层仍会被保留下来,
只有未被其它镜像使用的层会被删除。
5.构建镜像:docker build
除了可以通过
docker pull
指令从仓库拉取镜像之外,还可以通过docker build
指令构建 Docker 镜像。有两种方式进行镜像构建:
进入 Dockerfile 文件所在目录后,可以使用
docker build
指令进行镜像构建。cd ~/workspace/dockerspace/ docker build -t hellodocker .
上述的
.
表示通过当前目录下的 Dockerfile 文件进行镜像构建。在其他任意目录进行镜像构建
docker build -t hellodocker ~/workspace/dockerspace/
通过同一个 Dockerfile 构建出来的镜像 ID 会相同。
1.创建并启动容器:docker run ... --name <容器名> <镜像名>
Docker 镜像主要用于创建容器,可以使用
docker run
指令创建并启动容器。例如:docker run -d -p 5000:80 --name test hello-world
选项说明:
选项 说明 -d 表示容器启动后在后台运行 -p 5000:80 表示将主机的 5000 端口和容器的 80 端口『对接』。
即,宿主机从 5000 端口收到的数据,由系统送到 docker 的 80 端口。--name test 表示所创建的容器的名字为 test 。 hello-world 表示以 hello-world
镜像为基础创建容器。需要注意的是:
docker run
命令包含了两个动作:创建容器 和 启动容器 。镜像和容器是一对多的关系:同一个镜像可以用来制作多个容器。
Docker 容器有以下 2 种运行态:
前台交互式
容器运行在前台,容器运行时直接连接到容器中运行的程序上。
这种场景下,我们通常会通过附加的参数打开容器的伪终端和输入流,从而实现与容器中程序的交互。
当通过命令退出和关闭链接时,容器即停止运行。
sudo docker run -i -t ubuntu /bin/bash
- -i 表示开启了 input(输入)功能
- -t 表示开启了一个连接容器里边的 terminal(终端)
- -it 常一起使用
后台守护式
容器运行在后台,运行的过程中不会占用当前输入指定的终端,也不会连接到容器内的程序上。
这种运行后台容器必须通过指令来关闭(
docker stop
)。
sudo docker run -d nginx
2. 列出已创建容器:docker ps
生成容器后,可以通过
docker ps
指令查看当前运行的所有容器:# 仅显示 Up 状态的容器 docker ps # 显示所有状态容器 docker ps -a # 显示最后( last )创建的那个容器: sudo docker ps -l # 显示最近创建的 N 个容器: sudo docker ps -n 2
字段名 说明 CONTAINER ID 容器的唯一性标识 IMAGE 容器所使用的镜像 COMMAND 容器启动时运行的命令(即,容器中的主程序) CREATED 容器的创建时间 STATUS 容器的运行状态。Up 表示运行中,Exited 标识已停止 PORTS 容器内部包括的端口映射到的主机端口 NAMES 容器的名称
3.停止容器:docker stop <容器名 or 容器ID>
当不需要容器运行时,可以使用
docker stop
指令停止指定的容器。使用 docker stop 指令停止容器时会略有延迟,成功后返回该容器的 ID 。
注意,容器被 stop 之后,它并未被删除。容器依然存在,你可以使用
docker ps -a
看到它,并且,未来你还可以使用docker start <容器名 or 容器ID>
再次启动它。不过,由于创建容器的代价极小,所以一般的惯例并非 stop - start 容器,而是在不用时直接将它删掉,未来需要使用时再创建。
另外,我们还可以通过
docker kill
指令立即杀死运行容器进程。docker kill <容器名字 or 容器ID>
4.启动容器:docker start <容器名 or 容器ID>
容器停止( stop )后,如果需要重新访问该容器中的程序,需要通过 docker start 重新启动该容器。
需要注意的是:
start 一个容器的前提是改容器已存在,且处于 Stop 状态。
如果一个容器曾经并未成功运行( 例如,docker run mysql 忘记了 -e ),那么,即便它存在,你也无法 start 它(因为,逻辑上它无法启动)。
由于创建容器的代价极小,所以一般的惯例并非 stop - start 容器,而是在不用时直接将它删掉,未来需要使用时再创建。
另外,除了
docker start
指令可以启动已停止的容器外,还可以使用docker restart
指令重启容器。docker restart <容器 or 容器ID>
5.删除容器:docker rm -f <容器名 or 容器ID>
当不需要使用容器时,则可以使用
docker rm
指令删除已停止的容器。默认情况下,docker rm 只能删除已停止的容器。如需要删除正在运行的容器,则需要添加 -f 参数强制删除。
因为 Docker 特有的镜像机制,在创建容器过程中并没有大量的 IO 操作,所以创建过程是秒级的。因此,我们更倾向于『随用随建,随停随删』。在停止程序所在容器时,将容器一并删除。
6.批量删除已停止的所有容器:docker rm -f $(docker ps -aq)
docker rm
指令可以传入多个容器的 ID 或名字进行批量删除,甚至可以套用docker ps
命令全部删除。在这里,我们借助
docker ps -aq
指令去求得所有容器的 ID 。以 docker ps -aq 命令的执行结果,作为 docker rm -f 命令的参数。docker rm -f $(docker ps -aq)
7.进入容器:docker exec -it <容器名 or 容器ID> /bin/bash
我们可以通过
docker exec
命令进入容器:docker exec -it <容器名 or 容器ID> /bin/bash
关注下命令提示符,你会发现你现在就在容器中。
执行 exit 命令可以退出容器。
1.目录挂载:docker run -v ...
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样容器中的某个目录和真机中的某个目录是同一个目录,容器和真机就可以以此为桥梁相互影响。
例如,我们可以创建一个运行 mysql 的容器,将容器中存放数据文件的目录映射到真机中的某个目录。这样,哪怕是该容器被删除了,曾经存储的数据仍然还在。
语法:
docker run ... -v 宿主机目录:容器目录
例如:
docker run \ -d \ -v /data/docker/mysql/data:/var/lib/mysql \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=123 \ --name mysql-example \ mysql:8.0
2.查看容器运行日志:docker logs -f <容器名 or 容器ID>
docker logs -f <容器名称> # 仅看最后的 100 行日志 docker logs -f --tail=100 <容器名称>
3.容器详情信息: docker inspect <容器名称 or 容器ID>
我们可以通过以下命令查看容器运行的各种数据:
docker inspect <容器名称 or 容器ID>
当然,从中查找容器的 IP 地址很不方便,因此,可以对此再细化一下:
docker inspect --format='{{.NetworkSettings.IPAddress}}'
4.删除不用的资源:docker prune
prune 命令用来删除不再使用的 docker 对象。
删除所有未被 tag 标记和未被容器使用的镜像:
docker image prune
删除所有未被容器使用的镜像:
docker image prune -a
删除所有停止运行的容器:
docker container prune
删除所有未被挂载的卷:
docker volume prune
删除所有网络:
docker network prune
删除 docker 所有资源:
docker system prune