版本 | 作者 | 迭代内容 | 时间 | 备注 |
---|---|---|---|---|
v1.0 | 刘志虎 | 基础版本初始化 | 2024/04/16 | 无 |
v1.1 | 刘志虎 | 添加harbor、kong | 2024/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-runner | 2024/05/07 | |
v1.6 | 刘志虎 | CI/CD完整流程 | 2024/05/09 | Gitlab、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、镜像简单使用
简单使用可以通过docker
、docker-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服务环境变量
配置项参数,其他配置项参考下配置即可,后面在部署容器的时候要用到
--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=
-
静态文件容器环境变量
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
现实使用中Deployments有更多的属性需要配置,更详细的可以到官方去看下
replicas
副本数Networking
服务网络配置Image
镜像Namespace
命名空间,服务间的访问方式是 服务.服务间Environment Variables
这里主要是环境变量,直接设置或者引用前面ConfigMap设置的配置项Pull Policy
镜像拉取方式,根据自己的实际场景进行配置就行,有Always
、IfNotPresent
、Never
- 更多参数看官网说明吧 kubernetes.io/docs/concep…
-
Services
服务主要是用于对集群内工作负载的封装,更便于使用端使用
k8s中的Services主要提供负载均衡及反代的能力
7、harbor镜像仓库
登录成功后,就可以看到项目项目,镜像的完整路径是域名、项目名称、镜像名称、镜像Tag
点击具体的项目名称,即可查看到该项目下的镜像列表
关于harbor的部署,我会在后面整理中间件的时候,写一篇详细的过程
如果在实践过程中遇到问题,也可以通过如下问题联系我