云原生之旅 - 2)Docker 容器化你的应用
前言
上文中我们用Golang写了一个HTTP server,本篇文章我们讲述如何容器化这个应用,为后续部署到kubernetes 做准备。
关键词:Docker, Containerization, Golang, 容器化, Docker Hub login, Container Registry, 容器仓库,云原生
Dockerfile
我们采用Docker分阶段构建方式来编写Dockerfile, 这种做法的最大好处就是缩小image的大小。
第一阶段构建如下,目的编译出我们的可执行二进制文件。
# Use the offical golang image to create a binary.
# This is based on Debian and sets the GOPATH to /go.
# https://hub.docker.com/_/golang
FROM golang:1.18-buster as builder # Create and change to the app directory.
WORKDIR /app # Retrieve application dependencies.
# This allows the container build to reuse cached dependencies.
# Expecting to copy go.mod and if present go.sum.
COPY go.* ./
RUN go mod download # Copy local code to the container image.
COPY . ./ # Build the binary.
RUN go build -mod=readonly -v -o server
如果没有VPN,那么需要添加 GOPROXY, 例如
RUN go env -w GOPROXY=https://goproxy.cn,direct && go mod download
进入第二阶段构建,真正的构建出生产用的镜像,代码如下:
注意 COPY --from=builder ,这里的 builder 和第一阶段的 as builder 是一一对应的
# Use the official Debian slim image for a lean production container.
# https://hub.docker.com/_/debian
# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds
FROM debian:buster-slim
RUN set -x && apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
ca-certificates && \
rm -rf /var/lib/apt/lists/* # Copy the binary to the production image from the builder stage.
COPY --from=builder /app/server /app/server # Run the web service on container startup.
CMD ["/app/server"]
两个阶段的构建代码都复制到 Dockerfile 如下

Build Image
需提前安装好docker, tag 也需要根据自己实际情况修改,wadexu007是我Docker hub的account, demo是 repository名, 1.0.0是镜像tag号
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.
docker login -u wadexu007
after paste access token
Login Succeeded
也可以查看docker config.json 或者直接编辑。
第二个就是我刚刚docker login 之后的配置。第一个是我本机 GCR - Google Cloud Registry,第三个是JCR - 京东云的Registry
% cat ~/.docker/config.json
{
"auths": {
"asia.gcr.io": {
"auth": "xxx"
},
"https://index.docker.io/v1/": {
"auth": "xxx"
},
"xxx-cn-north-1.jcr.service.jdcloud.com": {
"auth": "xxx"
}
}
}%
回到 Docker hub控制台, Create repository 创建一个 `demo` repository

最后执行 push 命令
把本地image push到远端
docker push wadexu007/demo:1.0.0
查看结果

### https://www.cnblogs.com/wade-xu/p/16708050.html ###
感谢阅读,如果您觉得本文的内容对您的学习有所帮助,您可以打赏和推荐,您的鼓励是我创作的动力。
云原生之旅 - 2)Docker 容器化你的应用的更多相关文章
- 云原生之旅 - 11)基于 Kubernetes 动态伸缩 Jenkins Build Agents
前言 上一篇文章 云原生之旅 - 10)手把手教你安装 Jenkins on Kubernetes 我们介绍了在 Kubernetes 上安装 Jenkins,本文介绍下如何设置k8s pod作为Je ...
- [ci]jenkins-slave-ssh docker容器化-用户名密码
jenkins-slave-ssh docker容器化 架构 参考:https://www.youtube.com/watch?v=OxrBCt1JLuQ https://github.com/Dav ...
- Docker容器化技术(上)
目录 Docker容器化技术 一.介绍 二.Docker的发展 三.Docker安装 四.阿里云Docker镜像加速 五.Docker的基本概念 六.命令 七.Docker宿主机与容器通信 八.容器内 ...
- docker容器化python服务部署(supervisor-gunicorn-flask)
docker容器化python服务部署(supervisor-gunicorn-flask) 本文系作者原创,转载请注明出处: https://www.cnblogs.com/further-furt ...
- 云原生之旅 - 10)手把手教你安装 Jenkins on Kubernetes
前言 谈到持续集成工具就离不开众所周知的Jenkins,本文带你了解如何在 Kubernetes 上安装 Jenkins,后续文章会带你深入了解如何使用k8s pod 作为 Jenkins的build ...
- 通过 Azure Pipelines 实现持续集成之docker容器化及自动化部署
通过 Azure Pipelines 实现持续集成之docker容器化及自动化部署 Intro Azure DevOps Pipeline 现在对于公开的项目完全免费,这对于开源项目来讲无疑是个巨大的 ...
- 利用 ELK 搭建 Docker 容器化应用日志中心
利用 ELK 搭建 Docker 容器化应用日志中心 概述 应用一旦容器化以后,需要考虑的就是如何采集位于 Docker 容器中的应用程序的打印日志供运维分析.典型的比如SpringBoot应用的日志 ...
- Docker容器化技术(下)
Docker容器化技术(下) 一.Dockerfile基础命令 1.1.FROM - 基于基准镜像 FROM centos #制作基准镜像(基于centos) FROM scratch #不依赖任何基 ...
- spring boot本地开发与docker容器化部署的差异
spring boot本地开发与docker容器化部署的差异: 1. 文件路径及文件名区别大小写: 本地开发环境为windows操作系统,是忽略大小写的,但容器中区分大小写 2. docker中的容器 ...
随机推荐
- CSS 盒子模型(一)
CSS 盒子模型(一) 本人在校学生,主学后端,后来发现前端的基础都忘得差不多了才想着写文章回来复习!欢迎留言交流. 什么是盒子呢? 拿下举例,我们可以把每个红框都比作一个盒子,他们可以是任意的 HT ...
- MyBatis 映射文件
Mybatis映射文件简介 1) MyBatis 的真正强大在于它的映射语句.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉 ...
- centos7 yum error yum doesn't have enough cached data
1.vi /etc/resolv.conf,添加下面一行 nameserver 114.114.114.114 修改完成后service network restart进行重启,试一下yum upda ...
- 网络通信协议分类和IP地址
网络通信协议分类 通信的协议还是比较复杂的,java.net 包中包含的类和接口,它们提供低层次的通信细节.我们可以直接使用这些类和接口,来专注于网络程序开发,而不用考虑通信的细节 java.net ...
- Jira7.3.8环境搭建
安装JDK sudo apt-get install openjdk-8-jdk 安装&配置MySQL sudo apt-get install mysql-server 创建jira用户 # ...
- MySQL--创建计算字段
存储在数据库表中的数据一般不是应用程序所需要的格式.下面举几个例子. 如果想在一个字段中既显示公司名,又显示公司的地址,但这两个信息一般包含在不同的表列中. 城市.州和邮政编码存储在不同的列中 ...
- 【ASP.NET Core】选项模式的相关接口
在 .NET 中,配置与选项模式其实有联系的(这些功能现在不仅限于 ASP.NET Core,而是作为平台扩展来提供,在其他.NET 项目中都能用).配置一般从多个来源(上一篇水文中的例子,记得否?) ...
- python3学习笔记之字符串
字符串 1.一个个字符组成的有序的序列,是字符的集合: 2.使用单引号.双引号.三引号引住的字符序列 3.字符串是不可变对象 4.python3起,字符串就是Unicode类型: 字符串特殊举例: 不 ...
- 丽泽普及2022交流赛day19 半社论
目录 No Problem Str Not TSP 题面 题解 代码 Game 题面 题解 代码 No Problem 暴力 Str 存在循环节,大力找出来即可,长度显然不超过 \(10^3\) . ...
- 20170622日行一记之PHP函数
fread() 函数读取文件(可安全用于二进制文件) fread(file,length) 参数 描述 file 必需.规定要读取打开文件. length 必需.规定要读取的最大字节数. 该函数在读取 ...