前言

上文中我们用Golang写了一个HTTP server,本篇文章我们讲述如何容器化这个应用,为后续部署到kubernetes 做准备。

关键词:Docker, Containerization, Golang, 容器化, Docker Hub login, Container Registry, 容器仓库,云原生

Dockerfile

我们采用Docker分阶段构建方式来编写Dockerfile, 这种做法的最大好处就是缩小image的大小。

第一阶段构建如下,目的编译出我们的可执行二进制文件。

  1. # Use the offical golang image to create a binary.
  2. # This is based on Debian and sets the GOPATH to /go.
  3. # https://hub.docker.com/_/golang
  4. FROM golang:1.18-buster as builder
  5.  
  6. # Create and change to the app directory.
  7. WORKDIR /app
  8.  
  9. # Retrieve application dependencies.
  10. # This allows the container build to reuse cached dependencies.
  11. # Expecting to copy go.mod and if present go.sum.
  12. COPY go.* ./
  13. RUN go mod download
  14.  
  15. # Copy local code to the container image.
  16. COPY . ./
  17.  
  18. # Build the binary.
  19. RUN go build -mod=readonly -v -o server

如果没有VPN,那么需要添加 GOPROXY, 例如

  1. RUN go env -w GOPROXY=https://goproxy.cn,direct && go mod download

进入第二阶段构建,真正的构建出生产用的镜像,代码如下:

注意 COPY  --from=builder ,这里的 builder 和第一阶段的 as builder 是一一对应的

  1. # Use the official Debian slim image for a lean production container.
  2. # https://hub.docker.com/_/debian
  3. # https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds
  4. FROM debian:buster-slim
  5. RUN set -x && apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
  6. ca-certificates && \
  7. rm -rf /var/lib/apt/lists/*
  8.  
  9. # Copy the binary to the production image from the builder stage.
  10. COPY --from=builder /app/server /app/server
  11.  
  12. # Run the web service on container startup.
  13. CMD ["/app/server"]

两个阶段的构建代码都复制到 Dockerfile 如下

Build Image

需提前安装好docker, tag 也需要根据自己实际情况修改,wadexu007是我Docker hub的account, demo是 repository名, 1.0.0是镜像tag号

  1. docker build -t wadexu007/demo:1.0.0 .

### https://www.cnblogs.com/wade-xu/p/16708050.html ###

Push Image

接下来我们得把Image push到一个镜像仓库,例如 Docker hub, 或者 ECR, GCR, ACR 等公有云平台仓库。也可以用开源的 Harbor 自建仓库。

下面介绍 Docker hub

首先到 Docker hub 注册一个账号 https://hub.docker.com

如果有账号直接Sign In

点击右上角--> Account Settings

Security --> New Access Tokens

Generate a new one. Then docker login, replace `wadexu007` with your account name.

  1. docker login -u wadexu007

after paste access token

  1. Login Succeeded

也可以查看docker config.json 或者直接编辑。

第二个就是我刚刚docker login 之后的配置。第一个是我本机 GCR - Google Cloud Registry,第三个是JCR - 京东云的Registry

  1. % cat ~/.docker/config.json
  2. {
  3. "auths": {
  4. "asia.gcr.io": {
  5. "auth": "xxx"
  6. },
  7. "https://index.docker.io/v1/": {
  8. "auth": "xxx"
  9. },
  10. "xxx-cn-north-1.jcr.service.jdcloud.com": {
  11. "auth": "xxx"
  12. }
  13. }
  14. }%

回到 Docker hub控制台, Create repository  创建一个 `demo` repository

最后执行 push 命令

把本地image push到远端

  1. docker push wadexu007/demo:1.0.0

查看结果

### https://www.cnblogs.com/wade-xu/p/16708050.html ###

Source code

感谢阅读,如果您觉得本文的内容对您的学习有所帮助,您可以打赏和推荐,您的鼓励是我创作的动力。

云原生之旅 - 2)Docker 容器化你的应用的更多相关文章

  1. 云原生之旅 - 11)基于 Kubernetes 动态伸缩 Jenkins Build Agents

    前言 上一篇文章 云原生之旅 - 10)手把手教你安装 Jenkins on Kubernetes 我们介绍了在 Kubernetes 上安装 Jenkins,本文介绍下如何设置k8s pod作为Je ...

  2. [ci]jenkins-slave-ssh docker容器化-用户名密码

    jenkins-slave-ssh docker容器化 架构 参考:https://www.youtube.com/watch?v=OxrBCt1JLuQ https://github.com/Dav ...

  3. Docker容器化技术(上)

    目录 Docker容器化技术 一.介绍 二.Docker的发展 三.Docker安装 四.阿里云Docker镜像加速 五.Docker的基本概念 六.命令 七.Docker宿主机与容器通信 八.容器内 ...

  4. docker容器化python服务部署(supervisor-gunicorn-flask)

    docker容器化python服务部署(supervisor-gunicorn-flask) 本文系作者原创,转载请注明出处: https://www.cnblogs.com/further-furt ...

  5. 云原生之旅 - 10)手把手教你安装 Jenkins on Kubernetes

    前言 谈到持续集成工具就离不开众所周知的Jenkins,本文带你了解如何在 Kubernetes 上安装 Jenkins,后续文章会带你深入了解如何使用k8s pod 作为 Jenkins的build ...

  6. 通过 Azure Pipelines 实现持续集成之docker容器化及自动化部署

    通过 Azure Pipelines 实现持续集成之docker容器化及自动化部署 Intro Azure DevOps Pipeline 现在对于公开的项目完全免费,这对于开源项目来讲无疑是个巨大的 ...

  7. 利用 ELK 搭建 Docker 容器化应用日志中心

    利用 ELK 搭建 Docker 容器化应用日志中心 概述 应用一旦容器化以后,需要考虑的就是如何采集位于 Docker 容器中的应用程序的打印日志供运维分析.典型的比如SpringBoot应用的日志 ...

  8. Docker容器化技术(下)

    Docker容器化技术(下) 一.Dockerfile基础命令 1.1.FROM - 基于基准镜像 FROM centos #制作基准镜像(基于centos) FROM scratch #不依赖任何基 ...

  9. spring boot本地开发与docker容器化部署的差异

    spring boot本地开发与docker容器化部署的差异: 1. 文件路径及文件名区别大小写: 本地开发环境为windows操作系统,是忽略大小写的,但容器中区分大小写 2. docker中的容器 ...

随机推荐

  1. Django WEB开发 - Django 3.0 Tutorial入门

    1. Django 官方网站 https://docs.djangoproject.com/zh-hans/3.0/intro/tutorial01/ 2. Model View Controller ...

  2. PTA(BasicLevel)-1023 组个最小数

    一. 问题定义 给定数字 0-9 各若干个.你可以以任意顺序排列这些数字,但必须全部使用.目标是使得最后得到的数尽可能小(注意 0 不能做首位). 例如:给定两个 0,两个 1,三个 5,一个 8,我 ...

  3. 👨‍💻Mybatis源码我搞透了,面试来问吧!写了134个源码类,1.03万行代码!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言:手撸一万行! 完结撒花:4个月.20章.134个类.1.03万行代码! 22年3月初 ...

  4. Qt点名器

    项目已开源,点击跳转 废话不多说,直接上代码. CMakeLists.txt cmake_minimum_required(VERSION 3.10) project(qt-caller) find_ ...

  5. Python学习——实现文件交互的学生管理系统

    第一次用写博客,从前一直在博客园上学习,现在也来这里分享一下我的学习成果. 就开门见山的说吧.首先做了一个流程图,可能也不符合啥规范,就当草稿用,将就着看,明白个设计思路就行. 1.首先系统初始化,定 ...

  6. 不是第七代的 Win 7

    贡献者:历史上的今天 Windows 7 是由微软公司(Microsoft)2009 年 10 月 22 日发布的桌面端操作系统,它影响了每个行业的方方面面,以至于很多人仍然在日常生活和工作中使用它. ...

  7. 算法竞赛进阶指南——0x15 字符串学习笔记

    K M P模式匹配 #include <bits/stdc++.h> using namespace std; #define N 100 char s[N]; char m[N]; in ...

  8. python 进程理解

    简介 线程理解中介绍过,再回顾一遍,一个应用程序由多个进程组成,一个进程由多个线程组成,由操作系统根据优先级.时间片来绝对线程的运行 进程 python的进程不同于线程,在主流的cpython解释器下 ...

  9. python面向对象的特征及反射

    目录 派生类实操 面向对象特征之封装 property伪装属性(python内置装饰器) 面向对象特征之多态 面向对象之反射 派生类实操 1.将时间字典序列化成json格式,由于序列化数据类型的要求, ...

  10. 5.8 NOI 模拟

    \(T1\) 比较容易想到的 二分转化为判定,判定是否存在一个子图能保证能一直在\(x\)时间内到达\(n\) 设\(dis(u,v)\)表示\(u->v\)的最短路 先找出候选节点\(i,di ...