Infra/CI&CD

Docker를 통한 CI/CD (1) - Docker 이해와 설치 및 사용법

DuL2 2024. 1. 30. 17:28

CI(Continuous Integration), CD(Continuous Delivery / Continuous Deployment)

기존의 서비스를 배포하는 과정에서는 n개의 서버가 클러스터가 되어있다면 "손배포"를 통해 상당한 시간 등의 리소스를 소모했었다.

하지만, Docker는 모두 같은 환경에서 테스트 및 배포 테스트를 할 수 있게 만들어 주었고, 이 과정을 자동화하기 까지 해주었기에 개발자의 시간을 많이 줄여줄 수 있게 되었다.

Docker : Container 관리 가능
Container Ochestration 기술 발달 -> Kubernetes 기술 발전.

Docker의 장점

  1. 애플리케이션 개발과 배포 편의성
    • Docker Container의 변경이 host OS에는 영향이 없음.
    • CI/CD에서 지속적인 통합 과정의 테스트에서 Docker를 활용하게 됨.
    • 어떤 서버에 올리더라도 같은 환경으로 구성된 컨테이너로 동작하기 때문에 표준화된 배포가 가능함.
  2. 여러 애플리케이션의 독립성과 확장성 확보
  3. Docker가 사실상 가상화의 표준인 상황.

Docker 설치 - mac 기준

1. 홈브루 설치

홈브루란?

brew(homebrew)는 각종 커맨드라인 프로그램과 일반 애플리케이션을 손쉽게 설치해주는 Mac용 패키지 매니저이다. 리눅스의 aptyum과 비슷하며 다양한 프로그램을 복잡한 빌드과정 없이 손쉽게 설치하고 업데이트, 관리도 간단하게 진행할 수 있다.

본격적인 설치

https://brew.sh/ko/ 로 이동

위 사이트로 이동하여 homebrew 설치

terminal에 다음 코드 입력하여 설치

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

2. docker 설치

docker, docker-compose 버전 확인

# docker for mac설치 
brew install docker docker-compose 

# docker version 확인 
docker --version 

# docker compose version 확인 
docker-compose --version

docker, docker-compose 버전 확인

docker Desktop 설치

https://docs.docker.com/desktop/install/mac-install/ 로 이동하여 본인 chip에 따라 설치.

도커 application으로 집어넣기

docker 실행 테스트

docker info

 

Container 실행 테스트

컨테이너가 제대로 올라가는지 확인을 위해 nginx 이미지를 docker에 올려 테스트를 해보자.

# nginx 이미지 다운받기
docker image pull nginx:1.25.3-alpine

docker images

docker image history nginx:1.25.3-alpine

docker run -d -p 8001:80 --name webserver01 nginx:1.25.3-alpine

docker ps | grep webserver01

docker port webserver01

curl localhost:8001

 

1. nginx를 다운받아 현재 docker에 설치된 image를 확인해보자.

2. docker image history를 확인해보자.

 

3. docker에 이미지를 실행시켜보자 

docker run -d -p 8001:80 --name webserver01 nginx:1.25.3-alpine

port는 8001:80에 webserver01 이라는 프로세스 이름으로 nginx 를 실행시키겠다는 뜻이다.

해쉬값이 나오는 것을 확인할 수 있다.

 

4. grep으로 확인해보자.

 

5. 다음 명령어로 우리가 실행시킨 nginx의 포트도 확인할 수 있다.

6. curl이라는 명령어로 포트를 찔러 확인할 수 있다. 아래 사진은 브라우저에서 해당 포트에 접근한 화면이다.

브라우저 localhost:8001의 화면

Docker image 관리

  • Docker 이미지는 container 런타임에 필요한 바이너리, 라이브러리 및 설정 값 등을 포함하고, 변경되는 상태값을 보유하지 않고(stateless) 변하지 않는다.(Immutable, Read-Only)
    • stateless: 상태를 저장하지 않기 때문에 다른 환경에서도 동일한 애플리케이션 실행이 가능함.(애플리케이션과 관련된 모든 파일과 라이브러리를 가지고 있음.
    • 불변성(Immutable): 이미지가 한번 생성되면 변경할 수 없음.(변경하고 싶다면 삭제하고 다시 다운받아야함.)
      • 도커 이미지는 필요한 파일만 포함하고 있음. 수정 x

Docker hub에 대한 이해

hub.docker.com 에서 기본적으로 이미지를 제공받거나 이미지를 업로드하여 제공할 수 있다. 이 것도 깃허브처럼 Private Registry 서버를 통해 받아올 수도 공유할 수도 있음.

 

마치 패키지 매니저가 무엇을 다운받을 때 받아오는 허브같은 곳임.

 

Docker 명령어 사용해보기

docker pull: Docker 이미지 내려받기

# docker [image] pull [options] name:[tag]

# 최초에는 docker.io가 default registry로 설정됨.
docker pull debian[:latest]                                 ---(1)
docker pull library/debian:10                               ---(2)
docker pull docker.io/library/debian:10                     ---(3)
docker pull index/docker.io/library/debian:10               ---(4)
docker pull nginx:latest                                    ---(5)

# private registry 나 클라우드 저장소의 이미지를 받는 경우
docker pull 192.168.0.101:5000/debian:10 # 현재는 실제로 동작하지 않음         ---(6)
docker pull gcr.io/google-samples/hello-app:1.0                         ---(7)

 

(1) : 데비안 다운로드 (latest - 최신판이 default이므로 생략 가능)

(2),(3),(4) : 특정 라이브러리에서 버전을 받아올 수 있음

(5) : 위에서는 최신 버전 nginx가 아니므로 최신 버전을 받아봄

(6), (7) : 클라우드 저장소의 이미지를 받을 수 있음.

 

docker image inspect: Docker 이미지 구조 확인

inspect를 통해 다운 받은 이미지의 내부 구조 정보를 json 형태로 확인이 가능함.

docker image inspect nginx:1.25.3-alpine

---------------------------------------------------------
docker image inspect --format="{{.Os}}" nginx:latest                
linux
docker image inspect --format="{{.RepoTags}}" nginx:latest             #태그 확인
[nginx:latest]
docker image inspect --format="{{.ContainerConfig.ExposedPorts}}" nginx:latest  #포트확인
map[80/tcp:{}]
docker image inspect --format="{{.RepoTags}} {{.Os}}" nginx:latest           #복수 확인
[nginx:latest] linux

 

docker image history: Dockerfile에 대한 정보

아래 명령어를 입력하면 여러 개의 계층 구조로 된 도커 이미지를 확인할 수 있다.

docker image history nginx:1.25.3-alpine

 

Docker login/logout : hub.docker.com에서 회원가입 후 실행

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: {자신의 계정}
Password: {자신의 암호}
Login Succeeded

docker logout
Removing login credentials for https://index.docker.io/v1/

테스트한 이미지 삭제

아래 화면을 보면 아까 실행했던 webserver01이 아직 실행중임을 알 수 있다. 필요없기 때문에 오른쪽 휴지통 버튼을 클릭하여 정지시키고 삭제해주자.

 

Docker Container와 Container 를 다루는 CLI

  • Docker Image : 컨테이너에 대한 OS, Application, Library 등등의 정보가 포함된 것.
  • Containder: Image를 실행시킨 상태, 여러 개를 도커안에 실을 수 있음.

Docker 이미지/Container 관련 명령어

https://segmentfault.com/a/1190000005802339

 

컨테이너의 상태

  • Runnning : 컨테이너가 실행중인 상태.
  • Paused : 컨테이너가 잠시 정지중인 상태.
  • Stopped : 컨테이너가 정지인 상태.

Docker 생애 주기(LifeCycle)

https://docker-saigon.github.io/post/Docker-Internals/

 

Docker Container 수동 생성

docker create 라는 명령어를 사용해 컨테이너를 실행시키지 않고 생성만 할 수 있다.

 

예시로 우분투 22.04를 생성해보자.

docker pull ubuntu:22.04
docker images
=

잘 다운로드된 것을 확인할 수 있다.

 

받은 이미지로 `ubuntu2204test`라는 이름의 컨테이너를 생성해보자.

docker create –ti --name ubuntu2204test ubuntu:22.04

다음 명령어로 도커에서 존재하는 컨테이너의 상태를 확인할 수 있다.

docker ps –a

created 된 우분투

docker container를 다음 명령어로 실행시킬 수 있다.

docker start ubuntu2204test
Ubuntu2204test
docker attach ubuntu2204test

 

이제 다음은 컨테이너를 실행시키고 컨테이너 안으로 들어가보자.

attach 하게 되면 사용자 이름이 root@~로 바뀌면서 컨테이너 내부로 들어간 것을 확인할 수 있다. 새로운 터미널에서 확인하면 켜져서 실행중인 것이 확인 할 수 있다.

이제 컨테이너 내부에서 'exit'을 통해 빠져나오면 꺼지게된다. 확인해보자.

 

이 모든 과정(create -> start -> attach)을 한번에 하고 싶다면 `run` 명령어를 사용하면 된다.

docker run -ti --name=ubuntu2204test2 ubuntu:22.04 /bin/bash

확인해보면 기존 test는 꺼져있고, test2는 실행중인 것을 확인할 수 있다.

 

실행중이라는 것은 프로세스로 켜지는 것이기 때문에 쉘 명령어로 실행중인 프로세스를 확인할 수 있다.

ps -ef | grep ubuntu2204test2

 

이미지 직접 만들어서 올려보기

이미지를 직접 빌드할 수 있다. 다음 명령어는 docker image를 직접 빌드할 수 있는 명령어이다. 빌드를 하게 되면 아래 사진처럼 로그가 나오고 빌드가 된다.

docker buildx build -t node-test:1.0 .

 

 

아래 명령어를 통해 빌드된 이미지를 찾을 수 있다. grep은 images 중에서 node-test를 찾는 명령어이다.

docker images | grep node-test

 

 

이미지 history를 확인해보면 6060번 포트에서 열린것을 확인할 수 있다.

docker image history node-test:1.0

 

이제 도커 직접 만든 이미지를 올려 실행시켜보자. 자세한 옵션은 아래서 알아보자.

docker run -itd -p 6060:6060 --name=node-test -h node-test node-test:1.0
docker ps | grep node-test
curl http://localhost:6060

 

실행한 앱의 로그 또한 볼 수 있다.

docker logs node-test

 

docker run 자주 사용하는 옵션
-d: detached mode; 백그라운드 모드
-p: 호스트와 컨테이너의 포트를 연결(포워딩)
-v: 호스트와 컨테이너의 디렉토리를 연결(마운트)
-e: 컨테이너 내에서 사용할 환경변수 설정
-name: 컨테이너 이름 설정
-rm: 프로세스 종료 시 컨테이너 자동 삭제
-ti: -i 와 -t 를 동시에 사용한 것으로 터미널 입력을 위한 옵션

 

 

컨테이너의 정보를 확인할 수도 있다. 만약 docker stat을 아무런 옵션 없이 사용하면 stream으로 계속 나오게 된다.

 

쌓이는 로그의 경우에는 로컬의 ./ 디렉토리에 저장이 된다.

 

컨테이너 내부를 사용하고 싶다면 다음과 같이 사용하면 된다.

docker inspect [container] 
docker inspect node-test

 

도커 컨테이너 정리하기

# 터미널1, 도커 상태 확인
docker stats

# 터미널2, 도커 프로세스 이벤트 확인
docker events

# 터미널3, docker start
docker stop node-test         -------- 노드 정지
docker ps –a
docker start node-test        -------- 노드 시작

# 
docker pause node-test        -------- 노드 일시정지
docker unpause node-test      -------- 노드 다시시작
docker ps -a

 

Docker exit code 확인해보기

  • 0 : Docker Process가 수행해야 할 모든 Command 또는 Shell을 실행하고 정상 종료
  • 255 : Docker Image에 정의된 EntryPoint 또는 CMD가 수행이 완료되었을 경우 발생
  • 125 : Docker run 명령어의 실패로 실제 docker process가 기동되지 않음
  • 126 : Docker Container 내부에서 Command를 실행하지 못할 경우 발생
  • 127 : Docker Container 내부에서 Command를 발견하지 못하였을 경우 발생
  • 137 : kill -9로 인해 종료 됨
  • 141 : 잘못된 메모리 참조하여 종료 됨
  • 143 : Linux Signal로 정상 종료 됨
  • 147 : 터미널에서 입력된 정지 시그널로 종료 됨
  • 149 : 자식 프로세스가 종료 되어 종료 됨

Docker container, image, system 정리하기

prune 명령어를 사용하면 모든 값을 사라지게 할 수 있다.

# 중지된 컨테이너를 포함하여 모든 컨테이너 리스트
docker container ls -a

# 
docker container prune

# 
docker image prune

# 남아 있는 이미지 리스트 확인 – 실행 중인 컨테이너의 이미지 등
docker image ls

# 사용하지 않는 도커 이미지, 컨테이너, 볼륨, 네트워크 등 모든 도커 리소스를 일괄적으로 삭제
docker system prune