开发者Docker指南:镜像、容器与Compose
你可能听说过Docker和容器,但也许不确定它们如何融入你的日常开发工作流。或者你尝试过Docker,但镜像、容器和Compose的概念让你感到困惑。本指南将通过实际示例带你了解基础知识,让你能够在项目中高效使用Docker。
什么是Docker镜像和容器?
把Docker镜像想象成应用程序的蓝图。它包含运行代码所需的一切:操作系统、运行时、库和应用程序文件。镜像是不可变的,由Dockerfile构建而成。
容器是镜像的运行实例。当你启动容器时,Docker会从镜像创建一个隔离环境。你可以从同一个镜像运行多个容器,每个容器都有自己的状态。
关键区别
| 镜像 | 容器 |
|---|---|
| 只读模板 | 可运行实例 |
| 由Dockerfile构建 | 从镜像创建 |
| 存储在注册表中 | 在主机上运行 |
| 不可变 | 临时性(可停止、启动、删除) |
构建你的第一个Docker镜像
让我们创建一个简单的Node.js应用并将其容器化。在项目根目录创建一个Dockerfile:
# 使用官方Node.js运行时作为父镜像
FROM node:18-alpine
# 设置工作目录
WORKDIR /app
# 复制package.json和package-lock.json
COPY package*.json ./
# 安装依赖
RUN npm ci --only=production
# 复制其余应用代码
COPY . .
# 暴露应用运行的端口
EXPOSE 3000
# 定义运行应用的命令
CMD ["node", "server.js"]
使用以下命令构建镜像:
docker build -t my-node-app .
从镜像运行容器:
docker run -p 3000:3000 -d my-node-app
你的应用现在可以通过http://localhost:3000访问。
管理容器
以下是管理容器的一些基本命令:
docker ps– 列出正在运行的容器docker ps -a– 列出所有容器(包括已停止的)docker stop <container_id>– 停止正在运行的容器docker rm <container_id>– 删除已停止的容器docker logs <container_id>– 查看容器日志docker exec -it <container_id> sh– 在运行中的容器内打开shell
使用Docker Compose简化多容器应用
真实应用通常需要多个服务:Web服务器、数据库、缓存等。使用单独的docker run命令管理这些服务很繁琐。Docker Compose允许你使用YAML文件定义和运行多容器应用。
创建一个docker-compose.yml:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DB_HOST=db
depends_on:
- db
db:
image: postgres:15-alpine
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=mydb
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
使用以下命令启动所有服务:
docker compose up -d
使用以下命令停止并删除它们:
docker compose down
开发最佳实践
- 使用.dockerignore从构建上下文中排除不必要的文件(node_modules、.git)。
- 利用层缓存:合理安排Dockerfile指令顺序,使依赖在复制源代码之前安装。
- 使用多阶段构建以保持生产镜像精简。
- 将数据存储在卷中,用于数据库和其他有状态服务。
- 使用Compose进行本地开发,以复制类似生产的环境。
常见问题
镜像和容器有什么区别?
镜像是定义应用程序及其依赖的只读模板。容器是镜像的运行实例,上面有一个可写层。
我可以在生产环境中使用Docker Compose吗?
Docker Compose主要设计用于开发和测试。对于生产环境,请考虑使用Kubernetes或Docker Swarm等编排工具。
如何在Docker中持久化数据?
使用卷或绑定挂载。卷由Docker管理,是持久化容器生成数据的首选方式。
准备好容器化你的应用了吗?如果你需要将文档或指南转换为PDF供团队使用,试试我们的Word转PDF转换器来分享精美的文档。