# 2. docker-cli

Docker CLI를 정리한다.

## Docker CLI 정리

* docker pull \[OPTIONS] NAME\[:TAG|@DIGEST]
  * -a, --all-tags: 이미지의 모든 태그 다운로드
  * \--disable-content-trust: 이미지의 content trust 비활성화
  * \--platform: 특정 플랫폼의 이미지 다운로드
  * docker pull ubuntu
  * docker pull ubuntu:20.04
  * docker pull --platform linux/arm64 ubuntu
* docker images
* docker rmi \[image id or name]
* docker build \[OPTIONS] PATH | URL | -
  * -f, --file: 사용할 Dockerfile의 경로 지정. 기본적으로 현재 디렉토리의 Dockerfile 사용
  * \--build-arg: 빌드 시에 사용할 빌드 인수 설정
  * -t, --tag: 생성할 이미지에 태그 지정(<이미지\_이름>:<태그> 형식으로 지정)
  * \--target: 멀티스테이지 빌드에서 목표 빌드 스테이지 지정
  * \--network: 빌드 컨텍스트를 가져오는 데 사용되는 네트워크 지정
  * \--compress: 빌드 컨텍스트를 전송할 때 압축 사용
  * \--progress: 빌드 진행 상황을 표시하는 방법 지정
  * \--no-cache: 캐시를 사용하지 않고 빌드를 진행
  * \--pull: 빌드 전에 베이스 이미지를 항상 업데이트
  * docker build -t node-local:0.1 -f ./docker/Dockerfile.local .
* docker run \[OPTIONS] IMAGE \[COMMAND] \[ARG...]
  * -d, --detach: 컨테이너 백그라운드 실행
  * \--name: 컨테이너 이름 지정
  * -p, --publish: 호스트와 컨테이너 간 포트 매핑 설정(포트포워딩)
  * -v, --volume: 호스트와 컨테이너 간 볼륨 마운트
  * -e, --env: 환경 변수 설정
  * \--network: 컨테이너 특정 네트워크에 연결
  * \--rm: 컨테이너가 종료되면 자동으로 삭제
  * -it: 대화형 터미널 사용하여 컨테이너를 실행
  * \--restart: 컨테이너 재시작 정책 설정
  * \--privileged: 컨테이너에 모든 권한 부여
  * docker run -it --name backend-local -p 3000:3000 node-local:0.1
  * docker run -d --name api-local -p 3000:3000 node-local
* docker rm \[container id or name]
* docker start \[container id or name]
* docker stop \[container id or name]
* docker ps
* docker ps -a
* docker ps -q
* docker ps -a -q
* docker exec \[OPTIONS] CONTAINER COMMAND \[ARG...]
  * -d, --detach: 명령을 백그라운드에서 실행
  * -i, --interactive: 명령의 표준 입력 연결
  * -t, --tty: 의사 TTY를 할당하고, 명령을 상호작용적으로 실행할 수 있도록
  * \--user: 명령을 실행할 사용자 지정
  * \--privileged: 컨테이너를 특권 모드로 실행
  * \--workdir: 명령을 실행할 작업 디렉토리 지정
  * docker exec -it my-container bash
  * docker exec -d my-container ls -l
  * docker exec --user myuser my-container whoami
  * docker exec --workdir /app my-container ls -l
  * docker exec -it node-local bash
  * docker exec -it node-local /bin/sh
* docker network ls
* docker network create my-network
* docker network inspect my-network
* docker network rm my-network
* docker image prune: 사용하지 않는 이미지 삭제
* docker container prune: 사용하지 않는 컨테이너 삭제
* docker volume prune: 사용하지 않는 볼륨 삭제
* docker network prune: 사용하지 않는 네트워크 삭제
* docker system prune: 사용하지 않는 이미지, 볼륨, 네트워크 및 컨테이너 삭제
* docker system prune -a: 모든 이미지와 중단된 컨테이너까지 모두 삭제
* docker system prune -f: 강제로 모두 삭제
* docker system prune --volume: 사용하지 않는 볼륨 삭제

***

### docker pull - 도커 이미지 pull

```shell
docker pull [OPTIONS] NAME[:TAG|@DIGEST]

-a, --all-tags: 이미지의 모든 태그를 다운로드합니다.
--disable-content-trust: 이미지의 content trust를 비활성화합니다.
--platform: 특정 플랫폼의 이미지를 다운로드합니다.

docker pull ubuntu
docker pull ubuntu:20.04
docker pull --platform linux/arm64 ubuntu
```

### docker images: 도커 이미지 리스트

```shell
docker images
```

### docker build - 도커 이미지 생성

```shell
docker build [OPTIONS] PATH | URL | -

-f, --file:
  - 사용할 Dockerfile의 경로를 지정. 기본적으로 현재 디렉토리에 있는 Dockerfil 사용

--build-arg: 빌드 시에 사용할 빌드 인수를 설정

-t, --tag: 생성되는 이미지에 태그를 지정(<이미지_이름>:<태그> 형식으로 지정)

--target: 멀티스테이지 빌드에서 목표 빌드 스테이지를 지정

--network: 빌드 컨텍스트를 가져오는 데 사용되는 네트워크를 지정

--compress: 빌드 컨텍스트를 전송할 때 압축 사용

--progress: 빌드 진행 상황을 표시하는 방법 지정

--no-cache: 캐시를 사용하지 않고 빌드를 진행

--pull: 빌드 전에 베이스 이미지를 항상 업데이트

docker build -t node-local:0.1 -f ./docker/Dockerfile.local .
```

### docker rmi: 도커 이미지 삭제(컨테이너 중지 상태에서)

```shell
docker rmi <image id or name>
```

## Docker container

### docker run: 컨테이너 생성 및 실행

```shell
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

-d, --detach: 컨테이너 백그라운드 실행
--name: 컨테이너 이름 지정
-p, --publish: 호스트와 컨테이너 간 포트 매핑을 설정(포트포워딩)
-v, --volume: 호스트와 컨테이너 간 볼륨 마운트
-e, --env: 환경 변수 설정
--network: 컨테이너 특정 네트워크에 연결
--rm: 컨테이너가 종료되면 자동으로 삭제
-it: 대화형 터미널 사용하여 컨테이너를 실행
--restart: 컨테이너 재시작 정책 설정
--privileged: 컨테이너에 모든 권한 부여

docker run -it --name backend-local -p 3000:3000 node-local:0.1
docker run -d --name api-local -p 3000:3000 node-local
```

### docker rm: 컨테이너 삭제

```shell
docker rm <container id or name>
```

### docker 컨테이너 실행/중지

```shell
docker start <container id or name>
docker stop <container id or name>
```

### docker 컨테이너 리스트 확인

```shell
docker ps
docker ps -a
docker ps -q
docker ps -a -q
```

### docker exec: 실행 중인 컨테이너 내부에서 추가적인 작업 또는 디버깅

```shell
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

-d, --detach: 명령을 백그라운드에서 실행
-i, --interactive: 명령의 표준 입력을 연결
-t, --tty: 의사 TTY를 할당하고, 명령을 상호작용적으로 실행할 수 있도록
--user: 명령을 실행할 사용자를 지정
--privileged: 컨테이너를 특권 모드로 실행
--workdir: 명령을 실행할 작업 디렉토리를 지정

# 컨테이너 내부에서 Bash 셸 실행하기
docker exec -it my-container bash

# 백그라운드에서 명령 실행하기
docker exec -d my-container ls -l

# 특정 사용자로 명령 실행하기
docker exec --user myuser my-container whoami

# 특정 작업 디렉토리에서 명령 실행하기
docker exec --workdir /app my-container ls -l

# 자주 사용하는 명령어
docker exec -it node-local bash
docker exec -it node-local /bin/sh
```

## Docker network

```shell
docker network ls
docker network create my-network
docker network inspect my-network
docker networkd rm my-network
```

## Docker \[image/container/volume/network] prune

사용하지 않는 리소스를 정리하는 명령어

* docker system prune: 도커 시스템 전체 정리
  * docker system prune -a
  * docker system prune -f
  * docker system prune --volumes
* docker container prune
* docker image prune
* docker volume prune
* docker network prune

## docker top \[container id or name]

컨테이너에서 실행되고 있는 프로세스 리스트를 출력

## docker ps 의 옵션들

* -a: 종료된 컨테이너도 포함하여 모든 컨테이너를 표시
* -f, --filter:
  * 지정된 조건에 맞는 컨테이너만 표시
  * 예를 들어, --filter "status=running"은 실행 중인 컨테이너만 표시
* \--format
  * 출력 형식 지정
  * 특정 필드를 사용하여 사용자 정의 형식을 지정
* -n, --last n: 최근에 생성된 N개의 컨테이너만 표시
* \--no-trunc: 컨테이너 ID를 자르지 않고 전체 길이로 표시
* -q, --quiet: 컨테이너 ID만 표시
* -s, --size: 컨테이너의 사용 중인 디스크 공간 크기를 표시
* \--help: 도움말 표시
