Tech Note · 2023-02-05 1

网站容器化:利用Docker-compose配置LNMP环境

背景: 网站环境为LNMP,现在想对服务器进行容器化。

目的:

  1. 实现网站环境一键搭建,以便后续做迁移或者重置服务器
  2. 学习了解docker的原理及实际操作过程。

任务:

  1. 分析了解我的文件在服务器上该如何布局。
  2. 服务器安装docker环境并进行配置
  3. 自定义docker-compose.yml和config文件(使用Docker-compose为我现在用的nginx、mysql、网站程序、和phpMyAdmin分别配置容器)
  4. 制作Docker-compose的镜像?
  5. 做数据库定时备份

实操:

1. 设计:

我的理解及需求: docker容器是一个进程,进程杀死后container里未备份的数据就不存在了,所以需要解决如何在程序运行在container的前提下将产生的数据存储在物理存储中。
最初设想的实现方式: docker数据挂载,将mysql容器的数据挂载到宿主机的指定文件夹下。
最终: 基于以上想法,通过docker-compose.yml文件写好nginx和mysql的映射
参考资料: https://gitee.com/kingofhua/docker-lnmp

2. 服务器安装docker环境并进行配置

服务器环境:CentOS7(7以下不支持)

ps: docker目前只支持linux,不支持Windows

docker安装完成后所有的内容都会保存在/var/lib/docker目录下,保存了和docker相关的images, containers, volumes, networks等信息,Docker Engine – Community 的包叫做docker-ce

安装docker-ce有很多种方法:

  1. 选择使用docker的repositories来安装docker,这样可以简化安装和升级任务。比较推荐,这是大多人的选择
  2. PRM包安装,下载RPM包手动安装,并完全手动管理升级。在no access to the internet的环境下是不错的选择
  3. 自动化脚本,通常在测试环境和开发环境,会选择使用自动化的脚本来安装docker

前期工作:卸载旧版本docker

yum -y remove docker docker-common docker-selinux docker-engine

1. 设置yum仓库

要使用docker的repo来安装docker,我们首先需要安装yum-utils,device-mapper-persistent-data,lvm2。其中yum-utils 提供了 yum-config-manager 功能,后2者用于服务设备映射存储驱动程序。
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

2. 启动docker-nightly版本,docker-ce提供了3种方式用于docker的更新,稳定,测试和夜间(官网原文):

Stable gives you latest releases for general availability.
Test gives pre-releases that are ready for testing before general availability.
Nightly gives you latest builds of work in progress for the next major release.
启动/禁用nightly更新方式
sudo yum-config-manager --enable docker-ce-nightly  
sudo yum-config-manager --disable docker-ce-nightly  

3. 设置yum源

1)官方(推荐)

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo  

2)阿里云yum源(不推荐)

yum-config-manager  --add-repo  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

需要注意的是,docker不设置阿里云镜像源也是能正常安装的,并且阿里云镜像源地址也可能会更改,所以以上地址可能会返回404,如果以上镜像源地址不存在也可以忽略这一步直接进行下一步.

4. 启动docker并加入开机自动启动

systemctl start docker
systemctl enable docker

5. 验证docker服务是否启动成功

运行系统提供的一个镜像,输出Hello from Docker!,容器启动过程可能较慢,请耐心等待。

sudo docker run hello-world  

6. 配置镜像

国内各大云服务商(Azure、阿里云、七牛等)均提供了 Docker 镜像加速服务,我使用阿里云,所以镜像加速器也选择的阿里云:

直接访问阿里云容器镜像服务:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
根据官方给出的文档配置镜像加速器:

针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-‘EOF’
{
“registry-mirrors”: [

"https://YOUR-ALI-CODE.mirror.aliyuncs.com",
"https://dockerhub.azk8s.cn",
"https://reg-mirror.qiniu.com"]

}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

拓展: 卸载docker

有可能有一天不想再运行docker服务了,或者该主机有别的用途,不想docker占用主机资源,那么可以卸载docker服务。

stop docker
systemctl stop docker
Uninstall the Docker package
systemctl remove docker

删除主机上的映像、容器、卷或自定义配置文件

sudo rm -rf /var/lib/docker

3. 自定义docker-compose.yml和config

我需要做的:

  1. 确定各个程序的版本,mysql,php,nginx
  2. mysql:这里只需要配置初始用户密码和默认编码方式utf8mb4(为了网站使用emoji表情)就好,数据库文件后续可以直接导入
  3. php:根据提供的配置即可
  4. nginx:1.域名管理, 我当前的lnmp是做了反向代理存放多个vhost,这次也想继续这样做,所以需要制作一个文件夹存放config文件; 2. https 我当前的网站ssl证书是放在conf文件夹的,我直接放进去就可以吗?3. 端口设置,暴露nginx容器的哪个端口,localhost的哪个端口?
  5. 网站程序文件:配置github action文件,制作私有镜像
  6. phpmyadmin:这个程序也直接放在我的网站程序文件里?

4.