linux折腾docker开发

毕业设计导师任务,要求把网站部署到他的网站上。

由于导师是用docker部署的,我也对docker有兴趣,就一直折腾了下去。

导师用的ubuntu,我在他的系统上,建立docker镜像,并在镜像之上使用docker-compose进行容器建立。

创建一个web文件夹,挂载到容器上,可以对容器内部开发。

我将机器学习后端的也打包为docker镜像,上传到docker hub,通过一个docker-compose文件启动整个项目。

实操了很多linux和docker的命令,还是很有学习价值的。

php grpc拓展安装问题

由于我想创建一个docker容器,基于php81-apache镜像。但是要使用grpc服务还需要安装grpc拓展。通过网络安装grpc拓展是很困难的,网络问题,很可能超时失败,或者由于需要编译安装,缺少一些组件而失败。我是将grpc的拓展在一台机器上先编译安装,将生成的grpc.so文件作为本地文件使用。所以dockerfile文件只需要将这个文件copy到php拓展的文件夹就ok了。

  • 特别注意,编译安装grpc生成的拓展和php版本强相关,必须和php版本一致,一次编译安装时间很久,可能一小时。
  • php使用grpc服务,只要使用了grpc相关,就必须给相应php版本安装相应的grpc拓展。光凭借composer安装的grpc依赖是不够的,应该这个依赖包底层还是要使用这个grpc拓展。
  • 如果不需要编译proto文件,proto拓展可以不安装。
  • 不要使用php --ini的方式查看php拓展的配置文件位置,这可能和你的项目使用的php的ini文件并不一致。应该使用print_r(phpinfo())函数查看当前php的配置,找到ini文件的地址!
  • 最无语的一集。我的服务器防火墙配置是在宝塔上进行的,我一直修改云服务器商处的设置,一直无果。最后终于发现了,在宝塔侧边栏->安全里,幽默。

gcn服务打包为docker镜像过大

整个服务只使用了pytorch关于gcn相关的代码,但是要安装pytorch包,这是很大的。尤其如果你在linux上安装torch,会默认安装cuda版本,这会导致大小激增。我默认安装后,镜像大小8个多G,这很显然是不合理的。
后来我为了减少体积,我只安装了torch的cpu版本,即修改了requirement.txt文件

grpcio==1.62.1
grpcio-tools==1.62.1
protobuf==4.25.3 

pyecharts==2.0.5 
geopandas==0.14.3 

-f https://download.pytorch.org/whl/cpu/torch_stable.html
torch==2.1.0+cpu
-f https://pytorch-geometric.com/whl/torch-2.1.0+cpu.html
torch_geometric

只安装cpu版本,大小只有1.6G.

docker镜像上传失败问题

将py服务本地镜像想上传到docker-hub时候,报错:denied: requested access to the resource is denied
这个报错一般表示你的权限不够,无法push。首先看你是否未登录,然后看你的镜像是不是没有tag。
一般都是登录的,不然你也没机会push。主要是镜像名要和远程仓库名一致!远程仓库名为:xxx/your-image-name。你的本地镜像名可能只是:your-image-name。所以push失败。

docker tag myimage:mytag yourusername/myimage:mytag
docker push yourusername/myimage:mytag

docker.png

docker启动mysql服务失败。

在linux虚拟机上通过docker镜像启动的。打包镜像给win11电脑用docker启动,却报错start service mysqld ...failed
查看mysql的错误日志
cat /var/log/mysql/error.log
发现报错:Different lower_case_table_names settings for server ('2') and data dictionary ('0').

这个错误是由于MySQL服务器和数据字典的lower_case_table_names设置不一致导致的。lower_case_table_names是MySQL的一个系统变量,用于确定表名的大小写敏感性。

在Windows系统中,lower_case_table_names默认值为1,表示表名存储为小写,但比较时不区分大小写。在Linux系统中,lower_case_table_names默认值为0,表示表名存储为给定的大小写,比较时区分大小写。

当你在一个系统(例如Windows)上创建MySQL数据,然后尝试在另一个系统(例如Linux)上使用这些数据时,可能会出现这个错误。

解决这个问题的方法是确保你的MySQL服务器和数据字典的lower_case_table_names设置一致。你可以在MySQL的配置文件(通常是my.cnf或my.ini)中设置这个变量