前言
需要有个centos7系统的宿主机环境,然后在宿主机上安装好docker容器。我为了制作出更小的镜像,尽可能的少安装插件,没有安装vim工具,编辑的时候我用的是linux系统自带的sed指令,操作会比vim繁琐一点点,你们也可以根据自己的需要来考虑要不要安装vim工具。同时我为了安全起见,启动容器时没有给予privileged特权,所以里面服务的启动没用systemctl和service工具,用的是原始命令;写这篇文章我主要是想作为笔记用的,里面的我安装了psmisc(图4),这个是我根据我自己的需要安装的工具,你们可以跳过这个
宿主机上执行
创建文件夹,下载并解压信呼开源OA软件源码
cd /home && mkdir xinhu && cd xinhu
wget http://xinhu-1251238447.file.myqcloud.com/file/xinhu_utf8_v2.1.7.zip
unzip xinhu_utf8_v2.1.7.zip
进入目录/home/xinhu/webmian下,将webmainConfig.php1 改成 webmainConfig.php,配置一下里面信息,如数据库,地址等

拉取一个centos7的docker镜像,并用此镜像启动一个容器
docker pull centos:7
docker run -dit --name=xinhu centos:7

进入到容器
docker exec -it xinhu bash
下载安装httpd,mariadb和php
yum -y install httpd mariadb-server mariadb php php-mysql

下载安装killall(这个看个人需要,我用来做监听httpd和mysql服务的,写了一个脚本,一旦httpd或mysql挂掉了,可以保证服务重新拉起)

修改mysql配置文件,添加用户和数据库操作的日志记录
首先修改/etc/my.cnf文件,添加一个用户
sed -i '/symbolic-links=0/a user=mysql' /etc/my.cnf

图6和图7是配置数据库操作的日志记录,你们不需要的可以跳过这两步
先把需要存储数据库操作日志内容的文件创建好,我是放在/var/log/mariadb下的,建议你们也放在这里,创建好了文件一定记得修改文件属性和权限
cd /var/log/mariadb
touch general.log
chmod +x general.log

chown mysql:mysql general.log

再去/etc/my.cnf.d/server.cnf修改配置文件
sed -i '# this is only for the mysqld standalone daemon/i\general_log=on' /etc/my.cnf.d/server.cnf
sed -i '# this is only for the mysqld standalone daemon/i\general_log_file=/var/log/mariadb/general.log' /etc/my.cnf.d/server.cnf
cat查看一下是否添加成功
cat /etc/my.cnf.d/server.cnf

此时启动mariadb服务,
/usr/libexec/mysqld
发现报错,翻车了。。。

不慌,先看看报错,说是不能访问这个插件表,然后网上百度了一下,说出现这个错误的原因是重新编译安装的时候数据目录不一致导致
然后我就初始化了一下数据库,记得指定用户和安装目录
mysql_install_db --user=mysql --datadir=/var/lib/mysql

现在再次启动
/usr/libexec/myssqld

发现服务启动正常,没有报错,美滋滋!

但是,当我执行mysql -u root -p想进数据库里面逛逛时,发现我还是太年轻。。。

看到这报错信息,熟悉的感觉扑面袭来,因为之前踩过这个坑。第一感觉就是user表出了问题,猜测不是密码问题就是host问题。。。
看到这么熟悉的报错,接下来怎么操作我肯定了然了
就是去修改一下配置文件,跳过密码认证,然后进入到数据库中,然后再把user表更新一下,再去配置文件中把跳过密码认证的配置去掉
此时先去到配置文件中,添加skip-grant-tables,使得用户登录的时候直接无密码登录
sed -i '/user=mysql/a skip-grant-tables' /etc/my.cnf

然后重启mariadb数据库,进入到数据库中

查看user表
select user,password,host from mysql.user;
果不其然,执行sql语句后,我发现,导致前面bug的真相只有一个。。。
那就是密码字段全被置空了,
为什么密码会被置空,别问我,问就是不知道。。。

现在这一步,我不说你应该也知道了,那就是把密码配一下
update mysql.user set password=password('//////');
我发现里面还有用户名为空的记录,
不多说,看到这种情况我就是干,看到不爽的直接删,反正我是弄着玩玩的,实在不行崩就崩呗,傲娇。。
delete from mysql.user where user='';
flush privileges;

更新完了一定记得去配置文件中把跳过密码验证的配置去掉
sed -i '7d' /etc/my.cnf

现在再重启数据库,发现可以用密码正常登录进数据库了
数据库就是烦,别以为目前为止我就是遇到了前面这些错,其实不然的,我是从众多坑中走来,才摸索出这一条坑少的路,也怪自己菜,解bug能力差,行吧,不多啰嗦了,继续展示吧。。。
数据库搞好了再去盘httpd服务,先去修改一下httpd服务的配置文件
sed -i '/#ServerName www.example.com:80/a\ServerName www.example.com:80' /etc/httpd/conf/httpd.conf

查看是否修改成功
cat -b /etc/httpd/conf/httpd.conf

启动httpd服务,启动正常,nice!
/usr/sbin/httpd

目前已经把容器中需要的两大服务整妥了,现在才是真正去操作信呼
先退出到宿主机上
执行指令,把信呼源码复制到容器指定的文件夹中
docker cp /home/xinhu xinhu:/var/www/html
再进到容器中
docker exec -it xinhu bash
cd /var/www/html
进来发现,复制在/var/www/html中的是整个xinhu文件夹,所以得再多几步操作
cd /var/www/html
mv ./xinhu/ ../xinhu
rm -rf html/
mv xinhu/ html
现在html中看到的就是我们想要的状态

然后ps命令查看mariadb和httpd服务是否处于开启状态
ps -ef | grep mysqld
ps -ef | grep httpd
如果没有开启,则把相关服务启动,
启动mariadb服务命令是 /usr/libexec/mysqld &
启动httpd服务的命令是 /usr/sbin/httpd &
现在,所有的准备工作全部搞定了,进入终极一步
先查看一下容器的ip,
ifconfig
然后退出容器,在宿主机上打开浏览器,输入容器的ip/?m=install
我的容器ip是172.17.0.2
172.17.0.2/?m=install
进入到期待的界面
配置好相关信息和数据库密码

然后提交安装

然后进入到登录界面,初始用户是admin密码是123456
至此,该有的操作全部搞定,,,

陪你们看看里面的界面吧
信呼,非常的nice!

最后一步生成属于自己的镜像
在宿主机上执行
命令是 docker commit -m '镜像描述' -a '制作者' 容器名 镜像名
docker commit -m 'my_xinhu' -a 'haha' xinhu xinhuoa:part1
到现在基础镜像的制作已经搞定了,不过启动完这个镜像后要去到容器中启动httpd和mysqld服务,不过你们可以用docker-compose去启动镜像,配置docker-compose.yml文件,使得镜像启动的时候开启httpd和mysqld服务,docker-compose文件配置的参考可以去到我的dockerhub仓库看一下
我的Docker Hub——lucaibao/xinhuoa
赠品:如何将容器制作成镜像并存入自己的仓库中
docker制作镜像存入自己的dockerhub仓库中,得先有自己的dockerhup账号,没有的话注册一个
(1)将容器制作成镜像
docker commit -m '镜像描述' -a '制作者' 容器名 镜像名
(2)登录本地计算机上的Docker公共注册表,需要认证你的账号密码
docker login
(3)标记images
docker tag 镜像名 username/repository:tag
(4)将标记的图像上传到存储库
docker push username/repository:tag
我制作好的信呼镜像是放在lucaibao/xinhuoa上的,你们可以拉取最新一版
docker pull lucaibao/xinhuoa:latest
网友评论