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

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
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 时重启容器。可以指定重启的最大次数。
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.mzph.cn/bicheng/62065.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是 WPF 中的依赖属性?有什么作用?

依赖属性(Dependency Property)是 WPF 的一个核心概念,它为传统的 .NET 属性提供了增强功能,支持绑定、样式、动画和默认值等功能。通过依赖属性,WPF 提供了一种灵活的数据驱动的方式来处理 UI 属性。 1. 什么是依赖属…

Spring Boot 应用开发:构建高效、可扩展的 Java 微服务

以下是一个简单的 Spring Boot 小项目示例,该项目是一个基于 Spring Boot 的博客系统后端部分。这个项目将展示如何使用 Spring Boot 框架来创建一个基本的 RESTful API 服务,以管理博客文章。 项目结构 spring-boot-blog ├── src │ ├── main…

【TS】TypeScript基本使用

什么是TypeScript? 是一种编程语言,是JavaScript的超集,过添加静态类型、类、接口和模块等功能,使得在大型应用程序中更容易进行维护和扩展,可以编译成纯JavaScript 静态类型和动态类型有什么区别? 静态…

git 命令之只提交文件的部分更改

git 命令之只提交文件的部分更改 有时,我们在一个文件中进行了多个更改,但只想提交其中的一部分更改。这时可以使用 使用 git add -p 命令 Git add -p命令允许我们选择并添加文件中的特定更改。它将会显示一个交互式界面,显示出文件中的每个更…

FFmpeg 音视频同步问题

在使用 FFmpeg 进行开发时,音视频同步问题是一个常见且复杂的问题,涉及到时间戳管理、帧率处理、以及容器格式的支持等多个方面。以下是一个详细的整理,涵盖问题背景、可能原因、解决方法及注意事项: 问题背景 在多媒体开发中,音视频同步是指确保音频轨道和视频轨道在播…

图论基础知识

图论基础知识 什么是图论? 图论(Graph Theory)是研究图(Graph)的数学分支,主要研究点和边之间的关系。在计算机科学、网络设计、生物信息学等领域中,图论有广泛的应用。 图的基本定义 图 (Gr…

深度学习网络模型 MobileNet系列MobileNet V1、MobileNet V2、MobileNet V3网络详解以及pytorch代码复现

深度学习网络模型 MobileNet系列MobileNet V1、MobileNet V2、MobileNet V3网络详解以及pytorch代码复现 1、DW卷积与普通卷积计算量对比DW与PW计算量普通卷积计算量计算量对比 2、MobileNet V1MobileNet V1网络结构MobileNet V1网络结构代码 3、MobileNet V2倒残差结构模块倒残…

[极客大挑战 2019]BabySQL--详细解析

信息搜集 进入界面: 输入用户名为admin,密码随便输一个: 发现是GET传参,有username和password两个传参点。 我们测试一下password点位能不能注入: 单引号闭合报错,根据报错信息,我们可以判断…

C 语言面向对象

面向对象的基本特性:封装,继承,多态 1.0 面向过程概念 当我们在编写程序时,通常采用以下步骤: 1. 将问题的解法分解成若干步骤 2. 使用函数分别实现这些步骤 3. 依次调用这些函数 这种编程风格的被称作 面向过程…

VMware16安装macOS12【详细教程】

因为在应用上线IOS应用商店时,需要用到mac系统进行,于是就在VMware16pro虚拟机进行安装macOS12系统,安装的过程做了一个记录,希望对你有所帮助! 前言 首先需要下载好下面工具: VMware workstation pro 16…

Pytorch微调深度学习模型

在公开数据训练了模型,有时候需要拿到自己的数据上微调。今天正好做了一下微调,在此记录一下微调的方法。用Pytorch还是比较容易实现的。 网上找了很多方法,以及Chatgpt也给了很多方法,但是不够简洁和容易理解。 大体步骤是&…

视频推拉流EasyDSS互联网直播点播平台技术特点及应用场景剖析

在数字科技日新月异的今天,视频直播和点播已经成为互联网内容传播的重要方式之一。而互联网直播点播平台EasyDSS作为功能强大的流媒体直播点播视频能力平台,提供了一站式的视频推拉流、转码、直播、点播、时移回放、存储等视频服务,广泛应用于…

RPC学习

一、什么是 RPC RPC(Remote Procedure Call),即远程过程调用,是一种计算机通信协议,它允许运行在一台计算机上的程序调用另一台计算机上的子程序或函数,就好像调用本地程序中的函数一样,无需程序…

【Python】分割秘籍!掌握split()方法,让你的字符串处理轻松无敌!

在Python开发中,字符串处理是最常见也是最基础的任务之一。而在众多字符串操作方法中,split()函数无疑是最为重要和常用的一个。无论你是Python新手,还是经验丰富的开发者,深入理解并熟练运用split()方法,都将大大提升…

从 Llama 1 到 3.1:Llama 模型架构演进详解

编者按: 面对 Llama 模型家族的持续更新,您是否想要了解它们之间的关键区别和实际性能表现?本文将探讨 Llama 系列模型的架构演变,梳理了 Llama 模型从 1.0 到 3.1 的完整演进历程,深入剖析了每个版本的技术创新&#…

【Qt】QComboBox设置默认显示为空

需求 使用QComboBox,遇到一个小需求是,想要设置未点击出下拉列表时,内容显示为空。并且不想在下拉列表中添加一个空条目。 实现 使用setPlaceholderText()接口。我们先来看下帮助文档: 这里说的是,placeholderText是…

mysql根据日期查询没有的日期也要显示数据

先查询出日期数据(当前日期往前推12个月) select bb.datefrom (select num : num 1,date_format(adddate(date_sub(date_sub(curdate(),interval 12 month),interval 1 month),interval num month), %Y-%m) as datefrom mysql.help_topic,(select num : 0) as twhere addd…

非root用户安装CUDA

1.使用nvidia-smi查看当前驱动支持的最高CUDA版本: 表示当前驱动最多支持cuda12.1 2.进入cuda安装界面,https://developer.nvidia.com/cuda-toolkit-archive,选择想要安装的版本,例如想要安装CUDA11.4: 如果需要查看ub…

环形缓冲区

什么是环形缓冲区 环形缓冲区,也称为循环缓冲区或环形队列,是一种特殊的FIFO(先进先出)数据结构。它使用一块固定大小的内存空间来缓存数据,并通过两个指针(读指针和写指针)来管理数据的读写。当任意一个指针到达缓冲区末尾时,会自动回绕到缓冲区开头,形成一个"环"。…

Halo 正式开源: 使用可穿戴设备进行开源健康追踪

在飞速发展的可穿戴技术领域,我们正处于一个十字路口——市场上充斥着各式时尚、功能丰富的设备,声称能够彻底改变我们对健康和健身的方式。 然而,在这些光鲜的外观和营销宣传背后,隐藏着一个令人担忧的现实:大多数这些…