인프런 커뮤니티 질문&답변

seohyeonjin787님의 프로필 이미지

작성한 질문수

풀스택을 위한 도커와 최신 서버 기술(리눅스, nginx, AWS, HTTPS, flask 배포) [풀스택 Part3]

docker compose 주요 명령 익히기

섹션9 docker compose 주요 명령 익히기

작성

·

101

0

- 본 강의 영상 학습 관련 문의에 대해 답변을 드립니다. (어떤 챕터 몇분 몇초를 꼭 기재부탁드립니다)
- 이외의 문의등은 평생강의이므로 양해를 부탁드립니다
- 현업과 병행하는 관계로 주말/휴가 제외 최대한 3일내로 답변을 드리려 노력하고 있습니다
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

 

안녕하세요, 강사님. 항상 좋은 강의 잘 듣고 있습니다.

강의에서 docker-compose 작성해서 테스트하는 방법을 배웠습니다.

 

version: "3"

services:

db: image: mysql:5.7

restart: always

volumes: - ./mysqldata:/var/lib/mysql

environment:

- MYSQL_ROOT_PASSWORD=funcoding

- MYSQL_DATABASE=fundb

ports: - "3306":"3306"

 

이런식의 docker-compose.yml을 작성을 했고,

볼륨 부분 설명중에 mysqldata 볼륨을 생성한 적이 없지만

이 docker-compose를 up하게 되면 실행되면서 /var/lib/mysql -> ./mysqldata 로 생성을 해준다고 설명을 해주신 것까진 이해가 됩니다.

 

앞선 강의에서도 -v 옵션을 통해서 배웠구요. 여기서 제가 궁금한건... 음.. 일단,

  1. volumes를 작성할 때 순서는 hostPC의 볼륨:docker container 내의 볼륨 순서로 되는 것으로 이해를 했구요, 이거는 -v 옵션도 마찬가지인거일 테구요.

  2. 그렇다면, 방향은 어떻게 설정이 되는건가요? 지금같은 경우엔 mysqldata볼륨이 없어서 오른쪽에서 왼쪽으로 이동을 해준건 이해를 했습니다. 하지만, 처음 저희가 /home/ubuntu/2021_DEV_HTML 에서 /usr/local/apahce2/htdocs 로 파일을 옮겨줄 때에는 둘 다 볼륨이 있는 상태였었는데 호스트pc에서 컨테이너 경로로 복사를 해줬습니다. 그래서 좀 혼돈이 오는 것 같습니다. 볼륨 옵션을 사용할 때의 복사의 from 과 to는 어떻게 설정이 되는 것인지 궁금합니다. 감사합니다.

     

 

 

답변 1

0

안녕하세요. 답변 도우미입니다.

안녕하세요! 강의 잘 들어주셔서 감사합니다.

해당 기능이 폴더의 상태에 따라서, 다르게 동작하는 케이스가 있어서, 그 중에 정확히 동작하고, 활용에 도움이 되는 형태를 중심으로 이야기드리긴 했는데요. 여러 케이스가 있을 수 있긴 합니다. 다음과 같이 관련 케이스에 대해 상세히 기재를 해드립니다. 참고가 되면 좋을 것 같습니다.

 

Docker에서 볼륨을 설정할 때 볼륨 옵션을 사용할 때 데이터를 복사하는 방향과 관련된 몇 가지 개념을 정리해 드리겠습니다.

### Docker 볼륨의 기본 개념

1. 볼륨 마운트 순서: host_path:container_path 형태로 작성됩니다.

- host_path: 호스트 머신의 경로

- container_path: 컨테이너 내의 경로

2. 데이터 복사의 방향: 일반적으로는 호스트 머신의 데이터를 컨테이너로 마운트하지만, 초기에는 복사되는 데이터의 방향이 상황에 따라 다를 수 있습니다.

### 데이터 복사 규칙

1. 호스트 디렉토리가 비어 있는 경우:

- docker run이나 docker-compose up을 처음 실행할 때, 호스트 디렉토리가 비어 있다면, 컨테이너의 디렉토리 내의 기본 데이터가 호스트 디렉토리로 복사됩니다.

- 예: /home/ubuntu/2021_DEV_HTML이 비어 있고 /usr/local/apache2/htdocs에 기본 파일이 있을 때, /usr/local/apache2/htdocs의 내용이 /home/ubuntu/2021_DEV_HTML로 복사됩니다.

2. 호스트 디렉토리가 비어 있지 않은 경우:

- 호스트 디렉토리에 이미 파일이 있는 경우, 그 파일들이 컨테이너 내의 디렉토리에 마운트됩니다.

- 이 경우, 호스트 디렉토리의 내용이 컨테이너 내의 디렉토리 내용을 덮어쓰게 됩니다.

### 요약

- 볼륨 마운트의 방향: host_path:container_path로 마운트됩니다.

- 데이터 복사:

- 호스트 디렉토리가 비어 있으면, 컨테이너의 디렉토리 내용이 호스트 디렉토리로 복사됩니다.

- 호스트 디렉토리가 비어 있지 않으면, 호스트 디렉토리의 내용이 컨테이너 디렉토리를 덮어씁니다.

### 예시 설명

1. 첫 번째 예시:

- volumes: - ./mysqldata:/var/lib/mysql

- ./mysqldata가 비어 있다면, mysql:5.7 이미지 내의 /var/lib/mysql 디렉토리 내용이 ./mysqldata로 복사됩니다.

- 이후에는 ./mysqldata가 컨테이너 내 /var/lib/mysql 디렉토리로 마운트되므로, 호스트에서 변경된 내용이 컨테이너에서 사용됩니다.

2. 두 번째 예시:

- /home/ubuntu/2021_DEV_HTML:/usr/local/apache2/htdocs

- /home/ubuntu/2021_DEV_HTML이 비어 있다면, 컨테이너 내 /usr/local/apache2/htdocs의 내용이 호스트로 복사됩니다.

- /home/ubuntu/2021_DEV_HTML에 파일이 있다면, 그 내용이 컨테이너의 /usr/local/apache2/htdocs로 마운트되어 컨테이너 내 파일을 덮어씁니다.

 

감사합니다.

답변 감사합니다. 확실히 이해됐습니다!