搭建个 LNMP 网站环境,想达到以下目的:
我了解的,有三个解决方式:
最终选择了docker。docker使用起来一点也不复杂,laradock.io上的一句话
Use Docker First - Then Learn About It Later
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
$ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
官方镜像地址 hub.docker.com 太慢,阿里云有镜像加速,镜像地址每个人不一样,需要登录阿里云账号查看:产品与服务—>弹性计算—>容器镜像加速
docker 需要 root 权限才能执行,通过将普通用户加入 docker 用户组,可以使用普通用户运行 docker
sudo usermod -aG docker ${username}
测试 docker 是否安装成功 docker version
,如果没有 server 部分,说明docker安装了没有运行。
测试镜像是否设置成功 docker info
,最下面会有 Registry Mirrors
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
Dockefile 是创建镜像image的
docker-compose.yml 是创建容器的
#### DOCKER#####
docker build -t friendlyname . #使用当前目录下的Dockerfile创建镜像
docker run -p 4000:80 friendlyname # 运行"friendlyname" 映射宿主机端口4000到容器端口80
docker run -d -p 4000:80 friendlyname # 同上,但是以后台模式运行
docker exec -it [container-id] bash # 进入一个运行中的容器
docker ps # 列出所有运行中的容器
docker stop # 停止指定的容器
docker ps -a # 列出所有容器,包括停止运行的
docker kill # 强制停止指定容器
docker rm #删除指定的容器
docker rm $(docker ps -a -q) # 删除所有容器
docker images -a # 列出所有的镜像
docker rmi #删除指定的镜像
docker rmi $(docker images -q) # 删除所有的镜像
docker login # 登录docker hub
docker tag username/repository:tag # 给镜像打标签
docker push username/repository:tag # 上传镜像
docker run username/repository:tag # 从仓库运行镜像
docker system prune # 删除所有未使用的容器、网络、镜像、卷等
docker system prune -a # Remove all unused containers, networks, images not just dangling ones (Docker 17.06.1-ce and superior)
docker volume prune # 删除所有未使用的卷
docker network prune # 删除所有未使用的网络
##### DOCKER COMPOSE#########
docker-compose up # 创建并启用容器
docker-compose up -d # 以后台模式创建并启用容器
docker-compose down # 停止并删除容器、网络和卷
docker-compose logs #查看容器的输出
docker-compose restart # 重启所有容器
docker-compose pull # 拉去所有的镜像服务
docker-compose build # 创建所有的镜像服务
docker-compose config # 确认并展示 Compose 文件
docker-compose top # 显示所有运行的进程
docker-compose run -rm -p 2022:22 web bash # 运行web服务并以bash作为命令,运行完成后删除
三种方式:
docker run
中通过参数连接不同的容器。docker-compose up
来一键生成环境。当然是选择最后一种了。docker LNMP这么通用的需求,GitHub上有的是项目。最终选择了laradock3。
laradock是为 Laravel 框架创建的 docker-compose,Laravel 框架都能用,创建个PHP环境就更没问题了,8.6k的star,2.9k的fork,还有专门的文档网站,值得拥有。
docker-compose up -d nginx mysql phpmyadmin redis workspace
安装文档的介绍,只需上面的这一条命令,环境就搭建好了。但是,如果此时如果你通过浏览器访问服务器的话,大概率会得到一个nginx的404页面,主要原因是进程的运行用户和文件的访问权限问题。默认情况是nginx进程的UID是82,php-fpm进程的UID是1000。具体操作官网有介绍,我使用中觉得以下几点要注意:
创建一个用户,不能登录后台,
sduo useradd -s /sbin/nologin www
此时,在 /home/www 新建public子目录,放入一个index.php文件,然后更改文件权限。因为nginx进程是以UID82访问,所以给予其他用户读和执行的权限
sudo chmod -R a+x /home/www
sudo chmod -R a+r /home/www
生成环境中只把需要的service剪裁处理,nginx,php-fpm,MySQL,phpmyadmin。新建一个.yml文件。
laradock因为是为laravel文件创建的,所以启动php时会自动启动一个workspace 容器和一个docker-in-docker容器,为节省服务器资源,在depend-on和link中去掉。
laradock没有ftp,试了几款,发现stilliard/pure-ftp最好用4,可以指定运行用户和目录。
mysql目录下的my.cnf文件中添加default_authentication_plugin=mysql_native_password
,否则,很多数据库客户端无法访问。官方还建议宿主机不要对外暴露3306端口,即去掉端口映射port。
.env的主要修改内容有:
# 宿主机上的网站地址
APP_CODE_PATH_HOST=/home/www
# 数据存储的位置,比如mysql的数据库数据,ftp的账号数据。
DATA_PATH_HOST=../lnmpf/data
# 项目名称,容器名的前缀
COMPOSE_PROJECT_NAME=vdlnmpf
# 设置成www用户的UID,GID
PHP_FPM_PUID=1000
PHP_FPM_PGID=1000
还有mysql的密码和ftp的用户密码。
容器运行后再修改,最好把DATA_PATH_HOST的文件都删掉,否则修改没有作用5
具体的docker-compose 文件欢迎访问:https://github.com/mengxiangmengyuan/docker-lnmp-ftp
https://docs.docker.com/install/linux/docker-ce/centos/ ↩︎
https://docs.docker.com/compose/install/ ↩︎
https://laradock.io/ ↩︎
https://hub.docker.com/r/stilliard/pure-ftpd ↩︎
https://segmentfault.com/a/1190000017205616 ↩︎