포스트

Docker #4 - docker 핵심 명령어 모음(inspect, cp, --name, tag)

도커 이미지/컨테이너를 더 똑똑하게 다루기 위한 핵심 명령어 정리.

Docker #4 - docker 핵심 명령어 모음(inspect, cp, --name, tag)

도커 이미지 정보 출력 (docker image inspect)

docker image inspect는 이미지의 모든 설정과 메타데이터를 JSON으로 보여준다. 한마디로, 이 이미지가 어떻게 만들어졌고 어떤 환경에서 실행될지를 통째로 펼쳐보는 기능이다.

  • 왜 필요한가
    • 환경 확인: 어떤 포트를 노출하는지, 기본 실행 명령(Entrypoint/Cmd)은 무엇인지, 기본 환경 변수는 무엇인지 즉시 확인 가능.
    • 구조 파악: 이미지의 기반 OS, 레이어(Layers) 구성 등을 통해 Dockerfile 빌드 히스토리를 추적.
    • 최적화 힌트: 어떤 레이어가 많이 변하는지 확인해 캐시 전략을 조정.
1
2
# 특정 이미지(이름 또는 ID)의 상세 정보
docker image inspect a1b2c3d4e5f6

예시 일부 출력은 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
  "Config": {
    "ExposedPorts": { "80/tcp": {} },
    "Env": [ "PATH=/usr/local/sbin:..." ],
    "Entrypoint": [ "node", "server.js" ]
  },
  "Os": "linux",
  "RootFS": {
    "Type": "layers",
    "Layers": [
      "sha256:c921e0fe2...",
      "sha256:1a42bde9c..."
    ]
  }
}

컨테이너와 파일 교환 (docker cp)

docker cp는 실행 중인 컨테이너와 호스트 간에 파일/폴더를 복사하는 명령어이다. 컨테이너 내부를 들여다보거나 임시로 무언가를 넣고 싶을 때 유용하다.

  • 왜 필요한가
    • 로그/산출물 추출: 컨테이너 내부에서 생성된 로그나 결과물을 빠르게 로컬로 가져옴.
    • 임시 설정 주입: 디버깅 목적으로 설정 파일을 잠시 넣어 테스트.

중요한 점은, 애플리케이션 코드를 수정하고 이를 docker cp로 컨테이너에 덮어쓰는 방식은 권장되지 않는다. 변경 이력이 남지 않고 상태 일관성이 깨질 수 있다. 코드를 바꿨다면 이미지를 다시 빌드하고 컨테이너를 재생성하는 것이 정석이다.

1
2
3
4
5
6
7
8
9
10
11
# 로컬 → 컨테이너로 복사
docker cp [로컬 경로] [컨테이너 이름]:[컨테이너 내부 경로]

# 예) 내 컴퓨터의 dummy 폴더를 /app 아래로 복사
docker cp ./dummy my_container:/app

# 컨테이너 → 로컬로 복사
docker cp [컨테이너 이름]:[컨테이너 내부 경로] [로컬 경로]

# 예) 컨테이너의 /app/logs 폴더를 현재 폴더(.)로 복사
docker cp my_container:/app/logs .

컨테이너에 이름표 달기 (–name)

docker run --name [원하는 이름]을 쓰면 무작위 이름 대신 사람이 이해하기 쉬운 이름을 붙일 수 있다.

  • 왜 필요한가
    • docker stop, restart, rm 작업 때마다 긴 컨테이너 ID를 복사/붙여넣기 할 필요가 없다.
    • 팀에서 공통된 네이밍을 쓰면 목적과 역할이 한눈에 보인다.
1
2
3
4
5
# 'goals-app'이라는 이름으로 컨테이너 실행
docker run -p 3000:80 -d --rm --name goals-app my-image:latest

# 이제 이름으로 바로 제어 가능
docker stop goals-app

이미지 태깅 (name:tag)

docker build -t [이름]:[태그] . 형식으로 이미지에 의미 있는 이름과 버전을 붙일 수 있다. 긴 이미지 ID 대신 사람이 읽기 쉬운 주소를 부여하는 셈이다.

  • 왜 필요한가
    • 버전 관리: goals:latest, goals:1.0, goals:2.0-beta처럼 동일 앱의 여러 버전을 명확히 구분.
    • 가독성/협업: node:14, my-app:latest처럼 직관적인 참조가 가능해 명령이 읽기 쉬워짐.
    • 레지스트리 연동: Docker Hub 등 레지스트리에 올리고 내릴 때 이름:태그가 주소 역할.
1
2
3
4
5
6
7
8
# 빌드 시 이름과 태그 부여
docker build -t goals:latest .

# 이름:태그로 컨테이너 실행
docker run --name goals-app goals:latest

# 이미 빌드된 이미지를 다른 태그로 추가 태깅
docker tag goals:latest goals:1.0
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.