Docker基础
常见命令
1. 拉取镜像
docker pull <镜像名>:<标签>
常用参数:
<镜像名>
:要拉取的镜像名称。<标签>
:镜像的版本标签(如latest
、8.0
等)。
示例:
docker pull nginx:latest
2. 推送镜像
docker push <镜像名>:<标签>
常用参数:
<镜像名>
:要推送的镜像名称,通常为<Docker Hub用户名>/<镜像名>
。<标签>
:镜像的版本标签。
示例:
docker push myrepo/myimage:1.0
docker push 和 docker pull
3. 查看本地镜像
docker images
常用参数:
-q
:只显示镜像的ID。-a
:显示所有镜像,包括中间层镜像。
示例:
docker images -a
4. 删除镜像
docker rmi <镜像ID或名称>
常用参数:
-f
:强制删除正在使用的镜像。
示例:
docker rmi nginx:latest
docker rmi
5. 构建镜像
docker build -t <镜像名>:<标签> <Dockerfile所在目录>
常用参数:
-t
:为构建的镜像命名并打标签。--no-cache
:不使用缓存,强制重新构建镜像。
示例:
docker build -t myapp:1.0 .
docker build
6. 打包镜像
docker save -o <文件名.tar> <镜像名>:<标签>
常用参数:
-o
:指定保存的文件名。
示例:
docker save -o myapp.tar myapp:1.0
docker save
7. 挂载打包的镜像
docker load -i <文件名.tar>
示例:
docker load -i myapp.tar
docker load
8. 运行镜像
docker run -d -p <主机端口>:<容器端口> --name <容器名> <镜像名>:<标签> -v<数据卷>:<容器内目录>
常用参数:
-d
:后台运行容器。-p
:端口映射。--name
:为容器命名。-v
:挂载数据卷
示例:
docker run -d -p 8080:80 --name mynginx nginx:latest -v /spark:/opt/spark
9. 停止容器
docker stop <容器ID或名称>
示例:
docker stop mynginx
10. 启动容器
docker start <容器ID或名称>
示例:
docker start mynginx
docker run 、 docker stop 和 docker start
11. 查看容器运行状态
docker ps
常用参数:
-a
:显示所有容器(包括未运行的)。- --format{}:格式化输出
示例:
docker ps -a
12. 删除容器
docker rm <容器ID或名称>
常用参数:
-f
:强制删除正在运行的容器。
示例:
docker rm mynginx
docker rm
13. 查看运行容器日志
docker logs <容器ID或名称>
常用参数:
-f
:实时输出日志。--tail
:显示日志的最后N行。
示例:
docker logs -f mynginx
14. 进入容器内部
docker exec -it <容器ID或名称> /bin/bash
常用参数:
-it
:允许交互式终端进入容器。/bin/bash
:进入容器后使用的Shell。
示例:
docker exec -it mynginx /bin/bash
数据卷
数据卷(Volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁,这种映射是双向的
数据卷(Volume)是 Docker 中一种持久化数据的机制,允许你将数据从容器内保存到宿主机的指定位置。通过数据卷,容器可以方便地共享、存储和管理数据。它主要解决了容器中的数据不会随着容器删除而丢失的问题。
数据卷的特点:
- 持久化存储:数据卷可以将容器内的数据存储到宿主机的文件系统中,确保容器删除后数据依然存在。
- 数据共享:多个容器可以共享同一个数据卷,实现跨容器的数据访问和同步。
- 独立于容器生命周期:数据卷的生命周期独立于容器,即使容器删除,数据卷上的数据仍然保留。
- 性能优化:数据卷可以避免数据复制带来的性能开销,直接与宿主机文件系统交互,速度更快。
- 备份和迁移方便:可以轻松将数据卷中的数据进行备份或迁移到其他主机。
数据卷只能在创建容器(
docker run
)的时候挂载,以及创建的容器无法再挂载数据卷
数据卷操作常见命令
1. 创建数据卷
docker volume create <卷名>
示例:
docker volume create my_volume
这个命令会创建一个名为 my_volume
的数据卷。如果不提供卷名,Docker 会自动生成一个随机名称。
- 常用参数:
- 没有额外的参数,使用默认设置创建卷。如果需要自定义驱动或其他选项,可以通过
--driver
和--opt
指定,但这是高级选项,通常不需要。
- 没有额外的参数,使用默认设置创建卷。如果需要自定义驱动或其他选项,可以通过
docker volume create --driver local --opt type=tmpfs --opt device=tmpfs my_tmpfs_volume
--driver
:指定卷的驱动程序(如local
)。--opt
:提供额外的选项配置卷的类型和设备。- 常见参数:
type
:指定文件系统类型,常见值包括tmpfs
(将数据存储在内存中,不持久化)、none
(无文件系统类型,用于绑定宿主机目录)。device
:指定宿主机上的设备或路径,或在tmpfs
的情况下,指定tmpfs
本身。o
:挂载选项,用于设置卷的额外参数。常见值有:size
:限制tmpfs
卷的最大内存使用大小(例如size=100m
表示 100 MB)。bind
:用于绑定宿主机目录到容器。ro
:只读挂载,防止容器对数据卷进行写入。
- 常见参数:
2. 查看所有数据卷
docker volume ls
示例:
docker volume ls
常用参数:
-q
:只显示卷的名称,而不是完整的列表信息。
示例:
docker volume ls -q
3. 删除指定数据卷
docker volume rm <卷名>
示例:
docker volume rm my_volume
常用参数:
-f
:强制删除卷,即使卷被某个容器使用时也能删除。
示例:
docker volume rm -f my_volume
4. 查看某个数据卷的详情
docker volume inspect <卷名>
示例:
docker volume inspect my_volume
这会返回指定数据卷的详细信息(JSON 格式),包括存储路径、驱动程序、挂载点等。
5. 清除未使用的数据卷
docker volume prune
示例:
docker volume prune
此命令会清理所有未被使用的“悬空”数据卷。它会要求你确认清理,输入 y
后执行。
常用参数:
-f
:跳过确认步骤,直接删除未使用的卷。
示例:
docker volume prune -f
6. 查看容器元数据
docker inspect <容器名或容器ID>
docker inspect
命令用于查看容器的详细元数据信息,包括其配置、状态、网络设置、挂载卷等信息,输出为 JSON 格式。
示例:
docker inspect my_container
这将返回容器 my_container
的所有元数据。
常用参数:
--format
:自定义输出格式,用于筛选所需的信息。
示例: 仅查看容器的 IP 地址:
docker inspect --format='{{.NetworkSettings.IPAddress}}' my_container
查看容器的状态信息:
docker inspect --format='{{.State.Status}}' my_container
- 在执行docker run命令时,使用 -V 数据卷:容器 内目录可以完成数据卷挂载
- 当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷
本地目录挂载
这种挂载存在一些匿名卷
本地目录挂载(Bind Mount)是 Docker 中的一种机制,它允许你将宿主机的文件或目录挂载到容器内的指定路径。这使得容器可以直接访问和修改宿主机上的文件或目录,通常用于数据共享、持久化存储或使用宿主机上的配置文件。
本地目录挂载的特点:
- 双向同步:容器和宿主机之间的数据是双向同步的,容器内对挂载目录的修改会直接反映在宿主机上,反之亦然。
- 持久化:与 Docker 卷类似,挂载的目录可以实现数据持久化,但与 Docker 卷不同,绑定挂载完全由宿主机的文件系统管理。
- 灵活性:允许你选择宿主机上的任何路径进行挂载,适合需要直接操作宿主机文件的场景。
使用 docker run
挂载本地目录
挂载的时候使用的是绝对路径
可以在创建容器时使用 --mount
或 -v
(--volume
)选项将宿主机的目录或文件挂载到容器内。
1. 使用 --mount
这是推荐的现代方式,语法清晰,适合复杂的挂载场景。
docker run -d --mount type=bind,source=<宿主机路径>,target=<容器路径> <镜像名>
type=bind
:表示使用绑定挂载。source=<宿主机路径>
:宿主机上的目录或文件路径。target=<容器路径>
:容器内的挂载点路径。
示例:
将宿主机的 /home/user/data
目录挂载到容器的 /app/data
目录:
docker run -d --mount type=bind,source=/home/user/data,target=/app/data nginx
2. 使用 -v
这是早期的方式,仍然广泛使用,但在处理更复杂的挂载场景时可读性不如 --mount
高。
docker run -d -v <宿主机路径>:<容器路径> <镜像名>
示例:
将宿主机的 /home/user/data
目录挂载到容器的 /app/data
目录:
docker run -d -v /home/user/data:/app/data nginx
挂载本地目录的常见参数
只读挂载:你可以使用
readonly
参数将宿主机的目录以只读模式挂载到容器,防止容器对目录进行写操作。示例:
docker run -d --mount type=bind,source=/home/user/config,target=/app/config,readonly nginx
挂载文件而非目录:你也可以挂载单个文件,而不仅仅是目录。
示例:
docker run -d --mount type=bind,source=/home/user/config/app.conf,target=/etc/app.conf nginx
临时文件系统(
tmpfs
)挂载:除了绑定宿主机目录,你还可以使用tmpfs
将临时文件系统挂载到容器内,所有数据都会保存在内存中。示例:
docker run -d --mount type=tmpfs,target=/app/tmp nginx
查看挂载的卷和目录
你可以使用 docker inspect
查看容器的详细信息,包括哪些目录被挂载:
docker inspect <容器ID或容器名>
这将返回 JSON 格式的输出,其中包含卷和挂载信息。
匿名卷
在 Docker 中,绑定挂载(Bind Mount)有时会涉及匿名卷的概念,尤其是当你使用 docker run
命令时,默认情况下 Docker 会为某些情况创建匿名卷,这些匿名卷可能会引起混淆。让我们来解释一下匿名卷的情况以及如何避免它们。
匿名卷的产生
匿名卷是在容器启动时,由 Docker 自动创建的未命名的卷。它们通常用于保存容器的持久化数据,但因为没有明确的名称,所以这些卷不易管理和跟踪。
什么时候会创建匿名卷?
匿名卷通常在以下情况下自动创建:
没有明确指定挂载目标:当 Docker 容器的某个路径(例如
/var/lib/mysql
)需要持久化存储时,如果没有为该路径明确指定挂载卷,Docker 会自动创建一个匿名卷。示例:
docker run -d mysql:latest
在这个例子中,MySQL 容器会在
/var/lib/mysql
保存数据库数据。因为没有明确为这个路径指定卷,Docker 会自动创建一个匿名卷并将其挂载到容器的/var/lib/mysql
。使用
VOLUME
指令的镜像:如果镜像的Dockerfile
中包含了VOLUME
指令,并且你没有明确指定挂载路径,Docker 也会为这个路径创建匿名卷。示例: 在使用
VOLUME /data
指令构建的镜像时,如果你不手动指定挂载卷,Docker 将为/data
创建一个匿名卷。
如何避免匿名卷
为了避免 Docker 自动创建匿名卷,你可以明确指定数据卷或绑定挂载。这使你能更好地管理卷,避免不必要的匿名卷占用磁盘空间。
1. 使用命名卷
命名卷可以通过 Docker 命令明确指定,并且可以轻松管理和追踪。
示例:
docker run -d -v my_named_volume:/var/lib/mysql mysql:latest
在这个例子中,my_named_volume
是我们手动创建的卷,它将挂载到容器的 /var/lib/mysql
目录。这样可以避免 Docker 创建匿名卷。
2. 使用绑定挂载(Bind Mount)
通过绑定宿主机上的目录到容器中的路径,确保你完全控制数据的存储位置。
示例:
docker run -d --mount type=bind,source=/home/user/mysql-data,target=/var/lib/mysql mysql:latest
在这个例子中,宿主机上的 /home/user/mysql-data
目录被挂载到容器的 /var/lib/mysql
,确保了数据直接存储在宿主机指定的目录中,而不会创建匿名卷。
如何管理匿名卷
如果系统中已经产生了匿名卷,你可以通过以下步骤来查看和清理它们:
1. 查看匿名卷
使用 docker volume ls
可以列出所有卷,包括匿名卷。匿名卷通常没有名称,Docker 会生成一个随机的 ID 作为名称。
docker volume ls
输出示例:
DRIVER VOLUME NAME
local my_named_volume
local 1d9ae6879ec2d4d39172a8bb8a0a2b16f291d6eae1a2fdce93613fd74c446f9f # 匿名卷
2. 删除匿名卷
你可以通过 docker volume prune
删除所有未使用的卷,包括匿名卷:
docker volume prune
Docker 会提示你确认删除所有未使用的卷,输入 y
以继续。
如果你想手动删除某个特定的匿名卷,可以使用 docker volume rm <卷ID>
命令删除它:
docker volume rm 1d9ae6879ec2d4d39172a8bb8a0a2b16f291d6eae1a2fdce93613fd74c446f9f