在阿里雲 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 12月 10 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映象部署
剛開始記錄,覺得不錯可以點個贊,有問題可以評論下來哈
本作品採用《CC 協議》,轉載必須註明作者和本文連結