Design scheme for Deploying PHP applications using Docker 1. Docker
The official definition of Docker is:
Docker allows you to package an application with all of its dependencies into a standardized unit for software development.
Https://www.docker.com/whatisdocker
There is no doubt that Docker solves a huge problem in application deployment:
Customer: The installation is complete and cannot be used.
Publisher: No problem on my machine.
How to solve the dependency of each application is a headache before the emergence of Docker. now, with only one configuration, Dockerfile or image as the final delivery, it can run perfectly on any Linux. It is easy to say, but there are many questions worth thinking about in the Docker configuration process: how to arrange the various components of the application? Does one Container solve the problem or refine the Container? What is the communication between containers? And so on .. The following describes these problems with the most common WEB application configuration and deployment.
NOTE: This article assumes that the reader has a basic understanding of some concepts in Docker. if you do not know much about them, I recommend this article:
Https://linux.cn/article-6074-weibo.html
2. LNMP
The typical PHP application configuration scheme is LAMP or LNMP. This article uses LNMP as an example.
For example ):
An application consists of four components: Nginx, PHP-FPM (PHP), MySQL, and WWW. The four components run in an independent container created by the respective image. Www iner is only a Container that stores business code and static resources. it can be regarded as "dead.
In fact, the LNMP architecture adopts the above design method, which is the easiest and clearest. each component has relative independence. In addition to the WWW container, all the other three containers can be directly built using official images.
However, this is not the case on the internet. it is not so detailed. Nginx and WWW are usually put in a container, or they are all put in a container. You can learn about Dockerfile:
Https://github.com/search? Utf8 =? & Q = docker-lnmp
Refine the advantages and disadvantages of the Container design:
The coupling between containers increases. We can see the coupling between the PHP-FPM container and the other three containers, MySQL container is the most independent.
Although the coupling is large, the file system coupling relationship can be solved by adding several running options, which will be described later.
As containers divide the entire architecture, the content in containers becomes very independent and secure. For example, I want to update the code in WWW online, just need to enter the WWW container for modification, does not affect Nginx, PHP-FPM or MySQL.
Containers can be flexibly disassembled and replaced. for example, if I want to replace MySQL with Mongodb, or simply move the business code to a home, it will not affect other containers (only change the relevant configuration file)
Since each container is created through an official image, you can use the latest official Image at minimal cost at any time.
The occupied space is relatively large. if a simple application needs to do so, the four images will occupy a large amount of storage space.
2.1 Inter-container communication problems
Refining the Container involves another problem: how to implement inter-Container communication. The following describes the data process:
The http request of the client reaches port 80 of the server. The port is mapped to port 80 of the Nginx Container, so Nginx is processed. Nginx analyzes the requested resource and determines whether it is a static resource or a php script. if it is a static resource, it will directly retrieve it from WWW and send it back to the client. if it is a script program, you need to tell the PHP-FPM to get the corresponding script at WWW, and then process it through php-cgi.
Fast-cgi uses php to execute scripts and access MySQL to access data if necessary.
The coupling relationship is as follows:
Nginx needs to connect to the PHP-FPM open port 9000, need to access the file system in WWW.
The PHP-FPM also needs to access the file system in WWW and Port 3306 of MySQL.
2.2 solve the problem
There are two types of coupling relationships: Port and file system.
For port coupling, docker uses the -- link option. for file system coupling, docker uses the -- volumes-from option.
Solve the first coupling relationship:
$ Sudo docker run-p 80: 80-p 443: 443 # host port ING to container -- volume-from WWW_CONTAINER_NAME # mount the folder of the WWW container VOLUME to the started container -- link PHP_FPM_CONTAINER_NAME: fpmservice # before the colon is the name of the running FPM container, followed by an alias. the alias will be visible as hostname in the started container-d # detachNGINX_IMAGE # Image name
Solve the second coupling relationship:
$ sudo docker run --volume-from WWW_CONTAINER_NAME--link MYSQL_CONTAINER_NAME:mysql-dPHP_FPM_IMAGE
Reference: https://docs.docker.com/reference/run/
The order of container startup is as follows:
MySQL Container
WWW Container (because there is no service running, the Container will exit immediately after run. you can use block commands such as tail-f to keep the Container running without exiting)
The PHP-FPM Container.
Nginx Container
Where 1 and 2 can be switched.
3. Summary
Using Docker to deploy Web applications can bring a lot of convenience. the macro implementation of application componentization lays the foundation for the implementation of distributed systems.
We can see that it is very convenient to share data between Docker Containers. it is not difficult to figure out the dependencies between containers.
P.s. This article is my understanding of docker two days later. it is inevitable that there are leaks. please make an axe if you have any mistakes.