当前位置: 首页 > news >正文

Docker实战:从安装到多容器编排指南

一、Docker环境准备

1. 安装Docker

Ubuntu/Debian系统:

# 更新包索引sudoaptupdate# 安装依赖sudoaptinstall-y apt-transport-https ca-certificatescurlsoftware-properties-common# 添加Docker官方GPG密钥curl-fsSL https://download.docker.com/linux/ubuntu/gpg|sudoapt-keyadd-# 添加Docker仓库sudoadd-apt-repository"deb [arch=amd64] https://download.docker.com/linux/ubuntu$(lsb_release -cs)stable"# 安装Dockersudoaptupdatesudoaptinstall-y docker-ce docker-ce-cli containerd.io# 验证安装sudodocker --version

CentOS/RHEL系统:

# 移除旧版本sudoyum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine# 安装依赖sudoyuminstall-y yum-utils# 添加Docker仓库sudoyum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 安装Dockersudoyuminstall-y docker-ce docker-ce-cli containerd.io# 启动Dockersudosystemctl start dockersudosystemctlenabledocker

2. Docker配置优化

# 将当前用户加入docker组(避免每次sudo)sudousermod-aG docker$USER# 需要重新登录生效# 配置Docker镜像加速器sudomkdir-p /etc/dockersudotee/etc/docker/daemon.json<<-'EOF' { "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com" ], "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" }, "storage-driver": "overlay2" } EOF# 重启Dockersudosystemctl daemon-reloadsudosystemctl restart docker

二、创建自定义Docker镜像

1. 编写Dockerfile

# 基于官方镜像 FROM ubuntu:22.04 # 设置环境变量 ENV LANG=C.UTF-8 \ DEBIAN_FRONTEND=noninteractive \ TZ=Asia/Shanghai # 设置时区 RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 更新并安装基础软件 RUN apt update && apt install -y \ curl \ wget \ vim \ git \ net-tools \ iputils-ping \ python3 \ python3-pip \ nginx \ supervisor \ && apt clean \ && rm -rf /var/lib/apt/lists/* # 创建工作目录 WORKDIR /app # 复制应用文件 COPY requirements.txt . COPY app.py . # 安装Python依赖 RUN pip3 install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple # 复制配置文件 COPY nginx.conf /etc/nginx/nginx.conf COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf # 暴露端口 EXPOSE 80 443 # 设置启动命令 CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]

2. 创建应用文件

requirements.txt:

flask==2.3.3 gunicorn==21.2.0 redis==4.6.0

app.py:

fromflaskimportFlaskimportsocket app=Flask(__name__)@app.route('/')defhello():hostname=socket.gethostname()returnf"Hello from Docker Container:{hostname}"if__name__=='__main__':app.run(host='0.0.0.0',port=5000)

3. 构建镜像

# 构建镜像docker build -t my-app:latest.# 查看镜像docker images

三、容器操作与管理

1. 运行容器

# 基本运行docker run -d --name my-app -p8080:80 my-app:latest# 带数据卷docker run -d\--name my-app\-p8080:80\-v /host/path:/container/path\-eENV_VAR=value\my-app:latest# 限制资源docker run -d\--name my-app\--memory="512m"\--cpus="1.0"\--restart=always\my-app:latest

2. 容器管理命令

# 查看容器dockerps# 运行中的容器dockerps-a# 所有容器# 容器操作docker start my-app# 启动docker stop my-app# 停止docker restart my-app# 重启dockerrmmy-app# 删除dockerrm-f my-app# 强制删除# 进入容器dockerexec-it my-app /bin/bash dockerexec-it my-appsh# 查看日志docker logs my-app docker logs -f my-app# 实时查看docker logs --tail50my-app# 查看资源使用docker stats my-app

四、Docker Compose多容器编排

1. 创建docker-compose.yml

version:'3.8'services:web:image:nginx:alpinecontainer_name:web-serverports:-"80:80"-"443:443"volumes:-./nginx.conf:/etc/nginx/nginx.conf-./html:/usr/share/nginx/html-./logs:/var/log/nginxnetworks:-app-networkrestart:unless-stoppedapp:build:.container_name:app-backendports:-"5000:5000"volumes:-./app:/app-./data:/dataenvironment:-DB_HOST=database-REDIS_HOST=redisdepends_on:-database-redisnetworks:-app-networkrestart:unless-stoppeddatabase:image:postgres:15container_name:postgres-dbenvironment:POSTGRES_USER:adminPOSTGRES_PASSWORD:secretPOSTGRES_DB:mydbvolumes:-postgres-data:/var/lib/postgresql/data-./init.sql:/docker-entrypoint-initdb.d/init.sqlports:-"5432:5432"networks:-app-networkrestart:unless-stoppedredis:image:redis:7-alpinecontainer_name:redis-cachecommand:redis-server--appendonly yesvolumes:-redis-data:/dataports:-"6379:6379"networks:-app-networkrestart:unless-stoppedvolumes:postgres-data:redis-data:networks:app-network:driver:bridge

2. Compose命令

# 安装Docker Composesudocurl-L"https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname-s)-$(uname-m)"-o /usr/local/bin/docker-composesudochmod+x /usr/local/bin/docker-compose# 使用Composedocker-compose up -d# 启动所有服务docker-compose down# 停止并删除docker-composeps# 查看服务状态docker-compose logs# 查看日志docker-compose build# 重新构建docker-composeexecappbash# 进入服务容器

五、Docker镜像优化最佳实践

1. 多阶段构建示例

# 构建阶段 FROM node:18 AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . RUN npm run build # 运行阶段 FROM nginx:alpine COPY --from=builder /app/dist /usr/share/nginx/html COPY nginx.conf /etc/nginx/nginx.conf EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]

2. 优化建议

# 1. 使用官方基础镜像 FROM python:3.11-slim # 比ubuntu更小 # 2. 合并RUN命令减少镜像层 RUN apt update && apt install -y \ package1 \ package2 \ && rm -rf /var/lib/apt/lists/* # 3. 使用.dockerignore文件 .dockerignore: node_modules .git *.log *.tmp # 4. 使用特定版本标签 FROM ubuntu:22.04 # 而不是ubuntu:latest # 5. 非root用户运行 RUN groupadd -r appuser && useradd -r -g appuser appuser USER appuser

六、Docker网络配置

# 创建自定义网络docker network create my-network# 查看网络docker networkls# 连接容器到网络docker run -d --name container1 --network my-network nginx docker run -d --name container2 --network my-network redis# 容器间通过名称通信# container1中可以直接 ping container2

七、数据持久化

# 创建数据卷docker volume create mydata# 使用数据卷docker run -d\--name db\-v mydata:/var/lib/mysql\mysql:8.0# 备份数据卷docker run --rm\-v mydata:/source\-v$(pwd):/backup\alpinetarczf /backup/backup.tar.gz -C /source.# 恢复数据卷docker run --rm\-v mydata:/target\-v$(pwd):/backup\alpinetarxzf /backup/backup.tar.gz -C /target

八、监控与维护

# 查看容器资源使用docker stats# 查看镜像大小docker images --format"table {{.Repository}}\t{{.Tag}}\t{{.Size}}"# 清理无用资源docker system prune -a# 清理所有未使用的资源docker image prune# 清理未使用的镜像docker volume prune# 清理未使用的卷docker network prune# 清理未使用的网络# 导出/导入镜像docker save my-app:latest>my-app.tar docker load<my-app.tar# 导出/导入容器dockerexportmy-app>my-app-container.tarcatmy-app-container.tar|dockerimport- my-app:backup

九、安全建议

# 1. 使用非root用户# 在Dockerfile中添加:USERnobody# 2. 扫描镜像漏洞docker scan my-app:latest# 3. 限制容器能力docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx# 4. 使用只读文件系统docker run --read-only alpinesh# 5. 设置资源限制docker run --memory="512m"--cpus="1.0"my-app

这个完整的Docker环境制作指南应该能帮助你从零开始搭建和管理Docker环境。根据你的具体需求,可以调整相应的配置。

http://www.cnnetsun.cn/news/137286.html

相关文章:

  • 计算机小程序毕设实战-基于springboot+微信小程序的羽球快讯爱好者平台小程序羽毛球场预定app_羽毛球预约管家【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 11、文本与盒子属性的CSS技巧解析
  • 23、WinJS控件样式与样式规则定位指南
  • 27、Windows 8 应用开发中的 SVG 样式设计
  • SAP ABAP拆分交货单数量、批次、存储地点 并过账
  • 基于MPC的智能车运动预测和控制算法 Motion predication; Kinemati...
  • Mathcad的野路子】11kW PFC参数计算书实战拆解
  • STM32学习笔记CAN
  • 搭建你的第一个“私有知识库” (RAG)
  • 13、Unix 系统磁盘管理与安全定位脚本实用指南
  • 15、系统管理脚本实用指南
  • 怎么选一款适合大面积清洁的多功能全自动洗地机呢?
  • 使用matlab编写m脚本,编写无迹卡尔曼滤波算法(UKF)估计电池SOC,注释清晰
  • 教培行业新媒体运营困境凸显!这款软件或成转型制胜法宝?
  • Photoshop Neural Filters:把“引擎截图”秒变“电影级美宣”?AI 深度模糊与色彩迁移工作流
  • 基于matlab的多目标优化算法NSGA3,动态输出优化过程,得到最终的多目标优化结果。 数据...
  • 12.18
  • COCO 数据集
  • 国内好用的测试用例管理工具有哪些?
  • 24、COM+ 事务管理与补偿资源管理器详解
  • YOLO深度学习模型的训练参数配置与优化
  • 数字孪生可视化模板怎么用?5大行业Demo拆解,帮你快速复用提效
  • 必藏!程序员转型AI大模型:机遇、路径与成功率拆解
  • 《智构空间:AIOS 与全时域 3D 交互范式》第 0 篇:前言 —— 触摸语义的厚度
  • 如何将照片从 Android 传输到 Android
  • 前端Vue使用js-audio-plugin实现录音功能
  • 测试用例之翻页功能详解
  • 音乐平台歌曲盗版维权全攻略:权利卫士录屏取证+可信时间戳认证实操指南
  • 根据您提供的 package.json 片段,涉及的 @vue/cli-plugin-babel 和 @vue/cli-service 版本为 ~4.2.0。以下是针对该版本的详细解决方案,结合相关依
  • electron-egg打包win7