docker file - 기본기
Dockerfile
Dockerfile은 Docker 컨테이너 이미지를 생성하기 위한 텍스트 기반 파일이다.
Docker는 애플리케이션과 해당 애플리케이션을 실행하는 환경을 패키징하여 독립적이고 이식성이 뛰어난 컨테이너로 만들어준다. Dockerfile은 이러한 컨테이너 이미지를 정의하는 데 사용되며, Docker 엔진은 Dockerfile을 읽고 실행하여 이미지를 빌드한다.
Dockerfile은 애플리케이션을 실행하는 데 필요한 모든 구성 요소와 명령을 정의하는 일련의 단계로 구성된다.
각 단계는 Docker 이미지의 레이어로 구성되며, 이전 단계의 결과를 기반으로 새로운 레이어를 생성한다.
이렇게 함으로써 이미지를 빌드하는 데 필요한 시간을 최소화하고 재사용성을 높일 수 있다.
Dockerfile은 다양한 명령어를 포함할 수 있으며, 가장 일반적으로 사용되는 명령어 중 일부는 다음과 같다.
- FROM: 기반이 되는 이미지를 지정한다.
- RUN: 명령을 실행하여 파일 시스템에 변경 사항을 적용한다.
- COPY 또는 ADD: 파일과 디렉터리를 이미지로 복사한다.
- WORKDIR: 작업 디렉터리를 설정한다.
- EXPOSE: 컨테이너가 노출하는 포트를 정의한다.
- CMD 또는 ENTRYPOINT: 컨테이너가 시작될 때 실행되는 명령을 지정한다.
Dockerfile을 작성하고 Docker 이미지를 빌드하면 해당 이미지를 사용하여 동일한 애플리케이션을 여러 환경 또는 서버에서 실행할 수 있다. 이를 통해 애플리케이션의 이식성과 확장성을 향상시킬 수 있다.
Dockerfile 작성
- 해당 Dockerfile은 httpd 기반 이미지를 사용하여 컨테이너 이미지를 생성한다.
- 아래는 각 줄의 역할을 설명한 것이다.
- FROM httpd
- httpd는 Apache HTTP Server의 공식 이미지이다.
- 이 줄은 httpd 이미지를 기반으로 컨테이너 이미지를 생성하겠다는 것을 나타낸다.
- COPY ./webapp /usr/local/apache2/htdocs
: 현재 디렉터리에 있는 webapp 디렉터리를 컨테이너 내의 /usr/local/apache2/htdocs 경로로 복사한다.- 이는 webapp 디렉터리에 있는 웹 애플리케이션 파일을 Apache 서버의 기본 문서 루트 디렉터리로 설정하는 역할을 한다.
- CMD ["httpd-foreground"]
: 컨테이너가 시작될 때 실행되는 명령을 지정한다.- httpd-foreground 명령은 Apache 서버를 실행하는 명령이다.
- -foreground 플래그를 사용하여 Apache를 백그라운드가 아닌 foreground에서 실행하도록 설정한다.
- 이렇게 함으로써 Docker 컨테이너가 실행 중인지 여부를 확인할 수 있다.
- FROM httpd
이 Dockerfile을 사용하여 Docker 이미지를 빌드하면 httpd를 기반으로 한 컨테이너 이미지가 생성되고, 해당 이미지를 실행하면 웹 애플리케이션이 /usr/local/apache2/htdocs에서 호스팅되는 Apache 서버가 실행된다.
그리고 현재 디렉토리(/Users/사용자/Documents/dockerwork) 아래에 webapp 폴더 생성 후 내부에 다음과 같이 index.html 파일을 생성한다.
Dockerfile 실행 방법
Dockerfile을 실행하여 Docker 이미지를 빌드하고, 해당 이미지를 사용하여 컨테이너를 실행하는 과정은 다음과 같다.
- Dockerfile 작성
: 먼저, 텍스트 편집기를 사용하여 Dockerfile을 작성한다.- 필요에 따라 기반 이미지, 파일 복사, 명령 등을 Dockerfile에 포함시킨다.
- Docker 이미지 빌드
: 작성한 Dockerfile을 사용하여 Docker 이미지를 빌드한다.- 이를 위해 터미널 또는 명령 프롬프트를 열고 Dockerfile이 있는 디렉터리로 이동한다.
- 그리고 다음 명령을 실행합니다:
docker build -t 이미지_이름:태그_이름 .
- 여기서 -t 옵션은 이미지에 태그를 지정하는 역할을 합니다.
- 이미지_이름은 원하는 이미지의 이름을, 태그_이름은 버전이나 레이블을 나타낸다.
- 마지막의 .은 현재 디렉터리에서 Dockerfile을 찾는 것을 의미한다.
- Docker는 Dockerfile을 읽고 각 명령을 실행하여 이미지를 생성한다.
3. Docker 컨테이너 실행
: Docker 이미지를 성공적으로 빌드한 후, 해당 이미지를 사용하여 컨테이너를 실행할 수 있다.
docker run -p 호스트_포트:컨테이너_포트 이미지_이름:태그_이름
- 여기서 -p 옵션은 호스트와 컨테이너의 포트 매핑을 지정하는 역할을 한다.
- 호스트_포트는 호스트에서 접근 가능한 포트를, 컨테이너_포트는 컨테이너 내부의 포트를 나타낸다.
- 이미지 이름과 태그는 이전에 빌드한 이미지의 이름과 태그를 사용한다.
- 이 명령을 실행하면 Docker는 해당 이미지를 기반으로 컨테이너를 실행한다.
위의 단계를 따라 Dockerfile을 빌드하고 이미지를 실행하면 원하는 애플리케이션이 컨테이너 내에서 실행된다.
실행 중인 컨테이너에는 호스트와의 포트 매핑이 설정되어 애플리케이션에 접근할 수 있다.
Dockerfile build
docker build 명령 이후 docker image 리스트는 다음과 같다.
실행
결과
우리가 이전에 webapp 폴더 내부에 생성한 index.html 파일이 실행된 것을 확인할 수 있다.
실행된 컨테이너 내부 폴더를 살펴보면 다음과 같다.
COPY vs. volume
Dockerfile의 COPY 명령어와 Docker에서의 Volume 사용은
파일 및 디렉터리를 Docker 컨테이너에 복사하거나 연결하는 데 사용되는 두 가지 다른 방법이다.
각각의 특징과 차이점은 다음과 같다.
COPY 명령어: Dockerfile의 COPY 명령어는 로컬 파일 시스템에서 파일 또는 디렉터리를 Docker 이미지 내부로 복사한다.
위의 예시에서 COPY ./webapp /usr/local/apache2/htdocs는 호스트의 현재 디렉터리에 있는 webapp 디렉터리를 httpd 이미지 내부의 /usr/local/apache2/htdocs 경로로 복사한다.
이는 Docker 이미지를 빌드할 때 파일을 포함하여 이미지 내부에 정적으로 배포하는 데 사용된다.
따라서 이미지가 생성될 때 파일의 상태가 고정된다.
복사된 파일은 이미지의 한 부분이 되며 컨테이너가 실행될 때 항상 해당 파일을 사용한다.
Volume: Docker에서 Volume은 호스트 머신과 Docker 컨테이너 간의 디렉터리를 공유하는 기능이다.
Volume을 사용하면 컨테이너에서 발생하는 데이터 변화를 호스트에 반영하고, 호스트에서 변경된 데이터를 컨테이너로 전달할 수 있다.
Volume을 정의하고 사용하려면 Docker 명령어 또는 Docker Compose 파일을 사용하여 컨테이너를 실행할 때 Volume을 설정해야 한다.
Volume은 파일 시스템 또는 네트워크 마운트와 같이 작동하며, 컨테이너 내부와 호스트 간의 데이터 공유 및 지속성을 제공한다.
Volume은 컨테이너가 종료되어도 데이터가 유지되므로 컨테이너 간의 데이터 공유 및 지속적인 데이터 저장에 적합하다.
이 두 가지 접근 방식의 주요 차이점은 다음과 같다.
COPY 명령어는 Docker 이미지를 빌드할 때 파일을 정적으로 포함하며, 이미지 생성 시점에 파일이 결정된다.
그러므로 이미지에 포함된 파일은 변경되지 않는다.
이는 애플리케이션의 정적 파일이나 초기 설정 파일과 같은 경우에 적합하다.
Volume은 컨테이너와 호스트 간의 동적인 데이터 공유를 가능하게 한다.
호스트의 디렉터리를 컨테이너에 마운트하거나 도커 볼륨을 사용하여 컨테이너의 데이터를 보존할 수 있다.
데이터의 변경 사항은 호스트와 컨테이너 간에 실시간으로 반영된다.
이는 로그 파일, 데이터베이스 파일 및 동적으로 생성되는 파일과 같은 경우에 유용하다.
따라서, COPY 명령어는 이미지 빌드 시점에서 정적인 파일을 포함시키는 데 사용되며, Volume은 컨테이너와 호스트 간의 동적인 데이터 공유를 위해 사용된다.
선택은 사용하려는 데이터의 특성과 사용 사례에 따라 결정되어야 한다.
'Docker' 카테고리의 다른 글
docker file - RUN 명령어 (0) | 2023.06.24 |
---|---|
docker file - Entrypoint & Work (0) | 2023.06.23 |
docker commit 이미지 굽기와 docker hub 업로드 (0) | 2023.06.09 |
docker volumn 옵션으로 폴더 연결하기 (0) | 2023.06.09 |
docker exec 명령어 변경 (0) | 2023.05.29 |