由于文章内容较长,在此分为三个部分:
上:基础工作和创建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 ,结果非常顺利的就搞定,不过中间还是出了小插曲,接下来一一道来。
本次我准备三个容器分别为: nginx、php-fpm、mysql ,换句话说,这种情况属于在同一局域网内的三台服务器,整体网络结构如下,虚线部分为 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
使用的软件及操作系统
- CentOS 7.2 - Linux 操作系统
- docker v18.06.1-ce - 容器
- docker-compose - 快速定义和运行多个容器
- docker-nginx v1.15.9 - nginx的docker官方镜像
- docker-mysql v5.7.25 - MySQL的docker官方镜像。配置低,就选用这个版本吧
- docker-php-fpm v7.3.3 - php的docker官方镜像,php有cli、apache和fpm三个镜像,这里选用fpm
- typecho v1.1(17.10.30) - 基于php的博客系统,比较轻量级
- acme.sh - 用来生成 Let's Encrypt 证书
准备工作
注意:我这里使用的帐户是 root 用户,尚未出现权限问题,不解释你懂得!
首先,拉取项目所需的镜像:
- 安装 docker,安装教程就不再这里啰嗦了,详细内容请教参:Get Docker CE for CentOS
- 安装 docker-compose,同上,请参考:Install Docker Compose
拉取相应的镜像,当然 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;
本文由 waynelone 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Dec 11, 2021 at 01:05 pm