一、Docker 是什么?为什么我们需要它?
简单来说,Docker 是一种容器化技术。它能将你的应用程序及其所有依赖(比如代码、运行时、系统工具、库)打包到一个轻量、可移植的容器 (Container) 中。这个容器可以在任何安装了 Docker 的机器上运行,并且表现得一模一样。
1. Docker 与虚拟机的区别
为了更好地理解,我们可以将它与传统的虚拟机(VM)做个对比:
- 虚拟机:虚拟出一整套硬件,在上面运行一个完整的操作系统,然后再运行你的应用。它非常笨重,启动慢,资源占用高。
- Docker 容器:直接运行在宿主机的操作系统内核之上,没有自己的内核,也没有硬件虚拟化。它极其轻量,启动速度是秒级的。
Docker 的核心优势在于隔离性、一致性、可移植性,它彻底解决了开发、测试、生产环境不一致的问题。
2. 核心概念
在我们开始动手之前,必须理解三个核心概念:
- 镜像 (Image):一个只读的模板,可以看作是“软件安装包”。它包含了运行应用所需的一切。
- 容器 (Container):镜像是静态的,而容器是镜像运行起来的实例,可以看作是“安装好的软件”。你可以创建、启动、停止、删除容器。
- 仓库 (Repository):一个集中存放和分发镜像的地方。最大的公开仓库是 Docker Hub。
二、安装 Docker
Docker 支持主流的操作系统,安装过程非常简单。以 Ubuntu 为例,使用官方安装脚本自动安装,安装命令如下:
# 下载并执行Docker官方安装脚本
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# 启动Docker服务
sudo systemctl start docker
sudo systemctl enable docker
安装完成后,打开你的终端(命令行工具),输入以下命令验证是否成功:
docker --version
如果能看到版本号,恭喜你,Docker 环境已经准备就绪!
三、镜像 (Image) 核心命令
镜像是容器的基石,我们先来学习如何管理镜像。
1. 下载镜像
从 Docker Hub 下载一个官方的 Nginx 镜像。
docker pull nginx:latest
这里的 nginx
是镜像名,latest
是标签 (tag),通常代表最新版本。
2. 查看本地镜像
列出你已经下载到本地的所有镜像。
docker images
3. 删除镜像
当一个镜像不再需要时,可以删除它以释放磁盘空间。
docker rmi <镜像ID或镜像名:标签>
# 示例
docker rmi nginx:latest
四、容器 (Container) 核心命令
有了镜像,我们就可以创建和管理容器了。这是 Docker 最激动人心的部分。
1. 创建并运行容器
使用我们刚才下载的 Nginx 镜像来运行一个 Web 服务器。
docker run --name my-nginx -d -p 8080:80 nginx
让我们分解一下这个命令:
docker run
: 创建并运行一个容器。--name my-nginx
: 给容器起一个自定义的名字my-nginx
。-d
: 后台运行容器(Detached 模式)。-p 8080:80
: 端口映射。将我们自己电脑(宿主机)的8080
端口,映射到容器内部的80
端口。nginx
: 基于哪个镜像来创建容器。
现在,打开浏览器访问 http://localhost:8080
,你应该能看到 Nginx 的欢迎页面了!
2. 查看正在运行的容器
docker ps
3. 查看所有容器 (包括已停止的)
docker ps -a
4. 停止容器
docker stop my-nginx
5. 启动已停止的容器
docker start my-nginx
6. 查看容器日志
docker logs my-nginx
# 加上 -f 参数可以持续跟踪日志
docker logs -f my-nginx
7. 进入容器内部
有时需要进入容器进行调试,就像 SSH 登录一台远程服务器一样。
docker exec -it my-nginx /bin/bash
-it
: 开启一个交互式的终端。/bin/bash
: 进入容器后执行的命令,这里是打开一个 bash shell。
8. 删除容器
停止的容器不会自动删除,需要手动清理。
docker rm my-nginx
注意: 正在运行的容器无法直接删除,需要先 stop
或者使用 -f
参数强制删除。
五、使用 Dockerfile 构建自己的镜像
每次都手动运行命令来配置容器太麻烦了。Dockerfile
就像一张“建筑图纸”,可以让我们自动化地构建自定义镜像。
假设我们有一个简单的 Node.js 应用,目录结构如下:
/my-node-app
├── app.js
├── package.json
└── Dockerfile
现在,我们在 my-node-app
目录下创建一个名为 Dockerfile
的文件(没有后缀名),内容如下:
# 1. 指定基础镜像
FROM node:18-alpine
# 2. 设置工作目录
WORKDIR /app
# 3. 复制 package.json 文件到工作目录
COPY package*.json ./
# 4. 安装依赖
RUN npm install
# 5. 复制所有项目文件到工作目录
COPY . .
# 6. 声明容器对外暴露的端口
EXPOSE 3000
# 7. 容器启动时执行的命令
CMD ["node", "app.js"]
有了这个 Dockerfile,我们就可以构建自己的应用镜像了。在 my-node-app
目录下打开终端,执行:
docker build -t my-node-app:1.0 .
-t
: 给镜像起一个名字和标签。.
: 表示 Dockerfile 所在的当前目录。
构建完成后,用 docker images
就能看到你亲手创建的镜像了!然后就可以像使用官方镜像一样,用 docker run
来运行它。
六、Docker 网络
默认情况下,Docker 会创建一个 bridge
(桥接)网络,所有容器都连接到这个网络上。但如果想让多个容器方便地互相通信,最佳实践是创建自定义网络。
# 创建一个网络
docker network create my-app-net
# 运行容器并连接到这个网络
docker run --name some-app --network my-app-net ...
docker run --name some-db --network my-app-net ...
在同一个自定义网络中,容器之间可以直接通过容器名作为主机名进行通信。例如,some-app
可以直接访问 http://some-db:port
。
七、使用 Docker Compose 编排多容器应用
当应用变得复杂,比如一个 “Web 应用 + 数据库 + 缓存” 的组合,手动管理多个容器会变得非常困难。这时,Docker Compose 就登场了。
Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。你只需要一个 docker-compose.yml
文件,就可以用一条命令启动或停止所有服务。
下面是一个部署 WordPress 博客(需要 Web 服务器和数据库)的 docker-compose.yml
示例:
version: '3.8'
services:
# WordPress 服务
wordpress:
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: user
WORDPRESS_DB_PASSWORD: password
WORDPRESS_DB_NAME: wordpress
depends_on:
- db
# 数据库服务
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: user
MYSQL_PASSWORD: password
MYSQL_ROOT_PASSWORD: rootpassword
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
将以上内容保存为 docker-compose.yml
,然后在该文件目录下执行:
1. 启动所有服务
docker-compose up -d
2. 停止并删除所有服务
docker-compose down
简单两行命令,就完成了一个复杂应用的部署和销毁,这就是 Compose 的魅力。
总结
恭喜你!通过这篇教程,你已经掌握了 Docker 从入门到实战的核心知识链:
- 理解了镜像、容器、仓库的核心概念。
- 学会了使用
docker run
,docker ps
,docker stop
等核心命令来管理容器。 - 掌握了如何编写
Dockerfile
来构建自定义镜像。 - 了解了 Docker 的网络模式,并学会了使用
Docker Compose
来编排和管理多容器应用。
Docker 的世界远不止于此,但这已经为你打开了通往高效开发和运维的大门。下一步,你可以去探索更高级的主题,比如企业级容器编排工具 Kubernetes (K8s)。但无论走多远,今天所学的这些基础都将是你最坚实的基石。现在,就去将你的第一个应用 Docker 化吧!