【docker實操】使用docker部署一個laravel應用

最近部署上線一個項目,新的服務器,在生產環境安裝配置nginx、php、mysql、git、composer等各類東西一大堆很麻煩。docker已經火了一段時間,已經成了後端和運維的必備技能,以前老大也說要嘗試下,因而就來體驗一下docker的魅力。本文是我學習並使用docker部署項目的一個記錄。php

docker優點

docker的主要優點能夠總結爲:一次構建,處處部署。當咱們使用docker構建好項目後,在開發環境、測試環境、生產環境均可以使用統一的鏡像來部署,保證了環境的一致。而且docker支持linux、mac os、windows三大平臺,代碼運行在容器中,不受外部操做系統的影響,只和你的鏡像有依賴關係。mysql

另外咱們能夠部署不一樣版本的應用,例如mysql5.五、mysql5.7,而且互不干擾。linux

操做思路

關於docker的安裝和相關概念在此都不贅述了,網上有不少資料,說下具體實施的思路。nginx

正確的使用方式不是項目完成後纔開始構建docker鏡像,而是項目架構、依賴、環境肯定了以後就構建和配置好docker鏡像,以後代碼的開發和運行都在容器之中。以後部署只須要移植鏡像生成容器,就能保證環境的一致。laravel

我這個項目很簡單,只用到nginx、php、mysql這三件套,nginx使用php-fpm做爲cgi解析器。須要使用三個鏡像:nginx、php-fpm、mysql。爲何要用三個鏡像而不是把這三個集成到一個大鏡像中?這是docker推薦的作法,鏡像之間儘可能解耦,方便複用,避免臃腫的鏡像,容器間經過網絡鏈接起來。git

官方提供了不少優質鏡像,咱們只須要挑選並基於官方鏡像來配置就好。github

構建鏡像

完整文件詳見個人githubsql

nginx鏡像

DockerFile:docker

FROM nginx:1.10

ADD nginx.conf /etc/nginx/nginx.conf
ADD site.conf /etc/nginx/conf.d/
ADD mkdir.sh /opt/

RUN chmod +x /opt/mkdir.sh && /opt/mkdir.sh

將基本配置和站點配置複製進去,用shell腳步來建立好log文件夾shell

php-fpm鏡像

DockerFile:

FROM php:7.0-fpm

ADD apt-list /opt/

RUN cp /etc/apt/sources.list /etc/apt/sources.list.bak \ 
    && cat /opt/apt-list > /etc/apt/sources.list \ 
    && apt-get update \ 
    && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libmcrypt-dev \
        libpng-dev

RUN docker-php-ext-install -j$(nproc) iconv mcrypt \
        && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
        && docker-php-ext-install -j$(nproc) gd \
       && docker-php-ext-install pdo_mysql \
       && docker-php-ext-install zip
        
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \
        && composer config -g repo.packagist composer https://packagist.phpcomposer.com \

php鏡像的是最麻煩的,要裝系統依賴,php擴展,composer,還要設置環境變量。php擴展那塊參考官方鏡像dockr-hub-php

使用了apt,因此咱們要修改apt源,官方php鏡像是基於debian的,不是ubuntu的源。

dockerfile一個run建一層,這裏建議apt install做爲一層,安裝php擴展做爲一層,而不是都放在一層。這樣的好處就是若是第二層php擴展裝失敗了,不用再跑一遍apt install。最後一層咱們裝上composer。

爲了讓php版本一致,咱們應該調用php容器內的php做爲cli:
docker run -it -v $PWD:/opt/code -w /opt/code my-php php -v

命令太長了,咱們能夠作個alias,在~/.bash_aliases中加入一行(注意最後空格):
alias myphp='docker run -it -v $PWD:/opt/code -w /opt/code --rm my-php '

咱們在yourpath/opt/code下建立laravel應用,修改權限,注意在宿主機將你加入www-data group:

cd ~/docker-php/opt/code
myphp composer create-project --prefer-dist laravel/laravel .
sudo chown -R www-data:www-data . && sudo chmod -R 775 .

mysql鏡像

DockerFile:

FROM mysql:5.7

mysql最簡單,直接用官方的就好了

docker-compose啓動容器

咱們如今有三個鏡像,若是一個個啓動、鏈接、掛載很麻煩,官方提供了docker-compose工具,將配置寫在一塊兒,一鍵啓動。

docker-compose.yml:

nginx:
    build: ./nginx
    ports:
      - "80:80"
    links:
      - "php"
    volumes:
      - ~/docker-php/opt:/opt

php:
    build: ./php
    ports:
      - "9000:9000"
    links:
      - "mysql"
    volumes:
      - ~/docker-php/opt:/opt

mysql:
    build: ./mysql
    ports:
      - "3306:3306"
    volumes:
      - ~/docker-php/opt/data/mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 123456

使用docker-compose up命令啓動容器組:
圖片描述

啓動訪問 yourhost:80 能夠看到熟悉的laravel歡迎頁面:
圖片描述

進入mysql容器建個數據庫建個表測試一下數據庫鏈接:
docker exec -it dockerphp_mysql_1 bash

修改yourpath/opt/code/routes:
圖片描述

測試了一下報錯:
SQLSTATE[HY000] [2002] Connection refused

google了一下,修改一下.env,把db_host改成你的ip:
DB_HOST=127.0.0.1 -> DB_HOST=yourhost

訪問/mysql,頁面輸出,大功告成:
圖片描述

Reference:

相關文章
相關標籤/搜索