Docker 에서 데이터 관리법 3가지

1. Volume
- Docker가 관리하는 디스크 저장소
- 데이터를 호스트의 디스크에 저장하지만, Docker 전용 공간에서 따로 관리됨
- 일반적으로 데이터 보존이 필요한 경우에 사용
- 가장 자주 쓰임
2. Bind Mount
- 호스트의 디렉토리(폴더)를 그대로 연결
- Docker 외부에 있는 원하는 경로를 컨테이너와 공유할 수 있음
- 개발 시 소스 코드 자동 반영 등 실시간 연결에 유용
bash
docker run -v /host/path:/app mycontainer
3. tmpfs Mount
- 메모리에만 저장 (디스크 X)
- 컨테이너가 꺼지면 데이터는 사라짐
- 임시 파일이나 보안 데이터 저장에 사용
bash
docker run --tmpfs /app/tmp mycontainer
방식
|
저장 위치
|
특징
|
주로 쓰는 상황
|
Volume
|
Docker 관리 영역
|
안전하고 Docker가 관리
|
일반적인 데이터 저장
|
Bind Mount
|
Host 디렉토리
|
실시간 연동, 호스트 직접 접근
|
개발 환경, 로깅
|
tmpfs Mount
|
메모리
|
휘발성, 빠름, 보안성 좋음
|
임시 데이터, 민감한 정보 저장
|
Volume
- 볼륨 생성
- 생성한 볼륨을 사용하는 컨테이너 실행
- 동일한 볼륨을 사용하는 컨테이너를 추가로 실행
- myvolume 저장 위치 확인 명령어
bind mount
- Mysql 이미지를 이용해서 데이터베이스 컨테이너를 실행
C:\Users\joo97> docker container run -d --name wordpressdb -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress -v c:\docker\mysql_data:/var/lib/mysql mysql:5.7
e MYSQL_ROOT_PASSWORD=password
→ 컨테이너 실행에 필요한 환경변수를 설정, root 사용자 패스워드를 설정한다.
-e MYSQL_DATABASE=wordpress
→ 데이터베이스 이름을 설정
-v c:\docker\mysql_data:/var/lib/mysql
→ -v 호스트경로:컨테이너내부경로(mysql 설정정보와 데이터를 저장하는 곳)
→ -v 다음 경로가 나오면 bind mount, 호스트 경로를 컨테이너 내부 경로와 연결한다.
mysql:5.7
→ 컨테이너 실행에 사용할 이미지 docker.io/library/mysql:5.7
위 명령어 실행시 로컬 c:\docker\mysql_data 경로에 mysql 설정정보 및 데이터가 생성된다.
- 워드프레스(wordpress) 이미지를 이용해서 웹 애플리케이션 컨테이너를 실행
--link wordpressdb:mysql
→ 연결할컨테이너:별칭
e WORDPRESS_DB_NAME=wordpress
→ MySQL 데이터베이스에서 사용할 DB의 이름
e WORDPRESS_DB_USER=root
→ DB 접속에 사용할 사용자 명
e WORDPRESS_DB_PASSWORD=password
→ 패스워드
p 80
→ 가용한 호스트의 임의 포트와 컨테이너 내부의 80 포트를 연결
wordpress
→ 컨테이너 실행에 사용할 이미지
- 컨테이너 실행 확인

- 브라우저로 1089포트에서 wordpress 접속 확인

도커 네트워크
네트워크 생성
C:\Users\joo97>docker network create --driver=bridge web-network
→ 이름이 web-network인 bridge 드라이버 네트워크 생성
네트워크 상세 정보 확인
C:\Users\joo97> docker network inspect web-network
네트워크 상세 정보 확인
C:\Users\joo97> docker network inspect web-network
컨테이너 생성
C:\Users\joo97> docker container run -itd --name myweb ubuntu
→ 네트워크를 지정하지 않고 생성했기때문에 디폴트로 bridge 네트워크에 연결됨
생성한 컨테이너에 web-network 네트워크 연결
C:\Users\joo97> docker network connect web-network myweb
컨테이너의 네트워크 연결확인
C:\Users\joo97> docker container inspect myweb
→ 확인시 디폴트(bridge)와 web-network가 함께 연결된 상태로 뜬다.
네트워크 삭제
네트워크 연결된 컨테이너를 분리(제거) 후 네트워크 삭제
docker network disconnect web-network myweb (네트워크 분리)
docker network rm web-network (네트워크 삭제)


- 컨테이너 실행시 네트워크 부여
네트워크 생성
C:\Users\joo97> docker network create --driver bridge mybridgenetwork
컨테이너 실행시 네트워크 연결
C:\Users\joo97>docker container run -itd --name myweb2 --net mybridgenetwork ubuntu

- 연결이 잘 되었는지 확인
C:\Users\joo97> docker container inspect myweb2

네트워크 컨테이너간 통신
기본 브리지 네트워크 (bridge)
- 컨테이너 실행 시 네트워크를 지정하지 않으면 기본 bridge 를 사용한다.
bash
docker container run -itd --name ubuntu-default-a ubuntu
docker container run -itd --name ubuntu-default-b ubuntu
# IP로 ping 가능
ping 172.17.0.3
# 이름으로 ping 불가
ping ubuntu-default-b # Name or service not known
사용자 정의 브리지 네트워크
- 사용자 정의 네트워크에서는 내부적으로는 같은 network-a 끼리 통신이 되지만, 기본 브리지 네트워크와 연결은 되어있지 않아 통신이 안된다.
bash
docker network create --driver bridge network-a
docker container run -itd --name ubuntu-network-a --network network-a ubuntu
docker container run -itd --name ubuntu-network-b --network network-a ubuntu
-link 옵션: 기본 네트워크에서도 별칭을 통한 통신 가능
bash
docker container run -itd --name ubuntu-default-c --link ubuntu-default-a:ubuntu-a ubuntu
/etc/hosts 파일에 연결된 컨테이너 정보가 자동 등록된다.
link 옵션으로 컨테이너 실행시 컨테이너 이름과 별칭을 사용해서 연결이 가능하다.
root@75599dbdbae6:/# ping ubuntu-default-a -c 3 ← 연결 가능
root@75599dbdbae6:/# ping ubuntu-a -c 3 ← 연결 가능
ubuntu-default-c 컨테이너를 network-a 네트워크에 연결하여, 같은 네트워크에 있는 ubuntu-network-a 에 접속
1. 초기 상태: ubuntu-default-c의 네트워크 정보 확인
bash
docker container inspect ubuntu-default-c
- 기본적으로 bridge 네트워크에 연결중
- IP: 172.17.0.4
- Gateway: 172.17.0.1
- network-a에는 아직 연결되지 않음
2. ubuntu-default-c를 network-a에 연결
bash
docker network connect network-a ubuntu-default-c
3. 연결 확인 방법 두가지
방법 1. ubuntu-default-c의 네트워크 정보 재확인
bash
docker container inspect ubuntu-default-c
- bridge와 network-a 둘 다 연결됨
- network-a에서의 IP: 172.19.0.4
- Gateway: 172.19.0.1
방법 2. network-a 네트워크 정보 확인
bash
docker network inspect network-a
- 3개의 컨테이너가 네트워크에 연결됨:
통신 성공 확인
bash
docker container exec -it ubuntu-default-c /bin/bash
ping 172.19.0.2 -c 3
ubuntu-default-c → ubuntu-network-a 연결 성공