Docker搭建可一键部署的多域名LNMP环境 🔗
特点 🔗
- 完全开源
- 支持多版本PHP切换(PHP5.4、PHP5.6、PHP7.2…)
- 支持绑定任意多个域名
- 支持HTTPS和HTTP/2
- PHP源代码位于host中
- MySQL data位于host中
- 所有配置文件可在host中直接修改
- 所有日志文件可在host中直接查看
- 内置完整PHP扩展安装命令
- 实际使用,确保100%可行
- 实现一次配置,可在任何支持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连接 🔗
- $ 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等类似
一键安装脚本 🔗
#!/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