Docker 容器化
2024/6/15大约 4 分钟
Docker 容器化
概述
Docker 是一个开源的容器化平台,用于将应用程序及其依赖打包成容器,实现跨平台部署。
1. 安装与配置
1.1 安装 Docker(Linux)
# 更新系统
sudo apt-get update
sudo apt-get upgrade -y
# 安装依赖
sudo apt-get install -y \
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
# 添加 Docker 仓库
echo \
"deb [arch=$(dpkg --print-architecture) 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
# 安装 Docker
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
# 启动 Docker 服务
sudo systemctl start docker
sudo systemctl enable docker
# 验证安装
docker --version
docker run hello-world1.2 Docker 基本命令
# 查看 Docker 信息
docker info
# 查看镜像列表
docker images
# 查看容器列表
docker ps -a
# 拉取镜像
docker pull nginx:latest
# 运行容器
docker run -d -p 80:80 nginx
# 进入容器
docker exec -it container_id /bin/bash
# 查看容器日志
docker logs container_id
# 停止容器
docker stop container_id
# 删除容器
docker rm container_id
# 删除镜像
docker rmi image_id2. Dockerfile 编写
2.1 .NET 应用 Dockerfile
# 使用官方 .NET SDK 镜像作为构建阶段
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env
WORKDIR /app
# 复制项目文件
COPY *.csproj ./
RUN dotnet restore
# 复制所有代码并构建
COPY . ./
RUN dotnet publish -c Release -o out
# 使用官方 .NET 运行时镜像
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY --from=build-env /app/out .
# 暴露端口
EXPOSE 80
EXPOSE 443
# 设置环境变量
ENV ASPNETCORE_URLS=http://+:80
# 启动应用
ENTRYPOINT ["dotnet", "MyApp.dll"]2.2 多阶段构建优化
# 构建阶段
FROM node:20 AS frontend-build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . ./
RUN npm run build
# 运行阶段
FROM nginx:alpine
COPY --from=frontend-build /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]2.3 Dockerfile 最佳实践
| 技巧 | 说明 |
|---|---|
| 使用多阶段构建 | 减小镜像体积 |
| 按层缓存 | 将不变的层放在前面 |
| 使用 .dockerignore | 排除不必要的文件 |
| 使用非 root 用户 | 提高安全性 |
| 设置 HEALTHCHECK | 监控容器健康状态 |
# .dockerignore
node_modules
npm-debug.log
.git
dist3. Docker Compose
3.1 docker-compose.yml 示例
version: '3.8'
services:
web:
build: .
ports:
- "80:80"
depends_on:
- db
- redis
environment:
- ConnectionStrings__DefaultConnection=Server=db;Database=MyDb;User ID=sa;Password=Password123;
- Redis__ConnectionString=redis:6379
db:
image: mcr.microsoft.com/mssql/server:2022-latest
environment:
- SA_PASSWORD=Password123
- ACCEPT_EULA=Y
volumes:
- sql_data:/var/opt/mssql
redis:
image: redis:latest
volumes:
- redis_data:/data
ports:
- "6379:6379"
volumes:
sql_data:
redis_data:3.2 常用命令
# 启动服务
docker-compose up -d
# 查看日志
docker-compose logs -f
# 停止服务
docker-compose down
# 重新构建并启动
docker-compose up -d --build
# 查看服务状态
docker-compose ps
# 进入容器
docker-compose exec web /bin/bash4. 网络配置
4.1 创建自定义网络
# 创建网络
docker network create my-network
# 查看网络列表
docker network ls
# 连接容器到网络
docker network connect my-network container_name4.2 Docker Compose 网络
version: '3.8'
services:
web:
build: .
networks:
- frontend
- backend
api:
build: ./api
networks:
- backend
db:
image: mysql
networks:
- backend
networks:
frontend:
driver: bridge
backend:
driver: bridge5. 数据持久化
5.1 使用卷挂载
# 创建卷
docker volume create my-volume
# 查看卷
docker volume ls
# 运行容器并挂载卷
docker run -d -v my-volume:/app/data nginx5.2 挂载主机目录
# 挂载主机目录到容器
docker run -d -v /host/path:/container/path nginx
# 只读挂载
docker run -d -v /host/path:/container/path:ro nginx6. Docker 镜像管理
6.1 构建镜像
# 构建镜像
docker build -t my-app:1.0.0 .
# 构建时传递参数
docker build --build-arg ENV=production -t my-app:1.0.0 .6.2 推送镜像到仓库
# 登录 Docker Hub
docker login
# 标记镜像
docker tag my-app:1.0.0 username/my-app:1.0.0
# 推送镜像
docker push username/my-app:1.0.06.3 使用私有仓库
# 启动私有仓库
docker run -d -p 5000:5000 --name registry registry:2
# 标记镜像
docker tag my-app:1.0.0 localhost:5000/my-app:1.0.0
# 推送镜像
docker push localhost:5000/my-app:1.0.0
# 拉取镜像
docker pull localhost:5000/my-app:1.0.07. 安全最佳实践
7.1 镜像安全
# 扫描镜像漏洞
docker scan my-app:1.0.0
# 使用非 root 用户
RUN useradd -m appuser
USER appuser
# 最小化镜像
FROM alpine:latest7.2 容器安全
# 限制容器资源
docker run --memory=512m --cpus=2 nginx
# 只读文件系统
docker run --read-only nginx
# 禁用特权模式
docker run --privileged=false nginx8. 监控与日志
8.1 查看日志
# 查看容器日志
docker logs container_id
# 实时日志
docker logs -f container_id
# 查看最近N行日志
docker logs --tail 100 container_id8.2 容器监控
# 查看容器资源使用
docker stats
# 查看容器详细信息
docker inspect container_id9. Docker Swarm 集群
9.1 初始化 Swarm
# 初始化 Swarm
docker swarm init
# 添加工作节点
docker swarm join --token token manager_ip:23779.2 部署服务
# docker-compose.yml
version: '3.8'
services:
web:
image: my-app:1.0.0
deploy:
replicas: 3
restart_policy:
condition: on-failure
resources:
limits:
memory: 512M
reservations:
memory: 256M
ports:
- "80:80"# 部署服务
docker stack deploy -c docker-compose.yml my-stack
# 查看服务
docker stack services my-stack
# 扩展服务
docker service scale my-stack_web=5总结
Docker 容器化技术可以简化应用部署和运维,提高开发效率和系统可靠性。掌握 Docker 是现代 DevOps 工程师的必备技能。
作者:Blogger
日期:2024年6月15日