最近才发现ThinkPHP6.0和CI4.x都要求php版本为7.1以上了,本机的php版本还停留在7.0.3x,又懒得升级,于是考虑使用Docker来运行一个lnmp环境。
常规环境搭建的方式有两种,一种是把php、mysql、nginx分别编写一个Dockerfile,然后再使用docker-compose.yml来编写一个容器互连的配置,使用docker-compose来管理和生成容器。另外一种方式是把php、nginx、mysql都安装到一个镜像里面,简单粗暴。根据目的和可维护性来看,如果是想长期维护且对各个软件的版本要求比较灵活的话,使用docker-compose方式生成的容器和镜像更加方便。但是如果只是搭建本地环境(个人开发者,非团队),不是很频繁地调整环境,我宁愿使用第二种简单的方式。
安装专业的说法,第一种编写方式生成的容器叫thin container(瘦容器),第二种方式生成的容器叫fat container(胖容器)。fat container五脏俱全,不用再使用docker-compose去将多个容器进行配置和互连。
我由于更熟悉ubuntu,且ubuntu系统的源更加丰富和更新及时,所以考虑使用ubuntu作为容器系统。用到的系统和软件版本整理如下:
ubuntu 18.04 (长期支持版本)
php 7.4.15 (7.4.x中维护的最新版本)
mysql 5.7.33 (ubuntu18.04下默认版本)
nginx 1.18.0 (ubuntu18.04下默认版本)
根据实践,编写了Dockerfile,如下所示。
FROM ubuntu:18.04
MAINTAINER freephp "fightforphp@gmail.com"
RUN apt-get update
RUN apt-get install -y vim curl gcc
# 添加php7.4的源
RUN apt-get -y install software-properties-common
RUN add-apt-repository ppa:ondrej/php
RUN apt-get update
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
RUN apt-get install -y php7.4
RUN apt-get install -y php7.4-curl php7.4-fpm php7.4-gd php7.4-mysqlnd php7.4-mbstring php7.4-ldap php7.4-soap php7.4-mongod php7.4-soap php7.4-sqlite3
php7.4-xml
php7.4-zip
php7.4-intl
php7.4-imagick
php7.4-xdebug
# 安装composer
RUN curl -sS https://getcomposer.org/installer | php
RUN mv composer.phar /usr/local/bin/composer
# 设置composer源为阿里云
RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
# 安装mysql
RUN apt-get install -y mysql-server mysql-client
# 添加nginx配置
RUN add-apt-repository ppa:ondrej/nginx
RUN apt-get update
RUN apt-get install -y nginx
# 配置nginx
COPY ./default /etc/nginx/sites-available/default
# 添加启动脚本
ADD ./start.sh /start.sh
RUN chmod 755 /start.sh
CMD /start.sh && tail -f
# 暴露端口
EXPOSE 3306
EXPOSE 80
然后使用如下命令进行编译:
docker build -t freephp/mylnmp:v2 .
这样就得到了想要的lnmp镜像了,后面可以根据自己的需求去运行一个容器即可,例如:
docker run -id -p 80:80 -v /Users/tony/www/myphp:/var/www/html --name mylnmp2 freephp/mylnmp:v2
在Dockerfile中还有关于nginx的配置和启动脚本,其完整内容可以参考我开源在gitee上的项目lnmpdocker。