傻瓜式DEVOPS实践手册,需要的留言就行~

38 阅读4分钟
版本作者迭代内容时间备注
v1.0刘志虎基础版本初始化2024/04/16
v1.1刘志虎添加harbor、kong2024/04/18后面补充如
何部署
harbor、kong
v1.2刘志虎harbor部署及应用2024/04/28容器化部署
v1.3刘志虎Nexus部署及应用2024/05/02
v1.4刘志虎Docker
Docker-Compose安装
2024/05/05
v1.5刘志虎Gitlab、Gitlab-runner2024/05/07
v1.6刘志虎CI/CD完整流程2024/05/09Gitlab、Gitlab-runner
Harbor、docker

1、准备工作

​ Docker镜像的生成,主要是依靠Dockerfile,该文件规定了如何构建Docker镜像,是由一系列命令和参数构成的脚本,建议参考官方文章 docs.docker.com/reference/d…

​ 除了Dockerfile文件外,还有我们不要启动的服务,一般是jar包或者是其他开发语言生成的程序包、静态文件

2、文件编写

​ 工作中用到最多的就是java开发的jar及vue、react生成的静态文件。java开发的程序一般基础镜像依赖java1.8或者java17、21等等不同版本,静态文件依赖nginx即可

  • java程序的Dockerfile文件

    ./
    ├── Dockerfile
    └── ***-gateway.jar
    

    Dockerfile

    # 基础镜像
    FROM registry.***.cn/release/openjdk:jdk1.8
    # 作者
    MAINTAINER ***
    RUN echo 'Asia/Shanghai' >/etc/timezone
    ENV SPRING_PARAMS=""
    ENV JAVA_OPTS=""
    # 添加服务包
    ADD ./***-gateway.jar app.jar
    RUN bash -c "touch /app.jar"
    # 暴露端口
    EXPOSE '8080'
    ENTRYPOINT ["/bin/sh", "-c", "java $JAVA_OPTS -jar app.jar $SPRING_PARAMS"]
    
  • 静态文件镜像包构建文件

    ./
    ├── Dockerfile
    ├── nginx.conf
    └── ***-web
    

    Dockerfile

    # 基础镜像
    FROM registry.***.cn/rancher/nginx:1.17.4-alpine
    # 作者
    MAINTAINER ***
    COPY ***-base-web/ /usr/share/nginx/***-base-web/
    COPY nginx.conf /etc/nginx/nginx.conf
    

    nginx.conf

    user  root;
    worker_processes  3;
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        underscores_in_headers on;
        client_max_body_size 500m;
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
        server {
            listen       80;
            server_name  localhost;
            root /***-web;
            index  index.html index.htm;
            
            # 后端API接口反代
            location /prod-api/{
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://***.***.***.***:***/;
            }
    
            #静态文件
            location /web {
            alias   /web/***-web;
            try_files $uri $uri/ /index.html;
            index  index.html index.htm;
            }
    
            location @router {
            rewrite ^.*$ /index.html last;
            }
        }
    }
    

    3、生成镜像

镜像生产主要是通过docker build 命令,镜像生成后可以在本地直接启动,但一般是把镜像推到镜像仓库,然后通过使用服务的服务器上,通过从镜像仓库拉取镜像,进行服务部署

在当前 Dockerfile目录下执行, 打镜像命令如下

docker build -t registry.xxx.cn/xxx/gateway-dev:v2.1 .

可以通过 -f 指定Dockerfile,打镜像命令如下

docker build -f /opt/Dockerfile -t registry.xxx.cn/xxx/gateway-dev:v2.1 .
  • 参数说明
    • -f 指定Dockerfile的文件路径
    • -t 设置 镜像标签,一般包括镜像仓库( registry.xxx.cn )、项目名称( xxx )、镜像名称(gateway-dev)、版本(v2.1
    • . 构建过程中上下文环境的目录

4、推到镜像仓库

​ 如果需要把镜像推到镜像仓库,需要先用账号登录镜像仓库,怎么搭建自己的镜像仓库,我后面再单独整理或者网上找找,应该有类似文章,然后就可以推送镜像

登录镜像仓库

docker login -u 账号名 -p 账号密码 registry.xxx.cn

推镜像

docker push registry.xxx.cn/xxx/gateway-dev:v2.1

5、镜像简单使用

​ 简单使用可以通过dockerdocker-compose 方式创建容器服务

  • docker方式

    docker run -itd	--name gateway-server --privileged --restart=always -p 8080:8080 \
    -v /usr/local/***:/var/lib/*** \
    -e SPRING_PARAMS=参数配置 \
    registry.xxx.cn/xxx/gateway-dev:v2.1
    
    • --name 容器名称

    • --restart 容器退出时执行的操作

    • -p 端口映射

    • -v 文件映射

    • -e 环境变量

  • docker-compose

    version: "3.7"
    services:
      gateway-server:
        image: ${image_tag}
        hostname: gateway-server
        privileged: true
        container_name: gateway-server
        network_mode: host 
        restart: unless-stopped             
        extra_hosts:
          - "work:127.0.0.1"
        environment:
          TZ: Asia/Shanghai
          LANG: en_US.UTF-8
    
        volumes:                            
          - "/opt/logs/gateway-server:/runtime/logs"
          - "/etc/localtime:/etc/localtime:ro"
    networks:
      default:
        external:
          name: gateway_net
    
    • gateway-server 服务名
    • container_name 容器名
    • network_mode 网络方式,host方式是直接使用宿主机
    • restart 指定容器退出后的重启策略为始终重启
    • extra_hosts host 文件添加的配置
    • volumes 数据卷挂载,一般用作配置文件外挂
    • networks 服务网络,网络下的容器可以相互通信

6、k8s部署

​ k8s相对复杂,需要不断的积累经验,这里说明的是针对性的说明上面说的镜像的部署,主要涉及ConfigMaps 、Deployments、Services 、gateway设置,这里通过rancher、kong进行实施

  • ConfigMaps

configmap是k8s的一个配置管理组件,可以将配置以key-value的形式传递,通常用来保存配置信息

  • java服务环境变量

    image-20240417223934653

    配置项参数,其他配置项参考下配置即可,后面在部署容器的时候要用到

    --spring.cloud.nacos.discovery.server-addr=nacos.poros-platform:8848 --spring.cloud.nacos.discovery.password= --spring.cloud.nacos.config.server-addr=nacos.poros-platform:8848 --spring.cloud.nacos.config.password=
    
    • 静态文件容器环境变量

      image-20240417225505532

    nginx具体的ConfigMap配置项内容

    user  root;
    worker_processes  3;
    events {
        worker_connections  1024;
    }
    http {
        underscores_in_headers on;
        client_max_body_size 500m;
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
        server {
            listen       80;
            server_name  localhost;
            root /***-web;
            index  index.html index.htm;
            # 后端API接口反代
            location /prod-api/{
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://***.***.***.***:***/;
            }
            #静态文件
            location /web {
            alias   /web/***-web;
            try_files $uri $uri/ /index.html;
            index  index.html index.htm;
            }
    
            location @router {
            rewrite ^.*$ /index.html last;
            }
        }
    }
    

    nginx这样配置,主要是为了服务适应更多的使用场景,不同的场景基础服务是一样的,但具体业务需求可能不太一样,比如后端服务的API地址

  • Deployments

    image-20240417232428084

    现实使用中Deployments有更多的属性需要配置,更详细的可以到官方去看下

    • replicas 副本数
    • Networking 服务网络配置
    • Image 镜像
    • Namespace 命名空间,服务间的访问方式是 服务.服务间
    • Environment Variables 这里主要是环境变量,直接设置或者引用前面ConfigMap设置的配置项
    • Pull Policy 镜像拉取方式,根据自己的实际场景进行配置就行,有AlwaysIfNotPresentNever
    • 更多参数看官网说明吧 kubernetes.io/docs/concep…
  • Services

    服务主要是用于对集群内工作负载的封装,更便于使用端使用

    image-20240418001849306

​ k8s中的Services主要提供负载均衡及反代的能力

7、harbor镜像仓库

登录成功后,就可以看到项目项目,镜像的完整路径是域名、项目名称、镜像名称、镜像Tag

image-20240418135849533

点击具体的项目名称,即可查看到该项目下的镜像列表

image-20240418150605764

关于harbor的部署,我会在后面整理中间件的时候,写一篇详细的过程

如果在实践过程中遇到问题,也可以通过如下问题联系我

image-20240509002756386