第七期
目标
1.安装Docker仓库(例如容器开源镜像仓库harbor)
由于我们的arm架构,所以官网的我们无法直接用,建议使用我们自己搭建的arm版harbor
yum install git -y
安装gitgit clone -b v1.10.0 --depth=5 https://github.com/goharbor/harbor.git
cd harbor/make
vim harbor.yml
hostname: (自己本机地址)
port: (自己定义端口号,记得不要使用80端口)
harbor_admin_password: (admin进入密码)
vim prepare
修改goharbor/prepare为toyangdon/prepare
./prepare
生成docker-compose.ymlvim docker-compose.yml
将改文件中所有image属性中的goharbor改成toyangdon(我们自己搭建的一个harbor)
不要运行./install.sh
,否则会重新生成docker-compose.yml覆蓋了之前的修改docker-compose up -d
- 由于网络问题,不见得会成功
2.Spring Boot官方仓库下载一个最基础的单体服务,选择Web就行
- 进入spring boot官网并选择spring initializr
- 选择web的基础单体服务
- 进行下载
- 将下载后的文件上传至
/usr/local/spring-demo
中 cd demo
mnv install
没有配置阿里云镜像的记得配置下- 之后运行
java -jar demo-0.0.1-SNAPSHOT.jar
启动服务
- 报错
原来是8080被占用了 java -jar demo-0.0.1-SNAPSHOT.jar --server.port=9090
改用9090启用,成功(^-^)V- 参考如何搭建简单的web项目
3.编写Docker file打包发布这个微服务
- 进入刚才的demo项目根目录,创建Dockerfile文件与target平级
vim Dockerfile
FROM openjdk:8-jdk-alpine
ADD target/demo-0.0.1-SNAPSHOT.jar /app.jar
EXPOSE 8081
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
- 不要使用frolvlad/alpine-oraclejdk8因为是arm架构,O(∩_∩)O哈哈~
- Djava.security.egd=file:/dev/./urandom 是因为linux中和windows中取随机数时的参考策略不同,linux默认的随机数会被取完,导致返回-1.而制定/dev/./urandom这个取随机数的策略时,当随机数取完之后会返回伪随机数,不至于影响业务。
Dockerfile相关命令
docker build -t test:v0.1 .
这里设置镜像名称为test,版本为v0.1记得末尾加.docker run -p 8081:8081 test:v0.1
docker images
docker login
没有注册的去dockerhub注册一个docker tag imageID username/repository:tag
标记你的docker库和tagdocker push username/repository:tag
进行push
4.通过nginx对外进行服务
在nginx配置中增加
location /docker {
proxy_pass http://127.0.0.1:8081/;
}
5.通过Docker Compose对nginx和Spring Boot单体进行管理
cd /usr/local/docker-compose
vim docker-compose.yml
- 将我们刚才创建的image加入其中
version: '2'
services:
nginx:
image: nginx
restart: always
ports:
- 8080:80
volumes:
- ./nginx/conf:/etc/nginx/conf
- ./nginx/log:/var/log/nginx
- ./nginx/www:/var/www
- ./nginx/web:/usr/share/nginx/html
mysql:
network_mode: "bridge"
environment:
MYSQL_ROOT_PASSWORD: "123456"
MYSQL_USER: 'test'
MYSQL_PASS: '123456'
image: "mariadb"
restart: "always"
volumes:
- "./mysql/db:/var/lib/mysql"
- "./mysql/conf/my.cnf:/etc/my.cnf"
- "./mysql/init:/docker-entrypoint-initdb.d/"
ports:
- "3306:3306"
test:
image: "test:v0.1"
restart: "always"
ports:
- 8081:8081
一定要注意test镜像要跟版本号,否则会默认查找test:lastest,会找不到
docker-compose down
docker-compose up -d
6.优化镜像大小
docker images|grep test
查看镜像大小
docker history 1e0b008cbe66
查看镜像分层情况
优化思路:
- 将连续的RUN命令合并在一起。
- 设置某个组件的基础镜像,这个基础镜像中只存放这个组件中不变的代码,将这个组件中会变化的部分放入该组件的各个服务中。
以gnocchi为例,设置gnocchi-base作为gnocchi这个组件的基础镜像,里面放入不会改变的部分,
将会修改的内容放入gnocchi的各个服务中,例如: gnocchi-metricd, gnocchi-statsd, gnocchi-api - 删除镜像中不用的安装库,删除yum的缓存。
即在执行执行yum安装命令后,就执行 yum clean all清理缓存和rm -rf /var/lib/yum/yumdb
例子如下:
RUN yum -y install epel-release
&& yum -y install rsyslog
&& yum clean all
&& rm -rf /var/lib/yum/yumdb
7.监控该微服务
先完成第9步再来监控
- 编写脚本,通过监听9000端口来判断是否关闭
#! /bin/sh
while [ 1==1 ]
do
state=`netstat -lnetp | grep 8081 | awk '{print $6}'`
echo "$state";
if [ "$state" == "" ]
then `
cd /usr/local/docker-compose/`;
./start.sh;
fi
sleep 1
done
- 运行脚本即可
8.额外的任务(编写java内存溢出程序),让其产生OOM,观察崩溃的情况
9.编写自动打开和关闭该容器shell脚本
在/usr/local/docker-compose目录下编写
start.sh
#!/bin/bash
echo "start docker container ..."
docker-compose up -d
docker ps
stop.sh
#!/bin/bash
echo "stop docker container ..."
docker-compose down
echo `docker ps -a`
编写完后chmod +x start.sh stop.sh
进行赋权