天天看點

#雲原生征文#兩種 Docker 鏡像打包的常用方式

目錄

​​前言​​

​​正文​​

​​一、docker commit​​

​​二、docker build ​​

​​結尾​​

前言

雲原生概念的共識之一就是伺服器端的應用程式部署最好使用容器化的方式,而服務容器化就是把對應服務的應用程式部打包到容器鏡像中,然後通過容器的方式進行部署和運作。一般來說,Docker 打包有兩種常用的方式,本文接下來分别介紹。

正文

一、docker commit

使用docker commit指令可以把一個正在運作的容器送出為一個新的鏡像檔案,一般步驟如下:

(1)首先拉取一個基礎鏡像,參考指令如下:

docker pull centos

(2)建立一個支援互動式的容器,參考指令如下:

docker run -it --name=mycentos centos:latest

(3)上傳軟體到容器中,參考指令如下:

docker cp xxx.tar mycentos:/root/

(4)在容器中解壓壓縮包,然後部署對應服務的應用程式,參考指令如下:

tar -xf xxx.tar

(5)把互動式的容器送出為一個新的鏡像,參考指令如下:

docker commit mycentos mydockerservice

二、docker build 

Dockerfile是一個用來建構鏡像的文本檔案,文本内容包含一條條建構鏡像所需的指令和說明。Docker通過讀取Dockerfile中的指令自動生成鏡像。Docker裡的鏡像絕大部分都是在别的鏡像的基礎上去進行建立的,也就是使用鏡像的分層結構。Docker鏡像由隻讀層組成,運作的容器會在Docker的鏡像上面多加一層可寫的容器層。任何對檔案的更改都隻存在容器層。是以任何對容器的操作不會影響到鏡像。

使用docker build指令可以編譯一個新的鏡像檔案,一般步驟如下:

(1)編寫Dockerfile檔案

Dockerfile是一個用來建構鏡像的文本檔案,文本内容包含一條條建構鏡像所需的指令和說明,執行個體檔案如下:

From golang:1.14.2-alpine3.11 AS dev

ENV HOME /app

WORKDIR /app/gateway

COPY ./.netrc /app

COPY . /app/gateway

RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories

RUN apk add --no-cache gcc musl-dev git

RUN go env -w GOPRIVATE=git.liuzhen007.com

RUN go env -w GO111MODULE=on

RUN go env -w GOPROXY=https://goproxy.cn,direct

RUN go mod tidy

RUN go build main.go

RUN mv main gateway

ENV TZ=Asia/Shanghai

RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories

RUN apk update && apk add tzdata && echo "${TZ}" > /etc/timezone && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime && rm /var/cache/apk/*

WORKDIR /root/gateway/

COPY --from=dev /app/gateway/gateway .

CMD ["./gateway"]

(2)編譯打包

使用docker build指令打包鏡像,同時需要指定目标鏡像的名稱和版本号,參考指令如下:

docker build -t centos-gateway:v1 .

其中,點表示同級目錄下的Dockerfile檔案。

結尾

好了,至此,兩種 Docker 鏡像的打包方式就介紹完了。聽我這麼一介紹,是不是感覺非常簡單,那就自己動手試一試吧!

【本文正在參加雲原生有獎征文活動】,活動連結:https://ost.51cto.com/posts/12598

繼續閱讀