[Docker + CI/CD] Docker

콩퓨터·2025년 1월 20일

CI/CD

목록 보기
2/10

🐳 Docker

🤔 Docker를 사용하는 이유는 뭘까 ?

🚀 애플리케이션 개발과 배포가 편해진다 !!!

  • Docker Container 내부에서 여러 소프트웨어를 설치해도 호스트 OS에는 영향 X
  • CI/CD 에서 지속적인 통합(Continuous Integration) 과정의 테스트에서 Docker 를 활용
  • 어떤 서버에 올리더라도 같은 환경으로 구성된 컨테이너로 동작하기 때문에 표준화된 배포를 구성할 수 있다.
  • 여러 애플리케이션의 독립성과 확장성 ⬆️
  • Docker 가 가상화에서 사실상 표준의 위치

☑️ Docker 및 Docker Compose 설치

homebrew 를 이용해서 Docker, Docker Compose 설치

brew install docker docker-compose

#docker version 확인
docker --version

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

☑️ Container 실행테스트

# Docker 엔진과 구성 확인
docker info

# Container 실행 테스트

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

## 다운로드된 이미지 확인
docker images

# nginx:1.25.3-alpine 이미지의 레이어 히스토리 확인
docker image history nginx:1.25.3-alpine

# nginx 컨테이너 실행 (8001번 포트 매핑)
docker run -d -p 8001:80 --name webserver01 nginx:1.25.3-alpine

# 실행 중인 컨테이너 확인 (webserver01 검색)
docker ps | grep webserver01

# webserver01 컨테이너의 포트 매핑 정보 확인
docker port webserver01

# 로컬에서 8001번 포트를 통해 Nginx 서비스 확인
curl localhost:8001

☑️ Docker Image 관리

docker image

  • jar 파일과 같이 실행되지 않은 OS
  • 미리 라이브러리, 기타 종속성에 대한 정의 그리고 실행되는 코드가 포함되어있는 실행되지 않은 OS파일
    - 어떤것을 해야한다 라는 내용이 담김
    -Docker Container 서비스를 위한 이미지는 Container 런타임에 필요한 바이너리, 라이브러리 및 설정 값, 실행되는 코드 등을 포함
  • 변경되는 상태값을 보유하지 않고(stateless), 변하지 않음(Immutable, Read-Only).
    - 상태 저장 없음(stateless) : 애플리케이션과 관련된 모든 파일과 라이브러리를 포함하고 있기 때문에, 다른 환경에서도 동일한 애플리케이션을 실행 가능
    • 불변성(Immutable) : 이미지가 한번 생성되면 변경할 수 없는 것을 의미
  • 도커 이미지는 필요한 파일만 포함하고 있기 때문에, 용량이 작다.
  • 이미지를 변경할 필요가 있을 경우에는 새로운 이미지 생성 필요

☑️ Docker 이미지 내려받기

docker pull
  • hub.docker.com 에서 이미지를 제공받거나 해당 사이트로 이미지를 제공
  • Private Registry 서버를 통해 이미지를 제공받거나 제공 가능
  • docker 이미지는 Registry/Hub 인 특정 공간에 저장되어 있고 대표적인 공간이 Docker Hub
  • Docker Hub 에서 이미지를 pull 하고 Container 를 실행하게 된다.
  • Dockerfile 을 통해서 image 를 만든다.
    - 빌드한 imageDocker Registry/Hub 에 업로드한다.
    - 또는 자신의 머신에서 Container 로 실행할 수 있다.
# 최초에는 docker.io가 default registry로 설정됨.
docker pull debian[:latest]
docker pull library/debian:10
docker pull docker.io/library/debian:10
docker pull index/docker.io/library/debian:10
docker pull nginx:latest

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

☑️ Docker 이미지 구조 확인

docker image inspect

# 생성된 이미지의 내부 구조 정보를 json 형태로 제공
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

☑️ Dockerfile 정보

docker image history
  • 여러 개의 계층 구조로 구성
    -

    	- 여러 가지 계층으로 image가 만들어졌 있음을 확인가능하다 !!

☑️ Docker Desktop 확인

docker login


✅ Docker Container

Docker Image와 Container의 관계

Docker ImageDocker Container 사이의 관계에 대해 알아보자 !

  • Image : 컨테이너에 대한 OS, Application, Library 등등의 정보를 담고 있음.
  • Container : Image를 실행한 상태. 1개의 Image로 부터 N개의 Container 를 생성할 수 있는 1:N의 관계.
  • Image 는 내가 만들고 싶은 붕어빵의 정보를 갖고 있는 틀이라면, Container 는 구워낸 붕어빵

☑️ Docker Container 명령어

Docker 컨테이너는 Running, Paused, Stopped 상태로 나뉘며, 이 상태에 따라 컨테이너의 서비스 동작이 결정됩니다.

Docker 생애 주기(LifeCycle)

  • docker run 또는 docker create 명령어를 실행하면 컨테이너가 Create 상태로 전환.
  • docker start 명령어를 실행하면 컨테이너가 Start 상태로 전환되며, 이후 Running 상태에서 동작.

☑️ Docker Container 수동 생성

//이미지 다운로드 및 확인
docker pull ubuntu:22.04
docker images

# 컨테이너 생성 (실행하지 않고 생성만)
docker create –ti --name ubuntu2204test ubuntu:22.04
docker ps –a

# 컨테이너 시작 및 연결
## 중지된 컨테이너를 실행
docker start ubuntu2204test
##실행 중인 컨테이너에 연결
docker attach ubuntu2204test

# docker run 명령어 활용
# docker run은 create, start, attach를 순차적으로 한 번에 실행
docker run -ti --name=ubuntu2204test2 ubuntu:22.04 /bin/bash
docker run -ti --name=ubuntu2204test3 ubuntu:22.04 /bin/bash
root@1cd125b32870:/#

# 터미널을 한 개 더 열고 
ps -ef | grep ubuntu2204test3
user   9710  7637  0 17:17 pts/4    00:00:00 docker run -ti --name=ubuntu2204test3 ubuntu:22.04 /bin/bash
user   9921  9377  0 17:17 pts/5    00:00:00 grep --color=auto ubuntu2204test3

  • Docker 컨테이너는 하나의 프로세스임을 알 수 있다 !!

☑️ Container 명령어 테스트

컨테이너 명령어 테스트 해보자 !

mkdir nodejsapp
cd nodejsapp
vi app.js # 테스트용 nodejs 앱
vi Dockerfile # 새로운 도커 이미지를 위한 Dockerfile


# 1.0 태그를 추가하여 node-test라는 이미지를 빌드 
docker buildx build -t node-test:1.0 . 

# 빌드 완료한 이미지 보기
docker images | grep node-test

  • Dockerfile에 있는 명령어들을 순차적으로 실행하여 Image를 만드는 과정이다.
  • 빌드 완료된 Image 확인 가능 !! -> node-test

# 1.0으로 태그 추가한 이미지의 Dockerfile history
docker image history node-test:1.0

  • tini curl 설치한 것 확인 가능
  • app.js를 복사 한 다음에 6060번 포트에서 연 것을 확인 가능

# 컨테이너 실행
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 run 자주 사용하는 옵션

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

☑️ 실행 중인 Container에 대한 정보

# 컨테이너에서 실행 중인 프로세스 조회
docker top node-test 

# 컨테이너에 매핑된 포트 조회
docker port node-test

# 컨테이너 리소스 통계 출력 (1회)
docker stats node-test --no-stream
CONTAINER ID   NAME        CPU %     MEM USAGE / LIMIT     MEM %     NET I/O        BLOCK I/O   PIDS
14c475f7ac09   node-test   0.01%     9.035MiB / 15.45GiB   0.06%     1.5kB / 518B   0B / 0B     11

# 컨테이너 리소스 통계 출력 (스트림)
docker stats node-test

# docker logs
# 표준 출력(stdout), 표준에러(stderr) 출력
docker logs node-test 
…
 

# 로그를 계속 출력
docker logs –f node-test
…
…

# 출력된 로그는 파일로 관리되기 때문에 HostOS 의 disk 를 사용
docker info | grep -i log
# docker [container] inspect
# 컨테이너 내부 확인
docker inspect node-test
#docker stop | start | pause | unpause

# 터미널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

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

☑️ Docker Container 정리

  • docker container prune
    -실행 중이 아닌 모든 컨테이너 삭제
# 중지된 컨테이너를 포함하여 모든 컨테이너 리스트
docker container ls -a

# 
docker container prune
  • docker image prune
    - 태그가 붙지 않은(dangling) 모든 이미지 삭제
# 
docker image prune

# 남아 있는 이미지 리스트 확인 – 실행 중인 컨테이너의 이미지 등
docker image ls
  • docker system prune
    - 사용하지 않는 도커 이미지, 컨테이너, 볼륨, 네트워크 등 모든 도커 리소스를 일괄적으로 삭제
docker system prune

출처 : Application Deployment using Kubernetes and Docker
Docker Image/Container
Docker Container LifeCycle
[TeamSparta]

profile
🔥💻🔥

0개의 댓글