zoukankan      html  css  js  c++  java
  • 在Ubuntu 20.04中通过Docker compose搭建用于Laravel应用开发的容器

    参考 https://www.digitalocean.com/community/tutorials/how-to-install-and-set-up-laravel-with-docker-compose-on-ubuntu-20-04


      通过本文,最终会建立
         一个app服务运行PHP7.4-FPM
         db服务运行MYSQL 5.7
         使用app服务来解析PHP代码,最后呈现Laravel应用到最终用户的nginx服务

     

    请预先
         初始化Ubuntu配置,
         安装好Docker
         安装好docker-compose


       前面的搞完了,先来下载一个demo 的Laravel应用,已经是有初始状态可以用的了
       执行

      cd ~

       执行
      curl -L https://github.com/do-community/travellist-laravel-demo/archive/tutorial-1.0.1.zip -o travellist.zip

       接下来解压这个压缩包
       执行
      unzip travelliist.zip

         没有安装这个unzip命令的请执行
        sudo apt update
         sudo apt install unzip

        解压后可以看到~文件夹内多了个 travellist-laravel-demo-tutorial-1.0.1文件夹
       接着移动这个文件夹到一个新文件夹 一条命令直接也可以创建这个新文件夹 【也可以叫重命名】
      
       执行

      mv travellist-laravel-demo-tutorial-1.0.1 travellist-demo

      执行

      cd travellist-demo

    然后开始创建.env文件


       laravel的配置文件都在config文件夹中,.env文件被用于设置环境依赖配置。比如密码之类的在发布的时候可有不同设置的值。
       该文件也会在版本控制中被排除掉,同时因为该文件可以包含如数据库密码之类的信息,所以不要公共发布本文件。
       执行

      cp .env.example .env

       执行
      nano .env

       开始编辑.env文件里的设置
       首先数据库设置 初始配置是指向本地的 127.0.0.1 ,需要修改指向稍后我们会创建到Docker运行环境的数据库服务。

      暂时把服务【一般都是这么命名】命名为db
       即 修改
       DB_HOST=127.0.0.1 为 DB_HOST=db
       然后数据库名travellist 用户名travellist_user 密码password 【如果是想用其他值 自己设置就行】
       后面我们在设置docker-compose.yml文件的时候,需要用到这几个值用来配置服务。

      然后保存

    设置应用的Dockerfile


      
       虽然我们的Mysql 和Nginx服务都是基于Dockerhub下载的默认镜像。 但是我们还是需要做一点新的配置并另存为一个新的镜像
       所以接下来创建一个新的Dokcerfile来搞定。

      首先是需要基于PHP7.4-FPM的镜像。 然后我们需要配置一些其他的PHP模块 以及 Composer依赖管理工具。
      
       并在该容器中创建一个新用户,用于开发时执行artisan和composer命令。
       通过uid设置保证容器中的用户与该宿主机的系统用户一致。
       如此任何通过上述命令创建的文件都会附带正确的权限复制到宿主机中。
       如此便可以在宿主机中使用宿主机的文本编辑器来开发运行在容器里的应用!

      创建一个新的Dockerfile执行:

    nano Dockerfile

      复制下面的内容到Dockerfile里

     FROM php:7.4-fpm
    
      # Arguments defined in docker-compose.yml
       ARG user
       ARG uid
    
      # Install system dependencies
       RUN apt-get update && apt-get install -y 
           git 
           curl 
           libpng-dev 
           libonig-dev 
           libxml2-dev 
           zip 
           unzip
    
      # Clear cache
       RUN apt-get clean && rm -rf /var/lib/apt/lists/*
    
      # Install PHP extensions
       RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
    
      # Get latest Composer
      COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
    
      # Create system user to run Composer and Artisan Commands
       RUN useradd -G www-data,root -u $uid -d /home/$user $user
       RUN mkdir -p /home/$user/.composer && 
           chown -R $user:$user /home/$user
    
      # Set working directory
       WORKDIR /var/www
    
      USER $user
    



      然后保存!

      解释一下,上面就是说 我们使用一个基础镜像 php:7.4-fpm

      安装完系统包,安装PHP扩展 然后从官方https://hub.docker.com/_/composer站点里复制可以执行的
       composer镜像到这个应用镜像里。

      一开始设置了使用user 和 uid参数 来创建新系统用户,这些值会被Docker Composer在搭建环境的时候被注入。
       最后 我们设置了我们的默认工作文件夹 /var/www 然后切换为刚创建的新用户。这样可以保证我们是以正常用户
       的方式链接上的,并且在应用容器里执行composer和artisan命令的时候处于正确的工作文件夹。


    设置Nginx 配置和数据库打包文件

    通过Docker compose创建运行环境的时候,为了设置或引导启动服务,一般要与服务的容器共享配置或者初始文件。
       不过话是这么说,有的时候还是具体情况具体调整。

      首先创建一个文件夹并在其中创建些文件来搞定配置及服务容器初始化。
       执行
      

    mkdir -p docker-compose/nginx #创建文件夹

      执行 批注 2020-07-12 020141
      

    nano docker-compose/nginx/travellist.conf

      复制下面::

        server {
           listen 80;
           index index.php index.html;
           error_log  /var/log/nginx/error.log;
           access_log /var/log/nginx/access.log;
           root /var/www/public;
           location ~ .php$ {
               try_files $uri =404;
               fastcgi_split_path_info ^(.+.php)(/.+)$;
               fastcgi_pass app:9000;
               fastcgi_index index.php;
               include fastcgi_params;
               fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
               fastcgi_param PATH_INFO $fastcgi_path_info;
           }
           location / {
               try_files $uri $uri/ /index.php?$query_string;
               gzip_static on;
           }
         }

      然后保存。

      解释一下,就是配置Nginx监听80端口,然后使用index.php文件作为默认首页。并设置文件夹根目录为
       /var/www/public ,并设置Nginx通过9000端口使用app服务处理php文件。

      为设置Mysql数据库,需要共享一个数据库打包文件,然后在容器初始化的时候引入它。这个特性是
       在该容器中使用的MySQL5.7镜像提供的。


       执行
      

    mkdir docker-compose/mysql

      执行
      

    nano docker-compose/mysql/init_db.sql

       然后

      DROP TABLE IF EXISTS `places`;
    
      CREATE TABLE `places` (
         `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
         `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
         `visited` tinyint(1) NOT NULL DEFAULT '0',
         PRIMARY KEY (`id`)
       ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
    
      INSERT INTO `places` (name, visited) VALUES ('Berlin',0),('Budapest',0),('Cincinnati',1),('Denver',0),('Helsinki',0),('Lisbon',0),('Moscow',1),('Nairobi',0),('Oslo',1),('Rio',0),('Tokyo',0);
    
    
    


       保存。
      
       这一段就是创建一个place表,然后插入一条示例数据。

      应用的Dockerfile和服务初始化配置搞完了。

    使用Docker Compose创建多容器环境

      Docker Compose可以给运行在Docker上的应用创建多容器环境的。

      一般在根目录下创建一个docker-compose.yml文件,里面定义不同服务如app,db,nginx的配置。

      基于前面创建的那个Dockerfile搞出来的travellist镜像,它会运行一个容器,该容器使用php-fpm解析php代码,
       返回结果由另一个容器中的Nginx服务来处理。
       然后mysql服务是由一个运行MySQL 5.7的服务的容器提供的。

      这三个容器要由一个叫travellist的网桥连接起来。

      应用的文件会通过bind mounts 在app和nginx服务间同步。,这个bing mounts允许宿主机和容器间的双向同步。


       执行

      nano docker-compose.yml

      一般来说格式要定义成这样:

      version: "3.7" #标准格式,就是版本定义
      services: #紧接着就是服务
    
    
      networks: #再接着就是网络
        travellist:
           driver: bridge #桥接
    

    可以把没注释的这个骨架给复制到docker-compose.yml中

      开始编辑app db nginx服务的代码:

      1.首先是app服务的:

        app:
          build: #即告知docker compose需要使用user参数,uid参数及Dockerfile配置在context路径下,生成一个app服务的本地镜像
            args:
              user: tieress
              uid: 1000
            context: ./
            dockerfile: Dockerfile #此镜像使用的dockerfile与docker-compose.yml文件同目录
          image: travellist #这是容器保存的镜像名
          container_name: travellist-app #这是给容器的命名
          restart: unless-stopped #总是重启,除非服务停止。
          working_dir: /var/www/ #本app容器为了执行artisan命令,需要搞一个工作目录
          volumes: #创建一共享卷,在本容器中,同步当前文件夹./的内容到[:] /var/www文件夹【这个目录是nginx容器中的/var/www目录】
            - ./:/var/www
           networks: #配置本服务使用一个叫travellist的网络通信
            - travellist


       2.接下来是db服务:
       因为docker compose会自动加载与docker-compose.yml文件同目录的.env文件,所以我们可以使用先前修改的.env文件中的变量配置

        db:
           image: mysql:5.7 #直接用MysSQL5.7这个官方包
          container_name: travellist-db
           restart: unless-stopped
           environment: #下面就是使用.env中的配置了
            MYSQL_DATABASE: ${DB_DATABASE}
             MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
             MYSQL_PASSWORD: ${DB_PASSWORD}
             MYSQL_USER: ${DB_USERNAME}
             SERVICE_TAGS: dev
             SERVICE_NAME: mysql
           volumes:  #创建一个卷,共享用于初始化应用数据库的数据库dump包文件。
                    #MySQL镜像会自动引入容器里面存放于docker-entrypoint-initdb.d文件夹下的.sql文件
            - ./docker-compose/mysql:/docker-entrypoint-initdb.d
           networks:
             - travellist

      3.最后是nginx服务:
       使用预制的Nginx镜像

        nginx:
            image: nginx:1.19.1-alpine
            container_name: travellist-nginx
            restart: unless-stopped
            ports:
               - 8000:80 #使用ports定义,创建一个从宿主机8000端口重定向到容器内80端口的重定向。
            volumes: #创建两个共享卷
              - ./:/var/www #这个会同步当前文件夹到/var/www文件夹,当应用本地修改后,会立即同步到nginx服务容器中。
              - ./docker-compose/nginx:/etc/nginx/conf.d #同步nginx配置文件复制到容器中Nginx配置文件夹内。
            networks:
               - travellist


       然后保存!

    跑起来!

      执行
      

    docker-compose build app #生成我们的app镜像

      生成完毕批注 2020-07-12 031527

      执行
     

     docker-compose up -d #后台运行起来。-d就是后台模式

      执行
     

     docker-compose ps #查看运行中的服务

    批注 2020-07-12 031754
       环境跑起来了,接着执行几个命令完成应用的设置。
       注:可以通过docker-compose exec 来执行命令,比如
         执行 docker-compose exec app ls -l #用于查看应用文件夹内的文件详细信息。批注 2020-07-12 032030
       执行
      

    docker-compose exec app composer install #安装应用依赖包

      执行
     

     docker-compose exec app php artisan key:generate #生成key 【laravel配置步骤】

    批注 2020-07-12 032318 

    然后就可以访问8000端口看网站了。

    批注 2020-07-12 032420
       本地机就是localhost:8000 服务器就是服务器ip:8000 绑定了域名的就是域名:8000
       如果测试完了上线直接改端口映射 80:80 443:443这样。

      另外
       执行
      

    docker-compose logs nginx #可以查看服务生成的logs

       执行
     
     docker-compose pause  #暂停服务 但是不丢状态

       执行
      docker-compose unpause #恢复

      执行

      docker-compose down #停止 会移除全部容器,networks和卷

       更多的命令查看  https://docs.docker.com/compose/reference/

  • 相关阅读:
    C++小结
    进程
    JavaScript中如何获取当前点击对象信息!
    form表单中enctype="multipart/form-data"的传值问题
    WebMagic框架总结
    工具类:自己总结的利用fileupload包上传文件的工具类!
    工具类:关于如何找到两个List数组中不同的数据的算法!
    工具类:关于解决数据库中的日期格式,经过response.getWriter().write(json)打到前台日期格式混乱的问题的总结
    工具类:将其他编码类型转换成UTF-8或者其他类型的工具类
    博主收藏的前端框架,极力推荐!
  • 原文地址:https://www.cnblogs.com/dzkjz/p/13286884.html
Copyright © 2011-2022 走看看