使用Docker部署PHP应用的设计方案
1. Docker
Docker的官方定义是:
Docker allows you to package an application with all of its dependencies into a standardized unit for software development.
-- https://www.docker.com/whatisdocker
毫无疑问的是,Docker解决了应用部署上一个巨大的问题:
客户: 安装好了,用不了。
发布者:我的机器上没问题。
如何解决每个应用的依赖在Docker出现之前是个头疼的问题,现在仅仅通过一次配置,Dockerfile或者image作为最终交付,就能在任何Linux上完美运行了。说起来很简单的样子,但在Docker配置过程中,又存在很多值得思考的问题:应用各个组件如何安排?一个Container解决问题还是细化Container?Container之间何如通信?等等。。下面用一个最普遍的WEB应用配置部署来说明这些问题。
NOTE:本文假定读者对Docker中的一些概念有基本的认识,如果不甚了解,我推荐这篇文章:
https://linux.cn/article-6074-weibo.html
2. LNMP典型的PHP应用配置方案是LAMP或者LNMP,本文以LNMP为例。
设计方案如下图(我已经实现并运行成功的案例):
应用由4个组件组成,分别是Nginx,PHP-FPM(PHP),MySQL以及WWW,4个组件运行在由各自镜像创建出来的独立的容器中。其中WWW Container只是一个存储业务代码和静态资源的容器,可以认为是"死"的。
事实上LNMP架构采用上面的设计方式应该是最容易想到的,也是最清晰的,每个组件有相对的独立性。其中除了WWW容器,其他3个容器都可以直接通过官方镜像构建出来。
然而网上很多同学并不是这样做的,不会分的这么细,通常是把Nginx和WWW放到一个容器内,或者干脆全部放到一个容器中。可以学习一下大家的Dockerfile:
https://github.com/search?utf8=?&q=docker-lnmp
细化Container这种设计的优缺点:
容器间的耦合性增大。可以看到PHP-FPM容器和另外三个容器间有耦合关系,MySQL容器最独立。
虽然耦合性比较大,但这种端口耦合,文件系统耦合关系可以通过增加几个运行选项解决掉,后面有介绍。
由于容器对整个架构的划分,使得容器中的内容变得十分独立和安全。例如,我希望在线上更新WWW中的代码,只需要进入WWW容器做修改,不会影响到Nginx,PHP-FPM或者是MySQL。
各容器可灵活拆卸更换,比如我想把MySQL换成Mongodb,或者干脆把业务代码搬个家,不会影响到其他容器(仅仅更改相关配置文件)
由于各容器经由官方的镜像创建,因此可以随时花最少的代价使用最新的官方镜像尝鲜。
占用空间会比较大,一个简单的应用要这么做的话,四个镜像会占用大量的存储空间。
2.1 容器间通信问题
细化Container面临着另一个问题,就是如何进行容器间通信。下面简要描述一下上图中的数据流程:
客户端的http请求达到server的80端口,该端口被映射到Nginx Container的80端口,因此进入Nginx处理。Nginx会分析请求资源,判定是静态资源还是php脚本,如果是静态资源,则直接从WWW中取出发回客户端;如果是脚本程序,则要告诉PHP-FPM到WWW获取相应脚本,然后通过php-cgi处理。
fast-cgi通过php执行脚本,必要时访问MySQL存取数据。
这样耦合关系就出来了:
Nginx需要连接PHP-FPM开放的9000端口,需要访问WWW中的文件系统。
PHP-FPM也需要访问WWW中的文件系统,还要访问MySQL的3306端口。
2.2 解决问题
可以看出有两类耦合关系:端口和文件系统。
对于端口耦合,docker是通过--link选项解决的;对于文件系统耦合,docker是通过--volumes-from选项解决的。
解决第一个耦合关系:
$ sudo docker run -p 80:80 -p 443:443 # 主机端口映射到容器--volume-from WWW_CONTAINER_NAME # 把WWW容器VOLUME过的文件夹挂载到将启动的容器上--link PHP_FPM_CONTAINER_NAME:fpmservice # 冒号前是正在运行的FPM容器名称,后面是别名,别名会作为hostname在将启动的容器内可见-d # detachNGINX_IMAGE # 镜像名
解决第二个耦合关系:
$ sudo docker run --volume-from WWW_CONTAINER_NAME--link MYSQL_CONTAINER_NAME:mysql-dPHP_FPM_IMAGE
参考文档:https://docs.docker.com/reference/run/
因此容器启动的先后顺序就出来了:
MySQL Container
WWW Container (由于没有任何服务运行,容器run后会立即exit,可以使用 tail -f 等block命令使容器保持运行不退出)
PHP-FPM Container
Nginx Container
其中1和2可以对换。
3. 总结利用Docker部署Web应用可以带来很多便利,在宏观上实现应用组件化,为实现分布式系统奠定了基础。
可以看到实际上在Docker容器间共享数据是很方便的,搞清楚各容器的依赖关系就不难解决。
P.s. 本文是我学习docker两天后的心得体会,纰漏在所难免,如有错误还请斧正。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Alipay PHP ...

JWT는 주로 신분증 인증 및 정보 교환을 위해 당사자간에 정보를 안전하게 전송하는 데 사용되는 JSON을 기반으로 한 개방형 표준입니다. 1. JWT는 헤더, 페이로드 및 서명의 세 부분으로 구성됩니다. 2. JWT의 작업 원칙에는 세 가지 단계가 포함됩니다. JWT 생성, JWT 확인 및 Parsing Payload. 3. PHP에서 인증에 JWT를 사용하면 JWT를 생성하고 확인할 수 있으며 사용자 역할 및 권한 정보가 고급 사용에 포함될 수 있습니다. 4. 일반적인 오류에는 서명 검증 실패, 토큰 만료 및 대형 페이로드가 포함됩니다. 디버깅 기술에는 디버깅 도구 및 로깅 사용이 포함됩니다. 5. 성능 최적화 및 모범 사례에는 적절한 시그니처 알고리즘 사용, 타당성 기간 설정 합리적,

기사는 PHP 5.3에 도입 된 PHP의 LSB (Late STATIC BING)에 대해 논의하여 정적 방법의 런타임 해상도가보다 유연한 상속을 요구할 수있게한다. LSB의 실제 응용 프로그램 및 잠재적 성능

기사는 입력 유효성 검사, 인증 및 정기 업데이트를 포함한 취약점을 방지하기 위해 프레임 워크의 필수 보안 기능을 논의합니다.

이 기사에서는 프레임 워크에 사용자 정의 기능 추가, 아키텍처 이해, 확장 지점 식별 및 통합 및 디버깅을위한 모범 사례에 중점을 둡니다.

PHP 개발에서 PHP의 CURL 라이브러리를 사용하여 JSON 데이터를 보내면 종종 외부 API와 상호 작용해야합니다. 일반적인 방법 중 하나는 컬 라이브러리를 사용하여 게시물을 보내는 것입니다 ...

PHP 개발에서 견고한 원칙의 적용에는 다음이 포함됩니다. 1. 단일 책임 원칙 (SRP) : 각 클래스는 하나의 기능 만 담당합니다. 2. Open and Close Principle (OCP) : 변경은 수정보다는 확장을 통해 달성됩니다. 3. Lisch의 대체 원칙 (LSP) : 서브 클래스는 프로그램 정확도에 영향을 미치지 않고 기본 클래스를 대체 할 수 있습니다. 4. 인터페이스 격리 원리 (ISP) : 의존성 및 사용되지 않은 방법을 피하기 위해 세밀한 인터페이스를 사용하십시오. 5. 의존성 반전 원리 (DIP) : 높고 낮은 수준의 모듈은 추상화에 의존하며 종속성 주입을 통해 구현됩니다.

시스템이 다시 시작된 후 UnixSocket의 권한을 자동으로 설정하는 방법. 시스템이 다시 시작될 때마다 UnixSocket의 권한을 수정하려면 다음 명령을 실행해야합니다.
