docker Alpine部署LNMP +FTP 超小镜像

本文主要是为了记录我研究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服务器指定数据传输所使用的端口,默认值为20PASV 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

作者:李文文

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在 Docker部署 LNMP,需要先安装 Docker 环境,然后创建一个 Dockerfile 文件来定义镜像的构建过程。 以下是一个简单的 Dockerfile 文件示例,可以用于构建 LNMP 镜像: ``` # 基础镜像 FROM ubuntu:18.04 # 设置环境变量 ENV DEBIAN_FRONTEND noninteractive # 安装 Nginx、PHP 和 MySQL RUN apt-get update && apt-get install -y nginx php7.2-fpm php7.2-mysql mysql-server # 配置 Nginx 和 PHP COPY default /etc/nginx/sites-available/default COPY index.php /var/www/html/index.php # 暴露端口 EXPOSE 80 # 启动命令 CMD ["/usr/sbin/nginx", "-g", "daemon off;"] ``` 在这个示例中,我们使用 Ubuntu 18.04 作为基础镜像,安装了 Nginx、PHP 和 MySQL,并将默认的 Nginx 配置文件和一个简单的 PHP 文件复制到镜像中。然后,我们暴露了 80 端口,并设置了启动命令为启动 Nginx。 要构建镜像,可以使用以下命令: ``` docker build -t mylnmp . ``` 其中,`mylnmp` 是镜像的名称,`.` 表示 Dockerfile 文件所在的当前目录(注意结尾的点号)。 构建完成后,可以使用以下命令启动容器: ``` docker run -d -p 80:80 mylnmp ``` 其中,`-d` 表示后台运行容器,`-p 80:80` 表示将容器的 80 端口映射到主机的 80 端口(也可以使用其他未被占用的端口),`mylnmp` 是镜像的名称。运行后,可以通过浏览器访问 http://localhost/ 来测试 LNMP 是否正常工作。 请注意,在实际生产环境中,需要根据具体需求进行更详细的配置和优化,例如设置 MySQL 的安全配置、使用 HTTPS 等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈宗珺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值