前言:为什么会写这篇文章,一切都是因为手欠。两周前,我准备在服务器上安装docker,就先更新了yum源,并执行了yum update命令,但由于嫌弃yum更新太慢就中断了命令,后来发现命令并没有中断,而是在后台运行,心太急,就不相等,就想重启服务器之后重新安装,然后就执行了reboot命令,然后我的服务器就挂了,无奈只能初始化重装了。之前一直采用的是本地化安装php+nginx+mysql的方式,这次正好重装,就想试试用docker安装这个环境,然后过程中自己也踩了一些坑,所以写一篇文章记录一下,避免过后就忘记了。
写在前面:本文适合有Linux和Docker基础的人,如果不了解基础的Linux命令和基础的docker命令看起来可能会有点困难~~
一、安装docker
1、切换yum源并更新系统
本案例是基于阿里云服务器CentOS 7操作系统为宿主机进行的,所以,第一步为切换宿主机的yum源,依次执行以下命令即可(以下命令需要以root权限执行,如果不是以root身份登录的,需要在每条命令前面加上sudo
)。
# 进入yum源存放路径
cd /etc/yum.repos.d/
# 备份初始的yum源
cp CentOS-Base.repo CentOS-Base.repo.bak
# 下载阿里云的yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 清除YUM缓存
yum clean
# 生成新的缓存
yum makecache
# 更新系统
yum update
注意:尤其是最后一条yum update
命令,一般会需要较长时间,中途不要中断!!!
2、卸载旧版docker
如果你的服务器或操作系统中已经安装有docker,需要先进行卸载,命令如下:
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine \
docker-selinux
在安装docker这部分,可以参考这个链接进行:安装docker参考资料
3、配置Docker的yum库
配置过程依次执行以下命令:
# 首先需要安装yum工具
yum install -y yum-utils device-mapper-persistent-data lvm2
# 安装成功后,执行命令,配置Docker的yum源(更新为阿里云源,否则直连国外,如果你的服务器没有梯子,可能会导致拉取镜像失败):
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新yum,建立缓存
yum makecache fast
4、安装Docker
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
5、启动和校验Docker
# 启动Docker
systemctl start docker
# 停止Docker
systemctl stop docker
# 重启
systemctl restart docker
# 设置开机自启
systemctl enable docker
# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
6、配置镜像加速
这里以阿里云镜像加速为例。
6.1、注册阿里云账号
访问阿里云官网,并注册一个账号。阿里云官网:https://www.aliyun.com/
6.2、开通镜像服务
在阿里云的首页最上方,找到产品-容器-容器镜像服务 ACR,然后
点击后进入控制台:
首次可能需要选择立刻开通,然后进入控制台。
6.3、配置镜像加速
找到镜像工具下的镜像加速器:
页面向下滚动,即可找到配置的文档说明:
具体命令如下(如果不是以root身份登录的,则需要在每个命令前追加sudo
):
# 创建目录
mkdir -p /etc/docker
# 复制内容,注意把其中的镜像加速地址改成你自己的
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
}
EOF
# 重新加载配置
systemctl daemon-reload
# 重启Docker
systemctl restart docker
二、部署php+mysql+nginx环境
先说一下大概的思路:先创建默认的容器,并从容器中拷贝出必要的配置文件,然后再根据实际需求将容器中相关的目录和文件映射到宿主机上,并安装对应的扩展,最后使用docker compose实现一键创建。
1、准备目录结构
为了使docker能够按照我们的需求运行,我们需要将docker容器中的一些特殊目录和文件映射到宿主机上,以便我们修改配置、拷贝工程等操作,这里按本人的习惯组织目录结构,具体目录结构如下:
/
|- alidata
|- server
|- mysql
|- conf
|- data
|- init
|- nginx
|- cert
|- conf.d
|- php
|- conf
|- conf.d
|- wwwroot
|- logs
|- mysql
|- nginx
|- php
对上述目录结构进行一个简短说明
- 在根目录下创建
/alidata
目录,用于存放docker容器映射出来的各种目录和文件; - 所有的容器运行所需的目录和文件都存放在
/alidata/server
目录下; - 所有的日志文件都存放在
/alidata/logs
目录下; - 所有的工程运行代码都存放在
/alidata/wwwroot
目录下。 /alidata/server/mysql/conf
目录存放mysql配置文件;/alidata/server/mysql/data
目录存放mysql数据文件;/alidata/server/mysql/init
目录存放mysql初始化脚本;/alidata/server/nginx/cert
目录存放https证书;/alidata/server/nginx/conf.d
目录存放nginx单个网站的配置文件(子配置文件);/alidata/server/nginx/
目录存放nginx.conf配置文件;/alidata/server/php/conf
目录存php配置文件;/alidata/server/php/conf/conf.d
目录存php的Sodium 扩展的配置文件。
按照上述目录结构常见文件夹:
mkdir -p /alidata/server/mysql/conf
mkdir -p /alidata/server/mysql/data
mkdir -p /alidata/server/mysql/init
mkdir -p /alidata/server/nginx/cert
mkdir -p /alidata/server/nginx/conf.d
mkdir -p /alidata/server/php/conf/conf.d
mkdir -p /alidata/wwwroot
mkdir -p /alidata/logs/mysql
mkdir -p /alidata/logs/nginx
mkdir -p /alidata/logs/php
2、拉取镜像
由于这个环境是准备跑WordPress的,所以php选的7.4.27-fpm版本,而mysql和nginx都是最新版。
# 拉取nginx镜像
docker pull nginx
# 拉取mysql镜像
docker pull mysql
# 拉取php镜像
docker pull php:7.4.27-fpm
# 查看镜像下载情况
docker images
如果能够看到以下显示,则表示拉取成功
3、运行容器并从中拷贝出需要的配置文件
在阅读下面的内容时需要注意拷贝的到底是文件还是文件夹!!!
- 运行PHP容器
# 启动php容器并在后台运行
docker run -d --name php-fpm -p 9000:9000 php:7.4.27-fpm
# 查看运行情况
docker ps -a
如果能够看到以下效果代表php容器启动成功
# 通过docker cp命令将php配置文件拷贝到宿主机对应目录,注意,这里我使用的php容器的名称,如果在上面docker run命令指定的名称不是php-fpm需要替换成对应的容器名称
# 将php容器中的/usr/local/etc/php/conf.d/目录下的所有文件,拷贝到宿主机的/alidata/server/php/conf/conf.d/目录下
docker cp php-fpm:/usr/local/etc/php/conf.d/* /alidata/server/php/conf/conf.d
# 将php容器中的/usr/local/etc/php/php.ini-production文件,拷贝到宿主机的/alidata/server/php/conf/目录下,并改名为php.ini
docker cp php-fpm:/usr/local/etc/php/php.ini-production /alidata/server/php/conf/php.ini
# 配置文件拷贝完毕,停止并移除php容器
docker stop php-fpm
docker rm php-fpm
- 运行nginx容器
# 启动nginx容器并在后台运行
docker run -d -p 80:80 -p 443:443 --name nginx nginx
# 查看nginx容器启动情况
docker ps -a
# 通过docker cp命令将nginx配置文件拷贝到宿主机对应目录,注意,这里我使用的nginx容器的名称,如果在上面docker run命令指定的名称不是nginx需要替换成对应的容器名称
# 将nginx容器中/etc/nginx/目录下的nginx.conf配置文件,拷贝到宿主机的/alidata/server/nginx/目录下
docker cp nginx:/etc/nginx/nginx.conf /alidata/server/nginx/nginx.conf
# 将nginx容器中/etc/nginx/conf.d目录下的所有文件,拷贝到宿主机的/alidata/server/nginx/conf.d目录下
docker cp nginx:/etc/nginx/conf.d /alidata/server/nginx/conf.d
# 将nginx默认的html页面拷贝到素质及
docker cp nginx:/var/www /alidata/wwwroot
# 配置文件拷贝完毕,停止并移除nginx容器
docker stop nginx
docker rm nginx
- 运行MySQL容器
# 启动mysql容器并在后台运行,同时初始化其时区为东八区,初始化mysql的root密码为123
docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 mysql
# 查看mysql容器启动情况
docker ps -a
# 通过docker cp命令将mysql配置文件拷贝到宿主机对应目录,注意,这里我使用的mysql容器的名称,如果在上面docker run命令指定的名称不是mysql需要替换成对应的容器名称
# 将mysql容器中的/etc/mysql/conf.d/目录下的my.cnf配置文件,拷贝到/alidata/server/mysql/conf/目录下
docker cp mysql:/etc/mysql/conf.d/my.cnf /alidata/server/mysql/conf/my.cnf
# 配置文件拷贝完毕,停止并移除mysql容器
docker stop mysql
docker rm mysql
至此,基础的环境准备工作基本上就完成了,此时,可以使用docker ps -a
命令查看,应该是看不到php、nginx、mysql的容器的。
4、修改配置文件
这部分就和以前直接在宿主机上的配置大同小异了,但是这里有一个点比较容易踩坑,就是在配置文件中所使用的所有路径,都需要写成对应docker容器中的路径,而不是宿主机上的路径,否则会出现各种无法找到文件的错误!!!
- 修改php配置文件
cd /alidata/server/php/conf/
vim php.ini
然后根据自己的需要,修改相关的配置项。因为我是要部署WordPress,所以这里主要是打开了一些扩展,如bz2、curl、gd2、mysqli、openssl、pdo_mysql等,在php.ini配置文件中修改以下内容:
extension=bz2
extension=curl
extension=gd2