找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 2767|回复: 0

怎样在一个docker里启动apache2+mysql

[复制链接]
发表于 2024-11-5 02:20:07 | 显示全部楼层 |阅读模式
本帖最后由 chenandjun 于 2024-11-5 02:59 编辑

这个是我走弯路最多的一次,前前后后折腾了有一个月,找不到教程也没有人帮助,搞得差点崩溃,主要是不懂,对docker机制不懂,原理不懂,ubuntu命令也是刚学,其实dockerhub上面也有apache2+mysql的镜像的,但是不符合我的心意,我想的是按照我自已的想法实现,或者按照网上的说法或是docker的本意是一个docker容器只启动一个服务,这样结构清楚,维护简单,但是我根本不是这样想的,我就喜欢搞集中供电,没得办法,我的想法是你创建了一个apache2容器和一个mysql容器然后通过映射出来的端口连接难道要比在一个docker里直接apache2连接同一个docker里的mysql快吗,有人会说,如果有多个服务连mysql的话可以只创建一个mysql容器,然后在里面创建多个数据库,但这样这个mysql容器就是故障点,一旦这个容器出故障就全完了.我的小主机上十几个容器大多数都是我自已做的镜像弄的,有一些实在没有办法还只能用dockerhub上的镜像,比如jsbin,有懂jsbin的大佬不知能不能帮帮我,jsbin就是一个练习html和javascript的,它是在同一个网页上左边写代码右边直接显示结果的,我按照作者github页上的构建本地的方法做一直没成功,npm install依赖一直下不下来node版本换了若干7 8 6 18 0.8 1.0 1.2 1.1都用了根本没用,有高手请帮帮我.说回正题,怎样在同一个docker里运行两个服务,一开始我用的docker镜像是16.04lts,先下载一个ubuntu16.04的镜像docker pull ubuntu:16.04或者你也可以用debootstrap自已做docker镜像(但用debootstrap自已做镜像时在docker run时最后要加上/bin/bash,因为它没有启动命令,我开始时没注意搞了好几次导入tar包到群晖出错还以为没搞成功,后来在群晖命令行里用docker import 导入又运行不起来,容器一启动就退出,就是没有/bin/bash运行命令,或者你也可以把导入的镜像再docker build -f dockfile -t "新镜像:标签" .重建一次,dockerfile文件加上CMD ["/bin/bash"]或ENTRYPOINT ["/bin/bash"]如果你需要在docker里运行systemctl而不是service的话命令就不是/bin/bash而是/usr/sbin/init了.
有了ubuntu16.04镜像我们就可以创建容器了,docker run -itd --name ubuntu ubuntu:16.04,你看,这就是我上篇说的保留一个群晖系统的用意所在,我在运行docker run时什么也没加,没加端口,也没映射文件夹,因为开始还没想好要映射什么端口,映射什么文件夹,然后就是ubuntu基本操作.
apt update 然后要装一个https, apt install apt-transport-https因有些国内源的地址是https的不装的话更新会出错.再装一个nano用来编辑源列表,暂不装vim是因现在还没换源连的还是国外vim大,装了慢你换过源后可以再装vim.用nano来编辑sources.list文件nano /etc/apt/sources.list可以用阿里的源(请注意添加源时一定要看准你的ubuntu的代号,我的是ubuntu16.04,代号是xenial,要看源里的代号和你的版本一样,看代号用cat /etc/os-release)

1.png
deb http://mirrors.aliyun.com/ubuntu/ xenial main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main

deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main

deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe

deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe

deb http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main

deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe

然后ctrl+x保存输入y然后回车再apt update也可以用别的国内源,看各人喜好了.
换好源就可以安装自已喜欢的软件了我装的是apt install vim net-tools wget cpio unzip xz-utils lsof lshw curl iputils-ping那个sudo命令我没装,容器里我只有root没新建用户所以没装,对了还有一个装十三的命令我也装了apt install neofetch #显示系统信息,就像下面这样, 大家也可以装一下.

2.png
还有就是终端中文,可能对于高手是喜欢英文的,因为中文有时翻译的可能不对,但像我这种小白没有中文的话根本无从下手,就没那高要求了,中文必须整起来 安装终端中文环境:apt install language-pack-zh*
然后在 /etc/skel/.bashrc和~/.bashrc和~/.profile中添加环境变量(你可以就在~/.bashrc中添加即可,/etc/skel/.bashrc和/etc/skel/.profile是创建新用户时自动添加用的,这个我走过的弯路就不说了,一说全是泪,~代表用户目录,如你是root登陆的那目录就是/root)下面是要添加的环境变量:
export LANG="zh_CN.UTF-8"
export LANGUAGE="zh_CN:zh"
export LC_ALL="zh_CN.UTF-8"
添加完成后要刷新环境变量上面export添加的就是环境变量要刷新可以用update-locale  locale-gen  或 source ~/.bashrc我一般用后者,简单直接,然后你可以随意输入几个英文字符比如sdfsdf系统会提示中文信息了说找不到命令,我知道找不到就是想看看有没有变成中文
然后就是装apache2 apt install apache2(libapache2-mod-php好像默认就包含了不需要再装了)不过apache2安装好启动时会出一个错误,要改一下/etc/apache2/apache2.conf在最末尾添加 ServerName localhost然后重启apache2 service apache2 restart就好了)

1.jpg
再下来是装php,默认的ubuntu16.04的php版本是7.0,要装php7.4还得安装个存储库,我第一次听说这玩艺apt -y install software-properties-common本来想装php8.0的好像装不了.安装好存储库后还得添加一个别人的第三方存储库
add-apt-repository ppa:ondrej/php(该存储库已无用), 这个已经无用了,大家不要添加了,用下面这个
add-apt-repository ppa:jczaplicki/xenial-php74-temp
apt update
apt -y install php7.4

3.jpg
或许你的应用会需要一些php扩展,你可以安装一些php扩展,我反正是全装了(不管有没用,装了再说)
一些php扩展 apt-get install -y php7.4-cli php7.4-json php7.4-common php7.4-mysql php7.4-zip php7.4-gd php7.4-mbstring php7.4-curl php7.4-xml php7.4-bcmath
wordpress扩展 apt install -y php7.4-mysql php7.4-dom php7.4-simplexml php7.4-ssh2 php7.4-xml php7.4-xmlreader php7.4-curl  php7.4-exif  php7.4-ftp php7.4-gd
php7.4-iconv php7.4-imagick php7.4-json  php7.4-mbstring php7.4-posix php7.4-sockets php7.4-tokenizer
其它扩展 apt install -y php7.4-mysqli php7.4-pdo  php7.4-sqlite3 php7.4-ctype php7.4-fileinfo php7.4-zip php7.4-exif php7.4-tidy(注,php7.4-tidy是dzzoffice里有个文集上传txt小说要用到的)
APCu是一个缓存扩展,可以缓存并优化PHP中间代码,强烈建议安装。
apt -y install php7.4-apcu
apache2启用关闭模块命令
关闭模块a2dismod 模块
启用模块a2enmod 模块
如启用php7.4  a2enmod php7.4
apache2启用的一些模块
a2enmod rewrite
a2enmod file_cache
a2enmod cache
a2enmod socache_memcache
a2enmod deflate  压缩
启用ssl  a2enmod ssl
(请注意上面的模块启用后要service apache2 restart一次,如果你刚才装apache2没有启动apache2就先service apache2 start然后再service apache2 restart一次,我开始时是停止容器再启动容器,发现没用必须service apache2 restart一次)
还要改一下php.ini文件去除上传文件大小的限制
nano或vim /etc/php/7.4/apache2/php.ini
upload_max_filesize = 8m ;望文生意,即允许上传文件大小的最大值。默认为2M(我改成了256M)
post_max_size = 8m ;指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8M(我改成了256M)
max_execution_time = 600 ;每个PHP页面运行的最大时间值(秒),默认30秒
max_input_time = 600 ;每个PHP页面接收数据所需的最大时间,默认60秒
memory_limit = 8m ;每个PHP页面所吃掉的最大内存,默认8M(php7.4默认128M我没有改大)
max_file_uploads=20   一个页面默认上传多少张改成512(我改成了512M)
这些改完后重启apache2 service apache2 restart
然后你可以测试一下http和php有没有成功默认网站的目录是在/var/www/html下会生成一个index.html你可以先netstat -an看看服务究竟有没有起来
3.png
你看到有个0.0.0.0:80说明起来了,可以测试下curl localhost:80会出来一堆html代码(我没映射端口没法打开浏览器测试)就说明已经在解释html代码了,再在/var/www/html下创建一个php文件看能不能解释php先cd到html下cd /var/www/html
touch info.php
echo "<?php phpinfo(); ?>" > info.php
然后curl localhost/info.php你先又看到一堆的html代码表示php也能解释了,下面就开始装mysql了
ubuntu16.04自带的仓库的mysql是5.7如果你直接apt install mysql-server的话是装的mysql5.7,这我那愿意(其实真实的情况是mysql5.7在后面的docker映射文件夹时很烦,要先导出sql文件再导入特别是过几天会突然里面的debian账户会消失搞得任何用户都登陆不了,吃了不少亏,mysql8皮实一点,还有mysql5.7在创建mysql用户时在/etc/passwd里登记是这样的mysql:x:110:106:MySQL Server,,,:/nonexistent:/bin/false直接导致在启动mysql时会出个找不到/home的错误,要改成mysql:x:106:111:MySQL Server,,,:/var/lib/mysql/:/bin/false才可以)
下面开始安装mysql,由于本身仓库只支持mysql5.7,所以要去mysql官网下一下安装脚本配制文件:
先cd到/tmp下因等安装完了要删除这个文件cd /tmp然后
wget https://dev.mysql.com/get/mysql-apt-config_0.8.10-1_all.deb你如果没有装wget就装一下
apt install wget
dpkg -i mysql-apt-config_0.8.10-1_all.deb
apt update
然后就是安装 apt install mysql-server php7.4-mysql(那个mysql-client 我没有装,不知道有没有用我看也不影响使用)会出来有4个选项的窗口,选择4.ok又会出来一个窗口,提示你输入mysql的root密码,随便输入只要你记住就好以后要连数据库要用到
4.jpg
接下来的窗口是'您可以确认是否要使用新的密码加密功能……“推荐",我没有要它"推荐"我选了和mysql5x兼容. 5.jpg
然后就是安装直到完成.

但是当我启动mysql服务时 service mysql start告诉我没有这个服务,这怎么可能,我刚刚装的我cd到init.d下面 cd/etc/init.d
ls一下发现确实没有mysql启动脚本,这是怎么回事,后来经过多方了解,又去官方网站上看了,"有一种需要叫他们认为你不需要",原来是从ubuntu16开始不用以前的service了改用systemctl了,这样的话得装systemd可我又不想装,没有那就得想办法,我重新建了个容器装了mysql5.7把里面的mysql脚本提出来放到init.d里,启动发现不行,提示坏的.后来又去官方找,看到官方的mysql8有一种二进制安装包,我把它下载下来,它只需把安装包的文件复制到/usr/local下面就可运行,我把它的启动脚本拷贝出来,用notepad++打开按照的mysql8的安装目录改了下复制到init.d下,加执行权限,chmod +x mysql后service mysql start终于运行起来了.就改也下面这几项
4.png
想把mysql 脚本传上来,根本就传不了,改成zip txt都说不支持,明明附件类型里有这种类型,也小于1M不知道怎么回不,大家可以从mysql官网下载二进制包提取里面的mysql脚本然后按照你的mysql目录像我上面那样改就可以了.现在apache2和mysql两个服务都可以运行了,是应该把它保存成镜像了
docker commit ubuntu "ubuntucn:new"
然后用这个新的镜像重新创建容器,这一次得规化好,首先在主机的/dock文件夹下新建了个dzzoffice文件夹,再在dzzoffice文件夹下新建data和html
cd /dock
mkdir dzzoffice
cd /dzzoffice
mkdir data html
chown -R www-data:www-data /dock/dzzoffice
chmod 777 /dock/dzzoffice
上面的chown是更改所有者,www-data是ubuntu自带的一个用户,chmod 777我给了完全的权限,有人说这不安全,但对我们这些小白来说, 运行起来才是头等大事,其它的以后再说.
端口暂时定为8080:80 8081:3306开始docker run
docker run -itd --privileged --name ubuntunew -p 8080:80 -p 8081:3306 -v /dock/dzzoffice/data:/var/lib/mysql -v /dock/dzzoffice/html:/var/www/html ubuntucn:new
容器运行起来了,我连忙打开浏览器输入主机地址+8080,http://192.168.18.20:8080告诉我无法访问此网站,嗯,docker exec进去看一下
netstat -an一个服务也没有启动,噢,没有加入启动组,去网上搜如何时把ubuntu服务加入启动组,update-rc.d 服务 defaults 99于是我把apache2和mysql都加入启动组后来又

update-rc.d 服务 enable

sysv-rc-conf 服务 on
也看了/etc/下面rc0.d~rc6.d里面都有apache2和mysql,但是重做镜像后这两服务就是不启动.又是一顿狂搜,慢慢的了解了docker启动的机制,它就是一个进程,根本没有启动组一说,你就把它想成windows里的一个软件如qq,只不过这个软件里面又可以装软件,让你以为它是一个系统,为不不和原来的软件冲突,,用了一些关键字作隔离,导致主机系统根本找不到容器里的软件,谈何启动(这些只是我想像的,也不知道对不对,有高手如果觉得不对,欢迎对我提出批评,帮我纠正过来.)所以docker提供了一个启动命令,不过要重新构建.
用docker build -f dockerfile -t "new:tag" .
于是写了dockerfile文件chen
touch chen
nano chen
chen内容:
#!/bin/bash
FROM ubuntucn:new
CMD service apache2 start && service mysql start

tail -f /dev/null
ctrl+x保存输入y加回车
docker build -f chen -t "ubuntucn:new1" .
重新创建容器,docker run -itd --privileged --name ubuntunew1 -p 8080:80 -p 8081:3306 -v /dock/dzzoffice/data:/var/lib/mysql -v /dock/dzzoffice/html:/var/www/html ubuntucn:new1这次刚运行立马容器就退出了,意外中止,这是如何一回事,抽了一根烟,在那思索.
听了几首歌,还是过来搞,这次我把

CMD service apache2 start && service mysql start
改成CMD service apache2 start
只启动一个,顺利启动,那问题出在mysql上,我
docker exec -it ubuntunew1 /bin/bash
进去service mysql start
竟然没启动起来,再一看,/var/lib/mysql目录一片空白,原来是我映射目录/dock/dzzoffice/data:/var/lib/mysql用主机的data目录把mysql目录覆盖了,这可怎么办,但mysql目录必须映射出来,因容器一删除的话东西全没了必须映射到外部目录才行,正好那段时间gpt开始流行,据说gpt无所不知,我也进到它的网页版和gpt隔空对话了一次,它给出了两个建议,一是挂久存储,还有一个是mount加ro只读,这两个方法都不是我想要的,问它还没有有别的办法,它建议我去dock官方去了解,都去官方了还要你干嘛,没想到gpt也会发火,"我只是个程序你跟我发什么火"一个破程序也发牢骚,心里想gpt也不过尔尔,(当时好像也和gpt讨论了docker容器的启动机制,映射主机目录是在docker启动之前就映射还是docker启动起来才映射,本来还想在这里想想办法的,它一发牢骚把我的思绪全打乱了)没办法又去官方了解,全文翻译慢慢的看,基本上也就那两招,心里哇凉,漫无目的的在google上搜,突然一个贴子引起了我的注意,是关于mysql重新初始化的,我点进去一看,这不正是我所需要的吗,我连忙把他的这段文字用notepad++复制了保存了起来,但他没讲如何初始化,这好办,有了目的搜索,根本不需要gpt,文心一言都知道了,并且给出了脚本,还有注意事项.
mysql8初始化
mysqld --initialize-insecure
chown -R mysql:mysql /var/lib/mysql /var/run/mysqld
service mysql start
sleep 5
mysql -uroot --skip-password <<EOF
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY "$MYSQL_ROOT_PASSWORD";
create user 'root'@'%' identified with mysql_native_password by "$MYSQL_ROOT_PASSWORD";
grant all privileges on *.* to 'root'@'%' with grant option;
FLUSH PRIVILEGES;
quit
其中chown -R mysql:mysql /var/lib/mysql /var/run/mysqld是我后加的,因老是不是log文件无法创建就是mysqld.sock不能创建,所以我一古脑都加了
$MYSQL_ROOT_PASSWORD也是后加的目的是提取环境变量的值,这样在建容器时可以指定mysql的root密码,我开始在脚本中没加双引号导致mysql引用的密码是$MYSQL_ROOT_PASSWORD本身而非它的值,你用echo $MYSQL_ROOT_PASSWORD去看就对的但mysql引用就出错所以要加双引号
于是dockerfile文件要修改了,先删除我创建的ubuntucn1容器再删除build的镜像
docker stop ubuntunew1
docker rm ubuntunew1
docker images
docker rmi ubuntucn:new1
原chen内容
#!/bin/bash
FROM ubuntucn:new
CMD service apache2 start && service mysql start
修改后
#!/bin/bash
FROM ubuntucn:new
ENTRYPOINT  ["/usr/bin/chen.sh"]
然后在/usr/bin创建chen.sh脚本
cd /usr/bin
touch chen.sh
chmod +x chen.sh
nano chen.sh
chen.sh内容
#!/bin/bash
#初始化Mysql 数据库
mysqld --initialize-insecure
echo "正在初始化MYSQL数据库"
chown -R mysql:mysql /var/lib/mysql /var/run/mysqld /var/log/mysql
service mysql start
echo "正在启动MYSQL数据库,设置密码和远程"
sleep 5
mysql -uroot --skip-password <<EOF
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY "$MYSQL_ROOT_PASSWORD";
create user 'root'@'%' identified by "$MYSQL_ROOT_PASSWORD";
grant all privileges on *.* to 'root'@'%' with grant option;
FLUSH PRIVILEGES;
quit
EOF
echo "正在关闭MYSQL服务器"
service mysql stop
echo "正在启动网页服务器"
service apache2 start
#启动 Mysql 服务器
service mysql start
echo "MYSQL+apache+php启动完成,AMP环境搭建完成,可以使用了"
tail -f /dev/null
重新本地构建
docker build -f chen -t "ubuntucn:new1" .
再次创建容器
docker run -itd --privileged --name ubuntunew1 -p 8080:80 -p 8081:3306 -v /dock/dzzoffice/data:/var/lib/mysql -v /dock/dzzoffice/html:/var/www/html ubuntucn:new1
容器成功运行了,我docker exec进去发现mysql确实启动成功了,但是我没有发现apache2服务,再次关闭容器,再重启动,容器又退出了,意外中止,怎么回事啊,点开ubuntunew1容器日志查看发现又在初始化mysql,难道每次打开容器它都初始化一遍,于是加了条件判断,再次build,脚本内容修改如下:
chen.sh内容
#!/bin/bash
#初始化Mysql 数据库
if [ ! -f "/var/lib/mysql/initialized" ]; then
mysqld --initialize-insecure
echo "正在初始化MYSQL数据库"
chown -R mysql:mysql /var/lib/mysql /var/run/mysqld /var/log/mysql
service mysql start
echo "正在启动MYSQL数据库,设置密码和远程"
sleep 5

mysql -uroot --skip-password <<EOF
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY "$MYSQL_ROOT_PASSWORD";
create user 'root'@'%' identified by "$MYSQL_ROOT_PASSWORD";
grant all privileges on *.* to 'root'@'%' with grant option;
FLUSH PRIVILEGES;
quit
EOF

echo "MYSQL初始化完成,正在写入标志文件"
touch /var/lib/mysql/initialized
echo "正在关闭MYSQL服务器"
service mysql stop
fi
echo "正在关闭MYSQL服务器"
service mysql stop
echo "正在启动网页服务器"
service apache2 start
#启动 Mysql 服务器
service mysql start
echo "MYSQL+apache+php启动完成,AMP环境搭建完成,可以使用了"
tail -f /dev/null
这次我不docker exec进去了,我就看日志了,发现第二次并没有初始化,显示"MYSQL+apache+php启动完成,AMP环境搭建完成,可以使用了"
我才进去看,发现apache2还是不见了,难道docker只能启动一个服务,不对啊,我在里面再service apache2 start是可以的啊,而且也有人做了apache2+mysql8的镜像的啊,于是再次改动,我把apache2移到脚本顶上,又加了两秒廷时,修改如下
chen.sh内容
#!/bin/bash
echo "正在启动网页服务器"
service apache2 start
sleep 2
#初始化Mysql 数据库
if [ ! -f "/var/lib/mysql/initialized" ]; then
mysqld --initialize-insecure
echo "正在初始化MYSQL数据库"
chown -R mysql:mysql /var/lib/mysql /var/run/mysqld /var/log/mysql
service mysql start
echo "正在启动MYSQL数据库,设置密码和远程"
sleep 5

mysql -uroot --skip-password <<EOF
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY "$MYSQL_ROOT_PASSWORD";
create user 'root'@'%' identified by "$MYSQL_ROOT_PASSWORD";
grant all privileges on *.* to 'root'@'%' with grant option;
FLUSH PRIVILEGES;
quit
EOF

echo "MYSQL初始化完成,正在写入标志文件"
touch /var/lib/mysql/initialized
echo "正在关闭MYSQL服务器"
service mysql stop
fi
echo "正在关闭MYSQL服务器"
service mysql stop
#启动 Mysql 服务器
service mysql start
echo "MYSQL+apache+php启动完成,AMP环境搭建完成,可以使用了"
tail -f /dev/null
这次顺利启动成功,进去netstat -an 查看apache2和mysql服务都启动得好好的.这下万事大吉了,把容器删除了,重构了镜像,重命名为ubuntucn:base作为我的amp基础镜像并docker save保存了一个tar文件备份到我的笔记本上,好不容易做的,不能丢.
然后就是用这个基础镜像创建了dzzoffice容器和wordpress容器,当两个容器都启动时,问题来了,不是dzzoffice的mysql启动不成功就是wordpress的mysql启动未成功,要进去再service mysql start一下才行,心里想是不是两个容器的mysql同时启动打架了,于是我调了一下脚本里的sleep时间,
把其中一个启动时间境加了5秒,再次两个容器同时启动,好像是行的,但是心里总是不舒服,我也没有重构镜像.就这么先用吧,过了一段时间,有一天在网上不知搜什么东西时看到有一个贴子,讲docker容器关闭时如何优雅的关闭服务,好奇点进去看了一下,讲的是linux都有一个trap命令,可以在脚本中调用trap命令执行一些指令,要想用trap命令先得构建一个函数.如下
clean_up_term() {命令}
trap clean_up_term SIGTERM
函数构建在前,调用在后,我一想,我也要保护我的数据,也跟着在dzzoffice的chen.sh脚本中加了这个代码
clean_up_term() {
service mysql stop
echo "mysql已关闭"
}
trap clean_up_term SIGTERM
发现根本不起作用,查看日志没有发现"mysql已关闭"的提示,也就不在研究,反正dzzoffice和wordpress能用就凑合着用着,直到上星期,我装jsbin网页练习器时顺便问了gpt一次trap命令为什么没起作用,终于得到了有用的回答,jsbin倒是没弄起https来.
gpt建议我把tail -f /dev/null换成wait -n,然后启动apache2和mysql都用前台命令,这样才能方便trap捕捉到进程信号,才能优雅的关闭它们.
那个apache2前台运行我知道的apachectl -D FOREGROUND &但是mysql前台我不知道,于是我按照我自已的想法把脚本作如下改动.
#!/bin/bash
#初始化Mysql 数据库
if [ ! -f "/var/lib/mysql/initialized" ]; then
mysqld --initialize-insecure
echo "正在初始化MYSQL数据库"
chown -R mysql:mysql /var/lib/mysql /var/run/mysqld /var/log/mysql
service mysql start
echo "正在启动MYSQL数据库,设置密码和远程"
sleep 5

mysql -uroot --skip-password <<EOF
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY "$MYSQL_ROOT_PASSWORD";
create user 'root'@'%' identified by "$MYSQL_ROOT_PASSWORD";
grant all privileges on *.* to 'root'@'%' with grant option;
FLUSH PRIVILEGES;
quit
EOF

echo "MYSQL初始化完成,正在写入标志文件"
touch /var/lib/mysql/initialized
echo "正在关闭MYSQL服务器"
service mysql stop
fi

#启动 Mysql 服务器
echo "正在启动MYSQL服务器"
service mysql start

echo "正在启动网页服务器"
apachectl -D FOREGROUND &
echo "MYSQL+apache+php启动完成,AMP环境搭建完成,可以使用了"

clean_up_term() {
echo "容器正在停止,关闭 MySQL..."
mysqladmin -uroot -p$MYSQL_ROOT_PASSWORD shutdown
echo "关闭 Apache..."
apachectl -k stop
sleep 5
if ! pgrep mysqld > /dev/null && ! ps aux | grep -v grep | grep apache2 > /dev/null; then
echo "mysql已关闭"
echo "apache2已关闭"
else
echo "mysql还在运行"
echo "apache2还在运行"
fi
}

trap clean_up_term SIGTERM

wait -n
这些脚本判断都由问gpt加上我整理再加上我的想法而来,后来我又加了一个phpmyadmin,我在phpmyadmin网站上下了phpMyAdmin-5.2.1-all-languages.zip把它解压到了/usr/share目录下重命名成phpmyadmin文件夹,然后在脚本里加了符号键接,最终脚本如下:
#!/bin/bash
#初始化Mysql 数据库
if [ ! -f "/var/lib/mysql/initialized" ]; then
mysqld --initialize-insecure
echo "正在初始化MYSQL数据库"
chown -R mysql:mysql /var/lib/mysql /var/run/mysqld /var/log/mysql
service mysql start
echo "正在启动MYSQL数据库,设置密码和远程"
sleep 5

mysql -uroot --skip-password <<EOF
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY "$MYSQL_ROOT_PASSWORD";
create user 'root'@'%' identified by "$MYSQL_ROOT_PASSWORD";
grant all privileges on *.* to 'root'@'%' with grant option;
[font=微软雅赸FLUSH PRIVILEGES;

quit
EOF

echo "MYSQL初始化完成,正在写入标志文件"
touch /var/lib/mysql/initialized
echo "正在关闭MYSQL服务器"
service mysql stop
fi

#创建符号链接
if [ ! -L /var/www/html/phpmyadmin ]; then
  ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin
fi

#启动 Mysql 服务器
echo "正在启动MYSQL服务器"
service mysql start

echo "正在启动网页服务器"
apachectl -D FOREGROUND &
echo "MYSQL+apache+php启动完成,AMP环境搭建完成,可以使用了"

clean_up_term() {
echo "容器正在停止,关闭 MySQL..."
mysqladmin -uroot -p$MYSQL_ROOT_PASSWORD shutdown
echo "关闭 Apache..."
apachectl -k stop
sleep 5
if ! pgrep mysqld > /dev/null && ! ps aux | grep -v grep | grep apache2 > /dev/null; then
echo "mysql已关闭"
echo "apache2已关闭"
else
echo "mysql还在运行"
echo "apache2还在运行"
fi
}

trap clean_up_term SIGTERM

wait -n
这就是我现在用的脚本,同时启动也没有问题.
写到这里,我回头一看,不知不觉中写了一大堆,我知道我不适合写这个,罗罗嗦嗦的,说了这么多也不知道大家能否看得明白,其实我们这些小白新手学点东西很难,现在网上有用的东西已经不多了,进论坛又得注册说不定还要邀请码或强制捐赠,即使进去了,也还要到新手村学习提问的智慧,即使问了也没多少人理你,大家都很忙,我只是向同样是新手的人提供我的一些个人经历,相互扶持.










您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-4-10 14:38

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表