当前位置:首页 > 随笔 > 腾讯云轻量应用服务器纯Docker环境部署网站和mysql等服务

腾讯云轻量应用服务器纯Docker环境部署网站和mysql等服务

txtName2年前 (2023-05-11)随笔855

由于之前购买的服务器到期,要把原有的网站和服务迁移过来,下面记录的是遇到的问题和解决方案。

 

原服务器是3年前以个人新用户300块买的3年的2核4G5M带宽的服务器,现在到期了续费不起太贵了而且也用不到这么高的配置,在阿里云和腾讯云对比下最终选择了老用户可以参加的优惠购买了现在这款服务器,配置是2核2G4M带宽,但月流量是300G,3年1000,也完全够用。

 

之前为了省事,老服务器上装的宝塔面板,部署网站和其他服务很方便。但现在换了轻量应用服务器,ubuntu系统内置Docker环境,腾讯云控制台可以直接部署容器,虽然用不到。。。这次不想再用宝塔面板,想纯手动部署以更加熟练和了解Docker的一些命令和机制。

 

先说网站,网站就是现在的ZBlog,把之前的网站的备份上传到新服务器,由于网站里有上传的附件等可编辑的目录等,本人也对linux下的权限什么的也不太精通(主要是懒),所以打算用nginx直接挂载宿主机目录来实现访问而不是用打包镜像的方法。具体访问结构是,先部署一个web-nginx容器负责整个宿主机80和443的访问,这个web-nginx仅负责接收外部请求然后转发到内部各个容器服务,不涉及php等其他内容的解析什么的,仅仅就是转发,一个网站一个配置文件。

先看一下我的目录结构

image.png

每个目录下都有一个部署该服务的docker-compose.yml文件,下来先说这个web-nginx,certs目录里放着所有网站的ssl证书,conf.d里是所有网站的配置文件

image.png

docker-compose.yml

version: '3.9'

services:
  web-nginx:
    container_name: 'web-nginx'
    restart: always
    image: 'nginx:latest'
    ports:
      - '80:80'
      - '443:443'
    volumes:
      - /home/txtname/docker/nginx/certs:/certs
      - /home/txtname/docker/nginx/conf.d:/etc/nginx/conf.d
      - /home/txtname/docker/web_sites:/web_sites
    environment:
      - TZ=Asia/Shanghai
    networks:
      - mynetwork
networks:
  mynetwork:
    name: txtname_default
    external: true

blog.txtname.cn.conf

server {
   listen 80;
   listen 443 ssl;
   server_name blog.txtname.cn;

   ssl_certificate      /certs/blog.txtname.cn.pem;
   ssl_certificate_key  /certs/blog.txtname.cn.key;

   location / {
      proxy_pass http://blog-web:8080;
      proxy_set_header Host                blog.txtname.cn;
      proxy_set_header X-Forwarded-For     $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto   $scheme;
      proxy_set_header X-Forwarded-Port    $server_port;
   }
}

上面的http://blog-web:8080就是本站的nginx,下面看一下网站的docker-compose.yml和nginx.conf

docker-compose.yml

version: "3.9"
services:
   blog-web:
      container_name: blog-web
      image: bitnami/nginx:1.16.1-debian-9-r56
      depends_on:
         - blog-web-php-fpm
      restart: always
      volumes:
         - /home/txtname/docker/web_sites/blog.txtname.cn/www:/app
         - /home/txtname/docker/web_sites/blog.txtname.cn/nginx.conf:/opt/bitnami/nginx/conf/server_blocks/myapp.conf
      networks:
        - mynetwork
   blog-web-php-fpm:
      container_name: blog-web-fpm
      image: bitnami/php-fpm:5.5.30-2
      restart: always
      volumes:
         - /home/txtname/docker/web_sites/blog.txtname.cn/www:/app
      networks:
        - mynetwork
networks:
  mynetwork:
    name: txtname_default
    external: true

nginx.conf

server {
    listen  8080;

    root   /app;

    location / {
        index  index.html index.htm index.php;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /opt/bitnami/nginx/html;
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        fastcgi_pass   blog-web-fpm:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /app$fastcgi_script_name;
        include        fastcgi_params;
    }

    if (-f $request_filename/index.html){
            rewrite (.*) $1/index.html break;
    }
    if (-f $request_filename/index.php){
            rewrite (.*) $1/index.php;
    }
    if (!-f $request_filename){
            rewrite (.*) /index.php;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    location ~ /\.ht {
        deny  all;
    }
}

至此,把上面的这些内容都部署以后就可以访问到网站了。下来还需要部署mysql。

mysql的docker-compose.yml

version: '3.9'

services:
  mysql:
    container_name: mysql
    restart: always
    image: 'bitnami/mysql:5.7.37'
    volumes:
      - /home/txtname/docker/mysql/data:/bitnami/mysql/data
    environment:
      - MYSQL_ROOT_PASSWORD=your_root_password
      - BITNAMI_DEBUG=true
      - TZ=Asia/Shanghai
    networks:
      - mynetwork
  phpmyadmin:
    container_name: phpmyadmin
    image: 'phpmyadmin:latest'
    volumes:
      - ./phpmyadmin.config.user.inc.php:/etc/phpmyadmin/config.user.inc.php
    environment:
      - PMA_HOST=mysql
    restart: always
    networks:
      - mynetwork
networks:
  mynetwork:
    name: txtname_default
    external: true

然后是phpmyadmin的配置文件,是为了部署在二级目录下的配置,选择这种方式部署是想把后续服务都部署在域名的二级目录下,这样不用申请很多证书,也方便记忆和管理。。

<?php
$cfg['PmaAbsoluteUri']='https://domain.com/phpmyadmin/';

phpmyadmin等其他服务的nginx.conf,强制跳转https

server {
   listen 80;
   server_name domain.com;

   rewrite ^(.*) https://$server_name$1 permanent;
}
server {
   listen 443 ssl;
   server_name domain.com;

   ssl_certificate      /certs/domain.pem;
   ssl_certificate_key  /certs/domain.key;

   location /phpmyadmin/ {
      proxy_pass http://phpmyadmin/;
      proxy_set_header Host                domain.com;
      proxy_set_header X-Forwarded-For     $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto   $scheme;
      proxy_set_header X-Forwarded-Port    $server_port;
   }
}

好了,mysql和phpmyadmin部署完成,基本的访问和管理都已就绪,后面通过phpmyadmin把之前备份的网站数据库导入就可以了。

 

 

 

下面说说部署过程中遇到的一些问题

1、部署完blog网站后,web-nginx访问不到blog-web,然后想起来每个容器内部的网络都是隔离和独立的,后来用了links方式把这些服务都绑到一起,但感觉很别扭,想想后面如果再增加其他服务还要一个个去绑定真的很烦。后来查了docker-compose的文档,发现可以用networks这个东西,他可以让各个容器加入同一个网络,然后通过容器名称或别名直接访问,就像上面配置文件里的那样,直接访问mysql、blog-web等。

txtname_default这个network是预先创建的好的

sudo docker network create txtname_default

另外说一下,如果用docker-compose方式部署报错,说使用了未定义的network的或不支持network.external属性的时候基本上就是docker-compose版本低了不支持,我最早是单独修改docker-compose.yml 里的version不起作用,查了才知道是版本低了,更新命令如下,文档地址:https://docs.docker.com/compose/install/standalone/

curl -SL https://github.com/docker/compose/releases/download/v2.17.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

2、全部部署完以后发现,既然创建了单独的网络,那就没必要把所有服务都暴露,后来就只留了web-nginx的80和443的映射,其他的全都去掉了,让他们通过内部网络直接访问这样更安全。

image.png

扫描二维码推送至手机访问。

版权声明:本文由txtName发布,如需转载请注明出处。

本文链接:https://blog.txtname.cn/2023/05/10.html

标签: Docker
返回列表

上一篇:WinForm Label自动换行

没有最新的文章了...

相关文章

WinForm Label自动换行

WinForm Label自动换行

AutoSize=false时会自动换行,但超出范围的不显示AutoSize=true时不会自动换行,超出范围的也看不到可以使用TextBox的自动换行特性来获取需要的合适的大小//构造函数里或初始化控件的地方 _textbox ...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。