728x90
반응형
SMALL
Dockerfile 작성법
Node
# 이미지선택
FROM node
#ARG설정
ARG DEFAULT_PORT=80
# 작업 디렉토리 설정 (WORKDIR)
WORKDIR /app
# 필요한 소스코드 복사
# COPY . /app
# 필요한 의존성 설치
# RUN npm install
# 도커 빌드할 때 레이어아키텍처로 기존 변경 내용이 없으면 캐싱을 처리
# 소스코드만 변경 됐을 때 package.json 패키지를 새로 인스톨 할 필요가 없으니
# 순서를 변경하여 package.json /app 과 npm install은 캐싱처리가 되도록 순서 변경하여 최적화
COPY package.json /app
RUN npm install
COPY . /app
#환경변수 설정
ENV PORT $DEFAULT_PORT
# 사용할 포트 노출 (환경변수 사용)
EXPOSE $PORT
# 컨테이너 시작 시 실행 명령어
CMD ["node","server.js"]
# 1. OpenJDK 이미지를 사용하여 실행 환경 설정
FROM openjdk:17-jdk-slim
# 2. 애플리케이션을 실행할 디렉토리 설정
WORKDIR /app
# 3. 빌드된 JAR 파일을 컨테이너로 복사
COPY build/libs/myapp.jar /app/myapp.jar
# 4. JAR 파일을 실행
CMD ["java", "-jar", "myapp.jar"]
# 5. 애플리케이션이 사용할 포트 노출
EXPOSE 8080
-- ARG 사용
## 빌드시점에 JAR_FILE 변수에 값 할당하여 해당 빌드jar파일 copy후 실행
ARG JAR_FILE
COPY $JAR_FILE app.jar
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
Docker 자주 쓰는 기본 명령어
- docker build . : Dockerfile을 빌드하고 이를 기반으로 자신의 이미지를 생성합니다.
- -t
<NAME>:<TAG>
: 이미지에 이름(NAME)과 태그(TAG)를 지정합니다.
- -t
- docker run
<IMAGE_NAME>
: 이미지 이름(또는 이미지 ID)을 기반으로 새 컨테이너를 생성하고 시작합니다.- --name
<NAME>
: 컨테이너에 이름(NAME)을 지정합니다. 이 이름은 중지 및 제거 등에 사용될 수 있습니다. - -d : 컨테이너를 분리 모드로 실행합니다. 즉, 컨테이너에서 출력되는 내용이 보이지 않으며, 명령 프롬프트/터미널은 컨테이너가 중지될 때까지 기다리지 않습니다.
- -it : 컨테이너를 "인터랙티브" 모드로 실행합니다. 컨테이너/애플리케이션이 명령 프롬프트/터미널을 통해 입력을 받을 준비가 됩니다. -it 플래그를 사용할 때는 CTRL + C로 컨테이너를 중지할 수 있습니다.
- --rm : 컨테이너가 중지되면 자동으로 제거합니다.
- --name
- docker ps : 실행 중인 모든 컨테이너를 나열합니다.
- -a : 중지된 컨테이너를 포함하여 모든 컨테이너를 나열합니다.
- docker images : 로컬에 저장된 모든 이미지를 나열합니다.
- docker rm
<CONTAINER>
: 이름(CONTAINER)으로 컨테이너를 제거합니다(컨테이너 ID도 사용할 수 있습니다). - docker rmi
<IMAGE>
: 이름/ID로 이미지를 제거합니다. - docker container prune : 중지된 모든 컨테이너를 제거합니다.
- docker image prune : 중간 이미지(태그되지 않은 이미지)를 제거합니다.
- -a : 로컬에 저장된 모든 이미지를 제거합니다.
- docker push
<IMAGE>:<TAG>
: 이미지를 DockerHub(또는 다른 레지스트리)로 푸시합니다. 이미지 이름/태그에는 저장소 이름/URL이 포함되어야 합니다. - docker pull
<IMAGE>:<TAG>
: DockerHub(또는 다른 레지스트리)에서 이미지를 가져옵니다. 이미지를 이전에 가져오지 않은 경우 docker run IMAGE 명령어를 실행하면 자동으로 가져옵니다. - docker login : DockerHub 로그인
- docker logout : DockerHub 로그아웃
- docker tag
<original_image_name>:<copy_image_name>
: image 카피이미지 Name으로 복사 - docker cp
<container_name or id>:<container 내부경로> <host파일경로>
: 컨테이너 -> 로컬로 특정파일 복사 - docker cp
<host파일경로> <container_name or id>:<container 내부경로>
: 로컬 -> 컨테이너
Docker Volumes
docker run -v <VOL_NAME>
:<컨테이너볼륨경로>
docker volume rm VOL_NAME' 또는 'docker volume prune'
- 익명볼륨
- -rm 옵션으로 시작한 컨테이너는 제거되면 같이 제거가 됨.
아닌 경우에는 수동으로 삭제 필요
컨테이너간 데이터 공유 불가
docker run -v /app/data ...
Dockerfile -> VOLUME ["/app/data"]
- 네이밍볼륨
컨테이너가 제거되면 같이 제거가 됨.
docker run -v data:/app/data ... - 바인드마운트
docker run -v /path/to/code:/app/data ..
:ro 붙이면 읽기전용 (readOnly)
특징 | 익명 볼륨 (Anonymous Volume) | 네이밍 볼륨 (Named Volume) | 바인드 마운트 (Bind Mount) |
---|---|---|---|
관리 방식 | 자동 생성 | 사용자가 이름 지정 | 호스트 파일 시스템 경로 지정 |
지속성 | 컨테이너 삭제 후에도 남음(--rm 옵션사용시 삭제) | 컨테이너 삭제 후에도 남음 | 호스트와 동기화됨 |
공유 가능성 | 제한적 | 다른 컨테이너와 공유 가능 | 호스트 시스템에 따라 다름 |
경로 지정 | 불가능 | 가능 | 반드시 지정 필요 |
사용 목적 | 임시 데이터 저장 | 재사용 가능한 | 데이터 저장 호스트 파일 시스템 접근 |
.dockerignore
Dockerfile COPY 할 때 특정 부분 제외
env
docker run -d --rm -p 3000:8000 --env PORT=8000 ...
docker run -d --rm -p 3000:8000 -e PORT=8000 ...
docker run -d --rm -p 3000:8000 --env-file ./.env PORT=8000 ...
arg
Dockerfile에 ARG 사용시에
docker build -t <bulidImagNAME>
--build-arg DEFAULT_PORT=8000 .
Docker Network
- 호스트 연결
- "<host.docker.internal>" Docker가 제공하는 특수 DNS 이름으로, 컨테이너가 호스트 시스템의 IP 주소를 참조
- localhost vs host.docker.internal
항목 localhost host.docker.internal 참조 대상 해당 컨테이너 내부 호스트 시스템 주로 사용되는 환경 모든 Docker 환경 Docker Desktop (Windows, macOS) 사용 목적 컨테이너 내부 서비스 접근 호스트 시스템 서비스 접근 접근 가능한 서비스 위치 컨테이너 내부 호스트 시스템
아이피 연결
- 해당 아이피를 직접 입력하여 사용
- 컨테이너 아이피 확인은 docker inspect "<컨테이너 ID 또는 이름>"
컨테이너간 연결
특정 네트워크를 연결해서 사용
네트워크 생성
docker network create <네트워크이름>
컨테이너 실행시에 네트워크 연결
docker run -d --name <컨테이너이름> --network <네트워크이름> -d --rm -p 3000:3000 <이미지이름>
같은 네트워크에 사용되는 컨테이너에서 다른 컨테이너 통신시 해당 컨테이너 이름을 사용
728x90
반응형
LIST