使用dockerfile制作docker 镜像
镜像分为
基础镜像:centos,ubuntu
服务镜像:openjdk,nginx,mysql
项目镜像:项目代码打包在服务镜像里,最终交付物
java或者go的应用需要编译,php的可以不用编译。
容器部署过程中一般有以下三种数据:
使用Service ClusterIP类型暴露集群内部应用访问。
使用Ingress对外暴露你的应用。
使用Prometheus监控集群中资源的状态
使用ELK来收集应用的日志
区别:
测试java-demo java-demo.zip
unzip java-demo.zip && cd java-demo
yum install -y java-1.8.0-openjdk
yum install maven -y
由于maven默认使用的国外的maven源 所以改成国内阿里云的源这样下载依赖包会很快
/etc/maven/settings.xml
在159行加入
在
aliyunmaven central aliyun maven https://maven.aliyun.com/repository/public
构建war包
mvn clean package -Dmaven.test.skip
clean package 会删掉之前存在构建好的文件目录
maven.test.skip 表示忽略测试
配置对私有仓库的可信任,并配置默认的镜像仓库为阿里云仓库
/etc/docker/daemon.json
{ "registry-mirrors": ["https://yyk0qnca.mirror.aliyuncs.com"], "insecure-registries": ["192.168.31.70"] }
Dockerfile
FROM 192.168.31.70/library/tomcat:v1 RUN rm -rf /usr/local/tomcat/webapps/* COPY target/*.war /usr/local/tomcat/webapps/ROOT.war
1.从镜像仓库拉取旧版本的应用镜像,其中library仓库是个公共的仓库所以不需要登录
2.删除镜像中原本的war包
3.将本地构建好的war包复制到镜像的war包目录,并命名为ROOT.war
执行构建
docker build -t java-demo:v1 .
本地运行镜像
docker run -d java-demo:v1
docker inspect -f='{{.NetworkSettings.IPAddress}}' f07c85826426 #获取容器的ip
创建一个 demo的私有仓库
docker login 192.168.31.70 --username=admin docker tag 182f52a26eb0 192.168.31.70/demo/java-demo:v1 docker push 192.168.31.70/demo/java-demo:v1
由于demo仓库设置的是私有类型所以pull镜像需要登录认证。
kubectl create secret docker-registry docker-regsitry-auth --docker-username=admin --docker-password=Harbor1 345 --docker-server=192.168.31.70
apiVersion: apps/v1 kind: Deployment metadata: name: java-demo spec: replicas: 3 selector: matchLabels: project: www app: java-demo template: metadata: labels: project: www app: java-demo spec: imagePullSecrets: - name: "docker-regsitry-auth" containers: - image: 192.168.31.70/demo/java-demo:v1 name: java-demo imagePullPolicy: Always ports: - containerPort: 8080 name: web protocol: TCP resources: requests: cpu: 0.5 memory: 0.3Gi limits: cpu: 1 memory: 0.5Gi livenessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 60 timeoutSeconds: 20 readinessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 60 timeoutSeconds: 20
apiVersion: v1 kind: Service metadata: labels: app: java-demo name: java-demo spec: ports: - port: 80 protocol: TCP targetPort: 8080 nodePort: 30018 selector: app: java-demo type: NodePort
可以通过 任意节点的ip:30018 访问应用
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: java-demo spec: rules: - host: java.ctnrs.com http: paths: - path: / backend: serviceName: java-demo servicePort: 80
编辑hosts文件
然后访问java.ctnrs.com
在harbor节点 安装mysql数据库
yum install -y mariadb-server systemctl start mariadb mysqladmin -uroot password "123456" 设置密码123456
编辑 java-demo/src/main/resources/application.yml
将连接数据库的地址换成 harbor节点的地址
创建demo用户并授权
MariaDB [test]> grant all on test.* to 'demo'@'192.168.31.%' identified by '123.com'; MariaDB [test]> grant all on test.* to 'demo'@'localhost' identified by '123.com';
将修改后的配置重新编译成war包
mvn clean package -Dmaven.skip.test docker build -t java-demo:v2 . docker tag java-demo:v2 192.168.31.70/demo/java-demo:v2 docker push 192.168.31.70/demo/java-demo:v2
将deployment.yaml 中镜像版本v1改成v2
- image: 192.168.31.70/demo/java-demo:v2
重新应用配置后会触发滚动更新
kubectl apply -f deployment.yaml
再次访问应用http://java.ctnrs.com/就是升级后(更改过配置)的应用
回滚应用
kubectl rollout history deployment/java-demo #查看应用历史版本 kubectl rollout undo deployment/java-demo #回滚到之前的版本 kubectl rollout undo deployment/java-demo --to-revision=1 #回到指定的历史版本 kubectl rollout status deploy/java-demo #查看发布情况