laravel-admin配置到阿里雲linux伺服器中,使用Docker映象部署

zhumengyang發表於2020-12-15

在阿里雲 Linux 伺服器安裝 Docker 映象並部署 Laravel-admin ,使用 Docker-Network網路,資料持久化到宿主機

版本資訊

  • Linux 3.10.0-1127.19.1.el7.x86_6
  • Docker version 19.03.13
  • Laravel Framework 5.5.50
  • Laravel-admin 1.5.x-dev

docker 映象要求

  • 基於Alpine Linux的容器。
  • Nginx Web伺服器。
  • PHP 7.0或更高版本。
  • OpenSSL PHP擴充套件。
  • PDO PHP擴充套件。
  • Mbstring PHP擴充套件。
  • Tokenizer PHP擴充套件。
  • XML PHP擴充套件。

1. 在合適的目錄下建立 adminDocker目錄

mkdir adminDocker

2. 進入目錄cd adminDocker 建立 Dockerfile 檔案 vim Dockerfile

FROM nginx:mainline-alpine
LABEL maintainer="zhumengyang <XXX@163.come>" 

COPY start.sh /start.sh
COPY nginx.conf /etc/nginx/nginx.conf
COPY supervisord.conf /etc/supervisord.conf
COPY site.conf /etc/nginx/sites-available/default.conf

RUN echo "#aliyun" > /etc/apk/repositories
RUN echo "https://mirrors.aliyun.com/alpine/v3.10/main/" >> /etc/apk/repositories
RUN echo "https://mirrors.aliyun.com/alpine/v3.10/community/" >> /etc/apk/repositories
RUN apk update

RUN apk add --update curl  php7-fpm php7  php7-dev  php7-apcu  php7-bcmath  php7-xmlwriter  php7-ctype  php7-curl  php7-exif  php7-iconv  php7-intl  php7-json  php7-mbstring php7-opcache  php7-openssl  php7-pcntl  php7-pdo  php7-mysqlnd  php7-mysqli  php7-pdo_mysql  php7-pdo_pgsql  php7-phar  php7-posix  php7-session  php7-xml  php7-simplexml  php7-mcrypt  php7-xsl  php7-zip  php7-zlib  php7-dom  php7-redis php7-tokenizer  php7-gd  php7-fileinfo  php7-zmq  php7-memcached  php7-xmlreader 

RUN curl -sS https://getcomposer.org/installer | \
php -- --install-dir=/usr/bin/ --filename=composer

RUN apk add --update bash vim openssh-client supervisor

RUN apk add --no-cache --repository http://dl-3.alpinelinux.org/alpine/edge/testing gnu-libiconv
ENV LD_PRELOAD /usr/lib/preloadable_libiconv.so php

RUN mkdir -p /etc/nginx && \
mkdir -p /etc/nginx/sites-available && \
mkdir -p /etc/nginx/sites-enabled && \
mkdir -p /run/nginx && \
ln -s /etc/nginx/sites-available/default.conf /etc/nginx/sites-enabled/default.conf && \
mkdir -p /var/log/supervisor && \
rm -Rf /var/www/* && \
chmod 755 /start.sh

RUN sed -i -e "s/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g" \
-e "s/variables_order = \"GPCS\"/variables_order = \"EGPCS\"/g" \
/etc/php7/php.ini && \
sed -i -e "s/;daemonize\s*=\s*yes/daemonize = no/g" \
-e "s/;catch_workers_output\s*=\s*yes/catch_workers_output = yes/g" \
-e "s/user = nobody/user = nginx/g" \
-e "s/group = nobody/group = nginx/g" \
-e "s/;listen.mode = 0660/listen.mode = 0666/g" \
-e "s/;listen.owner = nobody/listen.owner = nginx/g" \
-e "s/;listen.group = nobody/listen.group = nginx/g" \
-e "s/listen = 127.0.0.1:9000/listen = \/var\/run\/php-fpm.sock/g" \
-e "s/^;clear_env = no$/clear_env = no/" \
/etc/php7/php-fpm.d/www.conf

EXPOSE 443 80
WORKDIR /var/www

CMD ["/start.sh"]

3.目錄下建立 start.sh 檔案

vim start.sh

4.檔案內容:

#!/bin/bash

# ----------------------------------------------------------------------
# Create the .env file if it does not exist.
# ----------------------------------------------------------------------
if [[ ! -f "/var/www/.env" ]] && [[ -f "/var/www/.env.example" ]];
then
    cp /var/www/.env.example /var/www/.env
fi

# ----------------------------------------------------------------------
# Run Composer
# ----------------------------------------------------------------------
if [[ ! -d "/var/www/vendor" ]];
then
    cd /var/www
    composer update
    composer dump-autoload -o
fi

# ----------------------------------------------------------------------
# Start supervisord
# ----------------------------------------------------------------------
exec /usr/bin/supervisord -n -c /etc/supervisord.conf

5. adminDocker 目錄下建立 nginx.conf 檔案

vim nginx.conf

6.nginx.conf檔案內容

user nginx;
worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    access_log off;
    sendfile on;
    #tcp_nopush on;
    keepalive_timeout 65;
    #gzip on;
    client_max_body_size 50m;
    include /etc/nginx/sites-enabled/*.conf;
}

7. 同樣建立 site.conf 檔案

vim site.conf

8. site.conf 檔案內容

server {
    listen 80;

    root /var/www/public;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ /\. {
        deny all;
    }

    location ~ \.php$ {
        try_files $uri = 404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

9.建立 supervisord.conf 檔案

vim supervisord.conf

10. supervisord.conf 檔案內容

[unix_http_server]
file=/dev/shm/supervisor.sock

[supervisord]
logfile=/tmp/supervisord.log
logfile_maxbytes=50MB
logfile_backups=10
loglevel=warn
pidfile=/tmp/supervisord.pid
nodaemon=false
minfds=1024
minprocs=200
user=root

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///dev/shm/supervisor.sock

[program:php-fpm7]
command = /usr/sbin/php-fpm7 --nodaemonize --fpm-config /etc/php7/php-fpm.d/www.conf
autostart=true
autorestart=true
priority=5
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

[program:nginx]
command=/usr/sbin/nginx -g "daemon off;"
autostart=true
autorestart=true
priority=10
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

11. adminDocker 目錄下建立 src 資料夾,把你的 Laravel-admin 專案程式碼git clone下來,或者 cpoy 進去。 adminDocker 目錄下面執行 ls 應該是下面幾個目錄檔案

[root@bogon www]# ls
Dockerfile  site.conf  src  start.sh  supervisord.conf
[root@bogon www]# cd src/
[root@bogon src]# ll
總用量 4
drwxrwxrwx. 12 root root 4096 1210 15:18 adminData
# 這裡我 clone 下來的是個 adminData 專案

12. 在 /var/www/adminDocker 路徑下構建 docker 映象

// 構建名稱為 myImage 映象檔案
docker build -t  myImage .

13. 拉取 Mysql 映象

// 這裡我用的是 Mysql 5.6
docker pull mysql:5.6

14. 建立資料卷

mkdir /var/www/adminDocker/src/adminMysqlData

15. 在 Docker 中建立網路(只需要執行第一個命令)

// 建立名字為 adminNet 的網路
docker network adminNet

// 檢視所有的 docker network
docker network ls

// 檢視名字為 adminNet 中的 Docker Network
docker network inspect adminNet

// 刪除名字為 adminNet 的 Docker Network 
docker network rm adminNet

16. 檢視構建的 Dokcer 映象

// 會有 myImage 和 mysql5.6 的映象檔案
docker images

17.容器執行, 終端上執行以下命令:


// Mysql 容器
// -d 後臺執行容器
// --restart always ,Docker重啟後自動重啟該容器
// -p 指定埠對映,格式為:主機(宿主)埠:容器埠。這裡是 3307 對映到 3306
// -v 繫結資料卷(剛剛建立的 adminMysqlData 和 adminData 資料夾下)
// --name 給容器重新命名
// --network 連結哪一個 Docker Network
// --network-alias 給當前映象檔案在 Network 中取別名
// -e 這裡樓主不是很清楚就不寫了哈
// 最後寫上剛剛拉下來的 mysql:5.6 即可

docker run -d --restart always -p 3307:3306 -v /var/www/adminDocker/src/adminMysqlData:/var/lib/mysql --name adminMysql --network adminNet --network-alias adminMysql -e MYSQL_ROOT_PASSWORD=root mysql:5.6


// Laravel-admin 容器
// -p 指定埠對映,格式為:主機(宿主)埠:容器埠。這裡是 8000 對映到 80
// -v 繫結資料卷(剛剛建立的 adminMysqlData 和 adminData 資料夾下)
// --privileged=true 以 root 許可權去執行,否則在該 Docker 容器中沒有許可權使用命令
// -e 這裡樓主不是很清楚就不寫了哈
// 最後寫上剛剛拉下來的 myImage 即可

docker run -d --restart always -p 8000:80 -v /var/www/adminDocker/src/adminData:/var/www --privileged=true --name adminWeb --network adminNet --network-alias adminWeb -e MYSQL_ROOT_PASSWORD=root -e DB_HOST= bpMysql myImage

18. 在 Mysql 容器中建立資料庫並匯入檔案

// 檢視 Mysql 的 CONTAINER ID
docker ps -a
root@bogon src]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                   PORTS               NAMES
22e0082dbf46        myImage      "/docker-entrypoin..."   1 days ago          Exited (0) 4 days ago                        adminWeb
a1ca8c42ac4f        mysql:5.6           "docker-entrypoint..."   4 days ago          Exited (0) 4 days ago                     adminMysql

// 將 data.sql 匯入到 Mysql 中的根路徑下 (原資料庫檔案)
// a1ca8c42ac4f 為 Mysql 的 CONTAINER ID
docker cp /var/www/adminDocker/src/adminData/data.sql a1ca8c42ac4f:/

// 進入 Mysql 容器
docker exec -it a1ca8c42ac4f  bash

// 檢視剛剛複製過來的檔案
root@a1ca8c42ac4f:/# ls
bin   docker-entrypoint-initdb.d  home     media    proc  sbin    sys  var
boot  entrypoint.sh          lib     mnt    root  srv    tmp
dev   etc              lib64  opt    run   data.sql    usr

// 連線資料庫
// --default-character-set=utf8 設定 utf8 字符集,不然匯入的中文資料會亂碼
// -u 使用者名稱
// -p 回車,會讓你輸入密碼,設定的是 root
mysql --default-character-set=utf8 -uroot -p

// 然後建立 adminDb 資料庫
create database adminDb;

// 選擇該資料庫
use adminDb;

// 匯入檔案
source /data.sql;

// 退出 Mysql 連線
exit;

// 退出 Mysql 容器
exit;

19. 在 Laravel-admin 容器中初始化專案

// 在 18 步中獲取到的容器 CONTAINER ID
docker exec -it 22e0082dbf46 bash

// 進來之後是在 /var/www 路徑下,可以看到你 clone 下來的專案檔案
// 建議把本地的 .env檔案內容 複製過來一份

// 複製 .env 檔案
cp .env.example .env

// 編輯 .env 檔案
vim .env

// 加上自定義字首: ADMIN_ROUTE_PREFIX=/laravel

// 這裡 DB_HOST 要寫剛剛建立 Mysql 容器時候的 --name 值,埠還是寫3306
// 可能有些同學會迷糊,為什麼剛剛埠對映的是 3307 現在還要寫 3306 。
// 因為那個 3307 是對外埠,這裡連線的 Mysql 是對內的(自己理解哈)

DB_CONNECTION=mysql
DB_HOST=adminMysql
DB_PORT=3306
DB_DATABASE=adminDb
DB_USERNAME=root
DB_PASSWORD=root

// 初始化專案要新增 key 
php artisan key:gen

// 順便修改一下存放日誌的資料夾可能沒有許可權(許可權已實際情況分配)
chmod -R 755 storage/*

// 測試一下是否連線上了資料庫,如果連線不上看一下當時 run Mysql 時候 --name 值 
php artisan migrate

20. 訪問你的IP + 埠號8000 + ADMIN_ROUTE_PREFIX自己寫的配置

192.168.0.217:8000/admin

參考文件: 嘗試使用 docker 部署 Laravel 專案

本文連結:部落格:laravel-admin配置到阿里雲linux伺服器中,使用Docker映象部署

剛開始記錄,覺得不錯可以點個贊,有問題可以評論下來哈:grin:

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章