说明
本文介绍在 Docker 平台上部署 Java 版 EC 项目。Linux 有众多发行版,使用 Docker 部署可以使开发人员不受服务器环境的干扰,从而避免"本地可以,服务器上不行"的尴尬局面。运维人员使用 Docker 部署可以快速部署、迁移、缩扩容。
本文仅以 CentOS 为例介绍 Docker 平台上的部署方式。
准备工作
环境说明
- 操作系统: CentOS 64位 7.0以上
- Linux内核版本: 3.10 及以上,强制
- SSH工具: 推荐 Putty,不强制
- 文本编辑工具:推荐 Vim,不强制
生成部署包
请根据参考文档的介绍,生成 jar 格式的部署包(以下简称 jar 包)
安装 Docker
-
确认服务器上是否已安装 Docker
docker --version
如果已安装会返回类似的内容:
-
如果已安装,请跳过安装 Docker 环节
-
下载docker-ce-19.03.5-3.el7.x86_64.rpm并将其上传到服务器,假设上传到/vdb/strongsoft/soft
-
执行命令
rpm -ivh /vdb/strongsoft/soft/docker-ce-19.03.5-3.el7.x86_64.rpm
PS:提示缺少依赖可以从依赖包下载
5. 修改镜像和容器数据存储位置,默认存储位置为/var/lib/docker
,为避免系统盘被占满,应该存储到数据盘上,假设存储目录为/vdb/lib/docker
,修改步骤如下:
修改docker默认路径
docker默认安装在根目录下,运行一段时间镜像、容器、日志等会占用大量磁盘,导致根目录磁盘不足。所以一般我们会将docker的存储路径进行修改。提供以下两种方式修改
方法一:
通过修改docker默认存储位置实现
- 打开
/usr/lib/systemd/system/docker.service
文件,找到ExecStart
配置项,在其后面加上 -g /vdb/lib/docker --log-opt max-size=50m --log-opt max-file=5,如图所示 - 重载配置文件
systemctl daemon-reload
- 重启docker
systemctl restart docker
方法二:
通过创建软连接实现(该方法无需修改docker配置)
- 停止docker
systemctl stop docker
- 如果已经出现了磁盘满的情况需要先将
/var/lib/docker
下的东西拷到新磁盘上,如果刚装的docker则忽略此步
cp -r /var/lib/docker /vdb/lib/
- 为
/vdb/lib/docker/
创建软连接
ln -s /vdb/lib/docker/ /var/lib/
- 重启docker
systemctl restart docker
6.修改docker服务开机自动启动
systemctl enable docker
构建容器镜像
- 下载helloworld.tar.gz,并在本地解压,得到以下内容
- 替换 rest 目录下的 jar 包,假设项目的 jar 包名字是
gdhz.jar
- 修改
start.sh
文件,将helloworld.jar
修改为gdhz.jar
,其他内容为默认设置,建议不要修改 - 如果有独立配置文件,将其命名为
application.properties
,并替换config
目录下的默认配置文件 - 将 config Dockerfile rest start.sh 几个文件夹和文件都上传到服务器上,并放在同一个目录里
- 登录服务器
- 进入上传的目录
- 输入命令开始构建镜像,
java-helloworld:0.1
代表的是镜像名:版本号
,可以自行命名,但是不能有特殊字符和中文docker build ./ -t java-helloworld:0.1
创建并启动容器
docker run -d --name java-hello -p 8088:8080 java-helloworld:0.1
停止容器
docker stop java-hello
重启容器
docker restart java-hello
移除容器
docker rm java-hello
docker容器自动启动
# 启动容器时加
--restart=always
# 如果已经启动的项目,则使用update更新
docker update --restart=always 容器名/容器id
更新升级
假设更新java-helloworld:0.2
版
1, 构建新容器
docker build ./ -t java-helloworld:0.2
2, 停止并移除旧容器
docker stop java-hello && docker rm java-hello
3, 创建并启动新容器
docker run -d --name java-hello -p 8088:8080 java-helloworld:0.2
4, 验证更新结果
- 更新成功: 无需操作
- 更新失败: 停止并移除新容器,创建并启动旧版本容器,
docker stop java-hello && docker rm java-hello
docker run -d --name java-hello -p 8088:8080 java-helloworld:0.1
拓展
添加镜像库源
注意方法一与方法二不可同时存在!!!配置完成后需要重载配置,重启docker
方法一: /usr/lib/systemd/system/docker.service
文件中添加--insecure-registry 122.112.162.230:2234
方法二: /etc/docker/daemon.json
文件中添加{"insecure-registries":["192.168.242.132","10.3.13.184"]}
资源监控
docker stats
连接容器
docker exec -it <容器名/容器ID> /bin/bash
查看最后100行日志
docker logs --tail 100 <容器名/容器ID>
部署建议
以上更新方案在更新或失败后版本回退时,都需要短暂的停机,在需要高可用的场景下,可以使用 nginx 反向代理容器的接口,创建新容器时可以用其他端口,验证没有问题后,切换反向代理的端口,即可实现不停机无缝切换