Maison  >  Article  >  Créer une application Laravel basée sur Docker à partir de zéro

Créer une application Laravel basée sur Docker à partir de zéro

小云云
小云云original
2018-01-11 15:19:273042parcourir

Cet article partage principalement avec vous un tutoriel sur la façon de créer une application Laravel basée sur Docker à partir de zéro. Nous commencerons par l'introduction la plus élémentaire à Docker et apprendrons lentement à créer une application Laravel basée sur Docker. j'espère que cela pourra vous aider.

Introduction à Docker

En fait, à l'ère du cloud computing, Docker est bien connu depuis longtemps, et il a changé la donne Machine physique traditionnelle La méthode de virtualisation utilise efficacement les ressources de la machine. Étant donné que l'application exécutée dans Docker s'exécute réellement sur l'hôte, elle n'a pas besoin d'effectuer une virtualisation au niveau matériel et d'exécuter un système d'exploitation complet. Par conséquent, l'efficacité d'exécution est prise en charge. le code de l'application, l'utilisation de la mémoire et la vitesse de lecture des fichiers sont meilleurs que les méthodes de virtualisation traditionnelles. De plus, sa vitesse de démarrage est très rapide, souvent de l'ordre de la milliseconde, ce qui permet d'économiser considérablement. Elle réduit le temps de développement, de test et de déploiement
En fait. , pour les développeurs, une plus grande importance de Docker est d'assurer un environnement d'exploitation cohérent. La chose la plus courante pour les programmeurs est que lorsque les environnements de développement, de test et de déploiement sont incohérents, ils déclenchent souvent des BUG inexplicables. comme "ce code fonctionne bien sur ma machine", c'est l'une des raisons pour lesquelles nous devrions apprendre Docker

Comment apprendre Docker ?

Internet regorge d'un grand nombre de didacticiels et d'informations sur divers aspects de Docker, et en raison du développement rapide de Docker, de nombreux didacticiels sont en fait obsolètes pour les débutants. Il est difficile de les distinguer et de les comprendre, et ce qui suit est un. une série d'embûches et de problèmes, qui érodent progressivement la motivation des apprenants. En fait, la meilleure façon d'apprendre une nouvelle technologie est toujours de commencer par la documentation officielle, puis par GitHub. Le plus important pour les notes d'étude d'un technicien est d'explorer. pratiquez et prenez de bonnes notes d'étude. En fait, lors de l'apprentissage d'une nouvelle technologie, si vous avez la bonne méthode d'apprentissage, vous pouvez éviter bien des détours. J'écrirai un article à ce sujet si j'en ai l'occasion.

Démarrage rapide

Cet article est limité par la longueur et le niveau de l'auteur, et ne parlera pas des principes sous-jacents et de la mise en œuvre technique de Docker, ni Je vais vous apprendre à écrire un fichier Docker fastidieux, mais je vais commencer en tant que développeur ordinaire et vous amener à créer une application Laravel basée sur Docker à partir de zéro. Notre environnement système utilise Ubuntu 17.04, et d'autres systèmes sont bien sûr similaires. Pour Windows, cela peut être une autre affaire.

Installation de Docker

L'installation de Docker sous Ubuntu est la même que celle des logiciels classiques , mais en raison des caractéristiques chinoises, il y a de nombreux points auxquels il faut prêter attention, qui seront expliqués en détail plus tard. Il existe de nombreuses façons d'installer Docker. Il est recommandé d'utiliser le script d'installation officiel en un clic pour éviter une série de problèmes. opérations fastidieuses.

1. Téléchargez et installez

<span style="font-size: 14px;">  curl -fsSL get.docker.com -o get-docker.sh<br></span>

, puis installez-le, et choisissez de télécharger à partir de la source du miroir Ali :

<span style="font-size: 14px;">sudo sh get-docker.sh --mirror Aliyun<br></span>

2. Configuration de base

En fait, il peut essentiellement être utilisé après l'installation, en configurant principalement certaines sources miroir et groupes d'utilisateurs. Le but de la configuration de la source miroir n'est pas grand-chose à dire. Le groupe d'utilisateurs est principalement utilisé pour l'exécuter sans utiliser les privilèges de super-administrateur.

  • Rejoindre le groupe d'utilisateurs

<span style="font-size: 14px;">sudo usermod -aG docker $USER<br></span>
PS. c'est possible Il y aura toujours un message indiquant qu'il n'y a pas d'autorisation. À ce moment, redémarrez la machine
  • Configurez la source miroir

    .
<span style="font-size: 14px;">sudo mkdir -p /etc/docker<br>sudo tee /etc/docker/daemon.json <<-&#39;EOF&#39;<br/>{<br/>  "registry-mirrors": ["https://be62qq2e.mirror.aliyuncs.com"]<br/>}<br/>EOF<br/></span>
PS. La source de l'image ici provient de mon propre Alibaba Cloud. Les étudiants peuvent accéder à Alibaba Cloud pour obtenir l'adresse propriétaire de la source de l'image
    .
  • Redémarrer

<span style="font-size: 14px;">sudo systemctl daemon-reload<br/>sudo systemctl restart docker<br/></span>

3. Installer docker-compose

docker -compose est similaire à un outil de gestion de packages , ce qui nous facilite la gestion des images.

<span style="font-size: 14px;">curl -L https://github.com/docker/compose/releases/download/1.17.1/run.sh > /usr/local/bin/docker-compose<br>chmod +x /usr/local/bin/docker-compose<br></span>

Concepts de base

Docker a deux concepts de base très importants : les images et les conteneurs. Ces deux-là sont en fait similaires aux classes orientées et. instances dans les objets. Une fois l'image créée, elle devient un conteneur, puis le conteneur peut être démarré et arrêté. Les données générées par l'application exécutée dans le conteneur peuvent en fait être conservées tant que le conteneur n'est pas détruit s'il est détruit. Ou les données n'existeront naturellement plus après la reconstruction du conteneur, donc la recommandation officielle est d'utiliser le montage pour la persistance, ce qui sera discuté ensuite

.

docker-compose

docker-compose 可以说是真正的让 Docker 现代化了. 它就类似于 PHP 的 Composer 包管理工具一样, 是用来管理多个镜像的. 它极大的降低了学习 Docker 的难度. 我们在日常的开发中, 经常会碰到需要多个容器相互配合来完成某项任务的情况,比如 Web 容器和数据库容器之间的通信,我们可以单独的把一个项目中需要的所有容器和配置写到一个 docker-compose.yml 文件中,来统一管理.来看一下一个简单的配置文件格式:

<span style="font-size: 14px;">version: '3'<br>services:<br>  nginx:<br>    build: .<br>    ports:<br>     - "80:80"<br><br>  redis:<br>    image: "redis:alpine"<br></span>

一个项目可以由多个服务(容器)工程,而 docker-compose 是面向项目进行管理.

文件系统和网络

这是 Docker 比较复杂的一块,简单介绍一下. Docker 里面的文件系统其实很真实宿主机的一样, 可以用同样的命令去操作, 只是要注意的一点就是我们在容器中运行的应用配置文件的路径全部都是基于 Docker 的,不是基于宿主机的,很多文件不存在的问题都是这个引起来的.比如我们在运行一个 Nginx 容器和 PHP-FPM 容器的时候,不仅要把宿主机的项目路径映射到 Nginx 容器中,还要映射到 PHP-FPM 容器中,否则就会是一系列的 File not found.
Docker 中的网络是有多种模式的, 在默认情况下是会创建一个虚拟网桥的, 实际上是 Linux 的一个 bridge,它会在挂载到它的网口之间进行转发。并且会随机分配一个本地未被使用的属于 172.17.0.0/16 网段的 IP 到各个容器中.这是一个网络拓扑图:

部署 Laravel 应用

基本介绍后我们会通过一个简单的实例来加深理解, 就是部署一个 Laravel 应用. Web 服务器我们会使用 Nginx, 并且通过 PHP-FPM 来处理动态请求,用 MySQL 来存储数据, Redis 作为我们的缓存和队列驱动. 不同于网上的通过 Supervisor 来把所有服务运行在同一个容器中,我们会把这四个服务运行在四个容器中,这也是官方推荐的一种做法,然后我们会通过 docker-compose 来管理所有的服务(容器).

Nginx

直接上配置文件:

<span style="font-size: 14px;">version: '2'<br>services:<br>    nginx:<br>        image: nginx<br>        ports:<br>            - "8090:80"<br>        links:<br>            - php-fpm<br>        volumes:<br>          - ./nginx/www:/var/www/html<br>          - ./nginx/sites:/etc/nginx/sites-enabled<br>          - ./nginx/nginx.conf:/etc/nginx/nginx.conf<br>        command: [nginx-debug, '-g', 'daemon off;']<br></span>

其中的 services 节点下每一个表示一个服务;然后 nginx 这是个服务名可以随便取;image 指定使用哪个镜像来构建; ports 表示要暴露的端口,其中 8090 是指宿主机的端口,80 是指容器中的端口;volumes 表示挂载的目录和文件,我们这里挂载了代码目录,虚拟主机目录以及配置文件;command 表示容器启动后要运行的命令。我们还要在当前目录下创建一个 nginx 的目录,用来存放一系列的文件,还需要把配置文件新建并且写入配置内容(具体配置内容可以去官网查看,这里不说明),最后的目录结构是这样

<span style="font-size: 14px;">Docker<br>    - docker-compose.yml<br>    - nginx<br>        - www<br>        - sites<br>        - nginx.conf<br></span>
可以把日志一起挂载,这里没有表述出来

然后执行启动容器的命令:

<span style="font-size: 14px;">docker-compose up nginx<br></span>

以上不会在后台启动,而是会直接在当前的 shell 上,然后我们访问应该就可以看到 Welcome to nginx!

PHP-FPM  MySQL  Redis

同理我们再次配置 PHP-FPM,MySQL 以及 Redis 的容器了,具体过程不多讲,这里贴出配置:

<span style="font-size: 14px;">  php-fpm:<br>    image: 'bitnami/php-fpm:7.1'<br>    volumes:<br>      - ./nginx/www:/var/www/html<br>      - ./php-fpm/php.ini:/bitnami/php/conf/php.ini<br>    links:<br>      - mysql<br>      - redis<br><br>  mysql:<br>    image: mysql<br>    restart: always<br>    environment:<br>        MYSQL_ROOT_PASSWORD: example<br>    volumes:<br>      - /var/lib/mysql:/var/lib/mysql<br><br>  redis:<br>    image: redis<br></span>

有一点要注意的是,在配置PHP-FPM容器的时候是需要把代码目录也挂载到容器里面的,这一点很容易被遗忘,网上很多教程都没提到,导致最后虽然按照步骤走了但就是跑不起来。其中的 links 就是配置要连接到哪个容器中。比如配置了 Nginx 容器连接到 PHP-FPM 的容器,这样我们在 Nginx 的容器中就可以直接 ping php-fpm,在配置的时候也可以这样 php-fpm:9000 来配置了。

配置文件

Nginx 的配置文件,然后还要修改一下本地的 hosts 文件。

<span style="font-size: 14px;">server {<br>    listen 80;<br>    listen [::]:80;<br>    root /var/www/html/laravel/public;<br>    index index.html index.php;<br>    server_name laravel-docker.app;<br>    location / {<br>            try_files $uri $uri/ /index.php?$query_string;<br>    }<br>    location ~ \.php$ {<br>            fastcgi_split_path_info ^(.+\.php)(/.+)$;<br>            fastcgi_pass php-fpm:9000;<br>            fastcgi_index index.php;<br>            include fastcgi_params;<br>            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;<br>    }<br>}<br></span>

相关推荐:

使用docker基于daocloud自动化部署到自己的主机

如何使用Docker部署PHP开发环境

Docker构建php的开发环境

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn