说明
在150机器上部署docker服务以及蓝绿发布
1. 安装docker
参考之前的文章
2. 准备一个jar包
2.1 准备一个controller
import org.springframework.web.bind.annotation.*;
/**
* @description:
* @author: 哼唧兽
* @date: 9999/9/21
**/
@RestController
@RequestMapping("/docker")
public class DockerController {
@GetMapping("/status")
public String status() {
return "success";
}
}
2.2 配置application.yml文件
server:
port: 8888
2.3 在pom中修改jar名称, 放在build里
<finalName>docker-project</finalName>
启动SpringBoot项目, 确保能正常启动
3. 制作Dockerfile
docker pull openjdk:8
cd /usr/local/src
mkdir project
cd project
上传jar文件
vi Dockerfile
内容如下
# 基于java8
FROM openjdk:8
MAINTAINER hahashou "179186501@qq.com"
WORKDIR /usr/local/src
COPY docker-project.jar .
# 设置时区
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
# 暴露8888端口
EXPOSE 8888
# 运行jar文件
CMD java -jar docker-project.jar
制作docker镜像
cd ..
docker build project -t my-project:v1
docker images
只有下载测试的hello-world、java8和刚才制作的镜像
docker run -d -p 8972:8888 my-project:v1
docker ps
curl http://localhost:8972/docker/status
没啥问题就可以停止服务了
docker kill XXX
再打一个v2版本, 以备后面验证蓝绿发布
docker build project -t my-project:v2
4. 通过marathon启动docker镜像
4.1 清空之前的数据, 并增加日志文件夹
cd /var/lib
rm -rf mesos-agent
rm -rf mesos-agent-log
rm -rf mesos-master
rm -rf mesos-master-log
mkdir mesos-agent
mkdir mesos-agent-log
mkdir mesos-master
mkdir mesos-master-log
4.2 启动mesos, mesos-agent, zookeeper, marathon
mesos
cd /usr/local/src/mesos-1.11.0/build
./bin/mesos-master.sh --ip=192.168.109.150 --work_dir=/var/lib/mesos-master --log_dir=/var/lib/mesos-master-log --logging_level=WARNING
mesos-agent
cd /usr/local/src/mesos-1.11.0/build
./bin/mesos-agent.sh --master=192.168.109.150:5050 --work_dir=/var/lib/mesos-agent --log_dir=/var/lib/mesos-agent-log --containerizers=docker,mesos --logging_level=WARNING
zookeeper
cd /usr/local/src/zookeeper-3.7.1/bin
./zkServer.sh start
marathon
cd /usr/local/src/marathon-1.8.222
./bin/marathon --master 192.168.109.150:5050 --http_port 6060 --logging_level warn
4.3 新开窗口, 新增docker-project.json文件
vi docker-project.json
内容
{
"id": "my-project",
"cpus": 0.2,
"mem": 64,
"networks": [ { "mode": "container/bridge" } ],
"container": {
"type": "DOCKER",
"docker": {
"image": "my-project:v1"
},
"portMappings": [
{ "containerPort": 8888, "hostPort": 0}
]
}
}
4.4 通过Marathon API启动服务
curl -X POST http://localhost:6060/v2/apps -d @docker-project.json -H "Content-type: application/json"
docker ps
注意看端口
curl http://localhost:31678/docker/status
4.5 蓝绿发布, Marathon推荐文章
通过研究Marathon API, 可以看到很漂亮的Restful风格的API。上面创建服务用的是 /v2/apps的 POST请求, 蓝绿发布需要用 /v2/apps/{app_id} 的PUT请求, 请求说明详见API文档。修改docker-project.json中的镜像为 my-project:v2
Note: 最好是修改代码中的请求返回, 重新package, 上传, 替换之前的jar包, 重新build一个docker镜像v2, 效果更好
curl -X PUT http://localhost:6060/v2/apps/my-project -d @docker-project.json -H "Content-type: application/json"
可以看到marathon会新启动一个服务, 待新服务启动成功后, 杀死旧服务, 新端口为31623
curl http://localhost:31623/docker/status
这样, 可以做到用户几乎无感的升级新服务