基于 docker 使用 nginx + phpfpm + typecho 搭建一个自己博客(上)

in Server with 0 comment

由于文章内容较长,在此分为三个部分:

上:基础工作和创建mysql容器(本文)
中:创建配置php-fpm和nginx容器
下:安装typecho及Lets Encrypt证书

某云买的服务器还有几个月就过期了,形势所(穷)逼(续费太贵了)⊙︿⊙,只好另投别处了。之前的网站是使用 lnmp 搭建的(Github地址:https://github.com/licess/lnmp ),操作起来比较简单,在此对前(作)辈(者)表示感谢。本文 nginx 相关配置绝大部分采用原 lnmp 的配置。

最近在学习 docker ,灵机一动不如用 docker 重新搭建一遍,顺便来检验一下自己的学习成果^_^。新买了一台服务器,3年360,并升了一下宽度,花了500块,再者买了一个域名花了220块5年,算算比较便宜了,当然服务器配置也不咋滴(1CPU 2G),唯一感觉不爽的地方就是国内服务器需要ICP备案,时间是真的长,等的都有点儿不耐烦了。

起初使用,nginx + apache + php 的模式与部署的,但稀里糊涂的出了 ssl 问题,状况是首页是https,子页面却变成了伪https,并告知信息不安全。然后就是一通乱配,却怎么也解决不了问题,于是只好作罢(p.s: 哪位大神如果是基于此模式部署成功并解决了https问题的,还请赐教,小弟感激不尽),曾经的web server巨头,实在是让人望而生畏(哎,不找借口了,是自己学习的深度不够,平时做的最多的是 dotnet 开发,这只是自己的业余爱好),因此转而使用 php-fpm ,结果非常顺利的就搞定,不过中间还是出了小插曲,接下来一一道来。

本次我准备三个容器分别为: nginxphp-fpmmysql ,换句话说,这种情况属于在同一局域网内的三台服务器,整体网络结构如下,虚线部分为 docker 容器部分。

网络结构

本次基于 docker 容器,使用 docker-compose 快速定义和运行多个容器(使用命令一个一个敲太费劲了),基本配置都放在 docker-compose.yml 文件里,项目地址:https://github.com/WayneLone/docker-blog,项目目录结构:

mysql/
    my.cnf
nginx/
    blog.conf
php-fpm/
    Dockerfile
    php.ini
docker-compose.yml

使用的软件及操作系统

准备工作

注意:我这里使用的帐户是 root 用户,尚未出现权限问题,不解释你懂得!

首先,拉取项目所需的镜像:

  1. 安装 docker,安装教程就不再这里啰嗦了,详细内容请教参:Get Docker CE for CentOS
  2. 安装 docker-compose,同上,请参考:Install Docker Compose
  3. 拉取相应的镜像,当然 docker-compose 会自动完成这件事,不过我还是先自己拉取了,运行以下命令

    docker pull mysql:5.7.25
    docker pull nginx:1.15.9
    docker pull php:7.3.3-fpm

下一步在用户目录下创建 ~/docker-blog 文件夹,作为我们的项目目录,这里面有储存项目所需的配置信息及源码。

接下来在项目目录 ~/docker-blog 下创建 docker-compose.yml 文件,编写我们的 blog-net 局域网,docker-compose.yml 文件内容如下:

version: '3.7'

networks:
  blog-net:

上面的配置等效于下面的 docker 命令(注意我们创建的是 bridge 桥接网络):

docker network create --driver bridge blog-net
# 查看已有网络
docker network ls

好了,网络配置完了。但发现什么也做不了!

docker 已经不推荐使用 link 来连接容器了

创建配置mysql容器

在项目目录 ~/docker-blog 下创建 mysql 文件夹,用于存放mysql的配置文件。

关于 mysql 容器的配置需要我们通过阅读 https://hub.docker.com/_/mysql 链接中 DESCRIPTION 和镜像定义文件 Dockerfile,来了解 docker-mysql 镜像配置文件信息情况,并决定是否要做相应的数据卷映射。

当然也可以通过以下命令查看容器内的文件目录结构,了解最真实的情况:

# 创建一个名为 test_mysql 的容器 并指定数据库 root 用户密码
docker run -d --name test_mysql -e MYSQL_ROOT_PASSWORD=blog123. mysql:5.7.25
# 使用以下命令 与一个正在运行的容器 进行 bash 命令交互
docker exec -it test_mysql /bin/bash
# 在容器中执行下面命令 查看 mysql 配置目录内容
ls -l /etc/mysql

通过上面的操作,我们了解到 MySQL 容器的配置目录,配置目录结构如下:

/etc/mysql
    - conf.d/
        - docker.cnf
        - mysql.cnf
        - mysqldump.cnf
    - my.cnf -> /etc/alternatives/my.cnf
    - my.cnf.fallback
    - mysql.cnf
    - mysql.conf.d/
        - mysql.conf

以及容器内 /etc/mysql/my.cnf 的文件内容:

# 描述信息省略
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

最终得出了要对以下容器内的目录做数据卷映射:

针对 MySQL 配置文件,在这里就选择容器内 /etc/mysql/conf.d/mysql.cnf 文件做映射。我们退出容器,回到宿主机器,在我们的项目目录下,创建下面两个文件夹:

mkdir -p ~/docker-blog/mysql/conf
mkdir -p ~/docker-blog/mysql/data

执行以下命令,复制容器内的 /etc/mysql/conf.d/mysql.cnf 文件到项目目录 ~/docker-blog/mysql/conf 下,并删除 test_mysql 容器(它已经完成使命了,缅怀一下)下面我们将用 docker-compose 创建新的 MySQL 容器。

docker cp test_mysql:/etc/mysql/conf.d/mysql.cnf ~/docker-blog/mysql/conf/my.cnf
docker stop test_mysql
docker rm test_mysql

这里需要修改 ~/docker-blog/mysql/conf/my.cnf 文件,修改后内容如下:

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
default-time-zone='Asia/Shanghai'

紧接着我们再编辑 ~/docker-blog/docker-compose.yml 文件,修改后内容如下:

version: '3.7'

services:

  mydb:
    image: mysql:5.7.25
    restart: on-failure
    volumes:
      - ./mysql/conf/my.cnf:/etc/mysql/conf.d/mysql.cnf:ro
      - ./mysql/data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=blog123.
    networks:
      - blog-net

networks:
  blog-net:

上面配置等效于:

docker run -d --name mydb \
    --restart=on-failuer \
    -v ~/docker-blog/mysql/conf/my.cnf:/etc/mysql/conf.d/mysql.cnf:ro \
    -v ~/docker-blog/mysql/data/:/var/lib/mysql \
    --restart=on-failure \
    --network=blog-net \
    -e MYSQL_ROOT_PASSWORD=blog123. \
    mysql:5.7.25

这里,我们为下一步工作做一些铺垫,进入 mysql 容器内,创建名称为 blog 的数据库和 blog 用户,并且授予 blog 用户所有 blog 数据库的权限。同时也检测一下,容器的启动情况,在项目目录下 ~/docker-blog 下执行以下命令:

# 启动容器
docker-compose up -d
# 查看当前由 docker-compose启动的容器列表
docker-compose ps
# 进入 mysql容器
docker exec -it docker-blog_mydb_1 /bin/bash
# 以下命令在容器内部执行 进行mysql命令行
mysql -uroot -p

紧接上一步,创建 blog 数据库和 blog 用户,并授予 blog 用户权限:

create database if not exists blog default character set utf8 collate utf8_general_ci;
create user 'blog'@'%' identified by 'blog123.';
grant all privileges on blog.* to 'blog'@'%';
flush privileges;
Comments are closed.