news 2026/6/23 14:20:16

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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环境。根据你的具体需求,可以调整相应的配置。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 5:04:49

计算机小程序毕设实战-基于springboot+微信小程序的羽球快讯爱好者平台小程序羽毛球场预定app_羽毛球预约管家【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/23 19:36:06

11、文本与盒子属性的CSS技巧解析

文本与盒子属性的CSS技巧解析 1. 文本属性 1.1 窄列布局 某些类型的内容适合使用窄列布局,例如字典,它主要是一系列简短内容的列表。在设计时,设置列间距和列之间的分隔线会很有帮助。以下代码展示了带有一定间距和浅灰色分隔线的窄列布局: /* columns.css */ #column…

作者头像 李华
网站建设 2026/6/23 12:16:00

23、WinJS控件样式与样式规则定位指南

WinJS控件样式与样式规则定位指南 1. WinJS控件样式介绍 1.1 ViewBox控件 ViewBox 控件能够自适应其父容器的大小,并且在不改变子元素宽高比的前提下,对单个子元素进行缩放以适应 ViewBox 的大小。当用户旋转平板电脑时,ViewBox 会相应地处理其内容的缩放。 以下是一个包…

作者头像 李华
网站建设 2026/6/23 17:21:06

27、Windows 8 应用开发中的 SVG 样式设计

Windows 8 应用开发中的 SVG 样式设计 1. SVG 简介 SVG(Scalable Vector Graphics)即可缩放矢量图形,具有诸多优势,如可嵌入 HTML 中,能通过 CSS 属性对其进行样式设计。SVG 的 CSS 属性包括填充(fill)、描边(strokes)、标记(markers)、滤镜(filters)、遮罩(ma…

作者头像 李华
网站建设 2026/6/23 3:05:40

SAP ABAP拆分交货单数量、批次、存储地点 并过账

案例&#xff1a;将交货单数量拆分到不同批次&#xff0c;一个批次下数量为1&#xff0c;并进行过账。 发布时间&#xff1a;20251218主要逻辑分为两个部分&#xff1a; 拆分和过账&#xff0c;拆分批次时必须写入存储位置&#xff0c;否则过账可能会报错&#xff08;eg&#x…

作者头像 李华
网站建设 2026/6/23 18:37:17

基于MPC的智能车运动预测和控制算法 Motion predication; Kinemati...

基于MPC的智能车运动预测和控制算法 Motion predication; Kinematic model //. MATLAB coding //. 加入求解步骤进而得到自定义成本函数的可扩展MPC控制器; //. 模型状态空间方程线性化和离散化; //. 可与风险场/人工势场/决策/轨迹跟踪等算法集成; //. 需要用到车辆运动学模…

作者头像 李华