Docker & Kubernetes
-
[Docker] commit & save 반영되지 않을 때 (volume) 2025.05.30 -
[Docker] 서버에 Dockerfile 생성 후 배포 2023.06.01
-
[Docker] 윈도우10 docker 설치, 윈도우에서 리눅스 사용하기 2023.01.19
[Docker] commit & save 반영되지 않을 때 (volume)
개발 환경에서 호스트 경로에 소스 코드를 두고 컨테이너 볼륨으로 지정했다.
컨테이너를 올린 후 코드 수정을 해서
commit하고 save하고 load했더니 수정된 코드가 반영이 안됐다.
= 볼륨 데이터는 commit에 포함되지 않음!
Docker 컨테이너의 파일 시스템 구조

▶︎ 이미지 레이어
여러 개의 읽기 전용 레이어들이 쌓여 있는 구조
각각의 레이어는 Dockerfile의 명령어 (FROM, RUN, COPY 등)를 실행하면서 만들어짐
컨테이너를 만들면 이 이미지 위에 쓰기 가능한 컨테이너 레이어가 하나 얹혀짐
▶︎ 컨테이너 레이어
컨테이너 실행 중에 생기는 수정, 생성, 삭제된 모든 파일/디렉터리가 저장됨
단, 마운트된 경로는 제외!
> 해당 경로는 애초에 호스트 외부를 바라보도록 리디렉션되어 있음
그래서 볼륨 데이터는 이미지에도 컨테이너 레이어에도 없음
docker commit
docker commit은 컨테이너 레이어(=컨테이너 자체의 파일 시스템)만 저장
따라서 마운트된 경로는 커밋 대상이 아님
마운트된 데이터도 포함시키려면?
docker commit으로는 불가능
1. 마운트 경로 → 임시 경로 → commit → 복원
[전제 조건]
# 호스트 경로: /myproject
# 마운트: /myproject ↔ 컨테이너 내 /app/core
docker run -v /myproject:/app/core -it ubuntu bash
[1] 최초 컨테이너 /app/core → (호스트에 마운트됨)
/app/temp → (비어 있음, commit 반영을 위해 임시 폴더 만들기)
[2] 파일 수정
/app/core/main.py ← 수정됨 (호스트에 반영됨)
[3] /app/temp에 복사
/app/temp/main.py ← 복사됨 (컨테이너 내부에 존재)
[4] docker commit → temp만 이미지에 포함됨
[5] 새 컨테이너 실행 후 복원 cp /app/temp/* /app/core/
2. Dockerfile에서 COPY를 통한 이미지 재생성
FROM ubuntu
COPY ./core /app/core
'Docker & Kubernetes > [Docker]' 카테고리의 다른 글
| [Docker] 서버에 Dockerfile 생성 후 배포 (0) | 2023.06.01 |
|---|
[Docker] 서버에 Dockerfile 생성 후 배포
서버 OS 확인
vi /etc/os-release
NAME = "CentOS Linux"
VERSION = "7 (Core)"
Dockerfile
이미지를 만드는 역할
이후 docker run 명령어를 통해 컨테이너로 실행해야 함
1. FROM
FROM 토대가 되는 이미지 지정
서버의 운영 체제와 서버 내에서 실행되는 컨테이너의 운영 체제는 독립적으로 선택할 수 있다.
즉, 서버의 운영 체제가 CentOS7이더라도, 서버 내에서 CentOS8 또는 다른 운영 체제의 컨테이너를 실행할 수 있다.
컨테이너가 자체 파일 시스템, 라이브러리 및 리소스를 가지고 있으므로 서버의 OS와 별도로 관리될 수 있음을 의미한다.
= 서버 OS와 컨테이너 OS 간에 호환성 문제 발생 X
일반적으로는 컨테이너 이미지가 호스트 서버와 유사한 환경을 갖도록 하기위해
서버 OS와 동일하게 설정함
또는 목적에 따라 사용하고자 하는 base 이미지를 사용하면 됨
(ex_ CentOS 서버에서 Python 사용시 CentOS base 이미지를 사용하지 않고 직접 파이썬 이미지 사용 가능)
2. COPY
COPY 이미지에 파일이나 폴더 추가
git repo에 직접 접근하여 코드를 복제(clone)하는 방법이 있다.
하지만 이는 불필요한 보안 문제와 의존성을 야기할 수 있어 권장되지 않는다.
# 권장하지 않음
# Git 저장소 클론을 위한 인증 정보 설정
ARG GIT_USERNAME
ARG GIT_PASSWORD
# 애플리케이션 코드를 복사
WORKDIR /app
RUN git clone https://${GIT_USERNAME}:${GIT_PASSWORD}@<git_repository_url> .
대신, 코드를 Docker 이미지에 직접 복사하는 방식을 사용하는 것이 일반적이다.
1. 서버에 공유 폴더를 생성하고 코드를 해당 폴더에 올려두고 이를 COPY 명령을 사용해 코드를 복사
COPY <호스트(서버)에서 복사할 소스 경로> <복사할 대상 경로>
# ex : 서버에 있는 app.py 코드를 이미지 내부에 /app폴더로 복사
COPY app.py /app/
# ex : src 폴더 내의 모든 파일을 이미지의 /app폴더로 복사
COPY src/* /app/
📌 2. local에 있는 코드를 dockerfile 내에 복사한 후 build 하여 이미지를 만들고
(COPY 경로는 Dockerfile이 있는 디렉토리를 기준으로 상대 경로를 입력)
docker save 명령을 사용해 이미지를 파일로 저장한다.
이후 이미지 파일('.tar')를 서버에 전송해 docker load 명령을 사용해 이미지를 등록하면 된다.
흔히 말하는 "말아올린다"는
일반적으로 소스 코드나 파일을 패키징하여 한 곳에 모으는 작업을 의미한다.
Docker의 경우, Docker 이미지를 빌드할 때 소스 코드나 파일을 이미지 내부로 복사하여 패키징하는 것을 말한다.
이미지 내에 소스 코드를 포함하게 되면 별도로 소스 코드를 압축하고 호스트에 올린 후 압축을 푸는 작업이 생략된다.
하지만 이 경우, 환경변수를 포함한 IP 주소, 포트 번호 등 local 환경에 종속적인 설정은 서버 환경에 맞게 변경해야 한다.
일반적으로 환경변수나 설정 값들은 Dockerfile이나 컨테이너 실행 명령어에서 직접 하드코딩하는 대신,
환경변수를 사용하거나 별도의 설정 파일을 읽어서 동적으로 설정하는 것이 좋다.
이렇게 하면 배포 환경에 따라 설정을 쉽게 변경할 수 있기 때문이다.
3. RUN
RUN 이미지를 빌드할 때 실행할 명령어 지정
컨테이너 내부에서 실행할 명령어를 지정하는 데 사용된다.
예를 들어 아래와 같은 작업을 수행할 수 있다.
패키지 설치 | 파일 다운로드 | 환경 변수 설정 | 소스 코드 빌드 | 파일 복사 | 명령어 실행 | 사용자 추가 | 디렉토리 생성 | 파일 퍼미션 변경 등
RUN 명령어는 컨테이너 이미지를 빌드할 때 실행되며,
이전 단계에서 생성된 파일이나 환경을 기반으로 작업을 진행할 수 있다.
FROM, COPY, RUN 외에도 많은 명령어가 있다.
| CMD | 컨테이너를 실행할 때 실행할 명령어 지정 |
| ENTRYPOINT | 컨테이너를 실행할 때 실행할 명령어 강제 지정 |
| EXPOSE | 이미지가 통신에 사용할 포트를 명시적으로 지정 |
| ENV | 환경변수 정의 |
| WORKDIR | RUN, CMD, ENTRYPOINT, ADD, COPY에 정의된 명령어를 실행하는 작업 디렉터리 지정 |
| ARG | docker build 커맨드를 사용할 때 입력받을 수 있는 인자 선언 |
VOLUME, USER, SHELL 등 더 있지만 생략한다.
CMD와 ENTRYPOINT에 대해 알아보자.
CMD와 ENTRYPOINT는 독립적으로 사용될 수도 있고, 함께 사용될 수도 있다.
독립적 사용
[CMD]
컨테이너 이미지를 실행할 때 기본적으로 실행되는 명령어 정의
docker run 명령어로 컨테이너를 실행할 때 사용자가 추가적인 명령어를 전달하지 않은 경우 실행되는 명령어
[ENTRYPOINT]
컨테이너 이미지를 실행할 때 고정된 명령어 정의
docker run 명령어로 컨테이너를 실행할 때 항상 실행되는 명령어
사용자가 추가적인 명령어를 전달해도 이 명령어 앞 또는 뒤에서 실행됨
함께 사용
[CMD, ENTRYPOINT]
동적으로 실행할 명령어와 인자를 지정
CMD는 ENTRYPOINT의 인자로 사용됨
ENTRYPOINT ["echo", "Hello"]
CMD ["word"]
위와 같이 Dockerfile을 정의한 후
'docker run myimage HiHi' 와 같이 실행하면 컨테이너 내부에서는
'Hello word HiHi'가 실행된다.
예시 Dockerfile (Python, ES, FastAPI)
아래는 CentOS8을 base이미지로 가지고 python, elasticsearch, fastapi를 설치한 후
/app 디렉토리 안에서 app.py 안 app변수 즉 FastAPI 애플리케이션 객체를 실행하는 dockerfile이다.
FROM centos:8
# 기본 패키지 업데이트 및 필수 패키지 설치
RUN dnf update -y && dnf install -y \
curl \
gcc \
openssl-devel \
bzip2-devel \
libffi-devel \
zlib-devel \
make
# Python 3.8 설치
RUN curl -O https://www.python.org/ftp/python/3.8.12/Python-3.8.12.tgz \
&& tar xzf Python-3.8.12.tgz \
&& cd Python-3.8.12 \
&& ./configure --enable-optimizations \
&& make altinstall
# Elasticsearch 7.17.7 설치
RUN rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch \
&& echo "name=Elasticsearch Repository for 7.x packages" >> /etc/yum.repos.d/elasticsearch.repo \
&& echo "baseurl=https://artifacts.elastic.co/packages/7.x/yum" >> /etc/yum.repos.d/elasticsearch.repo \
&& echo "enabled=1" >> /etc/yum.repos.d/elasticsearch.repo \
&& echo "gpgcheck=1" >> /etc/yum.repos.d/elasticsearch.repo \
&& dnf install -y elasticsearch-7.17.1
# FastAPI 및 Uvicorn 설치
RUN pip3.8 install fastapi uvicorn
# 작업 디렉토리 생성 및 애플리케이션 코드 복사
WORKDIR /app
COPY app.py .
# 컨테이너 실행 명령어 설정
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
앞선 언급한 바와 같이 base이미지를 centOS가 아닌 Python을 사용해도 된다.
FROM python:3.8
# 기본 패키지 업데이트 및 필수 패키지 설치
RUN apt-get update && apt-get install -y \
curl \
gcc \
libssl-dev \
libbz2-dev \
libffi-dev \
zlib1g-dev \
make
# Elasticsearch 7.17.7 설치
RUN curl https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add - \
&& echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" > /etc/apt/sources.list.d/elasticsearch.list \
&& apt-get update \
&& apt-get install -y elasticsearch=7.17.1
# FastAPI 및 Uvicorn 설치
RUN pip install fastapi uvicorn
# 작업 디렉토리 생성 및 애플리케이션 코드 복사
WORKDIR /app
COPY app.py .
# 컨테이너 실행 명령어 설정
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
도커 파일을 만들어서 서버에 배포하는 방법을 요약하자면 아래와 같다.
1. local 환경에서 dockerfile 내에 소스 코드를 포함하여 이미지 빌드
docker build -t 생성할_이미지_이름 재료_폴더_경로
2. docker save를 통해 빌드한 이미지를 파일(.tar)로 변경
docker save -o 이미지_파일.tar 이미지_이름:태그
3. 이미지 파일을 서버에 전송 후 docker load를 통해 이미지 등록
docker load -i 이미지_파일.tar
4. docker run을 통해 등록한 이미지로 컨테이너 생성 및 실행
docker run (옵션) 이미지_이름_태그
'Docker & Kubernetes > [Docker]' 카테고리의 다른 글
| [Docker] commit & save 반영되지 않을 때 (volume) (0) | 2025.05.30 |
|---|
[Docker] 윈도우10 docker 설치, 윈도우에서 리눅스 사용하기
도커
리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈소스 프로젝트
필수 조건
리눅스 운영체제
설치
방법 1, 2 택
- 방법 1) Hyper-V
- 작업관리자 > 성능 : 가상화가 ‘사용’으로 되어있는지 확인
- Windows 기능 켜기/끄기에서 Hyper-V를 체크하고 확인을 눌러 설치
- 방법 2) WSL2
- 보안상 이유로 Hyper-V를 사용할 수 없을 경우 WSL2 사용으로 대체
- Windows 기능 켜기/끄기에서 Linux용 Windows 하위 시스템, 가상머신 플랫폼 체크
- 재부팅 후 WSL 다운로드
- docker desktop설치
- Use the WSL 2 based engine 체크되어 있음
도커 이미지 저장 경로
기본적으로 Docker Desktop을 설치하고 WSL2를 활성화하면 window나 ubuntu에서 사용하는 docker image들은 C:\Users\user\AppData\Local\Docker\wsl\data\ext4.vhdx 에 저장됨
[C드라이브 → D드라이브 이미지 저장경로]
https://hello-bryan.tistory.com/424
[Docker] Window(WSL2) Docker Image 저장 경로 변경 (C to D)
기본적으로 Docker Desktop 을 설치하고 WSL2 를 활성하면 window 나 ubuntu 에서 사용하는 docker image들은 아래 경로에 저장됩니다. C 드라이브에 저장되기 때문에, 이것저것 테스트를 하다보니 C 드라이브
hello-bryan.tistory.com
도커를 사용하기 위해서는 구분선 위에 있는 설치과정을 따르면 된다.
현 과정은 윈도우에서 리눅스를 사용하기 위한 내용이다.
윈도우에서는 리눅스를 사용하기 위해 기존에는 VMware같은 가상머신을 사용해 설치해야 했다.
윈도우10부터는 WSL(Windows Subsystem Linux)기능을 추가해 추가로 가상머신 설치 없이 리눅스를 설치할 수 있게 됐다.
- wsl : 윈도우10에서 리눅스를 사용할 수 있는 시스템 소프트웨어
- Ubuntu : 리눅스 배포판
- 리눅스 패포판
리눅스 = 리눅스 커널 (OS의 중심에서 하드웨어를 제어하는 역할을 담당하는 소프트웨어)
리눅스 커널과 함께 기본적인 명령어를 포함하여 사용자가 바로 사용할 수 있도록 패키징한 것 - 리눅스 배포판에는 레드햇 계열(CentoOS 등), 데비안 계열(Ubuntu 등)이 있다
- 리눅스 패포판
설치
- WSL 설치
- Ubuntu 설치
- 설치 후 Ubuntu 실행 → new user, password 설정
- wsl -l -v 로 설치 확인
Ubuntu앱에서 진행 or 터미널에서 wsl 입력으로 터미널 사용 가능
WSL 기본 경로 변경
WSL을 구성하는 가상 환경의 기본 경로는 C드라이브이다.
WSL2에서는 vhdx라는 확장명의 가상 디스크가 생성되고 해당 파일 내부에 리눅스 파일 시스템이 동작하는 형태다.
용량이 부담스럽다면 vhdx 파일을 D드라이브로 옮기면 된다.
[Windows 10 WSL default 리눅스 설정하기]
https://lucidmaj7.tistory.com/239
Windows 10 WSL 기본 리눅스 설정하기
Windows 10에서 도입된 Windows WSL(Windows Subsystem for Linux)은 Windows에서 리눅스를 사용할 수 있게 해주는 기능입니다. 별도의 가상머신을 설치 하지 않고도! WSL에는 Microsoft Store를 통해서 여러가지 배포
lucidmaj7.tistory.com