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 search2、运行镜像docker run -itd 镜像名称3、......这是最小的动作 若你要映射硬盘设置nat网络或者桥接网络等等…你就要做更多的 docker 操作 这显然是非常没有效率的。如上这些手动执行的操作可以写在【docker-compose.yml】文件中然后执行【docker-compose up -d】启动这些容器这样对容器的操作都变得如此简单。1.2、如何使用docker-composeDocker-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 --version1.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: - TZAsis/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: - TZAsis/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 down2.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 #社区维护的ubuntuxfcevnc开箱即用镜像【官网镜像是consol/ubuntu-xfce-vnc:latest】 container_name: linuxdesk #容器名称 restart: always ports: - 5901:5901 #客户端端口 - 6901:6901 #web VNC端口 environment: - VNC_PWadmin123 #VNC登录密码(且密码必须小于等于8位) - VNC_RESOLUTION1280x720 #桌面分辨率 - VNC_DEPTH24 #色彩位数24位真彩 - TZAsia/Shanghai volumes: - ./root:/root #持久化root管理员所有数据 - ./home:/home #持久化所有普通用户数据桌面默认用户headless shm_size: 2g #共享内存解决浏览器、图形界面卡顿 #运行云桌面环境容器 docker-compose up -d2.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: - VERSION7 #使用自己本地的ISO系统镜像则这里填写【custom】 - ISO_URLhttp://192.168.1.2:8088/win7.iso #自己将配置好的windows7.iso镜像地址配置在这里 - USERNAMEadmin - USER_PASSWORDadmin123 #- LANGUAGEchinese #中文系统 - KVMN #禁用硬件加速 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 logs2.5、使用docker-compose部署zabbix监控平台通过docker、docker-compose方式安装部署zabbix7.0 LTS监控平台https://blog.csdn.net/xiaochenxihua/article/details/1533193192.6、Docker容器实践——docker部署应用系统Docker容器实践——docker部署应用系统https://coffeemilk.blog.csdn.net/article/details/160218036?spm1001.2014.3001.5502三、使用docker-compose部署Nginxtomcat环境使用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 -f3.2、使用docker-compose部署NginxTomcat环境#准备的基础内容 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 weight2; server tomcat02:8080 weight2; server tomcat03:8080 weight2; } 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] # 基础配置 usermysql port3306 socket/var/lib/mysql/mysql.sock pid-file/var/run/mysqld/mysqld.pid datadir/var/lib/mysql tmpdir/tmp character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci default-storage-engineInnoDB server-id1 # 全局字符集 skip-character-set-client-handshake # 关闭域名解析 提升速度 skip-name-resolve # 连接配置 max_connections500 wait_timeout600 interactive_timeout600 max_connect_errors1000 # 内存优化(通用服务器 2C4G) innodb_buffer_pool_size1G innodb_log_file_size256M innodb_log_buffer_size64M innodb_file_per_table1 innodb_flush_log_at_trx_commit1 sync_binlog1 # 慢查询日志 slow_query_log1 slow_query_log_file/var/log/mysql/slow.log long_query_time2 # 错误日志 log-error/var/log/mysql/mysqld.log # 二进制日志(主从/数据恢复) log_binmysql-bin binlog_formatROW expire_logs_days7 # 时区 default-time_zone8:00 [mysqld_safe] log-error/var/log/mysql/mysqld.log socket/var/lib/mysql/mysql.sock [client] port3306 socket/var/lib/mysql/mysql.sock default-character-setutf8mb4 #【/data/docker-compose/nginx-tomcat/webapps/ROOT/index.html】文件内容 cd /data/docker-compose/nginx-tomcat/webapps/ROOT echo h1 styletext-align: center;a hrefhttps://coffeemilk.blog.csdn.net target_blankcoffeemilk.blog.csdn.net/a/h1 index.html #【/data/docker-compose/nginx-tomcat/webapps/ROOT/info.jsp】文件内容 cat info.jsp EOF % page contentTypetext/html;charsetUTF-8 languagejava % % page importjava.util.* % html head titlejsp探针/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 h1Jsp探针 ver1.0/h1 div classtitle服务器基本信息/div table trtd服务器名称/tdtd% request.getServerName() %/td/tr trtd域名/IP/tdtd% request.getServerName() % % request.getLocalAddr() %/td/tr trtd服务器端口/tdtd% request.getServerPort() %/td/tr trtd客户端端口/tdtd% request.getRemotePort() %/td/tr trtd客户端IP/tdtd% request.getRemoteAddr() %/td/tr trtdWeb服务器/tdtd% application.getServerInfo() %/td/tr trtd操作系统/tdtd% System.getProperty(os.name) % % System.getProperty(os.version) % % System.getProperty(os.arch) %/td/tr trtd服务器时间/tdtd% new Date() %/td/tr trtdCPU信息/tdtd% System.getProperty(os.arch) %/td/tr trtd磁盘分区/tdtd//td/tr trtd用户当前工作目录/tdtd% System.getProperty(user.dir) %/td/tr trtd本文件路径/tdtd% application.getRealPath(request.getServletPath()) %/td/tr /table div classtitleJava相关信息/div table trtdJDK版本/tdtd% System.getProperty(java.version) %/td/tr trtdServlet版本/tdtd% application.getMajorVersion() %.% application.getMinorVersion() %/td/tr trtdJDK安装路径/tdtd% System.getProperty(java.home) %/td/tr trtd编码/tdtd% System.getProperty(file.encoding) %/td/tr trtdJAVA类路径/tdtd% System.getProperty(java.class.path) %/td/tr /table div classtitle服务器环境变量/div table % MapString, String env System.getenv(); for (Map.EntryString, String entry : env.entrySet()) { % trtd% entry.getKey() %/tdtd% entry.getValue() %/td/tr % } % /table /body /html EOF#使用docker-compose构建NginxTomcat环境 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