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

Docker容器实践——Docker-Compose实现多容器的控制

Docker容器实践——使用Dockerfile构建定制LNMP架构镜像并部署Wordpress应用https://blog.csdn.net/xiaochenXIHUA/article/details/160368526

一、Docker-Compose介绍

1.1、Docker-Compose是什么

docker-compose是用来做docker的多容器控制的,可以把所有繁琐的docker操作全都聚合在一个yaml格式文件中,只需一条命令,就可以自动化的完成对多容器的操作。

用通俗的语言来说,我们平时操作 docker 还是很原始的一系列动作,你手动使用 docker 的动作可以拆分成:

手动使用docker的动作可以拆分为如下操作:

1、搜索镜像:docker search

2、运行镜像:docker run -itd 镜像名称

3、......

这是最小的动作, 若你要映射硬盘,设置nat网络或者桥接网络,等等…你就要做更多的 docker 操作, 这显然是非常没有效率的。

如上这些手动执行的操作,可以写在【docker-compose.yml】文件中,然后执行【docker-compose up -d】启动这些容器,这样对容器的操作都变得如此简单。

1.2、如何使用docker-compose

Docker-Compose支持Linux、macOS、Windows 10 三大平台,可以通过Python的包管理工具pip进行安装,也可以直接下载编译好的二进制文件使用,甚至能够直接在Docker容器中运行。本文推荐使用二进制包方式安装,直接从官方:https://github.com/docker/compose/releases 处下载编译好的二进制文件即可。

#下载安装docker-compose方法(只用选择一个方法下载即可) #1-创建【/usr/local/bin】目录 mkdir -p /usr/local/bin/ #2-方法一:下载最新的docker-compose二进制文件到本机的【/usr/local/bin】目录 curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose #2-方法二:下载指定版本(如:v2.40.0)的docker-compose二进制文件到本机的【/usr/local/bin】目录 curl -L https://github.com/docker/compose/releases/download/v5.1.3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose #3-给下载好的docker-compose二进制文件添加执行权限 chmod +x /usr/local/bin/docker-compose #4-验证docker-compose是否安装成功(若输出docker compose的版本信息内容则表示成功,否则失败) docker-compose --version

1.3、Docker-Compose模板文件

模板文件是使用Docker-Compose的核心,涉及到的指令关键字也比较多。但这里面大部分指令跟“docker run”相关参数的含义都是类似的。默认的模板文件名称为 docker-compose.yml,格式为 YAML 格式。docker-compose.yml文件分为三个主要部分:【services】【networks】【volumes】。

docker-compose主要部分说明
services用来定义各个容器
networks定义需要使用到的网络
volumes定义services使用到的数据卷
#Docker-Compose文件示例 version: "3" services: webapp: image: nginx ports: - "8001:80" volumes: - "/usr/share/nginx/html" #version: '3'表示docker-compose.yml语法版本,单引号和双引号都行。 #Compose目前为止有三个版本分别为Version 1,Version 2,Version 3,Version2.x及Version 3.x基本兼容,是未来的趋势,Version 1将来会被弃用。 #services关键字表示定义服务(容器服务)。webapp表示服务的名称,可以自定义。

注意:yaml格式中不能使用制表符(Tab)进行缩进,通常使用2个空格表示缩进的层级关系.

二、Docker-Compose实现多容器控制示例

2.1、使用docker-compose部署lnmp环境

#使用docker-compose部署lnmp环境 cd /data/lnmp vi docker-compose.yml #【docker-compose.yml】文件的完整内容如下: version: '3' services: nginxck: image: nginx:ck-1.30.0 restart: always ports: - 8081:8081 volumes: - /data/lnmp/www:/usr/local/nginx/html - /data/lnmp/nginxlog:/usr/local/nginx/logs - /data/lnmp/conf:/usr/local/nginx/conf/conf.d networks: - net-lnmp php: image: php:ck-7.4.10 restart: always environment: - TZ=Asis/Shanghai volumes: - /data/lnmp/www:/usr/local/nginx/html networks: - net-lnmp mysql5.7: image: mysql:ck-5.7.31 restart: always ports: - 13306:3306 volumes: - /data/lnmp/db:/var/lib/mysql - /data/lnmp/conf/my.cnf:/etc/mysql/my.cnf environment: - TZ=Asis/Shanghai networks: - net-lnmp networks: net-lnmp: driver: bridge #直接运行docker-compose docker-compose up -d #查看当前运行的容器 docker-compose ps #查看当前运行容器的进程 docker-compose top #停止当前运行的容器 docker-compose stop #停止并删除容器 / 网络 docker-compose down

2.2、使用dokcer-compose部署Linux云桌面环境

#使用docker-compose.yml文件构建Linux云桌面环境 mkdir -p /data/docker-compose/linuxdesk cd /data/docker-compose/linuxdesk/ vim docker-compose.yml #【docker-compose.yml】文件的完整内容 version: '3' services: ubuntu-xfce-vnc: #服务名称 image: accetto/ubuntu-vnc-xfce-g3:24.04 #社区维护的ubuntu+xfce+vnc开箱即用镜像【官网镜像是:consol/ubuntu-xfce-vnc:latest】 container_name: linuxdesk #容器名称 restart: always ports: - 5901:5901 #客户端端口 - 6901:6901 #web VNC端口 environment: - VNC_PW=admin123 #VNC登录密码(且密码必须小于等于8位) - VNC_RESOLUTION=1280x720 #桌面分辨率 - VNC_DEPTH=24 #色彩位数(24位真彩) - TZ=Asia/Shanghai volumes: - ./root:/root #持久化root管理员所有数据 - ./home:/home #持久化所有普通用户数据(桌面默认用户headless) shm_size: 2g #共享内存(解决浏览器、图形界面卡顿) #运行云桌面环境容器 docker-compose up -d

2.3、使用docker-compose部署windows云桌面环境

#使用docker-compose【windows容器源码:https://github.com/dockur/windows】 mkdir -p /data/docker-compose/windowsdesk cd /data/docker-compose/windowsdesk vim docker-compose.yml #【docker-compose.yml】文件完整内容 version: '3' services: windows: image: dockurr/windows container_name: windows7 restart: always privileged: true #解决win7权限不足问题 environment: - VERSION=7 #(使用自己本地的ISO系统镜像则这里填写【custom】) - ISO_URL="http://192.168.1.2:8088/win7.iso" #自己将配置好的windows7.iso镜像地址配置在这里 - USERNAME=admin - USER_PASSWORD=admin123 #- LANGUAGE=chinese #中文系统 - KVM=N #禁用硬件加速 devices: #- /dev/kvm #启用硬件加速(可将性能提升50%,前提是必须在Linux系统中,且CPU开启虚拟化技术) - /dev/net/tun #网络设备,保证联网正常 cap_add: - NET_ADMIN #网络管理权限 ports: - 8006:8006 - 13389:3389 volumes: - ./windows7:/storage #数据持久化 - ./sharedata:/shared #用来与主机交换文件的文件夹 #- ./win7.iso:/custom.iso #使用本地下载好的系统镜像安装 stop_grace_period: 2m #优雅关机,保护系统 #启动 docker-compose up -d

注意:若使用IIS部署了windows7.iso的镜像镜像提供下载,但是下载时提示“

HTTP 错误 404.3 - Not Found

由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。

”错误信息,则需要打开IIS网站,然后双击【MIME类型】打开,然后点击鼠标右键选择【添加】在弹窗界面的【文件扩展名填写(.iso);MIME类型填写(application/octet-stream)】后重启网站,然后再重试下载即可成功下载了。

2.4、使用docker-compose部署Portainer可视化docker管理工具

#使用docker-compose部署Portainer可视化docker管理工具 mkdir -p /data/docker-compose/portainer cd /data/docker-compose/portainer vi portainer-compose.yml #【portainer-compose.yml】文件的完整内容 services: portainer: image: portainer/portainer-ce:sts #镜像:Portainer 社区稳定版(免费开源,最常用) container_name: portainer #自定义容器名,方便管理 restart: always #开机自启 + 容器崩溃自动重启 ports: - 9443:9443 # 核心端口:网页 HTTPS 管理入口 - 8000:8000 # Edge 远程代理端口 volumes: - /var/run/docker.sock:/var/run/docker.sock # 授予 Portainer 管理宿主机 Docker 的最高权限(必须挂载) - ./portainer_data:/data # 本地目录持久化:配置文件存在当前文件夹的 portainer_data 中 networks: networks: - portainer_network networks: portainer_network: driver: bridge #启动portainer容器 docker-compose -f portainer-compose.yml up -d #查看portainer容器运行状态 docker-compose -f portainer-compose.yml ps #查看portainer容器的运行日志 docker-compose -f portainer-compose.yml logs

2.5、使用docker-compose部署zabbix监控平台

通过docker、docker-compose方式安装部署zabbix7.0 LTS监控平台https://blog.csdn.net/xiaochenxihua/article/details/153319319

2.6、Docker容器实践——docker部署应用系统

Docker容器实践——docker部署应用系统https://coffeemilk.blog.csdn.net/article/details/160218036?spm=1001.2014.3001.5502

三、使用docker-compose部署Nginx+tomcat环境

使用Nginx作为负载均衡(或反向代理)后端的tomcat应用,架构图如下:

3.1、使用Dockerfile构建自己的tomcat镜像

#使用Dockerfile构建自己的tomcat镜像 mkdir -p /data/docker-compose/tomcat cd /data/docker-compose/tomcat wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.99/bin/apache-tomcat-8.5.99.tar.gz vi Dockerfile #【Dockerfile】文件的完整内容 FROM debian:bullseye-slim MAINTAINER coffeemilk.blog.csdn.net ADD jdk-8u421-linux-x64.tar.gz /usr/local ENV JAVA_HOME /usr/local/jdk1.8.0_421 ADD apache-tomcat-8.5.99.tar.gz /usr/local COPY server.xml /usr/local/apache-tomcat-8.5.99/conf/server.xml EXPOSE 8080 ENTRYPOINT ["/usr/local/apache-tomcat-8.5.99/bin/catalina.sh","run"] #构建tomcat镜像 docker build -t tomcat:ck-8.5 .

注意:若在使用Dockerfile构建镜像时提示“failed xxx no space left on device”错误时;是由于docker所使用的路径【/var】存储空间不够了,需要清理【/var】目录。

#清理Docker无用空间的命令 #1-删除无用容器、镜像、缓存、网络 docker system prune -a -f #2-清理单独的卷(可选,但很有效) docker volume prune -f

3.2、使用docker-compose部署Nginx+Tomcat环境

#准备的基础内容 mkdir -p /data/docker-compose/nginx-tomcat/ cd /data/docker-compose/nginx-tomcat/ mkdir -p nginx/conf.d mkdir -p mysql/conf mkdir -p webapps/ROOT #【/data/docker-compose/nginx-tomcat/nginx/nginx.conf】文件内容 worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; # 负载均衡 3台 Tomcat upstream tomcat8080_server { server tomcat01:8080 weight=2; server tomcat02:8080 weight=2; server tomcat03:8080 weight=2; } server { listen 80; server_name localhost; location / { proxy_pass http://tomcat8080_server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 60s; proxy_read_timeout 60s; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } #【/data/docker-compose/nginx-tomcat/mysql/conf/my.cnf】文件内容 [mysqld] # 基础配置 user=mysql port=3306 socket=/var/lib/mysql/mysql.sock pid-file=/var/run/mysqld/mysqld.pid datadir=/var/lib/mysql tmpdir=/tmp character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci default-storage-engine=InnoDB server-id=1 # 全局字符集 skip-character-set-client-handshake # 关闭域名解析 提升速度 skip-name-resolve # 连接配置 max_connections=500 wait_timeout=600 interactive_timeout=600 max_connect_errors=1000 # 内存优化(通用服务器 2C4G) innodb_buffer_pool_size=1G innodb_log_file_size=256M innodb_log_buffer_size=64M innodb_file_per_table=1 innodb_flush_log_at_trx_commit=1 sync_binlog=1 # 慢查询日志 slow_query_log=1 slow_query_log_file=/var/log/mysql/slow.log long_query_time=2 # 错误日志 log-error=/var/log/mysql/mysqld.log # 二进制日志(主从/数据恢复) log_bin=mysql-bin binlog_format=ROW expire_logs_days=7 # 时区 default-time_zone='+8:00' [mysqld_safe] log-error=/var/log/mysql/mysqld.log socket=/var/lib/mysql/mysql.sock [client] port=3306 socket=/var/lib/mysql/mysql.sock default-character-set=utf8mb4 #【/data/docker-compose/nginx-tomcat/webapps/ROOT/index.html】文件内容 cd /data/docker-compose/nginx-tomcat/webapps/ROOT echo "<h1 style='text-align: center;'><a href='https://coffeemilk.blog.csdn.net' target='_blank'>coffeemilk.blog.csdn.net</a></h1>" > index.html #【/data/docker-compose/nginx-tomcat/webapps/ROOT/info.jsp】文件内容 cat > info.jsp <<'EOF' <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page import="java.util.*" %> <html> <head> <title>jsp探针</title> <style> body { font-family: "宋体", sans-serif; font-size: 14px; background: #e6e6e6; margin: 20px; } h1 { font-size: 16px; text-align: center; } .title { background: #999; color: #fff; font-weight: bold; padding: 3px 8px; margin: 15px 0 5px; } table { width: 600px; border-collapse: collapse; background: #fff; margin: 0 auto; } td { border: 1px solid #ccc; padding: 3px 8px; } td:first-child { width: 150px; color: #333; } </style> </head> <body> <h1>Jsp探针 ver1.0</h1> <div class="title">服务器基本信息</div> <table> <tr><td>服务器名称</td><td><%= request.getServerName() %></td></tr> <tr><td>域名/IP</td><td><%= request.getServerName() %> <%= request.getLocalAddr() %></td></tr> <tr><td>服务器端口</td><td><%= request.getServerPort() %></td></tr> <tr><td>客户端端口</td><td><%= request.getRemotePort() %></td></tr> <tr><td>客户端IP</td><td><%= request.getRemoteAddr() %></td></tr> <tr><td>Web服务器</td><td><%= application.getServerInfo() %></td></tr> <tr><td>操作系统</td><td><%= System.getProperty("os.name") %> <%= System.getProperty("os.version") %> <%= System.getProperty("os.arch") %></td></tr> <tr><td>服务器时间</td><td><%= new Date() %></td></tr> <tr><td>CPU信息</td><td><%= System.getProperty("os.arch") %></td></tr> <tr><td>磁盘分区</td><td>/</td></tr> <tr><td>用户当前工作目录</td><td><%= System.getProperty("user.dir") %></td></tr> <tr><td>本文件路径</td><td><%= application.getRealPath(request.getServletPath()) %></td></tr> </table> <div class="title">Java相关信息</div> <table> <tr><td>JDK版本</td><td><%= System.getProperty("java.version") %></td></tr> <tr><td>Servlet版本</td><td><%= application.getMajorVersion() %>.<%= application.getMinorVersion() %></td></tr> <tr><td>JDK安装路径</td><td><%= System.getProperty("java.home") %></td></tr> <tr><td>编码</td><td><%= System.getProperty("file.encoding") %></td></tr> <tr><td>JAVA类路径</td><td><%= System.getProperty("java.class.path") %></td></tr> </table> <div class="title">服务器环境变量</div> <table> <% Map<String, String> env = System.getenv(); for (Map.Entry<String, String> entry : env.entrySet()) { %> <tr><td><%= entry.getKey() %></td><td><%= entry.getValue() %></td></tr> <% } %> </table> </body> </html> EOF
#使用docker-compose构建Nginx+Tomcat环境 vi docker-compose.yml #【docker-compose.yml】文件的完整内容 version: '3' services: nginx: image: library/nginx:1.30.0 restart: always ports: - "8087:80" networks: - mynet volumes: - ./webapps:/usr/share/nginx/html - ./nginx/logs:/var/log/nginx - /etc/localtime:/etc/localtime - ./nginx/nginx.conf:/etc/nginx/nginx.conf - ./nginx/conf.d/:/etc/nginx/conf.d depends_on: - mysql - tomcat01 - tomcat02 - tomcat03 tomcat01: image: tomcat:ck-8.5 restart: always hostname: tomcat01 networks: - mynet volumes: - ./webapps:/usr/local/apache-tomcat-8.5.99/webapps - /etc/localtime:/etc/localtime ulimits: nofile: soft: 65536 hard: 65536 tomcat02: image: tomcat:ck-8.5 restart: always hostname: tomcat02 networks: - mynet volumes: - ./webapps:/usr/local/apache-tomcat-8.5.99/webapps - /etc/localtime:/etc/localtime ulimits: nofile: soft: 65536 hard: 65536 tomcat03: image: tomcat:ck-8.5 restart: always hostname: tomcat03 networks: - mynet volumes: - ./webapps:/usr/local/apache-tomcat-8.5.99/webapps - /etc/localtime:/etc/localtime ulimits: nofile: soft: 65536 hard: 65536 mysql: image: library/mysql:5.7 restart: always hostname: mysql ports: - "33306:3306" environment: MYSQL_ROOT_PASSWORD: admin123456 MYSQL_DATABASE: test_ck volumes: - ./mysql/mysqldb:/var/lib/mysql - ./mysql/conf/my.cnf:/etc/mysql/my.cnf - /etc/localtime:/etc/localtime:ro networks: - mynet networks: mynet: driver: bridge #启动容器 docker-compose up -d #查看所有容器状态 docker-compose ps

http://www.jsqmd.com/news/699194/

相关文章:

  • 终极指南:如何用AlDente免费延长MacBook电池寿命50%
  • 武汉擎天仕劳务:靠谱的武汉设备吊装费用厂家 - LYL仔仔
  • AI赋能产品管理:PM Skills Marketplace 开源框架实战指南
  • 避开这些坑!SimpleFOC项目移植与电机初始化失败的常见原因排查
  • TVA技术在电池表观检测中的实操应用
  • BilldDesk终极指南:打破远程控制边界,开启跨平台协作新纪元![特殊字符]
  • biliTickerBuy:告别手速焦虑的B站会员购抢票终极指南
  • 廉颇老矣,尚能饭否:阿里 AI 正在打一场“翻身仗“
  • 2026年湖南长沙短视频运营与网络推广服务深度横评指南 - 年度推荐企业名录
  • 三小时精通Python微信机器人:从零到实战的完整指南
  • C++26反射成本控制最后防线(仅限首批ISO C++委员会审阅版文档披露的3条未公开约束规则)
  • 如何在5分钟内让PS4游戏体验翻倍?GoldHEN作弊管理器深度解析
  • 三步实现微信聊天记录永久保存:告别数据丢失,开启数字记忆新纪元
  • Arduino编程CH552
  • Arm Cortex-A55浮点与SIMD架构深度解析
  • Rust智能指针BoxRcArc使用场景
  • Ryujinx模拟器终极指南:从零开始畅玩Switch游戏
  • 2026年湖南长沙短视频运营与GEO智能推广深度横评:5大服务商官方对接指南 - 年度推荐企业名录
  • 如何永久保存微信聊天记录?这款开源工具让你完全掌控个人数据资产
  • 从javafx.util.Pair到Apache Commons Lang3:一个Java开发者踩过的那些‘键值对’小坑
  • 移动端架构演进与选型
  • 深入浅出 LangGraph —— 第2章:环境搭建与第一个Agent
  • 为什么你的AI语音处理项目需要ClearerVoice-Studio?5个核心场景深度解析
  • 北京金发钹祥金属材料贸易:朝阳区不锈钢焊接电话 - LYL仔仔
  • 2026浏览器指纹追踪的合规边界与隐私优先的反检测技术落地框架
  • 上海泽固新型建材:宝山聚合物砂浆批发厂家推荐 - LYL仔仔
  • 千问 LeetCode 1739.放置盒子 public int minimumBoxes(int n)
  • Gitee:中国本土DevOps平台如何重塑企业研发管理范式
  • 【路径规划】基于遗传算法确定山路补给无人机的最佳路线Matlab代码
  • Newtonsoft.Json 架构解析:高性能JSON序列化框架的技术实现与调优