news 2026/4/16 7:48:47

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/4/15 6:01:21

后端面经记录

3.那既然括号里的数字&#xff0c;不是用来限制取值范围的那为什么要设置长度呢&#xff0c;我不设置行不行 4.如果表中有INT(11)&#xff0c;而插入的是100&#xff0c;你会看到什么样的显示效果&#xff1f;INT(11) 是不是就是存储11位的数字&#xff0c;如果你插入了一个大于…

作者头像 李华
网站建设 2026/4/12 22:30:55

【课程设计/毕业设计】基于小程序的高校学生公寓道闸管理平台基于springboot+微信小程序的高校学生公寓道闸管理平台的设计与实现【附源码、数据库、万字文档】

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

作者头像 李华
网站建设 2026/4/10 18:31:27

13、CSS 样式与动画属性全解析

CSS 样式与动画属性全解析 1. 元素背景相关属性 1.1 背景定位与重复 背景定位和重复属性可用于精确控制背景图像的显示方式。例如,使用 background-repeat: no-repeat; 可防止背景图像重复, background-position: center center; 能将背景图像水平和垂直居中。 back…

作者头像 李华
网站建设 2026/4/15 19:01:41

17、Windows 8 应用布局属性全解析

Windows 8 应用布局属性全解析 在 Windows 8 应用开发中,布局的合理设计至关重要。本文将深入探讨 Flexbox、Grid 布局,以及 WinJS 提供的 ViewBox 和 ListView 控件,帮助你打造出美观且实用的应用界面。 1. Flexbox 布局 Flexbox 是 CSS 家族的一个强大工具,主要用于处…

作者头像 李华
网站建设 2026/4/5 16:25:41

19、Windows 8 应用全局样式深度解析

Windows 8 应用全局样式深度解析 1. Win - type 样式规则 在 Windows 8 应用开发中,有两种额外的 win - type 样式规则,分别是 win - type - ellipsis 和 win - type - interactive。 - win - type - ellipsis :该样式规则的定义包含 text - overflow 属性,其值为 ell…

作者头像 李华
网站建设 2026/4/11 0:05:24

20、WinJS 应用样式与控件风格全解析

WinJS 应用样式与控件风格全解析 一、全局样式中的元素与控件风格 在应用开发中,WinJS 库为我们提供了丰富的样式和控件支持,帮助我们打造具有 Windows 8 风格的应用。 1. 后退按钮与设置标题的样式 包含后退按钮和设置标题的 div 元素,使用了 win-ui-dark 和 win-…

作者头像 李华