티스토리 뷰

쿠버네티스 배포 프로젝트를 진행하면서 도커 이미지를 사용해 각 컨테이너를 구성했는데 이 과정에서 도커 이미지를 여러 번 초기화해 빌드하고 도커 허브에 Push 해야 했다. 이 일련의 과정들을 기록해두고자 한다.

 

🔗내가 진행한 쿠버네티스 배포 프로젝트 개요

 

[Kubernetes] 쿠버네티스와 도커를 활용하여 웹서비스 배포하기 프로젝트 1주차 : 프로젝트 개요

2023 클라우드 컴퓨팅 1팀 프로젝트 쿠버네티스를 처음 다루면서 정말 많이 헤매고 힘들었다. 아직 진행 중인 미완성 프로젝트지만 더 열심히 해보려고 블로그에 기록해보려고 한다. 프로젝트 최

yuejeong.tistory.com

 


 

1. 도커 이미지에 사용할 소스 코드 작성

컨테이너에 올릴 기존 서비스의 소스 코드를 준비한다. 직접 컨테이너에 소스 파일을 넣어주는 방법도 있겠지만 우리는 원격 저장소 Github에 소스코드를 올리고 Dockerfile에서 이미지를 빌드할 때 해당 소스코드를 git clone 해오는 방식으로 이미지를 구성했다. 만약 협업을 통해 프로젝트를 진행한다면 도커파일을 구성할 때 로컬 파일을 바로 넣어주는 방법 대신 git에 코드를 올려두고 clone 하는 방식이 훨씬 편하고 협업에 유리할 것 같다.

 

아래는 우리 프로젝트에서 사용한 소스코드의 github 링크이다. 팀원 세현이가 기존에 개발해 둔 서비스인데 너무 좋은 서비스를 제공해 준 세현이에게 다시 한번 더 무한 감사를 표한다!

 

🔗Backend: 

 

GitHub - ash0814/SC_backend

Contribute to ash0814/SC_backend development by creating an account on GitHub.

github.com

 

🔗Frontend:

 

GitHub - ash0814/SC_frontend

Contribute to ash0814/SC_frontend development by creating an account on GitHub.

github.com

 


 

2. 도커 파일 작성

이제 빌드할 도커 파일을 작성한다. 우리는 프론트엔드, 백엔드, 데이터베이스에 대한 도커 파일을 작성했다.

 

Frontend Dockerfile

FROM debian:buster
RUN apt-get -y update && apt-get -y upgrade && apt-get -y install	nodejs npm curl git
RUN npm cache clean -f && npm install -g n && npm update -g && n 16.17.1
WORKDIR /home
RUN git clone https://github.com/ash0814/SC_frontend.git
WORKDIR /home/SC_frontend
RUN npm install

CMD ["npm","run", "serve"]

 

 

Backend Dockerfile

FROM debian:buster
RUN apt-get -y update && apt-get -y upgrade && apt-get -y install	nodejs npm curl git
RUN npm cache clean -f && npm install -g n && npm update -g && n 16.17.1
WORKDIR /home
RUN git clone https://github.com/ash0814/SC_backend.git
WORKDIR /home/SC_backend
RUN npm install

CMD ["node","server.js"]

➡️백엔드 도커파일 중 서버를 실행시킬 명령어인 node server.js를 CMD 태그에 넣어줬는데 어째서인지 실행이 안된다. 이 부분은 추후에 수정이 필요하다.

 

---------[12/10 내용 추가]--------

해결 방법을 아래 포스팅에 자세히 정리해 두었다. 백엔드 디플로이먼트에 추가했던 명령어의 문제였다. 

 

[Kubernetes] 쿠버네티스와 도커를 활용하여 웹서비스 배포하기 프로젝트 4주차 : 진행 상황 및 에러

1. node server.js 명령어 미실행 오류 해결 백엔드 서버 파드는 생성 후 바로 'node server.js' 명령어를 실행해야 동작하고 프론트 엔드로부터 오는 api request를 받을 수 있다. 그렇게 때문에 도커파일을

yuejeong.tistory.com

 

Database Dockerfile

FROM mariadb:11.0.2
COPY ./db_init.sql /docker-entrypoint-initdb.d/db_init.sql

데이터베이스는 쿠버네티스 클러스터에서 독립적인 파드를 가지게 하기 위해 추가로 도커파일을 작성했다. 이때 우리 서비스의 데이터 베이스 초기 설정을 위한 init.sql 문을 함께 작성해서 도커파일과 같은 파일 경로 상에 위치시켰다. 

➡️하지만 어째서인지 init.sql문이 자동으로 실행되지 않아서 일일이 파드 안에 들어가서 실행해줘야 했다. 지금 포스팅을 작성하면서 발견한 문제점은 도커파일 자체에 명령어를 실행하는 레이어가 존재하지 않는다..! 이것도 수정이 필요하다.

 

---[12/10 내용 추가]----

기존 init.sql 실행문에는 테이블 생성문만 존재하는데 Create Database, Use Database 명령어가 들어있지 않아서 애초부터 데이터베이스가 생성되지 않았던 것이었다! init.sql 문을 수정하고 도커 이미지를 완전히 초기화해서 새로 빌드해 보니 데이터베이스가 잘 생성되어 있다. 

 

 

Databse init.sql

CREATE DATABASE IF NOT EXISTS sc_db;

USE sc_db;

CREATE TABLE IF NOT EXISTS `User` (
  `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_name` varchar(45) NOT NULL,
  `user_pwd` varchar(60) NOT NULL,
  `user_email` varchar(45) NOT NULL,
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `user_id_UNIQUE` (`user_id`),
  UNIQUE KEY `user_email_UNIQUE` (`user_email`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

....(나머지 테이블 생성문)

 

위에 도커파일 작성은 팀원 세현이가 맡아서 해주었다. 다시 한번 무한 박수!👏👏👏

 


3. 도커 이미지 빌드: Docker Build

이제 대망의 빌드를 해보자. 빌드 명령어는 다음과 같다.

sudo docker build --tag [사용자명]/[레파지토리명]:[태그] .

🗯️ 사용자명은 빌드한 이미지를 Push 할 도커허브 레파지토리의 사용자명이다.

🗯️ 레파지토리명은 도커허브의 레파지토리명 

🗯️ 태그는 이미지의 버전이라고 생각하면 된다. 

🗯️ 맨 마지막에 한 칸 띄고 '.' 마침표 찍는 거 잊지 말기

위와 같이 이미지 이름을 구성해야 하는 이유는 아래에 도커 허브 push에서 더 자세히 다룬다.

 

예를 들면 나의 백엔드 도커파일을 빌드할 때 도커 허브에 내가 소유한 'sc-backend' 레파지토리에 1.0 버전으로 push 할 예정이므로 명령어를 아래와 같이 구성했다. 해당 명령어는 도커파일이 있는 파일 위치에서 실행해야 한다.

sudo docker build --tag youjung819/sc_backend:1.0 .

빌드 완료

아래 명령어를 입력하면 내가 생성한 모든 도커 이미지를 확인할 수 있다. 

sudo docker images

방금 생성한 백엔드 이미지 1.0 버전

 

🔒 이때 프로젝트를 진행하다가 소스 코드를 수정하고 깃에 새로운 버전으로 push 한 경우 이미지 빌드를 새로 해야 할까?

🗝️ 정답은 YES

해당 도커 이미지를 가지고 컨테이너화 하면 이미지는 고정된 상태로 컨테이너를 만들기 때문에 이미지 빌드 이후에 수정한 내용은 이미지나 컨테이너에 반영되지 않는다. 덧붙여 단순히 docker rmi 명령어를 사용해 이미지를 삭제하고 빌드한다면 이전에 빌드한 이미지 기록이 캐시 되어서 새로운 이미지를 생성해도 반영되어 있지 않는다.

그렇기 때문에 모든 이미지를 생성하고 도커를 초기화하는 과정을 거쳐서 완전히 새로운 이미지를 생성해야 한다.  해당 내용은 아래 포스팅에 자세히 정리해 놨다.

 

🔗도커 이미지 새로 빌드시 git clone이 제대로 반영되지 않을 때 해결 방법 포스팅 

 

[Docker] 도커 이미지 새로운 버전 빌드 하기 전 입력해야 하는 필수 명령어 | Git clone 새로운 내용

쿠버네티스를 사용한 배포 프로젝트를 진행하면서 기존 소스코드를 수정할 일이 자주 발생했는데, 수정한 뒤 새로운 도커 이미지를 빌드해 보니 새로운 코드가 하나도 반영되지 않았다. 다시

yuejeong.tistory.com


4. 도커 허브에 Push 하기: Docker push 

쿠버네티스를 사용해 서비스를 배포한다고 하면 오브젝트 생성을 위한 매니페스트 파일을 작성할 때 사용할 컨테이너 이미지를 Docker Hub에서 가져오도록 구성해야 한다. 그러므로 내가 빌드한 이미지를 도커 허브에 push해주는 과정이 필요하다.

 

[1] 도커 허브 회원 가입 

도커 허브에 이미지를 올리기 위해선 도커 허브에 가입해야 한다.

 

Docker Hub Container Image Library | App Containerization

Build and Ship any Application Anywhere Docker Hub is the world's easiest way to create, manage, and deliver your team's container applications. Create your account Signing up for Docker is fast and free. Continue with GoogleContinue with GitHubContinue wi

hub.docker.com

 

[2] 도커 허브에서 각 이미지의 레파지토리 생성하기

백엔드 이미지를 push 할 레파지토리 sc_backend를 생성했다.

이때 주의할 점은 github 프로젝트 레파지토리와 다르게 하나의 레파지토리 안에 들어가는 이미지들은 버전만 다르고 같은 이미지여야 한다는 점이다. 즉, 프로젝트 이름으로 레파지토리를 생성하고 그 안에 태그를 달리하여 frontend, backend이미지를 같이 넣는 것이 아니라 각 이미지별로 다른 레파지토리를 생성해서 태그는 버전을 의미하도록 도커 허브를 구성해야 한다는 점이다. 

 

난 처음에 아래와 같이 sc_chatting이라는 우리 프로젝트명의 레파지토리를 만들고 frontend, backend, database 도커 이미지를 push 했었다. 

하지만 이렇게 한다면 도커 이미지 태그를 이미 각 이미지명으로 구성했기 때문에 프로젝트 과정에서 지속적으로 새로 빌드되는 도커 이미지의 '버전'을 지정할 방법이 없다. 

 

그러니까 아래와 같이 각 이미지별로 레파지토리를 만들고 새로 빌드될 때마다 이미지 태그에 버전을 지정해서 push 하는 방식으로 구성할 수 있도록 했다. 


[3] docker login 

명령어를 입력하면 도커 허브에 가입했던 Username과 Password를 입력해서 로그인을 할 수 있다. 한번 로그인해 두면 existing credentials에 로그인 정보가 저장돼서 편리하다. 또한 나의 경우에는 docker 명령어를 사용할 때 sudo를 붙이지 않으면 permission error가 발생했다. 그러므로 모든 도커 명령어마다 sudo를 꼭 붙여야 했다. 

 

[4] 빌드해 둔 이미지 도커 허브에 Push 하기: Docker push 

모든 준비는 끝났다. 이제 Docker push 명령어를 이용해서 아까 빌드해 둔 이미지를 도커 허브에 push 하자.

sudo docker push [빌드한 도커 이미지]

도커 이미지 이름을 구성할 때 사용자명, 레파지토리와 버전을 명시해 줬기 때문에 단순히 docker push 뒤에 빌드한 이미지를 지정하면 도커 허브에 push 할 수 있다. 

이전에 미리 push해뒀던 이미지므로 로그가 Layer already exists로 뜬다

Push에 성공했다면 도커 허브에서 해당 이미지를 확인할 수 있다.

 

끝!

 

🔗 참고 자료:

 

[도커] Docker Hub에 이미지 올리기

Docker Hub 도커 허브는 도커에서 제공하는 기본 이미지 저장소로 ubuntu, centos, debian 등의 베이스 이미지와 ruby, golang, java, python 등의 공식 이미지가 저장되어 있다. Github과 유사한 구조라고 생각하

leveloper.tistory.com

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함