有时候服务器不适合安装面板,或者不想破坏现有环境,这时可以使用 Docker 进行部署。但面对命令行操作可能会让人望而却步,特别是对只会简单复制粘贴命令的新手来说。本文就是为解决这种情况而写的简明指南。
首先有几种情况:
1.部署静态网站
2.动态网站(非PHP)
3.PHP动态网站
无论是哪一种,肯定还是要安装Nginx的,那么我们到分叉路口再详细说。
安装docker
tips:可以用下面的命令安装docker
curl -sSL https://get.daocloud.io/docker | sh
然后通过
docker --version
测试docker是否安装成功,如果 Docker 安装成功,该命令会返回类似于以下输出:
Docker version xx.xx.x, build xxxxxxx
运行一个简单的 Docker 示例容器来进一步确认安装是否成功:
sudo docker run hello-world
正常情况会输出
Hello from Docker!
This message shows that your installation appears to be working correctly
那么说明docker安装成功,进入下一步
安装Nginx
前提:
docker已安装
docker正常运行
首先docker需要使用root用户执行,你可以在下面每条命令前面加sudo,或者切换到root用户
特殊情况(我不知道root的密码)
在某些情况下(例如亚马逊云的ec2),系统可能没有设置root用户的密码,或者你可能不知道密码。这时,可以通过以下命令重新设置root用户的密码:
sudo passwd root
设置密码后,就可以切换到root用户。
怎么切换到root用户
1.用sudo切换 (适用于乌班图/Debian/其他自带sudo的系统)
sudo -i
2.用su切换 (适用于乌班图/Debian/centos/openwrt/其他自带su的系统) 小声bb:不会有系统没有su吧
su
或
d
又或者使用 SSH 登录到 root 用户(没有人会用这么抽象的办法吧)
ssh root@localhost
拉取镜像+运行容器
mkdir /var/www/html/dist && mkdir /etc/nginx/example.com/default
ps:记得把example.com换成你网站的域名,下面也是
docker run -d \
--name nginx \
-p 80:80 \
-p 443:443 \
-v /var/www/dist:/usr/share/nginx/html:ro \
-v /etc/nginx/example.com/default:/etc/nginx/nginx.conf:ro \
-v /var/log/nginx:/var/log/nginx
--restart unless-stopped \
nginx:latest
在这里面:
--name nginx 就是容器的名称,可以自定义,但是不能包含特殊字符或空格,可以使用-或_来分隔。
-p 80:80 是把容器的80端口映射到服务器的80端口,格式是
容器端口:服务器端口
-p 443:443 是把容器的443端口映射到服务器的443端口,443端口负责https,如果你不需要,可以删除这行。
挂载静态文件:
宿主机的
/var/www/html/dist
是静态文件的存放目录,挂载到容器的/usr/share/nginx/html
。设置为只读(
ro
)可以防止容器修改静态文件。
挂载 Nginx 配置文件:
宿主机的
/etc/nginx/sites-available/default
是 Nginx 的配置文件,挂载到容器的/etc/nginx/nginx.conf
。设置为只读(
ro
)可以防止容器修改配置文件。
所以迎来第一个分叉
使用PHP
和nginx
一样,我们拉一下PHP
的容器,我们可以直接用docker run来节省先pull后run的时间
docker run -p 9000:9000 -d --name php-fpm -v /var/www:/usr/share/nginx/www php:7.1-fpm
-p 9000:9000
:将容器的9000端口映射到主机的9000端口-d
后台运行(守护进程)--name myphp-fpm
:将容器命名为myphp-fpm-v
将主机中当前目录下的www挂载到容器的www目录
查看容器启动情况
docker ps -a
运行后会看到这样的内容
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
51adb2df6004 php:7.1-fpm "docker-php-entrypoif" 45 seconds ago Up 20 seconds 0.0.0.0:9000->9000/tcp php-fpm
3218b3ad4e47 nginx "nginx -g 'daemon off" 18 minutes ago Up 5 minutes 0.0.0.0:80->80/tcp,0.0.0.0:443->80/tcp nginx
说明两个容器都正常运行了,然后我们来看看ip,然后去修改nginx相关配置
docker inspect myphp-fpm | grep "IPAddress"
然后会得到"SecondaryIPAddresses": null, "IPAddress": "172.17.0.3", "IPAddress": "172.17.0.3",这样的输出,其中172.17.0.3
就是容器ip,我们记下来。
修改配置文件php部分
我们上面已经想到了容器里面没有vim,所以把路径映射了出来,我们接下来就不需要进入容器去编辑了
我们直接进入vim去编辑(如果不会用vim看下文的vim怎么用,提示vim不存在看如何安装vim)
vim /etc/nginx/sites-available/default/default.conf
把下面的内容放到server
块中,这个时候也可以随便设置你的域名
location ~ \.php$ {
fastcgi_pass 你的容器ip:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/www$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
include fastcgi_params;
}
设置域名可以在server
块中设置server_name example.com 192.168.1.8;
这个例子中设置了域名example.com
和ip192.168.1.8
vim怎么用
首先用vim 文件路径
进入文件
然后输入 “i
” 切换编辑模式,然后就可以开始编辑了,编辑完成后按下esc键退出编辑模式
退出编辑模式后,确认当前输入法是英语(这个很重要),确认后按下英语的 :
,然后输入 wq
,你的文件就被保存并退出vim了。
如果提示你没有权限(你真的不是root用户),你需要通过:q!
不保存并强制退出,
如果你是root用户,你可以使用:w!
强制保存,然后通过:q
退出
更新nginx
配置文件
执行这个命令
docker exec -it mynginx service nginx reload
然后得到 [ ok ] Reloading nginx: nginx.
,说明大功告成了
这个时候我们来访问我们刚刚设置的ip/域名(你域名要已经解析到服务器上面)
图片来自 使用docker快速搭建nginx+php环境 - 代码汇 - 博客园 剪裁后得
非PHP动态网站
这里以halo举例,我们跳过halo的部署,直接来到部署好的时候
一样的,也要修改配置文件,但是简单很多
用vim打开配置文件(关于vim的教程和常见问题看php部分的vim怎么用)
vim /etc/nginx/sites-available/default/default.conf
在这个里面添加以下内容来配置反向代理
upstream halo {
server 127.0.0.1:8090;
}
server {
listen 80;
listen [::]:80;
server_name www.yourdomain.com;
client_max_body_size 1024m;
location / {
proxy_pass http://halo;
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
由于我也是用halo的,直接放出来给你抄吧
upstream halo {
server 127.0.0.1:8090;
}
server {
listen 80 ;
listen 443 ssl http2 ;
listen [::]:443 ssl http2 ;
server_name xyj.haokajia.vip 192.168.1.42 xyj.kohara123.asia;
client_max_body_size 1024m;
access_log /www/sites/xyj.haokajia.vip/log/access.log main;
error_log /www/sites/xyj.haokajia.vip/log/error.log;
location ^~ /.well-known/acme-challenge {
allow all;
root /usr/share/nginx/html;
}
location ^~ / {
proxy_pass http://127.0.0.1:8090;
proxy_http_version 1.1;
add_header X-Cache $upstream_cache_status;
proxy_set_header Host xyj.haokajia.vip;
proxy_ssl_server_name off;
if ( $uri ~* "\.(gif|png|jpg|css|js|woff|woff2)$" ) {
expires 1m;
}
proxy_ignore_headers Set-Cookie Cache-Control expires;
proxy_cache proxy_cache_panel;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 304 301 302 10m;
}
}