Docker Compose

1、概述

本节我们介绍使用 docker 部署

docker 部署我们要使用到 harbor 镜像象仓库了,本地代码编写完成之后,构建镜像上传到 harbor,部署机器上直接拉取镜像启动即可。

2、项目代码

本节代码我们跟物理机部署一节代码保持一致,但是要多一步要使用 goctl 生成 dockerfile

在 apicode 项目根目录下执行如下命令生成 Dockerfile

  1. $ goctl docker -go apicode.go

2.1、上传代码

将代码 push 到 gitlab 上去即可

2.2 、配置 jenkins 服务器的公钥

jenkins 需要来 gitlab 拉取代码进行构建,所以我们要将 jenkins 所在物理机器的公钥配置到 gitlab 中,进行免密登陆

3、镜像仓库

去 harbor 创建本项目镜像仓库

查看 push 命令

  1. $ docker push 192.168.1.180:8077/apicode/REPOSITORY[:TAG]

4、Jenkins 发布

之前我们已经将 jenkins 与 gitlab 一起部署好了,接下来我们使用 jenkins 进行代码发布,只要编写 pipline 即可

4.1 创建 pipline

点击首页左侧“新建 item” , 名称输入“apicode-docker”,选择“流水线”,然后确定

然后点击“General” , 选择“This project is parameterized” , “添加参数”,“Choice Parameter”,如下图

然后编写内容如下

直接保存。

4.2 编辑 pipline

【注】在编写 pipline 之前我们还有一个公钥要配置,要将 jenkins 的公钥配置到运行服务的服务器上,因为我们使用 jenkins 构建好之后要将构建好的 tar 包使用 scp 传到运行服务器上,这时候就要免密登陆

查看 jenkins 所在的物理机公钥:

  1. $ cat /root/.ssh/id_rsa.pub

配置到运行服务物理机的 /root/.ssh/authorized_keys 即可。

向下滑动找到Pipeline script,填写脚本内容

  1. pipeline {
  2. agent any
  3. parameters {
  4. gitParameter name: 'branch',
  5. type: 'PT_BRANCH',
  6. branchFilter: 'origin/(.*)',
  7. defaultValue: 'master',
  8. selectedValue: 'DEFAULT',
  9. sortMode: 'ASCENDING_SMART',
  10. description: '选择需要构建的分支'
  11. }
  12. stages {
  13. stage('服务信息') {
  14. steps {
  15. sh 'echo 分支:$branch'
  16. }
  17. }
  18. stage('拉取代码') {
  19. steps {
  20. checkout([$class: 'GitSCM',
  21. branches: [[name: '$branch']],
  22. doGenerateSubmoduleConfigurations: false,
  23. extensions: [],
  24. submoduleCfg: [],
  25. userRemoteConfigs: [[credentialsId: 'gitlab-cert', url: 'ssh://git@192.168.1.182:2222/root/apicode.git']]])
  26. }
  27. }
  28. stage('获取commit_id') {
  29. steps {
  30. echo '获取commit_id'
  31. git credentialsId: 'gitlab-cert', url: 'ssh://git@192.168.1.182:2222/root/apicode.git'
  32. script {
  33. env.commit_id = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
  34. }
  35. }
  36. }
  37. stage('Dockerfile Build') {
  38. steps{
  39. script{
  40. env.image = sh(returnStdout: true, script: 'echo ${JOB_NAME}-${type}:${commit_id}').trim()
  41. env.jobname = sh(returnStdout: true, script: 'echo ${JOB_NAME}-${type}').trim()
  42. }
  43. sh 'echo 镜像名称:${image} && docker build -t ${image} .'
  44. }
  45. }
  46. stage('上传到镜像仓库') {
  47. steps{
  48. //docker login 这里要注意,会把账号密码输出到jenkins页面,可以通过port.sh类似方式处理,官网文档有这里我就不详细写了
  49. sh 'docker login --username=${docker_username} --password=${docker_pwd} http://${docker_repo}'
  50. sh 'docker tag ${image} ${docker_repo}/apicode/${image}'
  51. sh 'docker push ${docker_repo}/apicode/${image}'
  52. }
  53. }
  54. stage('Deploy') {
  55. steps{
  56. sh 'ssh root@192.168.1.183 docker login --username=${docker_username} --password=${docker_pwd} http://${docker_repo}'
  57. sh 'ssh root@192.168.1.183 docker pull ${docker_repo}/apicode/${image}'
  58. // 当然这里端口号可以选择放到配置哪里都可以
  59. sh 'ssh root@192.168.1.183 docker run -d -p 8889:8889 ${docker_repo}/apicode/${image}'
  60. }
  61. }
  62. }
  63. }

5、构建发布

点击首页,找到 apicode 这个服务点击进去

点击 Build with Parameters ,选择对应的“分支”跟“服务”,开始构建

构建完成,最后我们来访问http://192.168.1.183:8889/hello?msg=mikael ,可以看到页面上输出

  1. {
  2. "msg": "hello->mikael"
  3. }

至此,部署完成。当然你可以在前面加自己喜欢的网关进行转发到此服务中,比如 nginx、kong…