Volume 활용
코드를 저장하자마자 컨테이너에 바로 적용할 수 있는 방법이 있다.
docker run -it -p 4000:4000 --env-file .env -v $(pwd)/app:/usr/src/my-app/app express-dev
위와 같이 사용하면되는데 하나씩 살펴보자.
-it: 이 옵션은 컨테이너를 대화형 모드로 실행하며 터미널 입력을 가능하게 한다.
i는 표준 입력(STDIN)을 열고, t는 가상 터미널을 할당합니다.
-p 4000:4000: 이 옵션은 호스트의 포트와 컨테이너의 포트를 매핑한다. 여기서는 호스트의 4000번 포트를 컨테이너의 4000번 포트에 연결한다. 포트매핑에 대해 저번 글에서 다뤘다.
2023.12.10 - [CI-CD/Docker] - Port mapping
Port mapping
docker run redis 컨테이너에서 redis가 실행된다. 당연하게도, 로컬 환경에서는 컨테이너에서 실행된 redis에 접속할 수 없다. 연결할 수 없다고 나온다. 만약 이 둘을 연결해서 호스트 머신에서 컨테
toychip.tistory.com
--env-file .env: 이 옵션은 .env 파일에서 환경변수를 읽어 컨테이너에 적용한다. build시에 환경변수로 두고, env를 실행할 때 주입한다.
.env 파일에는 컨테이너 환경 설정을 위한 여러 환경변수가 들어있다.
-v $(pwd)/app:/usr/src/my-app/app: 볼륨 마운트 옵션이다.
여기서 $(pwd)/app은 현재 workwpace의 root경로의 /app 의미하며, /usr/src/my-app/app은 컨테이너 내의 대상 경로이다. 이렇게 하면 호스트의 해당 디렉토리가 컨테이너의 지정된 경로에 연결된다.
이는 로컬에서 코드 변경이 발생할 때마다 컨테이너 내의 파일도 자동으로 업데이트되도록 해준다.
express-dev: 사용할 Docker 이미지의 이름이다.
위 명령어를 Spring에도 똑같이 적용 가능하다.
하지만.. 이렇게 기다란 명령어를 매번, 외워서 사용해야할까? 부가적인 설정들이 더 추가된다면 더 길게 작성해야할까?
이를 해결할 수 있는 파일이 docker-compose 파일이다.
docker-compose
docker-compose는 위 기다란 명령어의 설정파일이라고 생각하면된다.
그리고 이 전에 volume을 실행할 때 docker ps 명령어로 실행중인 docker 컨테이너의 id를 찾아서 직접 실행했어야했다.
docker-compose를 사용하면 설정 뿐만 아니라 이또한 해결할 수 있다.
우리가 설정했던 docker file의 설정들을 세밀하게 설정할 수 있다.
version: "3"
services:
web:
build:
context: .
dockerfile: Dockerfile.dev
volumes:
- ./app:/src/my-app/app
ports:
- "4000:4000"
env_file:
- .env
depends_on:
- redis
redis:
image: "redis:alpine"
version: "3": 이 줄은 사용하는 Docker Compose 파일의 버전을 명시한다.
버전 3은 Docker Compose의 특정 기능과 구문을 사용하겠다는 것을 나타낸다.
services: 여기서부터는 Docker 컨테이너들의 정의가 시작된다. services 아래에 각각의 서비스(컨테이너)가 정의된다.
web: 'web'이라는 이름의 서비스(컨테이너)를 정의한다. 이 이름은 임의로 지정할 수 있습니다.
build: 'web' 서비스의 이미지를 어떻게 빌드할지 정의한다.
context: Dockerfile이 위치한 디렉토리의 경로이다. 여기서 .는 현재 디렉토리를 의미한다.
dockerfile: Dockerfile.dev: 사용할 Dockerfile의 이름이다. 이 경우 Dockerfile.dev 파일을 사용하겠다는 의미이다.
volumes: 호스트 시스템과 컨테이너 간에 볼륨을 마운트한다.
여기서 ./app:/src/my-app/app는 현재 디렉토리의 app 폴더를 컨테이너의 /src/my-app/app에 마운트한다.
ports:: 컨테이너의 포트를 호스트 시스템의 포트에 매핑한다. "4000:4000"은 호스트의 4000 포트를 컨테이너의 4000 포트에 연결합니다.
여기서 호스트란 Docker 컨테이너를 실행하는 시스템을 말한다.
env_file: 환경 변수를 정의한 파일을 지정한다. 여기서 .env 파일에서 환경 변수를 읽어온다.
depends_on: 'web' 서비스가 실행되기 전에 실행되어야 하는 다른 서비스를 명시한다. 여기서는 'redis' 서비스가 'web' 서비스보다 먼저 실행되어야 함을 나타낸다.
redis: 'redis'라는 또 다른 서비스를 정의한다.
image: "redis:alpine": 사용할 Docker 이미지를 지정한다. 여기서는 'redis' 이미지의 'alpine' 버전을 사용하겠다는 의미이다.
이 파일은 docker-compose up 명령을 사용하여 실행될 수 있으며, 이 명령은 정의된 모든 서비스(컨테이너)를 실행한다.
web 서비스는 지정된 Dockerfile을 사용하여 빌드되고, redis 서비스는 Docker Hub에서 제공하는 redis:alpine 이미지를 사용한다.
'Infra > Docker' 카테고리의 다른 글
Docker Image 생성과 DockerIgnore를 사용한 .env 관리, 캐싱 활용 (0) | 2023.12.11 |
---|---|
Port mapping (0) | 2023.12.10 |
Docker 명령어 정리 (0) | 2023.12.09 |