搜索镜像:从 Docker Hub 查找镜像
docker search <镜像名称>
# 例如:docker search nginx
拉取镜像:从仓库下载镜像到本地
docker pull <镜像名称:标签>
# 例如:docker pull nginx:latest
# 如果不写标签,默认拉取 latest 版本
列出本地镜像:查看已下载的镜像
docker images
# 或者
docker image ls
删除镜像:删除本地镜像
docker rmi <镜像ID或镜像名:标签>
# 例如:docker rmi nginx
# 强制删除(如果镜像正在被使用):docker rmi -f nginx
构建镜像:通过 Dockerfile 创建自定义镜像
docker build -t <镜像名:标签> <Dockerfile路径> # 例如:docker build -t my-app:1.0 . # `-t` 用于指定镜像名称和标签,`.` 表示当前目录
容器生命周期管理 (Container Lifecycle Management)
创建并启动容器:最核心的命令
docker run [选项] <镜像名称> [命令]
常用选项:
-
-d
:后台运行容器(守护态) -
--name
:为容器指定一个名称 -
-it
:交互式运行容器(通常与/bin/bash
连用) -
-p
:设置端口映射(详见第二部分) -
-v
:设置数据卷挂载(持久化数据) -
-e
:设置环境变量 -
--rm
:容器停止后自动删除
# 后台运行一个名为 my-nginx 的容器,并进行端口映射 docker run -d --name my-nginx -p 8080:80 nginx# 交互式运行一个 Ubuntu 容器,并进入其终端 docker run -it --name my-ubuntu ubuntu /bin/bash
列出容器:
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器(包括已停止的)
启动/停止/重启容器:
docker start <容器ID或名称> docker stop <容器ID或名称> # 优雅停止 docker restart <容器ID或名称> docker kill <容器ID或名称> # 强制立即停止
进入运行中的容器:
docker exec -it <容器ID或名称> /bin/bash
# `exec` 是在已运行的容器中执行命令,`-it` 保证我们有一个交互式终端
查看容器日志:
docker logs <容器ID或名称>
docker logs -f <容器ID或名称> # 实时追踪日志(类似 tail -f)
查看资源使用情况:
docker stats
清理资源:
docker system prune # 清理所有已停止的容器、未被使用的网络、构建缓存 docker system prune -a # 额外清理所有未被容器使用的镜像 # 注意:这个命令很强大,使用前请确认!
端口映射规则
-p
:手动指定映射端口(最常用)
docker run -p <宿主机端口>:<容器端口> ...
示例:docker run -d -p 8080:80 nginx
-
将容器内部的
80
端口映射到宿主机的8080
端口。 -
访问方式:在宿主机浏览器中打开
http://localhost:8080
或http://<宿主机IP>:8080
。
-p <宿主机IP>::<容器端口> # 示例:-p 127.0.0.1:8080:80 # 只有通过宿主机的 127.0.0.1:8080 才能访问,更安全。
-
原理:Docker 通过在主机的
iptables
中创建规则来实现端口转发。当外部请求到达宿主机的映射端口时,iptables
规则会将数据包转发到容器的虚拟 IP 和端口上。 -
安全问题:默认映射 (
-p 8080:80
) 会绑定到宿主机的所有 IP (0.0.0.0
),这意味着所有能访问到这台主机的客户端都可以连接。在生产环境中,如果宿主机有公网IP,建议使用-p 127.0.0.1:8080:80
或通过防火墙策略来限制访问来源,以提高安全性。 -
端口冲突:如果宿主机上的某个端口已经被其他进程占用(如已有另一个 Nginx 占用了 80 端口),你就不能再将它映射给容器,否则会报错
Bind for 0.0.0.0:80 failed: port is already allocated
。你需要选择一个未被占用的宿主机端口。