docker:环境安装
docker:Web迁移
上一次博客完成了环境的安装,这次就把在服务器的所有项目,在docker中进行重构,方便以后的迁移,我把我的Web项目按端口进行了拆分,所以一共需要三个容器,分别是使用80端口的Web+wordpress和使用5001端口的Flask项目,以及提供数据的Mariadb。
开始之前先用
sudo -i
进行提权。
docker pull mariadb:10.4
用 docker pull 从docker hub中拉取已经存在的镜像 后边是镜像名称和版本号。这里我选用了10.4.
docker images 可以查看本地所有镜像。
先放一下官方案例。
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密码。
新数据库就创建成功了。
你可以用.sql或者其它工具将你的云端数据库同步到虚拟机的docker中,这个不演示了。
刚才我们已经完成的数据库容器的创建,但有个问题,随着数据库中数据的不断增多,这个容器也会越来越大,后期打包或者迁移也会很不方便,所以我们需要将数据库中的数据剥离出来,以后我们只需要创建容器然后调用外部的数据就可以完成迁移。
将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
现在我们没有初始化密码,也可以从之前创建的链接打开数据库。
并且数据库内容也在。
在镜像的选取中,我选择了已经打包好apache和php的webdevops/php-apache
docker pull webdevops/php-apache:7.4
webdevops/php-apache文档
通过项目文档我们发现,该镜像将apache的工作目录放到了/app,所以我们可以将自己的网站文件放在这里或者从外部挂载到这里,我的建议是,如果这只是一个静态页面,里面的东西不会增加,就直接放到容器里,如果这个网站的内容会不断增加使得容器增大,就从外部挂载,因为我的php项目会不断上传新的媒体文件,所以我选择外部挂载
创建一个存放数据的目录,并将你的网站数据传进去。
docker run -d --name myweb -p80:80 -v /root/docker/webdata:/app webdevops/php-apache:7.4
我的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就可以。
之后就完成了网站的迁移。
我之前使用的是apache-Flask但是在docker hub中没找到适合的,最后决定自己从头配置一个。
在初始的镜像选取中还是选择了Debian12
docker pull debian:12.4
创建直接先把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网络中。
apt update
apt install apache2
service apache2 start
apt install python3 python3-pip
剩下的就是自己安装自己的配置文件了,不说了,这不是docker的内容。
如果你再操作中不小心退出了容器,因为你的容器没有设置后台运行的程序,所以启动后就会自动关闭,我们可以提交当前容器为镜像,然后用新镜像再次启动新容器,这样可以保留之前的操作。
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
经过一段时间的配置,我们完成了Flask项目的迁移。
因为我的这个项目需要的数据不会变化,镜像也不会逐渐增大,所以没有进行外部的文件挂载,现对这个镜像进行一个打包。
docker commit mydebian mydebian
vim Dockerfile
FROM mydebian:latest
RUN ["apachectl","-D","FOREGROUND"]
docker build -t flask .
docker run -d --name flask --network web -p5001:5001 flask
现在我们删除多余的镜像和全部容器。
现在我们只需要一下三条命令就可以快速部署整个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,它可以让我们快速部署一组的容器。
官方文档
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容器化技术就到这里,以后有需要补充的再说。