什么是 Docker?
Docker 是一个开源的容器化平台,用于打包、分发和运行应用程序。它通过将应用程序及其依赖项打包到一个轻量级的容器中,确保应用在任何环境中都能一致地运行。
Docker 的核心概念
镜像(Image)
镜像是一个轻量级的、独立的、可执行的软件包,包含运行应用所需的所有内容(代码、运行时、系统工具、库等)。
容器(Container)
容器是镜像的运行实例。可以把镜像看作是类,容器就是对象。
仓库(Repository)
存储镜像的地方。Docker Hub 是最大的公共镜像仓库。
Dockerfile
用于定义如何构建镜像的文本文件。
Docker 安装
Windows 和 Mac
下载 Docker Desktop:https://www.docker.com/products/docker-desktop
Linux(Ubuntu)
# 更新包管理器
sudo apt-get update
# 安装 Docker
sudo apt-get install docker.io
# 启动 Docker 服务
sudo systemctl start docker
# 验证安装
docker --version
基础命令
镜像操作
# 拉取镜像
docker pull ubuntu:latest
# 列出本地镜像
docker images
# 删除镜像
docker rmi image_id
# 搜索镜像
docker search nginx
容器操作
# 运行容器
docker run -d --name my-container ubuntu:latest
# 列出运行中的容器
docker ps
# 列出所有容器(包括已停止的)
docker ps -a
# 停止容器
docker stop container_id
# 启动容器
docker start container_id
# 删除容器
docker rm container_id
# 查看容器日志
docker logs container_id
# 进入容器
docker exec -it container_id /bin/bash
编写 Dockerfile
# 使用基础镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 复制文件
COPY . .
# 安装依赖
RUN pip install -r requirements.txt
# 暴露端口
EXPOSE 5000
# 运行应用
CMD ["python", "app.py"]
构建和运行镜像
# 构建镜像
docker build -t my-app:1.0 .
# 运行容器
docker run -d -p 5000:5000 --name my-app-container my-app:1.0
# 查看容器状态
docker ps
# 查看日志
docker logs my-app-container
Docker Compose
Docker Compose 用于定义和运行多容器应用。
docker-compose.yml 示例
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
environment:
- DATABASE_URL=postgres://db:5432/mydb
db:
image: postgres:13
environment:
- POSTGRES_DB=mydb
- POSTGRES_PASSWORD=password
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
运行 Docker Compose
# 启动所有服务
docker-compose up -d
# 停止所有服务
docker-compose down
# 查看日志
docker-compose logs -f
最佳实践
- 使用官方镜像 - 优先使用官方维护的镜像
- 最小化镜像大小 - 使用 alpine 基础镜像
- 使用 .dockerignore - 排除不必要的文件
- 分层构建 - 充分利用 Docker 的缓存机制
- 不要以 root 运行 - 创建非 root 用户
- 使用健康检查 - 定期检查容器健康状态
常见问题
Q: 如何查看容器内的文件?
docker exec -it container_id ls -la /app
Q: 如何复制文件到容器?
docker cp file.txt container_id:/app/
Q: 如何保存容器的更改为新镜像?
docker commit container_id my-new-image:1.0
总结
Docker 是现代应用开发和部署的必备工具。通过容器化,你可以确保应用在开发、测试和生产环境中的一致性,大大简化了部署流程。