만쥬의 개발일기
article thumbnail

 

오늘은 window wsl2 ubuntu18.04환경에서 도커를 설치하고, 젠킨스를 이용해 자동 배포 파이프라인을 구축해 볼 예정이다.

자동 배포의 필요성

기존 팀 프로젝트의 work flow는 다음과 같았다.

  1. 각자 기능 구현 후 PR
  2. EC2 서버로 접속
  3. github에 merge된 코드를 git pull
  4. gradle을 이용해 build
  5. jar파일을 java -jar 명령어를 통해 80번포트에 실행
 
 
이 1번~ 5번 과정이 서버 배포의 플로우이고, 서버 배포는 매번 기능이 추가 될 때마다 시행되어야 한다.
이 flow는 새로운 기능마다 바뀌는 것이 아니기에, 자동화 할 수 있는 대상이다.
이를 자동화하여 최신상태의 코드가 자동으로 배포되도록 하는 것을 Continuos Distribution, 지속적 배포라고 부른다.
 

젠킨스가 해주는 것

젠킨스가 대신해주는 부분은,
  1. github으로부터 머지되었다는 연락을 받고
  2. 코드를 git clone하고
  3. gradle로 프로젝트를 빌드하여,
  4. 빌드한 목적파일을 어플리케이션이 실행되어야 할 서버로 전달하고, 어플리케이션을 구동하기 위한 명령어를 실행합니다.

즉, 나는 브랜치에 merge만 하면 나머지 부분은 젠킨스가 자동으로 작업해주고, 서버에 자동 배포되는 것이다.

 

도커 설치

우선 도커를 설치해준다.

curl -fsSL https://get.docker.com/ | sudo sh

위 명령어를 치면, 윈도우용 도커 데스크앱을 설치하는 것을 권장하는데, 무시하고 잠시 기다린다.

처음엔 에러가 발생했는데, 이전에도 보았던 에러라 바로 해결할 수 있었다.

2023.10.05 - [🛠️TOOL/📄Linux] - [Linux] - sudo apt update시 error: "Release file is not yet valid"

 

[Linux] - sudo apt update시 error: "Release file is not yet valid"

window wsl2 환경에서 프로그래밍을 할 때, sudo apt-get update시 종종 볼수 있는 "release file is not valid yet" 이라는 에러가 있다. 예시) 이 때는 다음 명령어로 하드웨어 시계(RTC)값을 시스템 시계로 동기화

kangmanjoo.tistory.com

 

위와 같이 나온다면 설치가 완료된 것이다.

sudo usermod -aG docker $USER

도커는 기본적으로 root 권한을 필요로하고, root가 아닌 사용자가 사용시 권한이 필요하다.

위 명령어로 현재 접속중인 도커의 그룹 멤버쉽에 현재 사용자를 등록하고, 사용자에게 도커 권한을 부여하여 sudo 없이 사용이 가능하도록 한다.

 

만약 바로 적용이 안되면 다음 명령어로 즉시 새로운 그룹 멤버쉽을 등록해준다.

newgrp docker

 

docker version

도커가 잘 설치되었는지 확인한다.

sudo systemctl status docker

systemctl 명령어로 도커의 상태도 확인해준다.

혹시 여기서 에러가 뜬다면 아래 포스팅을 참고

2023.10.21 - [🛠️TOOL/📄Linux] - [Linux] systemctl 명령 에러 System has not been booted with systemd as init system (PID 1).

 

[Linux] systemctl 명령 에러 System has not been booted with systemd as init system (PID 1).

에러 원인 WSL을 사용하다보면, systemd 명령을 실행했을때 종종 systemd 환경이 아니라는 오류가 발생한다. 원인은 WSL은 루트 시스템 프로세스가 systemd가 아닌 init이기 때문이다. pstree 루트 시스템

kangmanjoo.tistory.com

 

버전정보를 보면 클라이언트와 서버로 나뉘어져 있다. 하나의 실행파일이지만 실제로 클라이언트와 서버역할을 각각 할 수 있는 것이 도커의 특징이다. 도커 커맨드를 입력하면 도커 클라이언트가 도커 서버로 명령을 전송하고 결과를 받아 터미널에 출력해 준다.

기본값이 도커 서버의 소켓을 바라보고 있기 때문에 사용자는 의식하지 않고 마치 바로 명령을 내리는 것 같은 느낌을 받고, 이러한 설계가 mac이나 windows의 터미널에서 명령어를 입력했을때 가상 서버에 설치된 도커가 동작하는 이유이다.

컨테이너 실행하기

실제로 컨테이너를 실행해보자.

터미널에서 도커를 실행시키는 방법은 다음과 같다.

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
옵션 설명
-d detached mode 흔히 말하는 백그라운드 모드
-p 호스트와 컨테이너의 포트를 연결 (포워딩)
-v 호스트와 컨테이너의 디렉토리를 연결 (마운트)
-e 컨테이너 내에서 사용할 환경변수 설정
–name 컨테이너 이름 설정
–rm 프로세스 종료시 컨테이너 자동 제거
-it -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션
–link 컨테이너 연결 [컨테이너명:별칭]

도커를 사용하는 다양한 예시는 아래 블로그에서 확인할 수 있다!

https://subicura.com/2017/01/19/docker-guide-for-beginners-2.html

 

도커 기본 명령어

컨테이너 목록 확인

docker ps

위 명령어로 현재 실행중인 컨테이너 목록을 확인할 수 있다.

컨테이너를 하나 생성해보자.

컨테이너 생성

docker run --rm -it ubuntu:16.04 /bin/bash

--rm 옵션으로 프로세스가 종료되면 컨테이너가 삭제되도록 하였다.

ubuntu 16.04 이미지를 다운받은 적이 없기에, 컨테이너를 생성하면서 ubuntu 설치도 자동으로 되는 모습이다. 맙소사

다른 터미널을 열어서 docker ps로 다시 컨테이너 목록을 확인해보면, 작동중인 ubuntu 컨테이너가 보인다.

이후 해당 프로세스를 종료하면, --rm 옵션에 의해 컨테이너가 자동으로 삭제되어 목록에서도 사라진 모습이다.

그러나 --rm 옵션 없이 그냥 프로세스를 종료한다면, 컨테이너는 종료되지만 삭제되지않는다.

이렇게 종료된 컨테이너들은 docker ps -a 명령어로 확인할 수 있으며, 컨테이너의 읽기/쓰기 레이어는 그대로 존재하고 다시 시작도 가능하다.

컨테이너 삭제

docker rm [OPTIONS] CONTAINER [CONTAINER...]

만약 이러한 컨테이너를 영구히 삭제하고 싶다면, 위 명령어를 이용해 삭제가 가능하다.

다운로드한 이미지 목록 확인

docker images

위 명령어로 다운받은 이미지들을 확인할 수 있다.

다운로드한 이미지 삭제

docker rmi {imageID}

그리고 위 명령어로 다운받은 이미지를 삭제해 용량을 아낄 수도 있다.

단, 컨테이너가 실행중인 이미지는 삭제되지않는다.

docker logs ${CONTAINER_ID}

위 명령어로 컨테이너의 로그도 확인 가능하다.

도커에서 컨테이너를 업데이트 하려면 새 버전의 이미지를 다운(pull)받고 기존 컨테이너를 삭제(stop, rm) 한 후 새 이미지를 기반으로 새 컨테이너를 실행(run)하면 된다.

컨테이너를 삭제한다는 건 컨테이너에서 생성된 파일이 사라진다는 뜻,, 데이터는 AWS S3 같은 외부 스토리지에 저장해놓아야 한다.

Dokcer Desktop for window 설치

먼저 도커 공식 사이트에서 window 버전을 설치한다.

https://www.docker.com/products/docker-desktop/

[Docker Desktop: The #1 Containerization Tool for Developers | Docker

Docker Desktop is collaborative containerization software for developers. Get started and download Docker Desktop today on Mac, Windows, or Linux.

www.docker.com](https://www.docker.com/products/docker-desktop/)

설치할 때 다음 옵션들은 모두 체크해준다.

✅ Hyper-V대신 WSL2 사용
✅ 바탕화면 아이콘 추가)

settings ➡️ general 에서 Use the WSL 2 based engine을 체크해준다.

settings ➡️ Resources ➡️ WSL integration 에서 위 항목을 체크표시해주고, 내가 사용하는 WSL 환경을 Enable로 변경해준다.

 

도커를 설치하고 간단한 사용법을 정리해봤다. 다음 장에서는 실제 자동 배포 파이프라인을 구축해보자.

reference

profile

만쥬의 개발일기

@KangManJoo

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!