docker:Web迁移

系列文章目录

docker:环境安装

docker:Web迁移


文章目录

  • 系列文章目录
  • 前言
  • 一、Mariadb
    • 1.拉取镜像
    • 2.创建容器
    • 3.数据同步
    • 4.数据分离
    • 二、PHP项目
      • 1.拉取镜像
      • 2.创建容器
      • 3.容器互通
      • 三、Flask项目
        • 1.拉取镜像
        • 2.创建镜像
        • 3.自定义镜像
          • 1.安装apache
          • 2.安装python3
          • 3.意外退出
          • 4.自动运行
          • 5.镜像测试
          • 四、Docker Compose
            • 1.环境安装
            • 编写文件
            • 总结

              前言

              上一次博客完成了环境的安装,这次就把在服务器的所有项目,在docker中进行重构,方便以后的迁移,我把我的Web项目按端口进行了拆分,所以一共需要三个容器,分别是使用80端口的Web+wordpress和使用5001端口的Flask项目,以及提供数据的Mariadb。

              开始之前先用

              sudo -i

              进行提权。


              一、Mariadb

              1.拉取镜像

              docker pull mariadb:10.4
              

              用 docker pull 从docker hub中拉取已经存在的镜像 后边是镜像名称和版本号。这里我选用了10.4.

              docker images 可以查看本地所有镜像。
              

              2.创建容器

              先放一下官方案例。

              docker run --detach --name some-mariadb --env MARIADB_ROOT_PASSWORD=my-secret-pw  mariadb:latest
              

              解释一下

              –detach 后台运行也可以用 -d

              –name 容器名称

              –env 一些初始化环境,官方案例中指定了初始root密码。

              mariadb:latest 本地已经拉取好的镜像

              然后我们进行一些修改的添加。

              docker run -d --name mariadb --env MARIADB_ROOT_PASSWORD=123456789 -p 3306:3306  mariadb:10.4
              

              docker默认创建的mariadb是不允许外部连接的,所以我这加了-p参数

              -p 内部端口:外部端口

              现在我们拿远程连接器连接一下。

              两个关键参数就是你的虚拟机链接和命令行中的root密码。

              新数据库就创建成功了。

              3.数据同步

              你可以用.sql或者其它工具将你的云端数据库同步到虚拟机的docker中,这个不演示了。

              4.数据分离

              刚才我们已经完成的数据库容器的创建,但有个问题,随着数据库中数据的不断增多,这个容器也会越来越大,后期打包或者迁移也会很不方便,所以我们需要将数据库中的数据剥离出来,以后我们只需要创建容器然后调用外部的数据就可以完成迁移。

              将docker内的数据内容复制出来。

              docker cp mariadb:/var/lib/mysql/ /root/docker/mariadb/
              

              这里面就是数据库的数据内容,现在我们删除创建好的数据库。

              docker rm -f mariadb
              

              现在我们重新创建docker,并且挂载外部的数据。

              docker run -d --name mariadb -p 3306:3306 -v /root/docker/mariadb:/var/lib/mysql mariadb:10.4
              

              现在我们没有初始化密码,也可以从之前创建的链接打开数据库。

              并且数据库内容也在。

              二、PHP项目

              1.拉取镜像

              在镜像的选取中,我选择了已经打包好apache和php的webdevops/php-apache

              docker pull webdevops/php-apache:7.4
              

              2.创建容器

              webdevops/php-apache文档

              通过项目文档我们发现,该镜像将apache的工作目录放到了/app,所以我们可以将自己的网站文件放在这里或者从外部挂载到这里,我的建议是,如果这只是一个静态页面,里面的东西不会增加,就直接放到容器里,如果这个网站的内容会不断增加使得容器增大,就从外部挂载,因为我的php项目会不断上传新的媒体文件,所以我选择外部挂载

              创建一个存放数据的目录,并将你的网站数据传进去。

              docker run -d --name myweb -p80:80 -v /root/docker/webdata:/app webdevops/php-apache:7.4
              

              现在我们直接使用ip访问。

              我就已经实现了静态页面的挂载。

              3.容器互通

              我的web页面中不仅有静态页面wordpress需要读取数据库数据,所以我们需要将两台容器进行互通,需要先创建一个网络。

              docker network create web
              

              然后查看一下

              docker network ls
              

              现在将两个容器都添加到这个网络中。

              docker network connect web myweb
              docker network connect web mariadb
              

              现在我们只要从新设置web中的数据库配置,就可以从新读取数据了。

              wordpress只要把根目录下的wp-config.php删除下次启动就会自己从新配置了。

              因为我的wordpress中的一些调用指向的是我的域名,可以在断开网络的情况下,修改本地hosts,把虚拟机ip指向我购买的域名,这样就可以完全模拟生产环境。

              然后访问wordpress项目,他就会让我从新进行数据库配置。

              我们需要从新配置数据库信息。

              注意在同一个docker网络下直接使用镜像名称作为host就可以。

              之后就完成了网站的迁移。

              三、Flask项目

              我之前使用的是apache-Flask但是在docker hub中没找到适合的,最后决定自己从头配置一个。

              1.拉取镜像

              在初始的镜像选取中还是选择了Debian12

              docker pull debian:12.4
              

              2.创建镜像

              创建直接先把myweb关掉,不然两个容器都监听外边的80端口会冲突。

              docker stop myweb
              
              docker run -it --name mydebian --network web  -p 80:80 -p5001:5001 debian:12.4 bash
              

              因为我们要安装apache 所以开放80端口,我的Flask项目使用5001,所以开放5001端口,并且直接将其加入创建的web网络中。

              3.自定义镜像

              1.安装apache

              apt update
              apt install apache2
              service apache2 start
              

              然后用ip测试一下。

              2.安装python3

              apt install python3 python3-pip
              

              剩下的就是自己安装自己的配置文件了,不说了,这不是docker的内容。

              3.意外退出

              如果你再操作中不小心退出了容器,因为你的容器没有设置后台运行的程序,所以启动后就会自动关闭,我们可以提交当前容器为镜像,然后用新镜像再次启动新容器,这样可以保留之前的操作。

              docker commit mydebian mydebian:1.0
              docker images
              
              docker rm mydebian
              docker run -it --name mydebian --network web  -p 80:80 -p5001:5001 mydebian:1.0 bash
              

              新容器依旧还有Python3

              4.自动运行

              经过一段时间的配置,我们完成了Flask项目的迁移。

              因为我的这个项目需要的数据不会变化,镜像也不会逐渐增大,所以没有进行外部的文件挂载,现对这个镜像进行一个打包。

              docker commit mydebian mydebian
              

              现在我们使用dockerfile进行自定义命令的配置。

              vim Dockerfile
              
              FROM mydebian:latest
              RUN ["apachectl","-D","FOREGROUND"]
              
              docker build -t flask .
              

              5.镜像测试

              这是我们最终生成的镜像。

              docker run -d --name flask --network web  -p5001:5001  flask
              

              四、Docker Compose

              现在我们删除多余的镜像和全部容器。

              现在我们只需要一下三条命令就可以快速部署整个Web项目。

              docker run -d --name mariadb --network web -p 3306:3306 -v /root/docker/mariadb:/var/lib/mysql mariadb:10.4
              docker run -d --name flask --network web  -p5001:5001  flask
              docker run -d --name myweb --network web -p80:80 -v /root/docker/webdata:/app webdevops/php-apache:7.4
              

              但是这仍然有些不方便。

              我们可是使用Docker Compose,它可以让我们快速部署一组的容器。

              1.环境安装

              官方文档

              curl -SL https://github.com/docker/compose/releases/download/v2.24.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
              chmod +x /usr/local/bin/docker-compose
              sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
              docker-compose version
              

              编写文件

              docker命名转Compose有固定的格式,所以有一些现成的工具可以帮助我们快速转换。

              composerize

              通过转换得到内容。

              将其写入docker-compose.yml文件

              vim docker-compose.yml
              
              version: "3"
              services:
                  mariadb:
                      container_name: mariadb
                      networks:
                          - web
                      ports:
                          - 3306:3306
                      volumes:
                          - /root/docker/mariadb:/var/lib/mysql
                      image: mariadb:10.4
                  flask:
                      container_name: flask
                      networks:
                          - web
                      ports:
                          - 5001:5001
                      image: flask
                  php-apache:
                      container_name: myweb
                      networks:
                          - web
                      ports:
                          - 80:80
                      volumes:
                          - /root/docker/webdata:/app
                      image: webdevops/php-apache:7.4
              networks:
                  web:
                      external: true
                      name: web
              

              然后在当前目录下运行。

              docker-compose up -d
              

              现在三个容器就一次性部署完成了。

              至此我的所有网站项目全部迁移到docker之中。


              总结

              docker容器化技术就到这里,以后有需要补充的再说。