容器自启动和归档还原
基于我们在Docker中的tomcat配置了woniusales
当我们退出容器再进入的时候发现mysql启动了,tomcat没有启动。原因是因为mysql是自启动的。我们可以使用
systemctl list-unit-files | grep mysql
来查看mysql是否是自启动,我们可以看到结果如下
然后我们尝试启动tomcat,发现报错了:
[root@myrootcentos7 webapps]# /opt/apache-tomcat-8.0.53/bin/shutdown.sh Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these environment variable is needed to run this program
原因是因为我们之前在 ~/.bash_profile 中配置的环境变量没有生效,但是为什么我们在linux宿主机上就没遇到过这种情况呢?
原因:~/.bash_profile 文件是当用户登录后自动运行的,linux宿主机在每次进入时都会有一个用户登录的操作,该过程的结束就表示该文件执行了,但是docker容器进入时,并没有用户认证的操作,因此,docker容器的该文件也不会自动生效了
一、配置镜像的自启动脚本
在linux中,哪些脚本是自启动的:
/etc/rc.d/rc.local:系统在启动时进行加载执行,/etc/rc.local是本文件的软连接文件
/etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行
/etc/bashrc:为每一个运行 bash shell 的用户执行此文件,当 bash shell 被打开时,该文件被读取
~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次
~/.bashrc:该文件包含专用于你用户的 bash shell 的 bash 信息,当登录时以及每次打开新的shell时,该文件被读取
~/.bash_logoutL:当每次退出系统(退出 bash shell)时,执行该文件。
了解了上面的自启动文件后,我们来配置一个启动容器时自动开启tomcat
当我们开机的时候会有哪些文件自启动呢?
- /etc/rc.d/rc.local (当一个系统运行时,该文件就会被直接执行)
- /etc/bashrc
了解清楚这些之后,我们给予该文件可执行权限就可以了
#编辑 /etc/bashrc 或 /etc/rc.d/rc.local,添加以下指令
export JAVA_HOME=/etc/jdk #这个就是jdk解压缩存放的目录
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin #这是在原本的PATH上加了java
export PATH
/opt/apache-tomcat-8.0.53/bin/startup.sh
#添加该文件的可执行权限
chmod u+x /etc/rc.d/rc.local
二、容器提交为镜像,归档,还原
- 将容器提交为镜像
docker commit -a "ymq" -m "woniusales with tomcat+mysql5.6" rootcentos7 woniusales:1.4
#-a 指定作者
#-m 对镜像的描述
#rootcentos7 指定被提交的容器
#woniusales:1.4 提交后的镜像的名称
此时没报错,说明提交为镜像成功
查看镜像,已保存在本地,ok
- 对镜像进行归档压缩
docker save -o /opt/woniusales-centos7.tar woniusaels:1.4
gzip /opt/woniusales-centos.tar
#-o 表示镜像归档之后存放的路径
#woniusaels:1.4 指定镜像名称
可以使用 du -sh woniusales-centos7.tar.gz
来查看该文件的大小变成了多少
变成为这么多,原先是1.59G,现在是689M
- 从归档文件还原镜像
我们把该镜像的归档压缩文件发给别人之后,别人就可以在电脑上还原该镜像,然后再使用该镜像创建容器,此时创建的容器就是可以直接用来访问woniusales的
docker load -i woniusales-centos7.tar.gz
- 基于该镜像创建新的容器
现在就可以基于还原的这个镜像再创建容器,此时创建的容器就是我们之前配置好的,不过还是要以特权模式建立容器
使用 docker port rootcentos7
来看这个容器映射的端口的情况,前提是该容器要开启,以便其他容器不会端口冲突
#创建容器
docker create -it --name woniusales -h mywoniusales --privileged=true -p 8082:8080 -p 3308:3306 woniusales:1.4 /sbin/init
#开启容器
docker start woniusales
现在我们去访问 192.168.230.147:8082 照样可以访问woniusales
此时从外面远程连接容器的数据库就要把端口改为3308
这样就OK了