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 |