Docker 通过镜像 (Image) 和容器 (Container) 两个核心概念,极大地简化了应用的构建、分发和运行。掌握相关的命令行工具是高效使用 Docker 的关键。
镜像是一个只读的模板,包含了运行应用程序所需的文件系统、库、依赖和代码。容器是镜像的一个可运行实例。
从 Docker Hub (默认的公共镜像仓库) 搜索可用的镜像。
docker search <image_name>
代码案例: 搜索所有与 nginx
相关的镜像。
docker search nginx
从仓库下载一个镜像到本地。
docker pull <image_name>[:tag]
[:tag]
: 可选。指定镜像的版本标签。如果不指定,默认拉取 latest
标签。代码案例:
# 拉取最新版本的 Ubuntu 镜像
docker pull ubuntu
# 拉取指定版本的 Redis 镜像
docker pull redis:6.2
列出本地已存在的所有镜像。
docker images
# 或者
docker image ls
代码案例:
删除一个或多个本地镜像。
docker rmi <image_name>[:tag] | <image_id>
-f
或 --force
: 强制删除镜像 (即使有容器在使用它,但不推荐)。代码案例:
# 通过名称和标签删除
docker rmi redis:6.2
# 通过镜像ID删除 (假设ID是 edbdd97bf78b)
docker rmi edbdd97bf78b
# 删除多个镜像
docker rmi ubuntu:latest redis:latest
以 JSON 格式返回镜像的详细元数据。
docker inspect <image_name>[:tag] | <image_id>
代码案例:
docker inspect ubuntu:latest
显示镜像的构建历史,即组成该镜像的每一层 (layer)。
docker history <image_name>[:tag] | <image_id>
代码案例:
docker history nginx:latest
将一个或多个本地镜像打包成一个 .tar
归档文件,方便离线传输。
docker save -o <output_filename.tar> <image_name>[:tag]
代码案例:
docker save -o my_nginx_image.tar nginx:latest
从一个 .tar
归档文件加载镜像到本地。
docker load -i <input_filename.tar>
代码案例:
docker load -i my_nginx_image.tar
为已存在的镜像创建一个新的标签 (相当于一个别名)。这在推送到不同仓库或重命名时非常有用。
docker tag <source_image>[:tag] <target_image>[:tag]
代码案例:
# 将本地的 nginx:latest 标记为 myrepo/mynginx:1.0
docker tag nginx:latest myrepo/mynginx:1.0
# 删除这个打了标签的镜像
[root@ivan01 ~]# docker rmi myrepo/mynginx:1.0
Untagged: myrepo/mynginx:1.0
容器是镜像的可运行实例。你可以创建、启动、停止、移动和删除容器。
这是一个非常强大的复合命令,如果本地没有指定镜像,它会先自动 pull
,然后基于该镜像创建一个新容器并启动它。
docker run [OPTIONS] <image_name>[:tag] [COMMAND] [ARG...]
-d
或 --detach
: 后台运行容器 (守护式容器)。-i
或 --interactive
: 交互式操作 (保持 STDIN 打开)。-t
或 --tty
: 分配一个伪终端。通常 -it
一起使用。--name <container_name>
: 为容器指定一个名称。-p <host_port>:<container_port>
: 端口映射,将主机的端口映射到容器的端口。-v <host_path>:<container_path>
: 挂载数据卷,将主机的目录挂载到容器的目录。--rm
: 容器退出时自动删除。-e <KEY=VALUE>
: 设置环境变量。代码案例:
# 以后台模式运行一个Nginx容器,并将主机的8080端口映射到容器的80端口
docker run -d -p 8080:80 --name my-web-server nginx:latest
# 交互式地进入一个Ubuntu容器的bash shell
docker run -it --rm ubuntu:latest /bin/bash
列出当前正在运行的容器。
docker ps
# 或者
docker container ls
-a
或 --all
: 列出所有容器 (包括已停止的)。代码案例:
# 查看所有容器
docker ps -a
优雅地停止一个或多个正在运行的容器。
docker stop <container_name | container_id>
代码案例:
docker stop my-web-server
启动一个已存在但已停止的容器。
docker start <container_name | container_id>
代码案例:
docker start my-web-server
docker restart <container_name | container_id>
代码案例:
docker restart my-web-server
exec
: 在正在运行的容器中执行一个新命令 (最常用)。attach
: 直接连接到容器的主进程 (PID 1) 的输入/输出流。exec
语法 (推荐):
docker exec [OPTIONS] <container_name | container_id> <COMMAND>
代码案例 (进入容器的shell):
docker exec -it my-web-server /bin/bash
删除一个或多个已停止的容器。
docker rm <container_name | container_id>
-f
或 --force
: 强制删除一个正在运行的容器。代码案例:
# 首先停止容器
docker stop my-web-server
# 然后删除
docker rm my-web-server
获取容器的标准输出和标准错误日志。
docker logs [OPTIONS] <container_name | container_id>
-f
或 --follow
: 实时跟踪日志输出。--tail <number>
: 只显示最后N行日志。代码案例:
# 实时查看my-web-server的日志
docker logs -f my-web-server
以 JSON 格式返回容器的详细配置和状态信息。
docker inspect <container_name | container_id>
代码案例:
docker inspect my-web-server
docker cp <container_name | container_id>:<container_path> <host_path>
代码案例:
# 将容器my-web-server中的/etc/nginx/nginx.conf文件复制到主机的当前目录
docker cp my-web-server:/etc/nginx/nginx.conf .
docker cp <host_path> <container_name | container_id>:<container_path>
代码案例:
# 将主机的index.html文件复制到容器my-web-server的/usr/share/nginx/html/目录下
docker cp index.html my-web-server:/usr/share/nginx/html/
总结:
search
, pull
, images
, rmi
, inspect
, save
, load
, tag
。run
, ps
, stop
, start
, restart
, exec
, rm
, logs
, inspect
, cp
。Docker 命令行练习题 (共12道)
请为以下每个任务编写相应的Docker命令。
题目:
mysql
相关的官方镜像 (通常 STARS
数最高且 OFFICIAL
为 [OK]
)。mysql
镜像的 8.0
版本。my-mysql-db
,并设置MySQL的root用户密码为 MySecretPwd123
(提示:通过环境变量 MYSQL_ROOT_PASSWORD
设置)。my-mysql-db
容器的实时日志。my-mysql-db
容器,并启动一个 bash
shell。backup.sql
的SQL文件复制到 my-mysql-db
容器的 /tmp/
目录下。my-mysql-db
的容器。my-mysql-db
容器。mysql:8.0
镜像。答案与解析:
mysql
镜像:docker search mysql
docker search
是用于在Docker Hub上查找镜像的命令。mysql:8.0
镜像:docker pull mysql:8.0
docker pull
用于下载镜像,<image_name>:<tag>
格式指定了镜像名和版本标签。docker images
docker images
或 docker image ls
用于列出本地已下载的镜像。docker run -d --name my-mysql-db -e MYSQL_ROOT_PASSWORD=MySecretPwd123 mysql:8.0
-d
使容器在后台运行。--name
为容器指定一个易于记忆的名称。-e
用于设置容器内的环境变量,MYSQL_ROOT_PASSWORD
是MySQL镜像官方文档中指定的用于设置root密码的环境变量。docker ps
docker ps
是 docker container ls
的简写,默认只显示正在运行的容器。docker ps -a
-a
或 --all
参数会显示所有容器,包括那些已经停止运行的。docker logs -f my-mysql-db
docker logs
用于查看容器日志。-f
或 --follow
参数会持续输出新产生的日志,实现实时跟踪。docker exec -it my-mysql-db /bin/bash
docker exec
用于在运行中的容器内执行命令。-it
组合参数提供了交互式终端,/bin/bash
是要在容器内启动的命令。docker cp backup.sql my-mysql-db:/tmp/
docker cp
用于在主机和容器之间复制文件。格式为 docker cp <host_source_path> <container>:<container_dest_path>
。docker stop my-mysql-db
docker stop
用于向容器发送停止信号,使其优雅地关闭。docker rm my-mysql-db
docker rm
用于删除一个或多个已停止的容器。如果容器正在运行,需要先 stop
或使用 -f
强制删除。docker rmi mysql:8.0
docker rmi
或 docker image rm
用于删除本地镜像。如果有任何容器(即使是已停止的)是基于该镜像创建的,必须先删除这些容器,才能成功删除镜像。