본문 바로가기

Docker,Jenkins

Container Volume 이란 ?

728x90

Container Volumn이란 ?

  • Container image는 Read ONLY 속성을 가지고 있다.(수정 불가 !)
  • 이러한 image를 run 하게 되면 , 하나의 process 가 된다.
  • Container Image 는 Read ONLY이지만,Run 된 Container에는 rw(read & write) layer 가 생성
  • 모든 데이터는 rw layer 에 쌓이게 된다.
  • 하지만 ro와 rw는 하나인 것 처럼 보여주는데 이를 Union File System라고 한다.

 

docker rm으로 도커 컨테이너를 삭제했다고 해보자.

이럴 경우, ro & rw layer모두 사라지게 된다.

( 따라서 rw에 저장되었던 모든 데이터도 함께 사라지게 된다 )

이러한 상황을 막기 위해, 영구적으로 보존하기 위한 기술이 중요하다!

 

데이터 보존하는방법

Container 가 만들어주는 data를 영구적으로 보존하는 법,

Docker HOST에 별도의 저장공간을 만들고, 이곳에 보존하기!

 

해당 container에서 만들어진 데이터가 host directory 안에 쌓이게 된다.

이러한 연결과정을 volume mount라고 한다.

(실수로 컨테이너를 삭제했다 하더라도 ,HOST에 잘 저장되어 있어서 OK)

 

volumn 옵션 사용하기

 

# case 1) 
-v <host path>:<container mount path>

# case 2) 
-v <host path>:<container mount path>:<read write mode>

# case 3
-v <container mount path>

 

Example)

 

# case 1) default : read write
docker run -d -v /dbdata:/var/lib/mysql -e MYSQL..PASSWORD=pass mysql:latest

# case 2) read only만 가능하게끔
docker run -d -v /webdata:/var/lib/html:ro httpd:latest

# case 3) host path를 명시안해주면, 임의의 directory만든 뒤 자동 mount
docker run -d -v /var/lib/mysql -e MYSQL..PASSWORD=pass mysql:latest

 

Container 간의 데이터 공유

docker run으로 컨테이너 하나를 실행

 

docker run -v /webdata:/webdata -d --name df smlinux/df:latest

 

 

host에 있는 data를 webserver가 가져다가 사용할 수 있다.

 

docker run -d -v /webdata:/usr/share/nginx/html:ro -d ubuntu:latest

 

GPT 의 유용한 답변

 

Docker 컨테이너 간 데이터를 공유하는 방법은 다양하지만, 가장 간단하고 일반적인 방법은 Docker 볼륨(Volume)을 사용하는 것입니다.

Docker 볼륨은 컨테이너 간 데이터를 공유하기 위해 호스트 시스템에서 생성된 디렉토리나 파일을 컨테이너에 마운트하여 사용하는 것입니다.

아래는 Docker 볼륨을 사용하여 컨테이너 간 데이터를 공유하는 예제 코드입니다.

먼저, 공유할 디렉토리를 생성합니다.

bash
Copy code
$ mkdir shared-data
다음으로, 첫 번째 컨테이너를 실행하고 공유할 디렉토리를 Docker 볼륨으로 마운트합니다.

bash
Copy code
$ docker run -d --name container1 -v /path/to/shared-data:/shared-data image1
위 명령어에서 -v /path/to/shared-data:/shared-data는 호스트 시스템의 /path/to/shared-data 디렉토리를 컨테이너 내부의 /shared-data 디렉토리에 마운트하는 것을 의미합니다.

다음으로, 두 번째 컨테이너를 실행하고 첫 번째 컨테이너와 동일한 Docker 볼륨을 마운트합니다.

bash
Copy code
$ docker run -d --name container2 -v /path/to/shared-data:/shared-data image2
위 명령어에서 -v /path/to/shared-data:/shared-data는 첫 번째 컨테이너와 동일한 Docker 볼륨을 마운트하는 것을 의미합니다.

이제 첫 번째 컨테이너에서 /shared-data 디렉토리에 파일을 생성하면, 두 번째 컨테이너에서도 동일한 파일을 읽을 수 있습니다.

Docker 볼륨을 사용하여 컨테이너 간 데이터를 공유하는 방법은 매우 간단하고 편리합니다. 하지만 Docker 볼륨은 호스트 시스템과 컨테이너 간에 파일 시스템을 공유하기 때문에 보안 문제가 발생할 수 있습니다. 따라서, 보안에 민감한 데이터의 경우에는 다른 방법을 고려해야 합니다.

 

docker 와 db 를 함께 컨테이너에 올리고 두개를 연동시키는방법

 

더보기
AWS EC2 인스턴스에서 Docker 이미지를 사용하여 스프링 컨테이너와 데이터베이스 컨테이너를 띄우고 서로 공유하는 방법은 다음과 같습니다.

Docker 이미지 빌드
먼저, 스프링 애플리케이션과 데이터베이스를 컨테이너에서 실행하기 위한 Docker 이미지를 빌드합니다. 스프링 애플리케이션은 JAR 파일로 패키징된 상태여야 합니다.

ruby
Copy code
$ docker build -t spring-app .
데이터베이스 컨테이너 실행
다음으로, 데이터베이스 컨테이너를 실행합니다. 여기에서는 MySQL을 사용하는 예제를 보여드리겠습니다.

arduino
Copy code
$ docker run -d --name mysql-db -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql
위 명령어는 MySQL 데이터베이스 컨테이너를 실행하고, my-secret-pw라는 비밀번호로 root 계정의 암호를 설정합니다.

스프링 컨테이너 실행
이제 스프링 컨테이너를 실행합니다. 이때, 데이터베이스 컨테이너와 공유할 볼륨을 생성하여 마운트합니다.

shell
Copy code
$ docker run -d --name spring-app -p 8080:8080 --link mysql-db:mysql -v /path/to/local:/var/lib/mysql spring-app
위 명령어는 스프링 컨테이너를 실행하고, 데이터베이스 컨테이너와 연결(link)합니다. 또한, /path/to/local 디렉토리를 MySQL 컨테이너의 /var/lib/mysql 디렉토리에 마운트하여 데이터베이스 파일을 로컬 디스크에 저장합니다.

스프링 애플리케이션에서 데이터베이스 사용
스프링 애플리케이션에서 데이터베이스를 사용하기 위해, application.properties 파일에서 데이터베이스 URL을 설정합니다.

bash
Copy code
spring.datasource.url=jdbc:mysql://mysql-db:3306/mydatabase
spring.datasource.username=root
spring.datasource.password=my-secret-pw
위 설정에서 mysql-db는 --link 옵션을 통해 컨테이너 이름이 지정된 MySQL 컨테이너에 대한 DNS 이름입니다.

이제 스프링 애플리케이션에서 데이터베이스를 사용할 수 있습니다.

 

 

 

 

 

 

 

728x90