Docker搭建可一键部署的多域名LNMP环境
特点
- 完全开源
- 支持多版本PHP切换(PHP5.4、PHP5.6、PHP7.2…)
- 支持绑定任意多个域名
- 支持HTTPS和HTTP/2
- PHP源代码位于host中
- MySQL data位于host中
- 所有配置文件可在host中直接修改
- 所有日志文件可在host中直接查看
- 内置完整PHP扩展安装命令
- 实际使用,确保100%可行
- 实现一次配置,可在任何支持Docker系统使用
安装步骤
1. Centos7安装方法
1 2 3 4 5
| 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安装方法
1 2 3 4 5 6
| 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
|
1 2
| 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
|
3 查看版本,加入到docker组
1 2 3
| $ docker -v $ docker-compose -v $ sudo gpasswd -a ${USER} docker
|
就不用每次启动Docker都得加sudo了,注意,执行gpasswd命令之后要重新登陆才有效。
4 使用国内镜像仓库
4.1 首先注册一个阿里云账号,然后访问阿里云的Docker镜像仓库,能找到加速器地址。
4.2 对于Docker 1.10+,打开配置文件 /etc/docker/daemon.json(没有时新建该文件):
1 2 3 4 5 6 7 8 9 10 11
| sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://l714mp7z.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
#开机启动centos7 systemctl enable docker
|
Docker 1.10以下请看:https://yq.aliyun.com/articles/29941。
5 安装容器和镜像
6 如果是windows下基于virtualbox挂载目录到linux
6.1 安装增强工具(centos7版本)

1 2 3 4 5 6
| 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
|
6.2 配置共享目录

6.3 手动挂载
6.3.1 ubuntu
1 2
| sudo mkdir /home/abner/server && chmod -R 777 /home/abner/server sudo mount -t vboxsf docker /home/abner/server #手动挂载 (这里挂载的目录最好不要和共享文件夹名称一样)
|
6.3.2 centos7
1 2
| sudo mkdir /root/server && chmod -R 777 /root/server sudo mount -t vboxsf docker /root/server
|
6.4 开机自动挂载
6.4.1 ubuntu
1 2 3 4
| sudo vim /etc/rc.local # sleep 1 sudo mount -t vboxsf docker /home/abner/server
|
6.4.2 centos7
==[virbox自动挂载不能勾选]==
1 2 3 4 5 6
| mkdir /root/server && chmod -R 777 /root/server mount -t vboxsf docker /root/server #手动挂载 # #自动挂载 sudo vim /etc/fstab docker /root/server vboxsf rw,gid=100,uid=1000,auto 0 0
|
6.5 若走的端口转发按图如下配置

6.6 若走的桥接网卡,正常连接即可
以下部分属于知识扩展
2.目录说明
2.1 大致框架

2.2 目录结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| ├── 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根目录
|
2.2.1 nginx配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| 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; } }
|
2.3 站点部署
本文有默认加了两个站点: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
2.4 HTTPS使用
./conf/nginx/conf.d/site2.conf
如果是自签名,可以用廖雪峰提供的一个自动生成认证文件、私钥脚本:gencert.sh,
这个脚本已经放在项目中,在这个目录下:
./conf/nginx/conf.d/certs/site2/
在Bash中输入:
$ ./gencert.sh
输入一次域名,和几次密码(内容随意)后,就会生成几个认证文件。
其中自签名情况不需要.csr和.origin.key后缀的文件。
然后修改Nginx配置文件,配置SSL支持就可以了。
2.5 docker-compose.yml文件
如下是docker容器的运行配置docker-compose.yml的内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| 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"
|
2.6 站点根目录写权限
默认的,容器中的/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
2.7 MYSQL连接
- $ mysql -h 127.0.0.1 -u root -p
- 说明:这里MySQL的连接主机不能用localhost,因为MySQL客户端默认使用unix socket方式连接,应该直接用本地IP。
- $pdo = new PDO(‘mysql:host=mysql;dbname=site1’, ‘root’, ‘123456’);
- 说明:,host的值就是在指定的MySQL容器的名称。 redis,memcaced等类似
一键安装脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| #!/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://get.daocloud.io/docker/compose/releases/download/1.18.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
|
常用操作
批量删除容器
1
| docker rm $(docker ps -a -q)
|
批量删除镜像
1
| docker rmi $(docker images -q)
|
删除挂载目录
1
| docker volume rm $(docker volume ls -qf dangling=true)
|
删除所有关闭的容器
1
| docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm
|
删除所有dangling镜像(即无tag的镜像)
1
| docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
|
查看所有容器IP
1 2 3 4
| docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
shell别名用法 alias docker-ips='docker inspect --format='"'"'{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'"'"' $(docker ps -aq)'
|
别名配置
1 2 3 4 5
| 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 stop && docker-compose -f /root/docker/ztth.yml rm' alias ztth-ps='docker-compose --compatibility -f /root/docker/ztth.yml ps'
|
评论系统未开启,无法评论!