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를 사용하면 개발환경과 프로덕션 환경 간의 차이를 줄이고, 애플리케이션의 배포 및 관리를 단순화 할 수 있습니다.
'Kubernetes' 카테고리의 다른 글
[CI/CD] Argo Rollout을 사용한 Blue/Green 배포 (4) | 2024.10.02 |
---|---|
CNCF란? Cloud Native란? (0) | 2024.09.25 |
[Docker] Docker 소개 (1) | 2024.07.24 |
실습으로 배우는 쿠버네티스 멀티 클러스터 관리 (0) | 2024.07.15 |
Github WebHooks 연동하여 Jenkins 빌드 자동화 (0) | 2024.03.13 |
Contents