版本升级分为两部分,一部分是数据库服务的升级,一部分是其他服务的升级。
1、当然,首先要判断是否需要升级,我没想到更好的办法,我是根据docker镜像的tag来判断的,tag可以作为版本号,通过比较以安装的镜像的tag和要安装的版本号比较即可得知是否需要升级。
(1)查询某个镜像的tag
declare tag=$(docker images | grep '镜像名' | awk {'print $2'})
docker images | grep '镜像名' | awk {'print $2'}的意思是,查找docker images列表中包含某个字符串的镜像,并返回列表的第二列即tag列。
root@greenvm-w14014v2:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE sebp/elk latest ac9f80b1eba4 3 days ago 1.15GB ubuntu 16.04 c9d990395902 6 days ago 113MB fluent/fluentd latest 19e4a20a16e2 7 days ago 38.2MB tomcat latest 33e02377a00f 7 days ago 554MB nginx latest b175e7467d66 8 days ago 109MB
(2)比较版本号大小
if [ -z "${tag}" ]; then #tag为空说明没安装docker,需要走安装流程. elif [[ "${tag}" < "最新版本" ]]; then #走升级流程 fi
2、其他服务的升级比较简单,只需要销毁容器和镜像,重新构建即可。
(1)销毁容器,在docker-compose.yml所在目录下执行:
docker-compose down
(2)删除镜像
docker rmi -f $(docker images | grep athena | awk {'print $3'})
(3)重新构建镜像并运行容器,在docker-compose.yml所在目录下执行
docker-compose up -d
3、数据库的升级,我自己琢磨的,不清楚是不是有更好的方案。
步骤:
(1)将升级脚本拷贝到mysql容器中
(2)执行升级脚本
下面分别来说一下:
(1)将升级脚本拷贝到mysql容器中
docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径
在本例中:
docker cp upgrade.sql mysql-server:/usr/local/work docker cp upgrade.sh mysql-server:/usr/local/work
(2)执行升级脚本
在docker-compose.yml文件目录下执行:
docker-compose exec 容器名 命令
在本例中:
docker-compose exec mysql-server bash /usr/local/work/upgrade.sh
upgrade.sh:
mysql -uroot -p$MYSQL_ROOT_PASSWORD << EOF source /usr/local/work/upgrade.sql EOF
ps:
由于mysql容器数据库的数据是放在宿主机文件系统的,所以mysql容器的销毁或创建甚至mysql镜像的重新构建都不会影响数据,容器重新运行后数据库依然能正常使用。