카테고리 없음

스파르타 AI-8기 TIL(12/5)-docker

kimjunki-8 2024. 12. 5. 15:41
Docker
Docker는 가상화 기술 중 하나로, 운영 체제 수준에서 어플리케이션을 분리하여 실행합니다.
"컨테이너"는 독립된 실행 환경으로, 어플리케이션의 실행에 필요한 모든 것을 포함하여 어디서나 일관된 동작을 보장합니다.
Docker의 주요 역할
1. 컨테이너 생성 및 관리
어플리케이션을 실행하는 데 필요한 환경(코드, 라이브러리, OS 설정 등)을 패키지화한 컨테이너를 생성.
컨테이너는 호스트 시스템에서 분리된 독립된 실행 환경을 제공.

2. 일관성 보장
"한 번 빌드하면 어디서나 실행 가능"한 환경을 제공합니다.
개발, 테스트, 운영 환경 간의 불일치를 최소화.

3. 리소스 효율성
가상 머신(VM)과 달리 컨테이너는 전체 운영 체제를 복제하지 않으므로 가볍고 빠릅니다.

4. 배포 간소화
Docker 이미지를 통해 어플리케이션을 쉽게 공유하고 배포할 수 있습니다.
DevOps 파이프라인에서 빌드와 배포를 자동화.

이미지(Image)
 Docker 이미지(Docker Image)는 컨테이너 실행에 필요한 모든 파일, 코드, 라이브러리, 설정 등을 포함한 읽기 전용 템플릿입니다. Docker 이미지는 애플리케이션을 컨테이너화하기 위한 기반 요소로, 특정 애플리케이션 환경을 구축하고 배포하는 데 사용됩니다.
"이미지(Image)"는 Docker에서 가장 중요한 개념 중 하나이며, 컨테이너(Container)의 템플릿 역할을 합니다. 이미지는 소프트웨어 실행에 필요한 모든 것을 포함하는 고정된 파일 시스템입니다. 이를 통해 어디서나 컨테이너를 동일하게 실행할 수 있습니다. 

컨테이너와 이미지의 차이
이미지(Image):
정적인 템플릿입니다.
컨테이너를 생성하기 위한 설계도 역할.
실행 파일, 라이브러리, 설정 파일 등 실행에 필요한 모든 것을 포함.
변경 불가능(Immutable)합니다.

컨테이너(Container):
이미지를 실행한 상태입니다.
실행 중인 어플리케이션과 관련된 동적 데이터가 포함됩니다.
컨테이너는 이미지 위에서 동작하며, 변경 가능한 환경입니다.

이미지(Image)는 사실 사진처럼 보관된 어플리케이션 실행 환경의 모든 요소를 담고 있는 스냅샷입니다. 이미지 안에 무엇이 들어 있는지 한번 보겠습니다.
Docker 이미지 안에 들어 있는 것
이미지는 다음과 같은 계층(Layer)으로 구성됩니다:
1. 운영 체제(OS) 파일 시스템
어플리케이션 실행에 필요한 최소한의 운영 체제 환경.
예: Ubuntu, Alpine, CentOS 같은 베이스 이미지.
실제 운영 체제의 커널은 사용하지 않지만, 유저 공간(User Space) 도구들이 포함됩니다.
예를 들어, ubuntu 이미지는 리눅스의 기본 도구(ls, cat 등)와 라이브러리가 들어 있습니다.

2. 의존성(Dependencies)
어플리케이션 실행에 필요한 라이브러리 및 패키지.
예: Python 프로그램에서는 pip install로 설치된 패키지들.
Node.js에서는 npm install로 설치된 패키지.

3. 어플리케이션 코드
어플리케이션 실행 파일 또는 소스 코드.
예: Python의 .py 파일, JavaScript의 .js 파일, 또는 컴파일된 바이너리.

4. 환경 설정
환경 변수, 설정 파일, 실행 경로 등.
Dockerfile의 명령어(ENV, WORKDIR, COPY, ADD 등)를 통해 설정된 정보.

5. 실행 명령
어플리케이션이 컨테이너에서 실행될 때 어떤 명령을 수행할지 정의.
Dockerfile의 CMD나 ENTRYPOINT에 정의된 실행 스크립트.
예: CMD ["python", "app.py"].

이미지의 계층 구조(Layered Structure)
Docker 이미지는 여러 계층(Layer)으로 구성되며, 각 계층은 이전 계층에 덧붙여지는 방식으로 만들어집니다.
이 계층 구조 때문에 Docker 이미지는 효율적이고 빠릅니다.
베이스 이미지(Base Image): 첫 번째 계층으로 OS 환경을 제공합니다.
추가 계층: 패키지 설치, 코드 복사, 설정 등을 추가.
각 계층은 불변(Immutable)하며, 공유 가능.

이미지가 중요한 이유는 바로 이식성과 일관성 때문입니다:
모든 것이 포함됨:
코드는 물론 실행 환경(OS, 라이브러리, 설정 파일)까지 포함되어 어플리케이션이 의존하는 모든 요소가 하나의 패키지로 묶입니다.

어디서나 실행 가능:
이미지를 기반으로 생성된 컨테이너는 어떤 시스템에서든 동일하게 실행됩니다.
로컬 개발 환경, 테스트 서버, 프로덕션 환경에서 똑같이 동작.

효율성:
Docker는 계층화된 이미지 구조를 활용하여 변경된 부분만 저장하고 배포합니다.
이미지를 업데이트할 때 전체를 다시 배포하지 않고, 수정된 계층만 적용.


1. docker pull: Docker 이미지 내려받기
-hub.docker.com 에서 이미지를 제공받거나 해당 사이트로 이미지를 제공
- Private Registry 서버를 통해 이미지를 제공받거나 제공 가능
2. docker image inspect: Docker 이미지 구조 확인
3. docker image inspect: 생성된 이미지의 내부 구조 정보를 json 형태로 제공
4. docker image history: Dockerfile에 대한 정보
5. docker pull: 이미지가 계층 구조인 것을 확인
6. Docker login/logout : hub.docker.com에서 회원가입 후 실행
7. Docker Desktop 확인
docker pull ubuntu:24.04
docker images
#다운로드된 Docker 이미지를 목록으로 표시합니다.
#이 명령으로 다운로드가 제대로 되었는지 확인할 수 있습니다.

# docker create 은 실제 실행하지 않고 컨테이너 생성만
docker create –ti --name ubuntu2404test ubuntu:24.04
docker ps –a
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS    PORTS     NAMES
2ccc1b2a1144   ubuntu:24.04   "/bin/bash"   4 seconds ago   Created             ubuntu2404test

docker start ubuntu2404test
Ubuntu2404test
docker attach ubuntu2404test

# docker run 은 create/start/attach 를 순차적으로 한 번에 실행하는 것과 같음 
docker run -ti --name=ubuntu2404test2 ubuntu:24.04 /bin/bash
root@57a1a1c759b6:/#

 

이 부분은 조금 조심히 이해해야 합니다. 먼저,
1. docker pull ubuntu:24.04
이미지를 인터넷(레지스트리, 기본적으로 Docker Hub)에서 다운로드합니다.
작동 원리:
지정한 이미지와 태그(예: ubuntu:24.04)를 레지스트리에서 검색하고, 로컬에 저장합니다.
이미 로컬에 해당 이미지가 있으면 다시 다운로드하지 않습니다.
즉, 인터넷에서 먼저 다운을 받으면 저장이 되며, 다음으로

2. docker create –ti --name ubuntu2404test ubuntu:24.04
로컬에 저장된 이미지를 기반으로 컨테이너를 생성합니다.
작동 원리:
지정된 이미지가 로컬에 있으면 이를 사용해 컨테이너를 생성합니다.
지정한 이미지가 로컬에 없으면 자동으로 해당 이미지를 다운로드하려고 시도합니다.
여기서 create는 컨테이너를 생성하지만 실행하지는 않습니다.
옵션 설명:
-ti: -t는 가상 터미널을 생성하고, -i는 표준 입력을 활성화합니다.
--name ubuntu2404test: 컨테이너 이름을 ubuntu2404test로 지정합니다.
ubuntu:24.04: 이 이미지를 기반으로 컨테이너를 생성합니다

3. docker ps –a
생성된 모든 컨테이너(실행 중이거나 종료된 컨테이너 포함)를 목록으로 표시합니다.
출력 예시:

CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS    PORTS     NAMES
2ccc1b2a1144   ubuntu:24.04   "/bin/bash"   4 seconds ago   Created             ubuntu2404test
STATUS가 Created인 상태는 아직 컨테이너가 실행되지 않았다는 뜻입니다.

4. docker start ubuntu2404test
이전에 생성한 컨테이너 ubuntu2404test를 실행합니다.
컨테이너가 실행되지만 터미널 연결은 없습니다

즉, 인터넷에서 다운받은 것을 토대로, 마음대로 컨테이너를 생성할 수 있는것입니다.

클래스로 비유하자면, 클래스 자체가 이미지, 클래스를 인스턴스로 변화해서 쓰는것이 컨테이너 입니다. 즉, 겉 프레임이 이미지, 안쪽이 컨테이너 입니다.
1. docker pull ubuntu:24.04 #ubuntu 24.04라는 이미지 다운.(pull이 다운로드 하는 코드)
2. docker create –ti --name ubuntu2404test ubuntu:24.04 (ubuntu2404test라는 컨테이너 만드는 코드)
#참고로 끝에 ubuntu:24.04는 로컬에 있는 ubuntu: 24.04라는 이미지를 가져오기 때문에 이름이 같아야함)
3. docker start ubuntu2404test #start를 통해 container 실행
4. docker attach ubuntu2404test #attach를 통해 터미널 연결 마무리
5. docker ps -a를 통해 컨테이너가 실행되었는지 볼 수 있다.
6. 나가고 싶으면 exit


# docker run 은 create/start/attach 를 순차적으로 한 번에 실행하는 것과 같음 
docker run -ti --name=ubuntu2404test2 ubuntu:24.04 /bin/bash

추가 설명:
5. docker attach ubuntu2404test
실행 중인 컨테이너 ubuntu2404test에 터미널을 연결합니다.

이제 컨테이너 내부에서 명령어를 입력할 수 있습니다.

6. docker run -ti --name=ubuntu2404test2 ubuntu:24.04 /bin/bash
docker create, docker start, docker attach를 한 번에 실행하는 명령입니다.
옵션 설명:
-ti: 
터미널 연결 및 표준 입력 활성화.
--name=ubuntu2404test2: 
컨테이너 이름을 ubuntu2404test2로 지정.
ubuntu:24.04: 
이미지 기반으로 컨테이너 실행.
/bin/bash:
컨테이너 실행 시 기본 명령으로 bash 셸을 실행.

이미지가 이미 있기 때문에, 여러 컨테이너를 만들 수 있습니다.

요약하면
docker pull:
 이미지를 다운로드.
docker create: 컨테이너 생성만 수행.
docker start: 컨테이너를 실행.
docker attach: 실행 중인 컨테이너에 연결.
docker run: 위의 3가지 단계를 한 번에 처리하며 컨테이너를 실행.


 

docker run -ti --name=ubuntu2404test3 ubuntu:24.04 /bin/bash
root@1cd125b32870:/#

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

Docker 컨테이너를 실행하고, 실행 중인 프로세스를 확인하는 과정입니다.
1. docker run -ti --name=ubuntu2404test3 ubuntu:24.04 /bin/bash
docker run: 새로운 Docker 컨테이너를 생성하고 실행하는 명령입니다.
-ti: -t는 가상 터미널을 활성화하고, -i는 표준 입력을 활성화하여 컨테이너 내부에서 명령을 입력할 수 있도록 합니다.
--name=ubuntu2404test3: 컨테이너 이름을 ubuntu2404test3으로 지정합니다.
ubuntu:24.04: ubuntu:24.04 이미지를 사용하여 컨테이너를 생성합니다.
/bin/bash: 컨테이너 내부에서 Bash 셸을 실행하여, 명령어를 실행할 수 있도록 합니다.
결과: 컨테이너가 실행되며, root@1cd125b32870:/#와 같은 프롬프트가 나타납니다. 이는 컨테이너 내부에서 Bash 셸을 실행한 상태임을 의미합니다.

2. ps -ef | grep ubuntu2404test3
ps -ef: 시스템에서 실행 중인 모든 프로세스를 출력합니다. -e는 모든 프로세스를, -f는 추가적인 정보를 포함한 출력 형식을 지정합니다.
grep ubuntu2404test3: ps 명령의 출력에서 ubuntu2404test3라는 이름이 포함된 행만 필터링하여 보여줍니다.
즉, 실행 중인 ubuntu2404test3 컨테이너와 관련된 프로세스를 찾기 위해 사용합니다.


Container 명령 테스트
cd ~ 
mkdir nodejsapp #nodejsapp 디렉토리 만들기
cd nodejsapp #nodejsapp 디렉토리 들어가기
vi app.js # 테스트용 nodejs 앱 
# vi app.js라고 치고 그 안에 app.js 메모장에 적어둔 코드 넣기
# esc 누르고 : 을 누른다른 wq를 눌러서 저장
vi Dockerfile # 새로운 도커 이미지를 위한 Dockerfile
# 같은 방식
ll 눌러서 확인

drwxr-xr-x 2 kevinkim kevinkim 4096 Dec  5 11:36 ./
drwxr-x--- 6 kevinkim kevinkim 4096 Dec  5 11:36 ../
-rw-r--r-- 1 kevinkim kevinkim  296 Dec  5 11:30 app.js
-rw-r--r-- 1 kevinkim kevinkim  147 Dec  5 11:36 dockerfile

이렇게 두개의 파일이 생성된 것을 확인할 수 있다.

docker buildx build -t node-test:1.0 . #Docker 이미지를 빌드하는 역할을 합니다. 
#이를 통해 애플리케이션을 실행하는 데 필요한 환경을 캡슐화한 Docker 이미지를 생성할 수 있습니다.

docker images | grep node-test  # 빌드 완료한 이미지 보기
node-test    1.0       825f1d184101   2 minutes ago   199MB라고 뜬다

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

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
#나머지는 전부 실행 코드

이 코드는 Node.js 애플리케이션을 위한 준비 과정입니다. 각 단계의 흐름과 역할을 하나씩 설명하겠습니다.
1. 디렉토리 생성 및 이동

cd ~
mkdir nodejsapp
cd nodejsapp

cd ~:
현재 작업 디렉토리를 홈 디렉토리(~)로 변경합니다.

mkdir nodejsapp:
nodejsapp라는 이름의 디렉토리를 생성합니다.
이 디렉토리는 Node.js 애플리케이션 파일을 저장할 공간입니다.

cd nodejsapp:
생성한 디렉토리로 이동합니다.

2. Node.js 앱 파일 작성

vi app.js

vi app.js:
vi 편집기를 열어 app.js라는 파일을 생성하거나 엽니다.
이 파일은 Node.js 애플리케이션 코드가 들어갈 곳입니다.
작업 방법:
vi 편집기에 들어가면 텍스트를 입력할 수 있는 상태가 아닙니다.
i를 눌러 삽입 모드로 전환 후 코드를 입력합니다.

저장 방법:
ESC를 눌러 명령 모드로 전환.
:wq를 입력 후 Enter를 눌러 파일을 저장하고 종료.

3. Dockerfile 작성

vi Dockerfile

vi Dockerfile:
Dockerfile은 Docker 이미지를 정의하는 파일입니다.
이 파일에는 새 컨테이너 이미지를 생성하기 위한 명령어가 포함됩니다.

4. 작성한 파일 확인

ll

ll: 현재 디렉토리의 파일 목록을 상세히 출력합니다.
예시:

total 8
-rw-r--r-- 1 user user  130 Dec  5 12:00 Dockerfile
-rw-r--r-- 1 user user  200 Dec  5 12:00 app.js


5. Docker 이미지 빌드

docker buildx build -t node-test:1.0 .

docker: Docker 명령어를 실행하는 클라이언트입니다.
buildx: Docker의 buildx는 확장된 빌드 기능을 제공하는 명령어입니다. 기본 docker build와 비슷하지만 멀티플랫폼 빌드나 기타 고급 빌드 옵션을 사용할 수 있습니다.
build: 이미지를 빌드하겠다는 명령입니다.
-t node-test:1.0: 생성될 Docker 이미지에 태그를 붙입니다. node-test는 이미지의 이름이고, 1.0은 그 버전입니다. 즉, 생성될 이미지의 이름과 태그를 설정합니다.
.: 빌드 컨텍스트를 지정합니다. 여기서는 현재 디렉터리(.)를 빌드 컨텍스트로 사용하고 있습니다. Docker는 이 디렉터리 내의 Dockerfile을 사용하여 이미지를 빌드합니다.(.은 현재 디렉토리를 나타내며, 현재 디렉토리의 Dockerfile을 사용하여 이미지를 빌드한다는 의미입니다.)

이렇게 치면
이미지 이름: node-test
node-test는 빌드된 Docker 이미지의 이름입니다. 이 이름은 사용자가 지정한 것으로, 해당 이미지를 구별하는 데 사용됩니다. 예를 들어, 다른 프로젝트에서 사용하는 이미지를 my-app이라는 이름으로 지정할 수 있습니다.

태그: 1.0
1.0은 해당 이미지의 버전 또는 태그입니다. 이 태그는 이미지의 특정 버전을 구분하는 데 사용됩니다. 예를 들어, latest, v1.0, dev, stable 등으로 지정할 수 있습니다. 태그를 사용하면 이미지의 다양한 버전을 관리할 수 있습니다.

6. 빌드한 이미지 확인

docker images | grep node-test

docker images: 시스템에 있는 모든 Docker 이미지를 나열합니다.
| grep node-test: grep은 결과 중에서 node-test라는 이름을 포함한 이미지만 필터링해서 출력합니다. 이를 통해 빌드한 이미지가 제대로 생성되었는지 확인할 수 있습니다.

7. 이미지의 Dockerfile 히스토리 보기

docker image history node-test:1.0

docker image history: 지정한 이미지의 역사(히스토리)를 보여주는 명령입니다. 이 명령어는 이미지가 어떻게 생성되었는지, 어떤 명령이 실행되었는지, 각 단계에서 발생한 레이어 등을 확인할 수 있습니다.
node-test:1.0: node-test:1.0 이미지를 대상으로 히스토리를 조회합니다.

8. 컨테이너 실행 

docker run -itd -p 6060:6060 --name=node-test -h node-test node-test:1.0

docker run: 새로운 Docker 컨테이너를 생성하고 실행하는 명령입니다.
-itd:
-i: 컨테이너의 표준 입력을 활성화하여 상호작용할 수 있게 합니다.
-t: 가상 터미널을 활성화하여 터미널 세션을 사용할 수 있게 합니다.
-d: "detached" 모드로 실행, 즉 백그라운드에서 실행되도록 합니다.
-p 6060:6060: 호스트의 6060 포트를 컨테이너의 6060 포트에 연결합니다. 외부에서 localhost:6060으로 접근할 수 있게 만듭니다.
--name=node-test: 컨테이너의 이름을 node-test로 지정합니다.
-h node-test: 컨테이너의 호스트명을 node-test로 설정합니다.
node-test:1.0: 빌드한 node-test:1.0 이미지를 사용하여 컨테이너를 생성하고 실행합니다.
이 명령어는 node-test:1.0 이미지를 사용하여 컨테이너를 실행하고, 포트 6060을 열어 클라이언트가 접근할 수 있게 합니다.

여기서 중요한 점은 docker buildx build와 docker pull은 모두 Docker 이미지와 관련된 명령어지만, 그 목적과 동작 방식은 다릅니다. 각 명령어의 차이를 설명하겠습니다:
docker buildx build
이미지를 "빌드"하는 명령어입니다.
주로 Dockerfile을 기반으로 새로운 이미지를 생성하는 데 사용됩니다. 즉, 로컬 파일 시스템에 있는 Dockerfile을 사용하여 이미지를 빌드하는 작업입니다.
예를 들어, docker buildx build -t node-test:1.0 . 명령어는 현재 디렉토리의 Dockerfile을 읽고, 그에 따라 새로운 이미지를 생성합니다. 빌드 과정에서 애플리케이션의 코드, 설정, 라이브러리 등을 포함하여 이미지를 만들 수 있습니다.
장점: 자신만의 애플리케이션을 포함하는 커스터마이즈된 이미지를 만들 수 있습니다.
예시: 자신만의 Node.js 애플리케이션을 포함하는 이미지를 빌드하거나, 특정 환경에 맞는 이미지를 만들 때 사용됩니다.

docker pull
이미지를 "다운로드"하는 명령어입니다.
Docker Hub나 다른 이미지 레지스트리에서 이미 빌드된 이미지를 가져오는 작업입니다.
예를 들어, docker pull node:14 명령어는 Docker Hub에서 node:14라는 태그가 붙은 이미지를 로컬 머신으로 다운로드합니다. 이미지는 공식적으로 제공된 이미지일 수도 있고, 다른 사람이 미리 빌드하여 레지스트리에 업로드한 이미지일 수도 있습니다.
장점: 이미 검증되고 설정된 이미지를 빠르게 가져와 사용할 수 있습니다.
예시: Node.js 공식 이미지를 가져와서 개발 환경을 설정하거나, 이미 빌드된 서버 이미지를 사용하는 경우.

핵심 차이점:
docker buildx build는 새로운 이미지를 빌드하는 명령어로, Dockerfile을 사용하여 자신만의 이미지를 만들 때 사용됩니다.
docker pull은 이미 만들어진 이미지를 다운로드하는 명령어로, 다른 사람이 이미 빌드한 이미지를 사용할 때 사용됩니다.


Dockerfile이 로컬 파일 시스템에 없다면?
Dockerfile이 로컬 파일 시스템에 없다면, docker buildx build 명령어는 실패하게 됩니다. Dockerfile은 이미지를 빌드하는 데 필요한 설계도(Instruction Set) 를 제공하는 중요한 파일이기 때문에, 빌드를 실행하려면 반드시 해당 파일이 있어야 합니다.
만약 Dockerfile이 없다면, Dockerfile을 직접 작성해야 합니다. 예를 들어, Node.js 애플리케이션을 위한 Dockerfile입니다.

Dockerfile이라는 이름을 반드시 사용해야 하는 건 아닙니다. 사용자가 원하는 다른 이름으로 Dockerfile을 지정할 수 있습니다.
기본적으로 Docker는 Dockerfile이라는 이름을 기대하지만, 다른 이름을 사용할 경우 -f 옵션을 통해 이름을 명시해야 합니다.
예시:
docker buildx build -t my-app:latest -f CustomDockerfile .
이 명령어는 CustomDockerfile이라는 파일을 사용하여 이미지를 빌드합니다.
-f 옵션 뒤에 사용자가 지정한 파일 이름을 넣어주면 됩니다.

 Docker에서 태그(tag)란
 Docker에서 태그(tag)는 이미지를 구별하고 관리하는 데 중요한 역할을 합니다. 태그를 사용하면 여러 버전의 이미지를 구분할 수 있어, 특정 버전의 이미지를 쉽게 참조하거나 사용할 수 있습니다.
버전 관리: 태그는 이미지를 버전별로 구별하는 데 사용됩니다. 예를 들어, node-test:1.0과 node-test:2.0은 서로 다른 버전의 이미지를 나타낼 수 있습니다. 이처럼 태그를 사용하면 이미지의 변경 사항이나 버전 차이를 명확하게 관리할 수 있습니다.

이미지 구분: 같은 이름을 가진 여러 이미지를 관리할 수 있게 해줍니다. 예를 들어, node-test:1.0은 개발용 이미지를, node-test:latest는 최신 버전 이미지를 나타낼 수 있습니다. 이렇게 하면 특정 태그를 사용해 원하는 버전의 이미지를 쉽게 선택할 수 있습니다.

이미지 배포 및 공유: 태그는 이미지를 다른 사람과 공유하거나, Docker Hub 같은 레지스트리에 푸시(push)할 때 유용합니다. 예를 들어, node-test:1.0이라는 태그로 이미지를 푸시하면, 해당 버전의 이미지를 다른 사람이 가져가 사용할 수 있습니다.

명확한 참조: 태그는 이미지의 내용을 설명하는데도 유용합니다. 예를 들어, 특정 환경이나 요구 사항에 맞춘 이미지에 대해 node-test:production, node-test:dev와 같이 태그를 붙여서 각 환경에서 필요한 이미지를 명확하게 구분할 수 있습니다.


참고로

이미지 이름 (node-test): 이미지의 이름은 사용자가 원하는 대로 설정할 수 있습니다. 예를 들어, my-app, my-node-app, frontend 등 다른 이름을 사용할 수 있습니다.

태그 (1.0): 태그도 사용자가 자유롭게 설정할 수 있습니다. 1.0, latest, dev, v1.0, stable 등 어떤 문자열도 사용할 수 있습니다. 일반적으로 태그는 이미지의 버전, 환경, 기능 등을 나타내는 데 사용됩니다.

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

1. -d: Detached Mode
설명: 컨테이너를 백그라운드에서 실행합니다.
기본적으로 docker run은 포그라운드 모드에서 실행되며, 터미널이 컨테이너 출력에 연결됩니다.
-d를 사용하면 컨테이너가 백그라운드에서 실행되고, 터미널은 컨테이너와 분리됩니다.
docker run -d nginx

설명:
1. Nginx 웹 서버를 백그라운드에서 실행.
활용: 지속적으로 실행되는 서비스 컨테이너(Nginx, Redis 등)에서 주로 사용.

2. -p: Port Mapping
설명: 호스트의 포트와 컨테이너 내부의 포트를 연결합니다.

형식: -p [호스트 포트]:[컨테이너 포트]
외부에서 컨테이너의 서비스에 접근할 수 있도록 포트를 열어줍니다.

docker run -d -p 8080:80 nginx

설명: 
1. 호스트의 8080 포트를 컨테이너의 80 포트와 연결.
2. 호스트의 http://localhost:8080에서 Nginx 서버에 접근 가능.
활용: 웹 서버, API 서버 등의 네트워크 기반 서비스에서 사용.

3. -v: Volume Mounting
설명: 호스트 디렉토리와 컨테이너 디렉토리를 연결(마운트)합니다.
형식: -v [호스트 경로]:[컨테이너 경로]
데이터를 지속적으로 저장하거나, 로컬 파일을 컨테이너에서 사용할 때 유용.

docker run -d -v /my/local/data:/data nginx

설명:
호스트의 /my/local/data 디렉토리를 컨테이너의 /data 디렉토리에 연결.
컨테이너에서 생성된 파일이 호스트에도 저장됩니다.

4. -e: Environment Variables
설명: 컨테이너 내에서 사용할 환경 변수를 설정합니다.
형식: -e [KEY]=[VALUE]
환경변수는 애플리케이션 설정, API 키, 사용자 인증 등의 정보를 전달하는 데 사용됩니다.

docker run -d -e ENV=production my-app

설명:
환경 변수 ENV를 production으로 설정.
활용: 애플리케이션의 환경별 설정(개발, 테스트, 프로덕션 등), 비밀 키 전달.

5. --name: Container Name
설명: 컨테이너 이름을 지정합니다.
기본적으로 Docker는 임의의 이름을 생성합니다.
--name 옵션을 사용하면 이름을 명시적으로 설정하여 컨테이너를 쉽게 관리할 수 있습니다.

docker run -d --name my-nginx nginx

설명:
my-nginx라는 이름으로 Nginx 컨테이너 실행.

활용: 컨테이너를 관리하거나 특정 컨테이너에 명령어를 실행할 때 유용:

docker stop my-nginx
docker logs my-nginx


6. --rm: Auto Remove
설명: 컨테이너가 종료되면 자동으로 삭제합니다.
일반적으로 일회성 작업에 사용됩니다.
컨테이너를 종료한 후 남는 불필요한 컨테이너를 방지.

docker run --rm ubuntu echo "Hello, World!"

설명:
"Hello, World!" 메시지를 출력한 후 컨테이너 자동 삭제.
활용: 단발성 작업(테스트 스크립트 실행, 데이터 처리 등)에서 사용.

7. -ti: Interactive Terminal
설명: -i와 -t를 함께 사용하여 터미널 입력을 활성화합니다.
-i: 표준 입력을 활성화 (입력 가능).
-t: 터미널 세션을 에뮬레이트.

docker run -ti ubuntu bash

설명:
Ubuntu 컨테이너에서 bash 셸을 실행하고 터미널로 연결.
활용: 컨테이너 내부에서 작업을 수행하거나 디버깅할 때 유용.


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

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

# 컨테이너 리소스 통계 출력 (1회)
docker stats node-test --no-stream

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

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에서 컨테이너의 상태를 확인하고 제어하는 데 사용됩니다.
1. docker stats
현재 실행 중인 모든 컨테이너의 실시간 리소스 사용량(CPU, 메모리, 네트워크, 디스크 사용량 등)을 보여주는 명령어입니다.

2. docker events
Docker 데몬에서 발생하는 이벤트를 실시간으로 스트리밍하는 명령어입니다. 컨테이너 시작, 중지, 상태 변경 등과 같은 다양한 이벤트를 확인할 수 있습니다.
여기서 Docker 데몬이란, Docker의 중앙 처리 유닛으로, Docker의 주요 작업을 백그라운드에서 처리하는 프로그램입니다. Docker 데몬은 시스템에서 실행되고 있으며, Docker CLI나 Docker API와 통신하여 다양한 Docker 명령을 처리하고, 컨테이너의 생성, 실행, 관리 등을 담당합니다.

3. docker stop node-test
실행 중인 node-test라는 이름의 컨테이너를 중지합니다.

4. docker ps -a
목적: Docker에서 실행 중인 모든 컨테이너와 중지된 컨테이너까지 포함하여 모든 컨테이너의 목록을 표시합니다.

5. docker start node-test
중지된 node-test라는 이름의 컨테이너를 다시 시작합니다.

6. docker pause node-test
실행 중인 node-test라는 컨테이너를 일시 중지합니다. 컨테이너의 모든 프로세스를 멈추고, 리소스를 해제하지 않고 보류 상태로 전환됩니다.

7. docker unpause node-test
docker pause로 일시 중지된 컨테이너를 다시 실행합니다. node-test 컨테이너를 다시 활성화합니다.

총 정리:
docker stats: 실시간 리소스 사용량 확인
docker events: Docker 이벤트 실시간 스트리밍
docker stop: 컨테이너 중지
docker ps -a: 모든 컨테이너 상태 보기
docker start: 중지된 컨테이너 시작
docker pause: 컨테이너 일시 중지
docker unpause: 중지된 컨테이너 재개

Docker Container를 정리하는 방법
docker container prune
- 실행 중이 아닌 모든 컨테이너를 삭제
docker image prune
- 태그가 붙지 않은(dangling) 모든 이미지 삭제
docker system prune
- 사용하지 않는 도커 이미지, 컨테이너, 볼륨, 네트워크 등 모든 도커 리소스를 일괄적으로 삭제

 

여기까지