본문 바로가기
[스파르타코딩클럽]/Docker & CICD

CI/CD와 Docker

by 진진리 2024. 3. 18.
728x90

CI/CD의 정의

  • CI(Continuous Integration, 지속적인 통합)
    • 자동화된 빌드와 자동화된 테스트 제공
    • 안정적인 코드를 빠르게 제공
  • CD(Continuous Delivery, 지속적인 서비스 제공)
  • CD(Continuous Deployment), 지속적인 배포)
    • 배포 자동화로 배포 시간을 단축하고 결과물을 빠르게 지속적으로 제공

 

과거의 배포: 폭포수 개발 방식

현대적인 개발 과정: 애자일 개발 방식

  • 특정 주기마다 개발, 테스트 및 프로덕션에 통합된 기능을 출시
  • Docker를 통해 서버를 표준화하고 같은 환경에서 테스트 및 배포 테스트를 진행하고 이 과정을 자동화
  • Docker가 테스트 뿐만 아니라 실제 배포도 담당

 

Docker 기초

Docker 사용 이유

  • 애플리케이션 개발과 배포가 편해진다.
    • 컨테이너 내부에 여러 소프트웨어를 설치해도 호스트 OS에는 영향이 없음
    • CI/CD 과정의 테스트에서 Docker를 활용
    • 같은 환경으로 구성된 컨테이너로 동작하므로 서버 상관없이 표준화된 배포를 구성 가능
  • 여러 애플리케이션의 독립성과 확장성이 높아짐
  • Docker가 가상화에서 사실상 표준의 위치

 

Docker image 이해와 구조

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

  • docker pull : Docker 이미지 내려받기
    • docker [image] pull [options] name:[tag]
  • docker image inspect : Docker 이미지 구조 확인
    • 이미지의 내부 구조 정보를 json 형태로 제공
docker image inspect nginx:latest
[
    {
        "Id": "sha256:593aee2afb642798b83a85306d2625fd7f089c0a1242c7e75a237846d80aa2a0",
        "RepoTags": [
            "nginx:latest"
        ],
        "RepoDigests": [
            "nginx@sha256:add4792d930c25dd2abf2ef9ea79de578097a1c175a16ab25814332fe33622de"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2023-10-25T01:21:47.343274012Z",
        "Container": "1e4063a23e5d6d56cbf5478ff7227b8c6940152770a0770585c3ae9480478b66",
        "ContainerConfig": {
            "Hostname": "1e4063a23e5d",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
…

 

  • docker image history : Dockerfile에 대한 정보
    • 여러 개의 계층 구조로 구성
  • docker login/logout : hub.docker.com에서 회원가입 후 실행

 

Docker Container

Docker 이미지/컨테이너 관련 명령어

 

  • Docker 생애 주기

  • docker create [이미지명] : 컨테이너를 싱행하지 않고 생성만
  • docker start [컨테이너명]
  • docker attach [컨테이너명]
  • docker run [이미지명] : create/start/attach를 순차적으로 한 번에 실행하는 것과 같음
    • -d : detached mode, 백그라운드 모드
    • -p : 호스트와 컨테이너의 포트 연결 (포워딩)
    • -v : 호스트와 컨테이너의 디렉토리를 연결 (마운트)
    • -e : 컨테이너 내에서 사용할 환경변수 설정
    • -name : 컨테이너 이름 설정
    • -rm : 프로세스 종료 시 컨테이너 자동 삭제
    • -ti : -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션
  • docker stop | start [컨테이너명] : 컨테이너 중지 및 재시작
  • docker pause | unpause [컨테이너명] : 컨테이너 일시정지 및 재시작

 

  • 실행 중인 Container에 대한 정보
# 컨테이너에서 실행 중인 프로세스 조회
docker top node-test 
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                2398                2378                0                   08:37               ?                   00:00:00            /sbin/tini -- node runapp.js
root                2421                2398                0                   08:37               ?                   00:00:00            node runapp.js

# 컨테이너에 매핑된 포트 조회
docker port node-test
8080/tcp -> 0.0.0.0:8080

# 컨테이너 리소스 통계 출력 (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



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

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

# 출력된 로그는 파일로 관리되기 때문에 HostOS 의 disk 를 사용
docker info | grep -i log


# 컨테이너 내부 확인
docker inspect node-test
[
    {
        "Id": "2ccc1b2a114495e2d0b67f84e55c9c21e79c6bfff6355ae1fc2caa5225698bba",
        "Created": "2023-10-29T08:04:36.295616146Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 1814,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2023-10-29T08:05:15.974255879Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:e4c58958181a5925816faa528ce959e487632f4cfd192f8132f71b32df2744b4",
        "ResolvConfPath": "/var/lib/docker/containers/2ccc1b2a114495e2d0b67f84e55c9c21e79c6bfff6355ae1fc2caa5225698bba/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/2ccc1b2a114495e2d0b67f84e55c9c21e79c6bfff6355ae1fc2caa5225698bba/hostname",

 

  • 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 정리 방법
    • docker container prune : 실행 중이 아닌 모든 컨테이너를 삭제
    • docker image prune : 태그가 붙지 않은(dangling) 모든 이미지 삭제
    • docker system prune : 사용하지 않는 모든 도커 리소스를 일관적으로 삭제

 

'[스파르타코딩클럽] > Docker & CICD' 카테고리의 다른 글

Docker volume  (0) 2024.03.19
Docker 모니터링&로깅  (0) 2024.03.19
Docker Compose  (1) 2024.03.19
Dockerfile  (0) 2024.03.18
Github Actions와 CI/CD  (0) 2024.03.18