logo头像

待到风起时,扬帆济沧海

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

本文于750天之前发表,文中内容可能已经过时。

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系统使用

安装步骤

1 docker(https://docs.docker.com/engine/installation/)

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

2 docker-compose安装

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 安装容器和镜像

1
docker-compose up -d

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 配置共享目录

image

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
##exit 0 前增加如下命令
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 #手动挂载
## 此时如果提示/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

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

image

6.6 若走的桥接网卡,正常连接即可



以下部分属于知识扩展

2.目录说明

2.1 大致框架

image

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
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连接

  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等类似

一键安装脚本

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
#!/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 -f /root/docker/ztth.yml up -d'
alias ztth-rs='docker-compose -f /root/docker/ztth.yml restart'
alias ztth-rm='docker-compose -f /root/docker/ztth.yml stop && docker-compose -f /root/docker/ztth.yml rm'
alias ztth-ps='docker-compose -f /root/docker/ztth.yml ps'

评论系统未开启,无法评论!