主题模式
Docker容器化部署指南
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows机器上,也可以实现虚拟化。
什么是Docker?
Docker是一个开源的容器化平台,它允许开发者将应用及其依赖项打包到轻量级、可移植的容器中。容器与虚拟机不同,它们共享宿主机的操作系统内核,因此更加轻量级和高效。
Docker的核心概念
- 镜像(Image):只读模板,用于创建容器
- 容器(Container):镜像的运行实例
- 仓库(Registry):存储镜像的地方,如Docker Hub
- Dockerfile:用于构建镜像的文本文件
Docker安装
Windows系统安装
- 下载Docker Desktop for Windows
- 运行安装程序
- 启动Docker Desktop
macOS系统安装
- 下载Docker Desktop for Mac
- 将Docker.dmg拖拽到Applications文件夹
- 启动Docker
Linux系统安装(Ubuntu为例)
bash
# 更新apt包索引
sudo apt-get update
# 安装必要的包
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 设置稳定版仓库
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 更新apt包索引
sudo apt-get update
# 安装Docker Engine
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 验证安装
sudo docker run hello-worldDocker基本命令
镜像操作
bash
# 搜索镜像
docker search nginx
# 拉取镜像
docker pull nginx
# 查看本地镜像
docker images
# 删除镜像
docker rmi nginx
# 构建镜像
docker build -t myapp .容器操作
bash
# 运行容器
docker run nginx
# 运行容器并指定名称和端口映射
docker run --name mynginx -p 8080:80 -d nginx
# 查看运行中的容器
docker ps
# 查看所有容器(包括停止的)
docker ps -a
# 停止容器
docker stop mynginx
# 启动已停止的容器
docker start mynginx
# 重启容器
docker restart mynginx
# 删除容器
docker rm mynginx
# 进入容器
docker exec -it mynginx /bin/bash容器日志和信息
bash
# 查看容器日志
docker logs mynginx
# 查看容器详细信息
docker inspect mynginx
# 查看容器资源使用情况
docker stats mynginxDockerfile详解
Dockerfile是用来构建Docker镜像的文本文件,包含了一系列指令。
基本语法
dockerfile
# 基础镜像
FROM ubuntu:20.04
# 维护者信息
LABEL maintainer="your-email@example.com"
# 设置工作目录
WORKDIR /app
# 复制文件
COPY . /app
# 安装依赖
RUN apt-get update && apt-get install -y python3
# 设置环境变量
ENV NODE_ENV=production
# 暴露端口
EXPOSE 3000
# 启动命令
CMD ["python3", "app.py"]常用指令说明
- FROM:指定基础镜像
- LABEL:为镜像添加元数据
- WORKDIR:设置工作目录
- COPY:复制文件到镜像中
- ADD:复制文件,支持URL和解压tar文件
- RUN:执行命令并创建新的镜像层
- ENV:设置环境变量
- EXPOSE:声明端口
- CMD:容器启动时执行的命令
- ENTRYPOINT:容器入口点
构建和推送镜像
构建镜像
bash
# 在Dockerfile所在目录执行
docker build -t myapp:v1.0 .
# 指定Dockerfile路径
docker build -f /path/to/Dockerfile -t myapp:v1.0 .推送镜像到仓库
bash
# 登录Docker Hub
docker login
# 给镜像打标签
docker tag myapp:v1.0 username/myapp:v1.0
# 推送镜像
docker push username/myapp:v1.0Docker Compose
Docker Compose是用于定义和运行多容器Docker应用程序的工具。
安装Docker Compose
bash
# 下载Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 添加执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker-compose --versiondocker-compose.yml示例
yaml
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
environment:
- DB_HOST=db
- DB_PORT=5432
db:
image: postgres:13
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:Docker Compose常用命令
bash
# 启动所有服务
docker-compose up
# 后台启动所有服务
docker-compose up -d
# 停止所有服务
docker-compose down
# 查看服务状态
docker-compose ps
# 查看服务日志
docker-compose logs
# 构建服务
docker-compose buildDocker网络
网络类型
- bridge:默认网络驱动
- host:移除网络隔离
- none:禁用网络功能
- overlay:跨主机网络
网络操作命令
bash
# 查看网络
docker network ls
# 创建网络
docker network create mynetwork
# 连接容器到网络
docker network connect mynetwork mycontainer
# 断开容器与网络的连接
docker network disconnect mynetwork mycontainerDocker数据持久化
数据卷(Volumes)
bash
# 创建数据卷
docker volume create myvolume
# 查看数据卷
docker volume ls
# 使用数据卷运行容器
docker run -v myvolume:/app/data nginx
# 删除数据卷
docker volume rm myvolume绑定挂载(Bind Mounts)
bash
# 使用绑定挂载运行容器
docker run -v /host/path:/container/path nginxDocker最佳实践
镜像优化
- 使用合适的基础镜像:选择较小的基础镜像,如alpine
- 多阶段构建:减小最终镜像大小
- 合理利用缓存:将变化较少的指令放在前面
- 删除不必要的文件:及时清理临时文件和缓存
安全实践
- 不要以root用户运行容器
- 定期更新基础镜像
- 扫描镜像漏洞
- 限制容器资源使用
多阶段构建示例
dockerfile
# 构建阶段
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
# 运行阶段
FROM node:14-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/index.js"]常见问题和解决方案
权限问题
bash
# 如果遇到权限问题,可以使用sudo运行Docker命令
sudo docker ps
# 或者将用户添加到docker组
sudo usermod -aG docker $USER容器无法访问外网
bash
# 检查Docker网络配置
docker network inspect bridge
# 重启Docker服务
sudo systemctl restart docker磁盘空间不足
bash
# 清理未使用的镜像和容器
docker system prune -a
# 清理未使用的数据卷
docker volume prune总结
Docker作为现代应用部署的标准工具,极大地简化了应用的部署和管理。通过容器化技术,开发者可以确保应用在不同环境中的一致性,提高了开发和部署的效率。
掌握Docker需要理解其核心概念,包括镜像、容器、Dockerfile、Compose等。在实际使用中,还需要关注安全性、性能优化和最佳实践等方面。
随着容器编排技术的发展,如Kubernetes等工具也逐渐成为生产环境的标准,但Docker作为基础仍然非常重要。