본문 바로가기

Kubernetes

[Docker] Docker 이미지 빌드, 배포, 백업

반응형

 

 

 

Docker 이미지를 사용하면 애플리케이션과 실행 환경을 하나로 묶어 손쉽게 배포할 수 있다. 이 글에서는 Docker 이미지 빌드, 배포, 백업 과정을 단계별로 설명하고자 한다.

 

1. 이미지 빌드

  • Docker 이미지 빌드란 애플리케이션과 실행 환경을 하나로 묶는 프로세스
  • 웹 어플리케이션 및 실행 설정 및 종속성을 하나의 이미지로 패키징 하는 과정

 

2. Dockerfile 작성

  • Docker 이미지를 빌드하는 데 필요한 명령어와 설정이 포함된 Dockerfile을 작성
  • 이미지 빌드 방법을 지시하는 스크립트

 

3. 멀티 스테이지 빌드

  • 이미지크기를 최적화하고 불필요한 구성 요소를 제거

 

4. Docker 이미지 태깅

  • 이미지 버전 관리를 위해 이미지에 태그 부여

 

5. Docker Hub 연동

  • Docker 이미지를 저장하고 다른 사람과 공유하기 위해 Docker Hub와 연동

 

Docker 이미지 빌드 후 Docker hub에 이미지 추

더보기

git을 사용하여 build를 위한 코드를 다운로드

git clone https://github.com/michaeljune0/docker-k8s-lecture.git
cd docker-k8s-lecture


├── 00-docker
│   ├── 00-container_id
│   └── 01-nginx-react
└── 01-kubernetes
    ├── 00-k8s_install
    ├── 01-nginx_install
    ├── 02-k8s_dashboard_install
    └── 03-nginx-blue-green
    
    
user07@user07-vm1:~$ git clone https://github.com/michaeljune0/docker-k8s-lecture.git
ecture/00-docker/00-container_id
Cloning into 'docker-k8s-lecture'...
remote: Enumerating objects: 66, done.
remote: Counting objects: 100% (66/66), done.
remote: Compressing objects: 100% (55/55), done.
remote: Total 66 (delta 8), reused 56 (delta 5), pack-reused 0
Unpacking objects: 100% (66/66), 179.51 KiB | 5.13 MiB/s, done.
user07@user07-vm1:~$ cd docker-k8s-lecture/00-docker/00-container_id

 

 

GoLang 프로그램 Docker 빌드

GoLang 프로그램을 Docker 이미지로 빌드하기 위해 Dockerfile이 필요하다. 예제코드를 기반으로 Dockerfile을 작성해보자

 

서비스를 위한 프로그램 코드 작성

더보기

웹페이지에서 Docker container id를 출력하는 프로그램

mkdir -p /root/docker-k8s-lecture/00-docker/00-container_id/
cd /root/docker-k8s-lecture/00-docker/00-container_id/
vi main.go


# main go 내용
package main

import (
    "fmt"
    "os"
    "log"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    name, err := os.Hostname()
    if err != nil {
        panic(err)
    }
    fmt.Fprintln(w, "hostname:", name)
}

func main() {
    fmt.Fprintln(os.Stdout, "Starting GoApp Server......")
    http.HandleFunc("/", handler)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

 

 

 

 

Dockerfile 작성

vi Dockerfile

# Dockerfile 내용
FROM golang:1.11-alpine AS build
WORKDIR /src/
COPY main.go go.* /src/
RUN CGO_ENABLED=0 go build -o /bin/demo
FROM scratch
COPY --from=build /bin/demo /bin/demo
CMD ["/bin/demo"]

 

 

Docker 이미지 빌드

# Docker 이미지 빌드
docker build -t mygolangapp:1.0 .

user07@user07-vm1:~/docker-k8s-lecture/00-docker/00-container_id$ docker build -t mygolangapp:1.0 .
[+] Building 8.4s (10/10) FINISHED                                         docker:default
 => [internal] load build definition from Dockerfile                                 0.0s
 => => transferring dockerfile: 971B                                                 0.0s
 => [internal] load metadata for docker.io/library/golang:1.11-alpine                0.7s
 => [internal] load .dockerignore                                                    0.0s
 => => transferring context: 2B                                                      0.0s
 => [build 1/4] FROM docker.io/library/golang:1.11-alpine@sha256:09e47edb668c2cac8c  0.0s
 => [internal] load build context                                                    0.0s
 => => transferring context: 467B                                                    0.0s
 => CACHED [build 2/4] WORKDIR /src/                                                 0.0s
 => [build 3/4] COPY main.go go.* /src/                                              0.1s
 => [build 4/4] RUN CGO_ENABLED=0 go build -o /bin/demo                              6.9s
 => [stage-1 1/1] COPY --from=build /bin/demo /bin/demo                              0.1s
 => exporting to image                                                               0.2s
 => => exporting layers                                                              0.1s
 => => writing image sha256:8c531ad25b2290ba2683e222774b9ef00ae3fa598760db323e71bdf  0.0s
 => => naming to docker.io/library/mygolangapp:1.0                                   0.0s

 

 

Docker Hub 로그인

docker login

 

user07@user07-vm1:~/docker-k8s-lecture/00-docker/00-container_id$ docker login
Log in with your Docker ID or email address to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com/ to create one.
You can log in with your password or a Personal Access Token (PAT). Using a limited-scope PAT grants better security and is required for organizations using SSO. Learn more at https://docs.docker.com/go/access-tokens/

Username: hyerin082197
Password:
WARNING! Your password will be stored unencrypted in /home/user07/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores

Login Succeeded

 

 

 

Docker 이미지 태깅 및 푸시

docker tag mygolangapp:1.0 hyerin082197/mygolangapp:1.0
docker push hyerin082197/mygolangapp:1.0


user07@user07-vm1:~/docker-k8s-lecture/00-docker/00-container_id$ docker tag mygolangapp:1.0 hyerin082197/mygolangapp:1.0

user07@user07-vm1:~/docker-k8s-lecture/00-docker/00-container_id$ docker push hyerin082197/mygolangapp:1.0
The push refers to repository [docker.io/hyerin082197/mygolangapp]
f9dbba6d98fe: Pushed
1.0: digest: sha256:74026c53ebf30d50e7ec6804463407f635bb45d7dd05bb35d91c7a41c5ca0d61 size: 527

 

 

Docker 이미지 정상 생성 확인

docker images

user07@user07-vm1:~/docker-k8s-lecture/00-docker/00-container_id$ docker images
REPOSITORY                 TAG       IMAGE ID       CREATED              SIZE
hyerin082197/mygolangapp   1.0       8c531ad25b22   About a minute ago   6.5MB
mygolangapp                1.0       8c531ad25b22   About a minute ago   6.5MB
nginx                      latest    a72860cb95fd   4 weeks ago          188MB
nginx                      1.26.0    94543a6c1aef   2 months ago         188MB

 

 

컨테이너 시작

docker run -d -p 8081:8080 mygolangapp:1.0

user07@user07-vm1:~/docker-k8s-lecture/00-docker/00-container_id$ docker run -d -p 8081:8080 mygolangapp:1.0
480fe237dc39316ea8408008ea98c0ee50602ec854ba99086c11a231560c62bf

 

 

컨테이너 서비스 확인

curl localhost:8081

user07@user07-vm1:~/docker-k8s-lecture/00-docker/00-container_id$ curl localhost:8081
hostname: 480fe237dc39

 

 

컨테이너 프로세스 확인

docker ps

user07@user07-vm1:~/docker-k8s-lecture/00-docker/00-container_id$ docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS         PORTS                                       NAMES
480fe237dc39   mygolangapp:1.0   "/bin/demo"              3 minutes ago   Up 3 minutes   0.0.0.0:8081->8080/tcp, :::8081->8080/tcp   stupefied_hodgkin

 

 

프로세스 상세 정보 확인

user07@user07-vm1:~/docker-k8s-lecture/00-docker/00-container_id$ docker inspect stupefied_hodgkin
[
    {
        "Id": "480fe237dc39316ea8408008ea98c0ee50602ec854ba99086c11a231560c62bf",
        "Created": "2024-07-25T07:14:45.232525368Z",
        "Path": "/bin/demo",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 32805,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2024-07-25T07:14:45.486686645Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:8c531ad25b2290ba2683e222774b9ef00ae3fa598760db323e71bdf9c064beca",
        "ResolvConfPath": "/var/lib/docker/containers/480fe237dc39316ea8408008ea98c0ee50602ec854ba99086c11a231560c62bf/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/480fe237dc39316ea8408008ea98c0ee50602ec854ba99086c11a231560c62bf/hostname",
        "HostsPath": "/var/lib/docker/containers/480fe237dc39316ea8408008ea98c0ee50602ec854ba99086c11a231560c62bf/hosts",
        "LogPath": "/var/lib/docker/containers/480fe237dc39316ea8408008ea98c0ee50602ec854ba99086c11a231560c62bf/480fe237dc39316ea8408008ea98c0ee50602ec854ba99086c11a231560c62bf-json.log",

 

 

도커 이미지를 Docker hub에 업로드

user07@user07-vm1:~/docker-k8s-lecture/00-docker/00-container_id$ docker images
REPOSITORY                 TAG       IMAGE ID       CREATED          SIZE
hyerin082197/mygolangapp   1.0       8c531ad25b22   13 minutes ago   6.5MB
mygolangapp                1.0       8c531ad25b22   13 minutes ago   6.5MB

 

 

tag 를 변경해보자.

docker tag hyerin082197/mygolangapp:1.0 hyerin082197/mygolangapp:latest

user07@user07-vm1:~/docker-k8s-lecture/00-docker/00-container_id$ docker images
REPOSITORY                 TAG       IMAGE ID       CREATED          SIZE
hyerin082197/mygolangapp   1.0       8c531ad25b22   15 minutes ago   6.5MB
hyerin082197/mygolangapp   latest    8c531ad25b22   15 minutes ago   6.5MB

 

 

Push images를 hub.docker.com 레포지토리에서 확인

 

 

 

 

 

 

Docker 이미지를 빌드하고 Docker Hub에 푸시하며 전체적인 과정을 해보았습니다. 이제 Docker를 통해 애플리케이션을 컨테이너화하고, 다양한 환경에 배포하는 일련의 과정을 이해했습니다. Docker를 사용하면 개발환경과 프로덕션 환경 간의 차이를 줄이고, 애플리케이션의 배포 및 관리를 단순화 할 수 있습니다.