Docker Container 내부에서 여러 소프트웨어를 설치해도 호스트 OS에는 영향 XCI/CD 에서 지속적인 통합(Continuous Integration) 과정의 테스트에서 Docker 를 활용Docker 가 가상화에서 사실상 표준의 위치homebrew 를 이용해서 Docker, Docker Compose 설치
brew install docker docker-compose
#docker version 확인
docker --version
#docker compose version 확인
docker-compose --version
# 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

jar 파일과 같이 실행되지 않은 OSDocker Container 서비스를 위한 이미지는 Container 런타임에 필요한 바이너리, 라이브러리 및 설정 값, 실행되는 코드 등을 포함
docker pull

Registry/Hub 인 특정 공간에 저장되어 있고 대표적인 공간이 Docker HubDocker Hub 에서 이미지를 pull 하고 Container 를 실행하게 된다.Dockerfile 을 통해서 image 를 만든다.image 를 Docker 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 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

docker image history
여러 개의 계층 구조로 구성
- 
- 여러 가지 계층으로 image가 만들어졌 있음을 확인가능하다 !!
docker login


Docker Image 와 Docker Container 사이의 관계에 대해 알아보자 !
Image : 컨테이너에 대한 OS, Application, Library 등등의 정보를 담고 있음.Container : Image를 실행한 상태. 1개의 Image로 부터 N개의 Container 를 생성할 수 있는 1:N의 관계.Image 는 내가 만들고 싶은 붕어빵의 정보를 갖고 있는 틀이라면, Container 는 구워낸 붕어빵
Docker 컨테이너는 Running, Paused, Stopped 상태로 나뉘며, 이 상태에 따라 컨테이너의 서비스 동작이 결정됩니다.

docker run 또는 docker create 명령어를 실행하면 컨테이너가 Create 상태로 전환.docker start 명령어를 실행하면 컨테이너가 Start 상태로 전환되며, 이후 Running 상태에서 동작.
//이미지 다운로드 및 확인
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

컨테이너 명령어 테스트 해보자 !
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

node-test# 1.0으로 태그 추가한 이미지의 Dockerfile history
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

-d : detached mode; 백그라운드 모드-p : 호스트와 컨테이너의 포트를 연경(포워딩)-v : 호스트와 컨테이너의 디렉토리를 연결(마운트)-e : 컨테이너 내에서 사용할 환경변수 설정-name : 컨테이너 이름 설정-rm : 프로세스 종료 시 컨테이너 자동 삭제-ti : -i 와 -t 를 통시에 사용한 것으로 터미널 입력을 위한 옵션# 컨테이너에서 실행 중인 프로세스 조회
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
| 종료 코드 | 설명 |
|---|---|
| 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 ls -a
#
docker container prune
#
docker image prune
# 남아 있는 이미지 리스트 확인 – 실행 중인 컨테이너의 이미지 등
docker image ls
docker system prune
출처 : Application Deployment using Kubernetes and Docker
Docker Image/Container
Docker Container LifeCycle
[TeamSparta]