docker:Web迁移

系列文章目录

docker:环境安装

docker:Web迁移


文章目录


前言

上一次博客完成了环境的安装,这次就把在服务器的所有项目,在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容器化技术就到这里,以后有需要补充的再说。

相关推荐
疯狂的沙粒2 分钟前
如何在Vue项目中应用TypeScript?应该注意那些点?
前端·vue.js·typescript
小镇程序员18 分钟前
vue2 src_Todolist全局总线事件版本
前端·javascript·vue.js
野槐20 分钟前
前端图像处理(一)
前端
程序猿阿伟27 分钟前
《智能指针频繁创建销毁:程序性能的“隐形杀手”》
java·开发语言·前端
疯狂的沙粒29 分钟前
对 TypeScript 中函数如何更好的理解及使用?与 JavaScript 函数有哪些区别?
前端·javascript·typescript
瑞雨溪37 分钟前
AJAX的基本使用
前端·javascript·ajax
力透键背40 分钟前
display: none和visibility: hidden的区别
开发语言·前端·javascript
条纹布鲁斯1 小时前
dockerdsktop修改安装路径/k8s部署wordpress和ubuntu
docker·kubernetes
程楠楠&M1 小时前
node.js第三方Express 框架
前端·javascript·node.js·express
盛夏绽放1 小时前
Node.js 和 Socket.IO 实现实时通信
前端·后端·websocket·node.js