也不是所有都编译,镜像具备的功能就不用编译了。文中编译的是php5的一些扩展库。

步骤

1.安装openEuler

虚机安装欧拉v22,作为容器的宿主。安装后,用NAT方式启动

sudo kvm -smp 2 -m 4096 --hda euler2.qcow2 -vga qxl -net nic -net tap,ifname=tap2,script=./nat-up-qemu,downscript=no

2.ssh登录openEuler

ssh登录的目的是欧拉的命令界面字体太小,方便主机和虚机之间复制命令。以下命令都在主机里执行:

ssh-keygen
ssh-copy-id 用户名@欧拉ip
在.bashrc添加简短的命令 alias ss='ssh 用户名@欧拉ip'
Euler默认开启了firewalld 服务,默认禁用了80端口

3.安装容器iSulad

如果需要build相关功能可以再安装isula-build,2个包具体有哪些命令请--help

yum安装完iSulad后,首先需要添加仓库地址

vi /etc/isulad/daemon.json
添加到:
"registry-mirrors": [ 
		"我用的华为云"
    ],

4.查询镜像

isula search xxx:tag 从上面配置的地方搜。本命令基于registry v1 接口 而每个人上文配置的仓库地址是否支持该接口?需要自己search 看结果

5.安装镜像nginx

先看看启动了吗?

systemctl status isulad
ip a 显示不像docker那样还有个网桥
isula pull nginx 不加版本号就是最新的
isula images 查看一下
isula run -d --net host nginx 不加-net参数时,容器不能连公网,除非后期配置再新开博客
isula ps -a 查看容器,可以看到运行的1号程序是nginx
isula exec -it nginx bash 进入容器
vi /etc/nginx/conf.d/default.conf 经过查找,看到配置的root目录
exit 退出容器,容器仍在运行
mkdir /root/nginx 在欧拉宿主上,建立网站目录,和nginx 共享
isula stop nginx
isula rm nginx 删除容器,因为我要添加共享目录
isula run -d -v /root/nginx:/容器里配置文件的root目录/ -net host nginx

-v 如果左边宿主目录里有内容,会覆盖容器里的目录

nginx的日志文件,也可以同上共享出来,我下载的这个默认是日志到stdout和stderrz 这时因为主机和欧拉之间是局域网,可以直接在浏览器访问测试。

最后打开nginx配置文件的php部分,使用默认9000端口连接php

6.安装镜像php5

isula pull php:5.6
isula run 省略

欧拉/root/nginx下面新建test.php 在浏览器访问不行,isula exec进入运行的容器php,查看正在运行的是php不是php-fpm ,而且find 不到php-fpm 。所以这个容器和镜像都删了吧

isula pull php:5.6-fpm 这个名字是百度得到的
isula run 省略

在浏览器访问,是file not found 而不是nginx的404页面,这说明是php 没有找到文件 ,  php容器中没有这个网站目录,所以not found ,所以上一步共享的目录,还需和php共享。

isula stop php
isula rm php
isula run -d -v /root/nginx:/此路径必须和上一步nginx的路径相同 --net host php

这时浏览器访问php正常。下一步要装数据库,所以先看看php的支持情况

php -m |grep mysql 结果只有mysqlnd
php -m |grep pdo 结果只有pdo-sqlite

我猜,这说明php已经具备mysql驱动。但是在网站目录中php文件测试new mysqli ()函数是失败的。期待读者留言帮助!

pdo的函数肯定缺少,所以安装一下php-pdo

vim 没有
cat /etc/apt/source.list 发现是debian 9

我在网络上找不到debian 9的软件源,所以下载了3张dvd,替换source.list 为dvd ,才把vim装上,但是php-pdo在dvd也搜不到。那就只能在容器php-fpm 中,源码编译php-pdo

php5的源码压缩包才10几MB(不像现在一些app要几百MB)

smbclinet 在欧拉中从主机复制这个压缩包。
tar解压一直卡住,所以ctrl + c 删了压缩包。在主机里解压,然后用上一篇文章的方法,共享给欧拉虚机

这样在虚机里,就新建一个目录,就是php5的源码目录。

用-v 共享给容器php5,进入容器编译 pdo-mysql 的过程请参考众多的网上博客。我在这一步的目的只是编译,所以命令参数里没加-v nginx网站根目录,导致虽然容器编译好了pdo功能,但是仍然会not found php 文件。

有一篇网络博客,不记得网址了,说可以 找到 容器 配置文件,大约在

/var/lib/isulad/engines/lcr/154aab容器ID/ 这个路径下,hostconfig.json和config.v2.json 中添加 -v 共享路径,然后systecmctl restart isulad 我试了这个方法,不管用,如果哪里操作错了,请留言告诉我,谢谢!

所以我只能导出tar包,再导入构建新镜像:

isula export -o xxx.tar php
isula import xxx.tar php-pdo:1.0
isula run -d --net host -v /root/nginx:/网站绝对路径/ php-pdo:1.0

7.安装镜像mysql5

isula pull mysql:5.7 
isula run -d --net host -e MYSQL_ROOT_PASSWORD=12345 mysql:5.6
isula exec -it mysql bash
mysql -uroot -p 
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
找socket文件,肯定是默认了本机模式,于是mysql -uroot -h 127.0.0.1 -p就连连上了

退出容器,停止容器,下次再进来,不加127.0.0.1也可以连上了!真的不懂,哪位网友知道原因一定留言,多谢!

定位配置文件:

# mysqld --verbose --help | grep -A 1 'Default options'
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf 

/# ls /etc/mysql
conf.d	my.cnf	my.cnf.fallback  mysql.cnf  mysql.conf.d

/# tail -n 2 /etc/mysql/mysql.cnf
!includedir /etc/mysql/conf.d/  #必须是绝对路径
!includedir /etc/mysql/mysql.conf.d/

/# ls -l /etc/mysql/my.cnf
lrwxrwxrwx. 1 root root 24 Dec 21  2021 /etc/mysql/my.cnf -> /etc/alternatives/my.cnf

进入容器记下数据目录,配置目录,日志目录的路径,这些最好存储在独立于容器之外。也用-v 共享目录。所以查完退出容器,删除,新建容器:(在isula 中,不写--net的话,默认没有网卡,就算有端口也监听不了 )

isula run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7

其中查看 -e 还有哪些选项,比如新建用户,可以在容器的启动脚本中查看(进入容器后发现这个入口文件,是在usr/local/bin/下 ),-e即--ENV 会设置进入系统后的全局环境变量,可在bash中echo $变量 。可见-e可设置任意变量名字和值,但是能被entrypoint文件利用上的名字一定要看入口文件实际调用了哪些

# isula ps -a
CONTAINER ID	IMAGE     	COMMAND               	CREATED     	STATUS                   	PORTS	NAMES
4d0609d007b8	mysql:5.7 	"docker-entrypoint..." 	5 days ago  	Up

关于-e更多信息,可以参考 https://blog.csdn.net/qq_38637558/article/details/120783759

https://blog.csdn.net/cfy_banq/article/details/122767830

8.总结

当使用qcow2格式时,文件体积增长挺快的。所以isulad默认存储路径 /var/lib/isulad 最好挂载到独立qcow2文件。或者干脆指定其他路径,我试了在配置文件中指定,"graph": "/home/docker_home" 但是我没看到有效果。

我测试有效的方式是改服务脚本:/usr/bin/isulad --graph /mnt/data1/isu

这样有效的前提是fstab中设置好 /mnt/data1 ,即开机时就要具有这个目录,而不能是开机后手动挂载。

以上为测试方便用了--net host,实际生产环境应该用--net 新建网桥。修改网站目录和数据库目录的权限。