- ORM
- session
- join
- mysql
- spring mvc
- spring
- SSL
- PYTHON
- 데이터베이스
- 1차원 배열
- spring security 6
- jpa
- springboot
- 프로그래머스
- string
- spring boot
- @transactional
- java
- 자바
- AWS
- 문자열
- select
- DI
- nginx
- sql
- 스프링부트
- Django
- Docker
- Git
- 스프링
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
개발하는 자몽
[Docker] image, container, Dockerfile, docker compose, 본문
[Docker] image, container, Dockerfile, docker compose,
jaamong 2024. 2. 3. 09:13Docker image, container
image
이미지는 도커 컨테이너 생성에 관한 명령이 담긴 템플릿(read-only)입니다.
애플리케이션을 실행하는데 필요한 소스 코드, 런타임 환경, 시스템 라이브러리 등 모든 설정들이 포함되어 있습니다.
https://docs.docker.com/get-started/overview/#images
container
도커 컨테이너는 이미지의 실행 가능한 인스턴스로, 도커 이미지를 기반으로 코드를 위해 격리된 공간을 의미합니다.
https://docs.docker.com/guides/walkthroughs/what-is-a-container/
https://docs.docker.com/get-started/overview/#containers
image와 container의 관계
이미지는 `class`, 컨테이너는 `instance`와 비슷합니다. 실제로 이미지를 상속받아서 새로운 이미지를 만들 수 있으며, 이미지로 컨테이너를 생성할 수 있습니다.
Dockerfile
Dockerfile은 이미지를 어떻게 만들어야 하는지 알려주는 설계서 같은 것입니다. 프로젝트를 실행하는 데 있어서 필요한 환경이나 라이브러리 등을 작성하게 됩니다.
https://docs.docker.com/engine/reference/builder/
🔹FROM
하나의 Docker 이미지는 base 이미지부터 시작해서 기존 이미지 위에 새로운 이미지를 중첩하여 여러 단계의 이미지 층(layer)을 쌓아가며 만들어집니다.
`FROM` 명령문은 이 base 이미지를 지정해 주기 위해서 사용되는데, 보통 Dockerfile 내에서 최상단에 위치합니다. base 이미지는 일반적으로 Docker Hub와 같은 Docker repository에 올려놓은 잘 알려진 공개 이미지인 경우가 많습니다.
FROM ubuntu:latest # Ubuntu 최신 버전을 base 이미지로 사용
🔹RUN
`RUN` 명령문은 마치 쉘(shell)에서 커맨드를 실행하는 것처럼 이미지 빌드 과정에서 필요한 커맨드를 실행하기 위해서 사용됩니다. 쉘(shell)을 통해 거의 못하는 작업이 없는 것처럼 `RUN` 명령문으로 할 수 있는 작업은 무궁무진하지만, 보통 이미지 안에 특정 소프트웨어를 설치하기 위해서 많이 사용됩니다.
RUN pip install -r requirements.txt # pip 패키지 설치
🔹WORKDIR
`WORKDIR` 명령문은 쉘(shell)의 `cd` 명령문처럼 컨테이너 상에서 작업 디텍토리로 전환하기 위해서 사용됩니다. WORKDIR 명령문으로 작업 디렉터리를 전환하면 그 이후에 등장하는 모든 `RUN`, `CMD`, `ENTRYPOINT`, `COPY`, `ADD` 명령문은 해당 디렉터리를 기준으로 실행됩니다.
WORKDIR /usr/app # /usr/app으로 작업 디렉터리 전환
🔹EXPOSE
`EXPOSE`는 컨테이너가 실행 시 특정 포트를 listen 하고 있음을 Docker에게 알려주는 명령어입니다. 도커 컨테이너의 포트를 외부로 노출시켜 호스트 머신과 연결하기 위해서 사용합니다.
EXPOSE <port> [<port>/<protocol>...]
# tcp 사용 경우
EXPOSE 80/tcp
🔹CMD
`CMD`는 컨테이너가 시작될 때 기본적으로 실행할 명령어를 지정하기 위해 사용합니다.
# CMD in Dockerfile
CMD ["executable","param1","param2"] # 권장 방식
CMD ["param1","param2"] # ENTRYPOINT가 사용될 때 의미있음
CMD command param1 param2 # shell form, docker 생명주기와 관련하여 좋지 않으므로 비권장
# command in shall
$ docker run <이미지> <CMD>
`CMD` 명령어는 shell에서 컨테이너를 `run`으로 실행할 때 인자가 있으면 해당 인자로 대체되어 실행됩니다. 이러한 사실은 `docker inspect` 명령어의 `CMD` 부분을 보면 확인할 수 있습니다.
🔹ENTRYPOINT
`ENTRYPOINT`는 `CMD`와 마찬가지로 컨테이너 생성 시 실행되는 프로세스 옵션입니다.
ENTRYPOINT ["executable", "param1", "param2"] # exec form, which is the preferred form
ENTRYPOINT command param1 param2 # shell form
`ENTRYPOINT`는 컨테이너 실행 시 반드시 실행됩니다. 또한 `ENTRYPOINT`가 설정되어 있을 때, shell에서 `run`으로 실행할 경우 에러가 발생합니다.
`CMD`와 함께 사용될 경우, `CMD`는 `ENTRYPOINT` 뒤에 argument로 사용됩니다. (2번 형태)
docker-compose.yml
Dockerfile과 docker-compose.yml 차이점
💡 Dockerfile은 이미지를 어셈블 하기 위해 호출할 수 있는 명령이 포함된 간단한 텍스트 파일입니다. Docker Compose는 다중 컨테이너 Docker 애플리케이션을 정의하고 실행하기 위한 도구입니다.
https://dockerlabs.collabnix.com/beginners/difference-compose-dockerfile.html
🔹Dockerfile
Dockerfile은 base image 파일로부터 수정된 image를 만드는 일련의 과정들을 정리한 파일이며, docker는 Dockerfile을 이용해 손쉽게 동일한 이미지를 반복적으로 생성할 수 있습니다.
🔹docker-compose.yml
Docker Compose는 애플리케이션을 구성하는 서비스를 docker-compose.yml에 정의하여 격리된 환경에서 함께 실행할 수 있습니다. docker-compose.yml에 빌드 명령을 추가하면 Docker Compose는 Dockerfile을 사용합니다.
참고
https://asung123456.tistory.com/51
'Architecture & Tool > Docker' 카테고리의 다른 글
[Docker] docker compose 명령어 (0) | 2023.11.17 |
---|---|
[Docker] 도커 <none>/dangling image 삭제 (1) | 2023.11.03 |
[Docker/Spring] Dockerfile 작성과 Docker에서 SpringBoot 빌드하기 (0) | 2023.05.25 |
[AWS EC2/Docker] EC2 생성, EC2에 Docker 설치, Docker에 MySQL 띄우기 (0) | 2023.05.20 |