小原酱
小原酱
Published on 2025-04-03 / 47 Visits
0
0

docker纯命令行部署网站

有时候服务器不适合安装面板,或者不想破坏现有环境,这时可以使用 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

前提:

  1. docker已安装

  2. 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,如果你不需要,可以删除这行。

  1. 挂载静态文件

    • 宿主机的 /var/www/html/dist 是静态文件的存放目录,挂载到容器的 /usr/share/nginx/html

    • 设置为只读(ro)可以防止容器修改静态文件。

  2. 挂载 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; 
    }
}


Comment