前言:Docker 是什么?为什么你需要它?
在软件开发中,环境问题一直是让人头疼的痛点——"我电脑上明明跑得好好的,怎么到你那里就不行了?" 这种对话几乎每个开发者都经历过。
Docker 就是来解决这个问题的。它通过容器化技术,把应用程序和它所需要的运行环境(操作系统、依赖库、配置文件等)打包在一起,形成一个可移植的镜像。这个镜像可以在任何安装了 Docker 的机器上运行,保证运行结果完全一致。
你可以把 Docker 想象成一个轻量级的虚拟机,但它比虚拟机快得多、资源消耗小得多,启动时间以秒计算。
Docker 的核心概念就三个:
| 概念 | 通俗理解 |
|---|---|
| 镜像(Image) | 相当于一个"安装包",包含了程序和环境。只读,不能修改 |
| 容器(Container) | 镜像跑起来之后就是容器。相当于"正在运行的程序" |
| 仓库(Registry) | 存放镜像的地方,就像代码托管平台存代码一样 |
下面我会按照「镜像 → 容器 → 数据卷 → 镜像构建 → 仓库推送 → Docker Compose」这条主线,带你一步步掌握 Docker 的常用操作。
第一部分:镜像操作
镜像是 Docker 的基石,所有容器都从镜像启动。
1. 查看本地所有镜像
bash
docker images
输出示例:
text
可以看到镜像的仓库名、标签、ID、创建时间和大小。这个命令会列出你本地已经下载好的所有镜像。
2. 搜索镜像
如果你想找某个镜像,可以先搜索看看:
bash
docker search nginx
输出中重点关注两列:
OFFICIAL:显示
[OK]表示官方镜像,安全性更高,优先选择STARS:星数越多,说明使用的人越多,口碑越好
搜索可以帮助你发现有哪些可用的镜像版本,以及社区对它的认可程度。
3. 下载镜像
bash
# 下载最新版本(标签名默认是 latest) docker pull nginx # 下载指定版本 docker pull mysq:8.4
如果不指定标签,默认下载latest(最新版本)。docker pull是使用镜像的第一步,只有下载到本地才能创建容器。
4. 删除镜像
bash
# 删除指定镜像 docker rmi 镜像名:latest # 如果镜像正在被容器使用,需要先删除容器,或者加 -f 强制删除 docker rmi -f nginx:latest
如果镜像还在被某个容器使用(哪怕容器已经停止),直接删除会报错。要么先删除容器,要么用-f强制删除。
第二部分:容器操作
镜像是"模板",容器是"运行起来的实例"。你可以把镜像理解成一个类,容器就是那个类 new 出来的对象。
1. 创建并运行容器
bash
docker run --name my-nginx -p 8080:80 -d nginx:latest
参数解释:
| 参数 | 含义 |
|---|---|
--name my-nginx | 给容器起个名字,方便后续管理 |
-p 8080:80 | 端口映射:宿主机的 8080 端口 → 容器内的 80 端口 |
-d | 后台运行(detach 模式),不会占用终端 |
nginx:latest | 使用哪个镜像来创建容器 |
运行后打开浏览器访问http://你的服务器IP:8080,就能看到 Nginx 的欢迎页面了。如果是在本地虚拟机,访问http://localhost:8080。
补充说明:-p参数可以多次使用,比如-p 8080:80 -p 8443:443可以同时映射多个端口。
2. 查看容器
bash
# 查看正在运行的容器 docker ps # 查看所有容器(包括已停止的) docker ps -a
docker ps -a会列出所有容器,包括已经停止的,方便你找到容器的 ID 或名字。输出中可以看到容器 ID、镜像、创建时间、状态、端口映射等信息
3. 进入正在运行的容器
有时候你需要进容器里面查看文件、修改配置或者调试程序,可以用这个命令:
bash
docker exec -it my-nginx bash
-it:交互式终端(i 表示保持输入流,t 表示分配伪终端)my-nginx:容器名(也可以用容器 ID)bash:进入后使用的 shell
进入之后,你就相当于在容器内部的操作系统里了,可以执行各种 Linux 命令——查看文件、安装软件、修改配置等。退出时输入exit即可。
4. 启动 / 停止 / 重启容器
bash
# 停止容器 docker stop my-nginx # 启动已停止的容器 docker start my-nginx # 重启容器 docker restart my-nginx
注意docker run是创建并启动,而docker start是用来启动已经创建但停止了的容器。docker restart则相当于先 stop 再 start。
5. 删除容器
bash
# 删除已停止的容器 docker rm my-nginx # 强制删除运行中的容器 docker rm -f my-nginx
容器删除后,里面的数据会全部丢失(除非使用了数据卷)。所以生产环境的重要数据一定要挂载到数据卷里。
第三部分:数据卷(Volume)
容器是"无状态"的——当容器被删除,里面的所有数据都会丢失。但很多场景下我们需要持久化数据,比如:
数据库文件(MySQL、PostgreSQL)
网站上传的图片和附件
日志文件
配置文件
这时候就需要用到数据卷。数据卷相当于宿主机上一个由 Docker 管理的目录,被挂载到容器内部,容器删除后数据依然保留。
1. 查看所有数据卷
bash
docker volume ls
显示当前系统中所有数据卷的列表。
2. 创建数据卷
bash
docker volume create my-data
创建一个名为my-data的数据卷。Docker 会在宿主机上为它分配一个存储位置(通常在/var/lib/docker/volumes/下)。
3. 使用数据卷启动容器
bash
docker run --name my-nginx -p 8080:80 -v my-data:/usr/share/nginx/html -d nginx:latest
-v my-data:/usr/share/nginx/html表示把my-data这个数据卷挂载到容器内的/usr/share/nginx/html目录。这个目录是 Nginx 的默认网页根目录。
你在宿主机上修改数据卷里的内容,容器里的网页就会同步更新。反过来,容器里写入的数据也会持久化到数据卷中。
4. 删除数据卷
bash
docker volume rm my-data
⚠️ 删除数据卷会永久丢失所有数据,操作前请确认是否需要备份。
第四部分:使用 Dockerfile 构建镜像
当你需要定制自己的镜像时,就需要用到 Dockerfile。它就是一个文本文件,里面写满了构建镜像的指令,告诉 Docker 如何一步步"组装"出你想要的镜像。
1. 项目结构
text
/workspace/ ├── home.conf # Nginx 站点配置文件 ├── home.html # 网站首页 ├── img/ # 图片资源 ├── my_font/ # 自定义字体 └── nosleep/ # 子页面目录
home.conf内容如下:
nginx
server { listen 10000; root /usr/share/nginx/html; index home.html index.htm; }3. 构建镜像
在/workspace目录执行:
bash
docker build -t my-site:v1 .
-t my-site:v1:指定镜像名为my-site,标签为v1.:表示使用当前目录的 Dockerfile
4. 运行容器
bash
docker run --name my-site -p 10000:10000 -d my-site:v1
5. 验证容器状态
bash
# 查看容器是否正常运行 docker ps # 查看容器日志 docker logs my-site # 进入容器内部检查文件 docker exec -it my-site bash ls -la /usr/share/nginx/html/
第五部分:推送镜像到仓库
自己构建的镜像,可以推送到远程仓库,方便在别的机器上下载使用。Docker 官方提供免费的镜像仓库 Docker Hub。
1. 给镜像打标签
Docker Hub 要求镜像名以用户名开头,所以需要重新打一个标签:
bash
docker tag my-site:v1 你的用户名/my-site:v1
举个例子,如果你的 Docker Hub 用户名是yourname:
bash
docker tag my-site:v1 yourname/my-site:v1
2. 登录 Docker Hub
bash
docker login -u 你的用户名
执行后会提示输入密码(或 access token),正确输入后登录成功。
3. 推送镜像
bash
docker push 你的用户名/my-site:v1
推送完成后,你就可以在 Docker Hub 上看到这个镜像了。在其他机器上直接用docker pull 你的用户名/my-site:v1就能下载使用。
2. 启动所有服务
bash
docker compose up -d
-d表示后台运行。执行后,两个容器会同时启动,并且通过同一个网络互相连通。
3. 停止所有服务
bash
docker compose down
4. 其他常用命令
docker compose ps # 重启所有服务 docker compose restart # 查看实时日志 docker compose logs -f
第七部分:实用工具命令
1. 从容器拷贝文件到本地
docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf
2. 从本地拷贝文件到容器
bash
docker cp ./index.html my-nginx:/usr/share/nginx/html/
3. 查看容器日志
bash
# 查看完整日志 docker logs my-nginx # 实时跟踪日志 docker logs -f my-nginx # 查看最近 100 行日志 docker logs --tail 100 my-nginx
第八部分:常用命令速查表
镜像命令
| 命令 | 说明 |
|---|---|
docker images | 查看所有镜像 |
docker pull 镜像名:标签 | 下载镜像 |
docker rmi 镜像名:标签 | 删除镜像 |
docker search 关键词 | 搜索镜像 |
docker build -t 镜像名:标签 . | 构建镜像 |
容器命令
| 命令 | 说明 |
|---|---|
docker run --name 容器名 -p 宿主机:容器 -d 镜像名 | 创建并运行容器 |
docker ps | 查看运行中的容器 |
docker ps -a | 查看所有容器 |
docker start 容器ID | 启动容器 |
docker stop 容器ID | 停止容器 |
docker restart 容器ID | 重启容器 |
docker exec -it 容器名 bash | 进入容器 |
docker rm 容器ID | 删除容器 |
docker logs 容器名 | 查看日志 |
数据卷命令
| 命令 | 说明 |
|---|---|
docker volume ls | 显示所有数据卷 |
docker volume create 名字 | 创建数据卷 |
docker volume rm 名字 | 删除数据卷 |
仓库命令
| 命令 | 说明 |
|---|---|
docker tag 镜像名:标签 用户/镜像名:标签 | 打标签 |
docker login -u 用户名 | 登录 |
docker push 用户/镜像名:标签 | 推送镜像 |
Docker Compose 命令
| 命令 | 说明 |
|---|---|
docker compose up -d | 启动所有服务 |
docker compose down | 停止所有服务 |
docker compose ps | 查看状态 |
docker compose logs -f | 查看日志 |
Docker 的学习曲线比 Git 要平缓得多,核心命令也就那么十几个。只要理解了「镜像 → 容器 → 仓库」这条主线,再配合数据卷做持久化、Dockerfile 做定制化、Compose 做编排,Docker 就算入门了。
在实际开发中,Docker 最大的价值在于环境一致性——你再也不用担心"在我电脑上能跑"这种问题了。而且现在几乎所有云平台都支持容器化部署,学会 Docker 已经成了一项必备技能。
文中的命令都是我自己日常使用中反复敲过的,你可以放心地在自己的环境里练习。如果遇到任何问题,回头看看速查表,或者用docker --help查看命令帮助,都能找到答案。
希望这篇博客能帮到你。