本文主要是為了記錄我研究Alpine部署typecho的過程,當然過程並不像文章裏這麼順利,主要是開始搞錯了方向,使我遇到了"技術難題".如果你也苦惱 容器內服務開機自啓的問題,建議看看《誰是Docker容器的init(1)進程》/)
文章參考了《在docker的alpine類鏡像上安裝LNMP服務》《Alpine Linux使用教程》
ftp
docker run \
--name vsftpd \
-d \
-e FTP_USER=www \
-e FTP_PASS=my-password \
-e PASV_ADDRESS=5.6.7.8 \
-e PASV_MIN=21100 \
-e PASV_MAX=21110 \
-p 21:21 \
-p 21100-21110:21100-21110 \
avenus/vsftpd-alpine
docker exec -it vsftpd sh
發現開啓了很多端口 -p 21100-21110:21100-21110這些都是被動模式端口,關於被動端口百度是這樣説的:
FTP 分為兩類,PORT FTP和PASV FTP,PORT FTP是一般形式的FTP。它們的區別在於使用數據傳輸端口(ftp- data)的方式。PORT FTP由FTP服務器指定數據傳輸所使用的端口,默認值為20。PASV FTP由FTP客户端決定數據傳輸的端口。
所以可以通過更改vsftpd配置文件關閉所有端口,重新打包鏡像,刪除-p 21100-21110:21100-21110,只保留21端口
ftp客户端需要關閉被動模式
nginx
指定國內鏡像源
- 輸入命令行打開repositories文件
vi /etc/apk/repositories
- 在文件中輸入源地址:
http://mirrors.aliyun.com/alp...
http://mirrors.aliyun.com/alp...
更新
更新一下使源地址生效
apk update
安裝nginx
apk add --no-cache nginx
保護pid
mkdir /run/nginx
建立ftp用户並可以直接操作nginx目錄
adduser -h /etc/nginx -s /sbin/nologin php -G root
更改目錄屬性,賦予ftp用户讀寫權限
chmod -R 777 /etc/nginx
新建設置網頁
- 新建一個網頁index.html
用軟件登陸FTP
在/etc/nginx裏新建一個html文件夾
在文件夾裏新建一個 index.html文件做為nginx的首頁
- 打開index寫一個簡單的html頁面或是隻輸入一行文字如
hello world
修改nginx的配置文件
- 修改配置文件/etc/nginx/conf.d/default.conf,只保留最基本配置
server {
listen 80 default_server;
location / {
index index.html;
root /etc/nginx/html;
}
location = /404.html {
internal;
}
}
訪問http://192.168.5.116:18080頁面顯示hello world表示成功
php
安裝php 及拓展
apk add php7-fpm php7-mcrypt php7-soap php7-openssl php7-gmp php7-json php7-dom php7-pdo php7-zip php7-apcu php7-pdo_pgsql php7-bcmath php7-pdo_mysql php7-pdo_sqlite php7-gettext php7-xmlreader php7-xmlrpc php7-bz2 php7-iconv php7-pdo_dblib php7-curl php7-ctype php7-mbstring php7-gd
- 模塊文件位置/usr/lib/php7/modules
- 這裏忘記需不需要安裝Sqlite3了,我應該是沒有安裝 ,沒能進入數據庫
在html文件夾新建info.php文件
<?php
phpinfo();
- 修改/etc/nginx/conf.d/default.conf文件,增加php支持
server {
listen 80;
index index.html index.php;
location / {
index index.html;
root /etc/nginx/html;
#實現PHP偽靜態 因為會用typecho做例子所以這個是適用於typecho的
#可以百度其他nginx偽靜態寫法
if (-f $request_filename/index.html){
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-e $request_filename){
rewrite (.*) /index.php;
}
}
# You may need this to prevent return 404 recursion.
location = /404.html {
internal;
}
#添加php支持
location ~ .php {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /etc/nginx/html/$fastcgi_script_name;
include fastcgi_params;
}
}
啓動php-fpm重啓nginx
php-fpm7 --daemonize
nginx -s reload
打開瀏覽器訪問http://192.168.5.116:18080/info.php會顯示php信息,表示成功
typecho
下載typecho 解壓,ftp上傳到html文件夾,
打開瀏覽器訪問http://192.168.5.116:18080
- 創建數據庫時可能會報錯,需要給usr文件夾讀寫權限
- 由於php擴展組件安裝不全所以有些頁面可能會報錯
typecho call to undefined function session_start()
解決
#查詢有關session軟件
apk search session
#選擇自己php 版本對應的插件
apk add php7-session
#重啓PHP
killall php-fpm7
php-fpm7 --daemonize
- 後台點擊插件管理出錯
Call to undefined function token_get_all()
同理查找到了這個擴展 php7-tokenizer-7.1.17-r0 安裝後重啓
- 如果在永久鏈接設置界面啓用地址重寫(其實就是偽靜態)報錯可以不用管 直接勾選
- 如果啓用插件404了就是地址重寫出了問題,對照default.conf是不是和我寫的一樣,或者百度typecho 偽靜態
- typecho網站的logo可以在網站根目錄即html文件夾裏添加favicon.ico,如果沒效果可以試試清楚瀏覽器緩存或者在隱私窗口打開網站
開機自啓
安裝管理軟件
apk add openrc
設置開機自啓
rc-update add php-fpm7
rc-update add nginx
測試是否可以正常啓動
rc-service vsftp start
報錯了 awk: /etc/network/interfaces: No such file or directory
- docker環境中修復awk: /etc/network/interfaces: No such file or directory問題
sed -i 's/#rc_sys=""/rc_sys="lxc"/g' /etc/rc.conf &&\
echo 'rc_provide="loopback net"' >> /etc/rc.conf
將CMD改成init系統啓動
這時FTP連不上了???
把vsftpd也添加到開機自啓
rc-update add vsftpd
測試是否可以啓動
rc-service vsftp start
sh到這裏發現vsftp 也可以自己安裝,具體方法網上也有並不難,這裏就不再説明了
打包鏡像
docker commit -a "liwenwen" -m "apache" alpine lnmp-alpine:vxx
啓動
docker run \
--name blog \
--restart=always \
-d \
-p 81:80 \
-p 8081:8080 \
-p 21:21 \
lnmp-alpine:vxx