腾讯云轻量应用服务器纯Docker环境部署网站和mysql等服务
由于之前购买的服务器到期,要把原有的网站和服务迁移过来,下面记录的是遇到的问题和解决方案。
原服务器是3年前以个人新用户300块买的3年的2核4G5M带宽的服务器,现在到期了续费不起太贵了而且也用不到这么高的配置,在阿里云和腾讯云对比下最终选择了老用户可以参加的优惠购买了现在这款服务器,配置是2核2G4M带宽,但月流量是300G,3年1000,也完全够用。
之前为了省事,老服务器上装的宝塔面板,部署网站和其他服务很方便。但现在换了轻量应用服务器,ubuntu系统内置Docker环境,腾讯云控制台可以直接部署容器,虽然用不到。。。这次不想再用宝塔面板,想纯手动部署以更加熟练和了解Docker的一些命令和机制。
先说网站,网站就是现在的ZBlog,把之前的网站的备份上传到新服务器,由于网站里有上传的附件等可编辑的目录等,本人也对linux下的权限什么的也不太精通(主要是懒),所以打算用nginx直接挂载宿主机目录来实现访问而不是用打包镜像的方法。具体访问结构是,先部署一个web-nginx容器负责整个宿主机80和443的访问,这个web-nginx仅负责接收外部请求然后转发到内部各个容器服务,不涉及php等其他内容的解析什么的,仅仅就是转发,一个网站一个配置文件。
先看一下我的目录结构
每个目录下都有一个部署该服务的docker-compose.yml文件,下来先说这个web-nginx,certs目录里放着所有网站的ssl证书,conf.d里是所有网站的配置文件
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的映射,其他的全都去掉了,让他们通过内部网络直接访问这样更安全。