Abner的博客

Docker搭建可一键部署的多域名LNMP环境

· 993 words · 5 minutes to read
Categories: 工具

Docker搭建可一键部署的多域名LNMP环境 🔗

特点 🔗

  1. 完全开源
  2. 支持多版本PHP切换(PHP5.4、PHP5.6、PHP7.2…)
  3. 支持绑定任意多个域名
  4. 支持HTTPS和HTTP/2
  5. PHP源代码位于host中
  6. MySQL data位于host中
  7. 所有配置文件可在host中直接修改
  8. 所有日志文件可在host中直接查看
  9. 内置完整PHP扩展安装命令
  10. 实际使用,确保100%可行
  11. 实现一次配置,可在任何支持Docker系统使用

安装步骤 🔗

docker安装 🔗

1. Centos7安装方法 🔗

sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum makecache fast
sudo yum -y install docker-ce
sudo service docker start

2. Ubuntu安装方法 🔗

sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get -y update
sudo apt-get -y install docker-ce

docker-compose安装 🔗

sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

查看版本,加入到docker组 🔗

$ docker -v
$ docker-compose -v
$ sudo gpasswd -a ${USER} docker     

就不用每次启动Docker都得加sudo了,注意,执行gpasswd命令之后要重新登陆才有效。

使用国内镜像仓库 🔗

  • 首先注册一个阿里云账号,然后访问阿里云的Docker镜像仓库,能找到加速器地址。
  • 对于Docker 1.10+,打开配置文件 /etc/docker/daemon.json(没有时新建该文件):
sudo mkdir -p /etc/docker
echo '{ "registry-mirrors": ["https://l714mp7z.mirror.aliyuncs.com"] }' >  /etc/docker/daemon.json
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker

#开机启动centos7
systemctl enable docker

Docker 1.10以下请看:https://yq.aliyun.com/articles/29941。

安装容器和镜像 🔗

docker-compose up -d

如果是windows下基于virtualbox挂载目录到linux 🔗

安装增强工具(centos7版本) 🔗

yum install -y gcc gcc-devel gcc-c++ gcc-c++-devel make kernel kernel-devel bzip2 vim wget  
sudo reboot  #重启
ln -s /usr/src/kernels/3.10.0(注意内核版本号自动补全) /usr/src/linux    ## 增加软连接
#点击虚拟机设备->安装增强
mount /dev/cdrom /mnt  #挂载增强光盘到系统,提示只读不用管
cd /mnt &&  ./VBoxLinuxAdditions.run

配置共享目录 🔗

手动挂载 🔗

ubuntu 🔗

sudo mkdir /home/abner/server  && chmod -R 777 /home/abner/server 
sudo mount -t vboxsf docker /home/abner/server   #手动挂载 (这里挂载的目录最好不要和共享文件夹名称一样)

centos7 🔗

sudo mkdir /root/server  && chmod -R 777 /root/server 
sudo mount -t vboxsf docker /root/server

开机自动挂载 🔗

virbox自动挂载不能勾选

ubuntu 🔗

sudo vim /etc/rc.local
##exit 0 前增加如下命令
sleep 1
sudo mount -t vboxsf docker /home/abner/server

centos7 🔗

mkdir /root/server && chmod -R 777 /root/server
mount -t vboxsf docker /root/server   #手动挂载
## 此时如果提示/sbin/mount.vboxsf: mounting failed with the error: No such device,说明内核模块vboxsf未加载,可通过lsmod | grep vboxsf查看(无结果说明未加载)。执行 `modprobe vboxsf` #加载vboxsf模块
#自动挂载
sudo vim /etc/fstab
docker /root/server   vboxsf rw,gid=100,uid=1000,auto 0 0

若走的端口转发按图如下配置 🔗

若走的桥接网卡,正常IP地址连接即可 🔗

以下部分属于扩展 🔗

目录说明 🔗

大致框架 🔗

目录结构 🔗

├── docker-compose.yml          容器启动配置文件
├── Dockerfile                  PHP-FPM构建配置文件
├── conf                        配置目录
│   ├── mysql                   MySQL配置文件目录
│   │   └── my.cnf              MySQL配置文件
│   ├── nginx                   Nginx配置文件目录
│   │   ├── conf.d              站点配置文件目录
│   │   │   ├── certs           SSL认证文件、密钥和加密文件目录
│   │   │   │   └── site2       站点2的认证文件目录
│   │   │   ├── site1.conf      站点1 Nginx配置文件
│   │   │   └── site2.conf      站点2 Nginx配置文件
│   │   └── nginx.conf          Nginx通用配置文件
│   └── php                     PHP配置目录
│       ├── php-fpm.d           PHP-FPM配置目录
│       │   └── www.conf        PHP-FPM配置文件
│       └── php.ini             PHP配置文件
├── log                         日志目录
│   ├── mysql                   MySQL日志目录
│   ├── nginx                   Nginx日志目录
│   └── php-fpm                 PHP-FPM日志目录
├── mysql                       MySQL数据文件目录
└── www                         站点根目录
    ├── site1                   站点1根目录
    └── site2                   站点2根目录

nginx配置 🔗

server {
    listen  80;
    server_name www.site1.com;
    root /var/www/html/site1;
    index index.shtml index.php index.html;
    location ~* \.(css|js)$ {
        sendfile  off;
        break;
    }
    expires off;
    client_max_body_size 2M;
    client_body_temp_path /var/www/html;

    location / {
            index index.shtml index.php index.html;
            if (!-e $request_filename){
                 rewrite ^/(.+)$ /index.php?_url=/$1 last;
            }
    }

    location ~ ^/.+\.php(/|$) {
        fastcgi_pass [容器的ip或者名称]:9000;  
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_read_timeout 600; 
    }
}

站点部署 🔗

本文有默认加了两个站点:www.site1.com(同localhost)和www.site2.com。
要在本地访问这两个域名,需要修改你的hosts文件,添加以下两行:
127.0.0.1 www.site1.com
127.0.0.1 www.site2.com
其中,www.site2.com为支持SSL/https和HTTP/2的示例站点。
因为站点2的SSL采用自签名方式,所以浏览器有安全提示,继续访问就可以了,自己的站点用第三方SSL认证证书替换即可。
如果只用到站点1,把站点2相关的目录和配置文件删除:
./conf/nginx/conf.d/certs/site2/
./conf/nginx/conf.d/site2.conf
./www/site2/
重启容器内的Nginx生效:
docker exec -it dlnmp_nginx_1 nginx -s reload

HTTPS使用 🔗

./conf/nginx/conf.d/site2.conf
如果是自签名,可以用廖雪峰提供的一个自动生成认证文件、私钥脚本:gencert.sh, 这个脚本已经放在项目中,在这个目录下:
./conf/nginx/conf.d/certs/site2/
在Bash中输入:
$ ./gencert.sh
输入一次域名,和几次密码(内容随意)后,就会生成几个认证文件。
其中自签名情况不需要.csr和.origin.key后缀的文件。
然后修改Nginx配置文件,配置SSL支持就可以了。

docker-compose.yml文件 🔗

如下是docker容器的运行配置docker-compose.yml的内容:

nginx:
  image: nginx:alpine
  ports:
    - "80:80"
    - "443:443"
  volumes:
    - ./www/:/var/www/html/:rw
    - ./conf/nginx/conf.d:/etc/nginx/conf.d/:ro
    - ./conf/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
    - ./log/nginx/:/var/log/nginx/:rw
  links:
    - php-fpm:fpm

php-fpm:
  build: .
  expose:
    - "9000"
  volumes:
    - ./www/:/var/www/html/:rw
    - ./conf/php/php.ini:/usr/local/etc/php/php.ini:ro
    - ./conf/php/php-fpm.d/www.conf:/usr/local/etc/php-fpm.d/www.conf:rw
    - ./log/php-fpm/:/var/log/php-fpm/:rw
  links:
    - mysql:mysql
    - redis:redis

mysql:
  image: mysql:latest
  ports:
    - "3306:3306"
  volumes:
    - ./conf/mysql/my.cnf:/etc/mysql/my.cnf:ro
    - ./mysql/:/var/lib/mysql/:rw
    - ./log/mysql/:/var/log/mysql/:rw
  environment:
    MYSQL_ROOT_PASSWORD: "123456"

redis:
  image: redis:latest
  ports:
    - "6379:6379"

站点根目录写权限 🔗

默认的,容器中的/var/www/html目录属于root,我们需要修改为www-data,PHP才能正常写目录。
先进入到容器中:
$ docker exec -it dlnmp_php-fpm_1 /bin/bash
然后修改目录权限:
$ chown -R www-data:www-data /var/www/html

MYSQL连接 🔗

  1. $ mysql -h 127.0.0.1 -u root -p
    • 说明:这里MySQL的连接主机不能用localhost,因为MySQL客户端默认使用unix socket方式连接,应该直接用本地IP。
  2. $pdo = new PDO(‘mysql:host=mysql;dbname=site1’, ‘root’, ‘123456’);
    • 说明:,host的值就是在指定的MySQL容器的名称。 redis,memcaced等类似

一键安装脚本 🔗

#!/bin/bash

function getVersionNum(){
    version=`cat /proc/version`
    cut=${version%%(*}
    dd=${cut:14}
}

function dockerAlis() {
    dps="\$(docker ps -aq)"
    dcup="ztth='docker-compose -f /root/docker/ztth.yml up -d'"
    dcrs="ztth-rs='docker-compose -f /root/docker/ztth.yml restart'"
    dcrm="ztth-rm='docker-compose -f /root/docker/ztth.yml stop && docker-compose -f /root/docker/ztth.yml rm'"
    dcps="ztth-ps='docker-compose -f /root/docker/ztth.yml ps'"
    dcip="docker-ips='docker inspect --format='\"'\"'{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'\"'\"' $dps'"
}

function main(){
	while [ True ];do
		echo -e "\033[33m CentOs7 docker安装步骤: \033[0m"
		echo -e "\033[33m The #1 docker服务安装 \033[0m"
		echo -e "\033[33m The #2 virtual box挂载安装,请保证安装增加工具和挂载目录已经添加 \033[0m"
		echo -e "\033[33m q键退出 \033[0m"
		read -p '选择安装: ' number
		case $number in
          1)
            echo -e "\033[31m docker install starting \033[0m" \
            && yum install -y wget \
            && mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup \
            && wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo \
            && yum install -y yum-utils \
            && yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo \
            && yum install -y gcc gcc-devel gcc-c++ gcc-c++-devel make kernel kernel-devel bzip2 vim wget device-mapper-persistent-data lvm2 docker-ce \
            && yum makecache fast \
            && service docker start \
            && curl -L  https://ghproxy.com/https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose \
            && chmod +x /usr/local/bin/docker-compose\
            && gpasswd -a $USER docker \
            && mkdir -p /etc/docker \
            && echo '{"registry-mirrors":["https://l714mp7z.mirror.aliyuncs.com"]}'>> /etc/docker/daemon.json \
            && systemctl daemon-reload \
            && systemctl restart docker \
            && systemctl enable docker \
            && echo -e "\033[31m docker安装完成,请重启电脑,执行步骤2 \033[0m" && exit
            ;;

          2)
            echo -e "\033[31m virtual box增强工具 install starting \033[0m" \
            && getVersionNum && rm -rf /usr/src/linux && ln -s /usr/src/kernels/$dd /usr/src/linux \
            && mount /dev/cdrom /mnt \
            && cd /mnt &&  ./VBoxLinuxAdditions.run \
            && mkdir -p /root/docker  && chmod -R 777 /root/docker \
            && echo 'docker /root/docker   vboxsf rw,gid=100,uid=1000,auto 0 0'>> /etc/fstab \
            && dockerAlis \
            && echo "alias $dcup">> /root/.bashrc \
            && echo "alias $dcrs">> /root/.bashrc \
            && echo "alias $dcrm">> /root/.bashrc \
            && echo "alias $dcps">> /root/.bashrc \
            && echo "alias $dcip">> /root/.bashrc \
            && source /root/.bashrc \
            && echo -e "\033[31m 请服务器重启 \033[0m"] && exit
            ;;

		 "q"|"quit")
            exit
            ;;

         *)
            echo "Input error!!"
             ;;

		esac
	done
}

main

常用操作 🔗

别名配置

alias docker-ips='docker inspect --format='"'"'{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'"'"' $(docker ps -aq)'
alias ztth='docker-compose --compatibility -f /root/docker/ztth.yml up -d'
alias ztth-rs='docker-compose --compatibility -f /root/docker/ztth.yml restart'
alias ztth-rm='docker-compose --compatibility -f /root/docker/ztth.yml down -v'
alias ztth-ps='docker-compose --compatibility -f /root/docker/ztth.yml ps'

批量操作

批量删除镜像
docker rmi -f $(docker images -aq)
清理所有未使用资源
docker system prune -a --volumes
删除未使用镜像
docker image prune -a -f
删除未使用容器
docker rm -vf $(docker ps -aq)
批量删除卷
docker volume rm $(docker volume ls -qf dangling=true)
删除所有关闭的容器
docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm
删除所有dangling镜像(即无tag的镜像)
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

自动脚本

挂载到目录`/docker-entrypoint-initdb.d/`,首次创建容器会执行,但是多脚本必须是`01\02\03\04\05`这样的顺序开头,否则会报错。

docker pull docker.1ms.run/apache/rocketmq:5.3.2

Tags