星期三, 25 12月 2019 06:40

docker 搭建 LNMP + FTP 环境

Written by
Rate this item
(0 votes)

需求

搭建个 LNMP 网站环境,想达到以下目的:

  1. 一键安装,不要一个个的安装nginx,php,mysql,然后再手动连接起来;
  2. 方便升级和切换不同的版本
  3. 最好不污染系统环境

我了解的,有三个解决方式:

  1. shell脚本,比如lnmp.org
  2. 各种面板,国外的cPanel,收费;国内的宝塔面板
  3. docker。

最终选择了docker。docker使用起来一点也不复杂,laradock.io上的一句话

Use Docker First - Then Learn About It Later

先使用docker,然后再慢慢了解。docker 架构

安装 docker 和 docker-compose

centos 安装 docker1

移除旧版本
$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
安装docker
$ 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
启动docker并设置自启动
sudo systemctl start docker
sudo systemctl enable docker
配置镜像,检查docker是否安装成功

官方镜像地址 hub.docker.com 太慢,阿里云有镜像加速,镜像地址每个人不一样,需要登录阿里云账号查看:产品与服务—>弹性计算—>容器镜像加速
阿里云镜像加速
docker 需要 root 权限才能执行,通过将普通用户加入 docker 用户组,可以使用普通用户运行 docker

sudo usermod -aG  docker ${username}

测试 docker 是否安装成功 docker version ,如果没有 server 部分,说明docker安装了没有运行。启动成功后的输出
测试镜像是否设置成功 docker info ,最下面会有 Registry Mirrors
镜像设置成功后的输出

安装 docker-compose2

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

docker常用命令小全cheatsheet

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 <hash>                          # 停止指定的容器
docker ps -a                                # 列出所有容器,包括停止运行的
docker kill <hash>                          # 强制停止指定容器
docker rm <hash>                            #删除指定的容器
docker rm $(docker ps -a -q)                # 删除所有容器
docker images -a                            # 列出所有的镜像
docker rmi <imagename>                      #删除指定的镜像
docker rmi $(docker images -q)              # 删除所有的镜像
docker login                                # 登录docker hub
docker tag <image> 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作为命令,运行完成后删除

搭建LNMP + FTP 环境

三种方式:

  1. 自己写好dockerfile文件,创建镜像,然后docker run中通过参数连接不同的容器。
  2. 自己写好dockerfile文件,自己写好docker-compose.yml 文件,然后通过docker-compose up来一键生成环境。
  3. GitHub上搜一个LNMPdocker-compose ,然后剪裁一个。

当然是选择最后一种了。docker LNMP这么通用的需求,GitHub上有的是项目。最终选择了laradock3

laradock是为 Laravel 框架创建的 docker-composeLaravel 框架都能用,创建个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

裁剪一个docker-compose文件

  1. 生成环境中只把需要的service剪裁处理,nginx,php-fpm,MySQL,phpmyadmin。新建一个.yml文件。

  2. laradock因为是为laravel文件创建的,所以启动php时会自动启动一个workspace 容器和一个docker-in-docker容器,为节省服务器资源,在depend-on和link中去掉。

  3. laradock没有ftp,试了几款,发现stilliard/pure-ftp最好用4,可以指定运行用户和目录。

  4. mysql目录下的my.cnf文件中添加default_authentication_plugin=mysql_native_password ​​​​,否则,很多数据库客户端无法访问。官方还建议宿主机不要对外暴露3306端口,即去掉端口映射port。

  5. .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

  6. 具体的docker-compose 文件欢迎访问:https://github.com/mengxiangmengyuan/docker-lnmp-ftp


  1. https://docs.docker.com/install/linux/docker-ce/centos/ ↩︎

  2. https://docs.docker.com/compose/install/ ↩︎

  3. https://laradock.io/ ↩︎

  4. https://hub.docker.com/r/stilliard/pure-ftpd ↩︎

  5. https://segmentfault.com/a/1190000017205616 ↩︎

Read 67 times Last modified on 星期二, 31 12月 2019 03:16

提交评论

安全码
刷新

博客标签

© Copyright 2020 zhuameng.com. All Rights Reserved.鲁ICP备16037764号-3

Search