本地 PHP 和 Java 开发环境 Docker 化与配置开机自启

server/2024/11/26 16:56:37/

Docker 的最大优势之一是其容器化的特性,可以将开发环境的配置与应用程序的运行隔离开来。通过容器化的方式,PHP 和 Java 项目能够在本地开发时保持一致的环境配置,同时确保便捷的端口映射,方便开发和测试。本文将在前文基础上,补充说明如何在 Docker 中配置端口映射,并结合开机自启功能进行部署。

1. 本地 PHP 和 Java 开发环境 Docker 化

1.1 构建 PHP Docker 镜像

首先,为 PHP 项目编写 Dockerfile,我们可以使用 Apache 作为 Web 服务器并配置必要的 PHP 扩展。

# 使用官方 PHP 镜像作为基础镜像
FROM php:7.4-apache# 安装 PHP 扩展(可根据项目需求进行调整)
RUN docker-php-ext-install mysqli pdo pdo_mysql# 设置工作目录
WORKDIR /var/www/html# 将本地的 PHP 项目文件拷贝到容器中
COPY ./php /var/www/html# 暴露端口 80
EXPOSE 80
1.2 构建 Java Docker 镜像

对于 Java 项目,我们使用 openjdk 镜像。假设 Java 项目使用 Maven 作为构建工具,以下是 Java 项目的 Dockerfile 示例:

# 使用 OpenJDK 镜像作为基础镜像
FROM openjdk:11-jdk# 设置工作目录
WORKDIR /app# 将本地的 Java 项目文件拷贝到容器中
COPY ./java /app# 编译并运行 Java 项目
RUN ./mvnw clean install# 启动 Java 应用
CMD ["java", "-jar", "target/myapp.jar"]# 暴露端口 8080
EXPOSE 8080
dockercomposeyml__51">1.3 创建 docker-compose.yml 文件(包含端口映射)

为了管理多个服务并配置端口映射,我们使用 Docker Compose 来启动 PHP、Java 服务和 MySQL 数据库。以下是 docker-compose.yml 文件示例,配置了端口映射以及不同服务的网络。

version: '3.7'services:# PHP 服务php:build:context: .dockerfile: Dockerfile.phpvolumes:- ./php:/var/www/htmlports:- "8080:80"  # 将容器的 80 端口映射到宿主机的 8080 端口networks:- dev-networkrestart: always  # 配置容器在退出后自动重启# Java 服务java:build:context: .dockerfile: Dockerfile.javavolumes:- ./java:/appports:- "8081:8080"  # 将容器的 8080 端口映射到宿主机的 8081 端口networks:- dev-networkrestart: unless-stopped  # 配置容器在退出时自动重启,除非手动停止# MySQL 服务(可选)db:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: rootMYSQL_DATABASE: app_dbvolumes:- db_data:/var/lib/mysqlnetworks:- dev-networkports:- "3306:3306"  # 将容器的 3306 端口映射到宿主机的 3306 端口networks:dev-network:driver: bridgevolumes:db_data:

在该配置中,端口映射的规则如下:

  • PHP 服务将容器的 80 端口映射到宿主机的 8080 端口。
  • Java 服务将容器的 8080 端口映射到宿主机的 8081 端口。
  • MySQL 服务将容器的 3306 端口映射到宿主机的 3306 端口。
1.4 启动服务

执行以下命令来构建并启动服务:

docker-compose up --build

通过上述命令启动后,您可以通过宿主机的 80808081 端口分别访问 PHP 和 Java 服务。

2. 配置 Docker 容器开机自启

2.1 使用 Docker 的 --restart 策略

Docker 提供了 --restart 选项,可以配置容器在 Docker 守护进程启动时自动启动。以下是常见的重启策略:

  • no:不自动重启容器(默认)。
  • always:无论容器退出的状态如何,Docker 守护进程都会尝试重新启动容器。
  • unless-stopped:容器退出时会重新启动,只有在手动停止容器后才不会再重启。
  • on-failure:仅在容器退出代码非 0 时重启容器。可以指定重启的最大次数。
dockercomposeyml__131">2.1.1 修改 docker-compose.yml 配置

docker-compose.yml 文件中,我们可以为每个服务配置 restart 策略。例如:

version: '3.7'services:php:build:context: .dockerfile: Dockerfile.phpvolumes:- ./php:/var/www/htmlports:- "8080:80"  # 配置端口映射restart: always  # 配置容器在退出后自动重启networks:- dev-networkjava:build:context: .dockerfile: Dockerfile.javavolumes:- ./java:/appports:- "8081:8080"  # 配置端口映射restart: unless-stopped  # 配置容器在退出时自动重启,除非手动停止networks:- dev-network
2.2 配置 Docker 守护进程自启

确保 Docker 守护进程在操作系统重启后自动启动。通常,Docker 在安装时默认会设置为开机自启,但可以手动配置。

2.2.1 在 Linux 上启用 Docker 自启

在 Linux 系统中,你可以使用 systemctl 来启用 Docker 守护进程的开机自启:

# 启动 Docker 服务
sudo systemctl start docker# 设置 Docker 服务开机自启
sudo systemctl enable docker
2.2.2 在 Windows 和 macOS 上启用 Docker 自启

在 Windows 和 macOS 上,Docker Desktop 默认支持开机自启,可以在 Docker Desktop 设置中启用该功能:

  1. 打开 Docker Desktop。
  2. 点击 Settings(设置)。
  3. General(常规)选项卡中,启用 Start Docker Desktop when you log in(登录时启动 Docker Desktop)。
2.3 使用 systemd 配置容器开机自启

对于需要更高自定义管理的场景,可以使用 systemd 配置容器在系统启动时自启。创建一个 systemd 服务单元文件,管理 Docker 容器的启动。

例如,创建 /etc/systemd/system/my-docker-app.service 文件:

[Unit]
Description=My Dockerized PHP Application
After=docker.service
Requires=docker.service[Service]
Restart=always
ExecStartPre=/usr/bin/docker pull php:7.4-apache
ExecStart=/usr/bin/docker run --rm --name php-app -p 8080:80 php:7.4-apache
ExecStop=/usr/bin/docker stop php-app[Install]
WantedBy=multi-user.target

然后重新加载 systemd 配置并启用该服务:

sudo systemctl daemon-reload
sudo systemctl enable my-docker-app
sudo systemctl start my-docker-app

这将确保容器在操作系统启动时自动启动。


http://www.ppmy.cn/server/145113.html

相关文章

使用LoRA微调florence-2模型

1 环境 Kaggle,单GPU 2 数据 图片、索引和标签放在JSON文件中 文件目录如下: logo是图片的文件夹,PNG-SVG是图片的文件夹,re.json是索引,florence2-weight是预训练的权重 JSON文件内容如下: image是…

Android数据存储——文件存储、SharedPreferences、SQLite、Litepal

数据存储全方案——详解持久化技术 Android系统中主要提供了3中方式用于简单地实现数据持久化功能,即文件存储、SharedPreference存储以及数据库存储。除了这三种方式外,还可以将数据保存在手机的SD卡中,不给使用文件、SharedPreference或者…

自动语音识别(ASR)与文本转语音(TTS)技术的应用与发展

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

springboot基于微信小程序的旧衣回收系统的设计与实现

摘 要 微信小程序的旧衣回收系统是一种专为环保生活设计的应用软件。这款小程序的主要功能包括:系统首页、个人中心、用户管理、回收人员管理、旧衣服分类管理、旧衣信息管理、回收预约管理、回收派单管理、回收订单管理、积分商品管理、积分兑换管理、管理员管理、…

docker 卸载与安装

卸载 查询之前安装的docker, 没有查到则不用卸载删除 yum list installed | grep docker 卸载安装包 yum remove docker-* -y 删除镜像、容器、默认挂载卷 rm -rf /var/lib/docker 安装 -ce 安装稳定版本 -y 当安装过程提示选择全部为 "yes" yum install d…

大数据新视界 -- Hive 数据仓库:构建高效数据存储的基石(下)(2/ 30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

基于数据融合的智能家居环境监测系统研究与设计(论文+源码)

1总体方案设计 本次基于数据融合的智能家居环境监测系统的设计,其系统总体架构如图2.1所示,整个系统在器件上包括了主控制器STM32F103单片机,MQ可燃气体传感器,光照传感器,DHT11温湿度传感器,风扇&#xf…

mysql in查询大数据量业务无法避免情境下优化

在 MySQL 中,IN 查询操作广泛用于从数据库中检索符合条件的多条记录,但当涉及到大数据量的 IN 查询时,性能可能会显著下降。特别是当 IN 子句中的元素数量非常大时,MySQL 需要对每个元素进行匹配,这会导致查询变得非常…