우와한 개발자

[Docker] Docker Image 다운로드 및 Container 실행, 환경변수 적용

by 우와한개발자

1. Docker Image란?

  • Docker Image는 컨테이너를 실행하는 데 필요한 모든 것을 패키징한 읽기 전용 파일
    • 파일시스템 (File System)
    • 라이브러리 (Library)
    • 실행 가능한 파일 (Executable)
    • 환경변수 (Environment Variable)
  • 이미지 자체는 ReadOnly(읽기 전용)로 변경 불가
  • 이미지는 직접 만들 수도 있고, Docker Hub에서 가져다 쓸 수도 있음
  • Dockerfile을 이용해서 빌드/생성
  • 컨테이너(Container) : 이미지를 실제로 실행한 상태
Dockerfile ----> Docker Image ----> Docker Container
             ↑                  ↑
          (build)             (run)

 

1) 레이어(Layer) 구조

  • Docker Image는 하나의 파일이 아니라 여러 개의 레이어로 구성
  • 각 레이어는 이전 레이어로부터의 변경 사항만 저장하며, 계층 구조로 쌓임
  • 이미지를 다운로드할 때 이미지 전체를 통째로 받는 것이 아니라 필요한 레이어만 내려받음
  • 이미 다운로드한 레이어는 캐시에 저장되어 중복 다운로드를 방지함
# 예시
이미지(5GB)와 B 이미지(6GB)가 공통 레이어를 공유한다면, 
단순 합산인 11GB가 아니라 공통 레이어 5GB + 추가 레이어 1GB = 실제 6GB처럼 
저장 공간을 절약가능

 

2. Docker Image 다운로드

  • docker image pull 명령어로 Docker Hub(Docker Registry)에서 이미지 다운로드
  • 다운받을 이미지의 버전을 명시하지 않으면 자동으로 가장 최신 버전 다운로드
docker image pull nginx #docker image pull nginx:latest 와 같음
# 실행 결과
Using default tag: latest
latest: Pulling from library/nginx
c29f5b76f736: Pull complete    # ← 각 줄이 하나의 레이어
e19db8451adb: Pull complete
24ff42a0d907: Pull complete
c558df217949: Pull complete
976e8f6b25dd: Pull complete
6c78b0ba1a32: Pull complete
84cade77a831: Pull complete
Status: Downloaded newer image for nginx:latest
  • Pull complete로 표시되는 각 줄이 하나의 레이어. (nginx는 총 7개의 레이어로 구성되어 있음을 확인가능)

 

1) 이미지 목록 조회

  • docker image ls
docker image ls

# 실행 결과
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    97662d24417b   32 hours ago   192MB

 

2) 이미지 삭제

  • docker image rm 이미지명
docker image rm nginx:latest

 

3. Docker 환경 변수 (Environment Variable)

  • 도커 환경변수는 이미지를 컨테이너로 실행할 때, 애플리케이션에 필요한 설정 값을 전달하여 컨테이너의 동작을 구성하고 제어하는 데 사용

 

1) 환경변수를 사용하는 이유

  • 애플리케이션 설정 (DB 연결정보, API 키, 포트번호)
  • 보안 및 비밀 정보 관리 (SECRET 키, API 키, 비밀번호, 토큰)
  • 다양한 환경 지원 (개발과 운영에 같은 이미지 사용 가능)

 

2) 환경변수를 사용하는 방법

① Dockerfile 내부 (ENV 명령 사용)

  • 이미지 빌드 시 기본값을 고정해야 할 때 주로 사용
ENV API_KEY=my-secret-api-key

 

② 컨테이너 실행 시 (-e 옵션 사용)

  • 임시로 또는 테스트 목적으로 값을 전달할 때 주로 사용
docker run -e ORACLE_PASSWORD=oracle ...

 

③ docker-compose.yml 파일 사용

  • 여러 컨테이너를 함께 관리할 때 주로 사용
version: '3'
services:
  myapp:
    image: myapp
    environment:
      - API_KEY=my-secret-api-key

 

4. Docker Container 실행

  • 이미지를 내려받았으면 docker run 명령어로 컨테이너 실행
docker run -d --name my_container -p 8080:80 nginx

 

1) 주요 옵션

옵션 설명
-d 백그라운드(detach) 모드로 실행
--name 컨테이너 이름 지정
-p 호스트포트:컨테이너포트 포트 연결 (외부 접근용)
-e 환경변수 전달
-i 표준 입력 활성화
-t 터미널 할당
-v 볼륨 마운트
--network 네트워크 연결

 

2)실행 중인 컨테이너 확인

  • docker container ls
docker container ls

CONTAINER ID   IMAGE   COMMAND                  CREATED         STATUS        PORTS                  NAMES
09a2d2fd72d0   nginx   "/docker-entrypoint.…"   15 seconds ago  Up 12 seconds 0.0.0.0:8080->80/tcp   my_container
  • 이후 브라우저에서 http://[리눅스 IP]:8080으로 접속하면 nginx 서버 실행을 확인가능

 

5. 컨테이너로 이미지 생성

  • 컨테이너를 삭제하면 내부의 모든 데이터도 함께 사라짐.
  • 컨테이너를 운영하는 동안 변경된 데이터를 유지하고 싶다면 해당 컨테이너를 새로운 이미지로 저장가능
  • docker commit 
# 전체 흐름 

컨테이너 실행 → 내부에서 작업/변경 
	↓ 
docker commit → 이미지로 저장 
	↓ 
docker tag → dockerhub용 이름으로 변경
	↓ 
docker push → dockerhub에 업로드

 

1) 컨테이너 → 이미지 변환

  • docker commit
docker commit 컨테이너이름 새로운이미지이름

# 예시
docker commit my_container new_image

 

2) 이미지 이름 지정 및 수정

  • docker tag
  • dockerhub에 업로드하려면 “계정이름/이미지이름:태그” 형식
# 기존 이미지에 새 태그 붙이기
docker tag 원본이미지[:태그] 새이미지[:태그]

# Docker Hub 업로드용 태그 지정
docker tag 로컬이미지[:태그] DockerHub계정명/저장소명[:태그]

docker tag myapp:latest oowaa/myapp:1.0

블로그의 정보

우와한개발자 님의 블로그

우와한개발자

활동하기