0부터 시작하는 Docker 공부 - Docker Compose - Network & Volume 정의하기

Jaehong Lee·2022년 8월 22일
3
post-thumbnail

1. Network 정의하기

  • 네트워크를 지정하지 않으면 별도의 네트워크가 생성된다. 이때, 기존에 생성되어 있는 네트워크를 재사용하고 싶다면 어떻게 해야 할까

network 생성과 지정

  • test1net 이라는 network 를 생성하자
docker container run -it --name centos01 --net test1net centos:7
  • 새로 생성한 network 를 지정하여 컨테이너를 배포해보자
  • 외부와 통신이 잘 된다
  • 컨테이너 상세 정보에 들어가서 network 정보를 확인하면, test1net network 에 연결되있는 것을 확인할 수 있다
  • 현재 위와 같은 구성이다

docker compose file 에 network 정의하기

services:
  web:
    image: httpd
    ports:
      - "80"
    command: httpd -D FOREGROUND
    depends_on:
      - db
    links:
      - db:mysql
    networks:
      - test1net

  db:
    image: mysql:5.7
    environment:
      - MYSQL_DATABASE=testdb
      - MYSQL_ROOT_PASSWORD=test123
    networks:
      - test1net
networks:
  test1net:
    external: true
  • 그냥 정의만 하면 디렉터리 이름 + 작성한 이름의 새 network 가 생성된다. 이때, external 옵션을 사용하면, 해당 이름의 새 네트워크 생성이 아닌 기존에 생성된 network 를 활용하게 해줄 수 있다

    • external: true 는 새 network 가 만들어지지 않고, 기존 network 에 연결되게 하는 옵션이다
    • 새 network 생성시 이름은 디렉터리 이름_작성한 이름 으로 생성된다
  • services 의 컨테이너에 network 를 지정하면, 밑에 networks 에 작성된 network 를 참조하게 된다. 만약, networks 에 network 를 정의하지 않으면, 새 network 가 생성된다

  • 배포한 컨테이너의 상세 정보를 확인하면, 지정한 network 에 연결된 것을 확인할 수 있다

  • 네트워크 리스트를 확인하면 새 네트워크가 생성되지 않은 것을 확인할 수 있다

  • 위와 같이 구성해보았다. 이를 통해 같은 네트워크에 있는 컨테이너들을 같은 네트워크 상의 다른 컨테이너를 통해 관리해줄 수 있다

2. VOLUME 정의하기

Host 의 volume & 외부 스토리지의 volume

  • volume list 를 확인하자. 임시 volume 들도 확인 가능하다
  • Host 의 volume 을 사용하게 되면, 사용자가 서버에 저장한 DATA 가 다른 서버에는 저장되지 않는다. 이로 인해, 사용자가 같은 서버에 접속하는 보장이 없으므로, 만약 다른 서버에 접속한다면, 전에 저장한 DATA 를 조회못하는 문제가 생긴다. 이를 해결하기 위해 외부 스토리지의 volume 에 연결해서 어느 서버에 접속해도 DATA 가 유지되게 해야 한다
    • 이때, 이 외부 스토리지의 volume 을 persistent volume ( pv ) 라고 한다

volume 정의하기

p. 230

  • VOLUME 역시 기존 VOLUME 을 활용 가능하다. 만약 VOLUME 을 지정하지 않는다면 디렉터리 이름을 이용하여 신규 생성한다
services:
 web:
  volumes:
   - testvolume1:/var/www/html # 볼륨을 연결
   - testvolume2:/var/www/html # 새 볼륨을 생성하여 연결
 
volumes:
 testvolume1:
  external: true # 기존에 만들어 둔 testvolume 을 사용한다
 testvolume3: # 새 볼륨 생성
  • 위와 같이 volume 을 새로 생성하며, external 옵션을 사용하면 기존의 volume 을 사용한다

volume 생성 & 연결하기

  • 다음과 같이 volume 을 생성하고, web 컨테이너에 연결되게 작성하자
  • 컨테이너를 배포하면, volume 이 새로 생성되는 것을 확인할 수 있다. 이때, volume 의 이름은 디렉터리 이름_지정한 볼륨 이름 으로 생성된다

기존 volume 사용하기

  • 위와 같이 volume 에 external 옵션을 true 로 하여 기존의 volume 을 사용하게 정의하자

  • 사용할 volume 을 하나 생성해주고, 컨테이너를 배포하면 volume 이 새로 생성되지 않고, 기존의 지정한 volume 과 연결된다

  • compose 에서 생성한 volume 과 network 는 down 을 통해 컨테이너를 삭제하면 같이 삭제된다. 허나, compose 가 아닌 기존에 생성한 volume 과 network 는 down 을 통해 컨테이너를 삭제해도 volume 과 network 는 삭제되지 않는다

volume 사용법

  1. nfs : 디렉터리 마운트
  2. iscsi : 스토리지에서 volume 을 생성하고, 이를 컨테이너의 /dev/sda* 과 같은 형태로 연결
  3. tmpfs : 디스크가 아니라 RAM 에 저장되는 것으로 영구 보관이 불가능 하다

nfs 방식 사용해보기

  • 디렉터리를 하나 생성해서 안에 파일을 생성하자
  • docker-compose.yaml 파일의 web service 의 volume 에 다음과 같이 추가하자
  • 생성된 컨테이너의 내용을 확인하면 test.txt 가 있는 것을 확인 가능하다

3. extend 옵션

  • extend 옵션은 yaml 파일을 추가적으로 만들거나 하나의 yaml 내에서 추가 컨테이너 내에 기본 내용을 작성하고, 이를 다른 파일이나 서비스에서 상속하여 사용하는 방법

  • 주로, 두 개의 파일을 만들어 두고, 이를 상속받는 방법을 사용한다

extend 사용해보기

  • 두 가지 yml 파일을 생성하자. 기준이 되는 파일은 extend-compose.yml 이다
version: '3.7'
services:
  web:
   extends:
     file: extend-compose.yml
     service: testweb
  • docker-compose.yml 에 위와 같이 작성하자
    • 사용할 파일은 extend-compose.yml 이며, 해당 파일에서 정의한 service 중 testweb 에서 정의한 내용을 가져와서 사용한다는 것 이다
    • extend 로는 link 와 같은 의존성이 있는 옵션들은 가져올 수 없다
version: '3.7'
services:
  testweb:
   image: httpd
   ports:
     - "80"
  • extend-compose.yml 파일에는 위와 같이 작성한다. testweb 에 대한 정의를 하였다

배포하기

  • 두 가지 yaml 파일을 모두 사용하여 배포 해야 한다
dc -f docker-compose.yml -f extend-compose.yml up -d
  • 위와 같이 두 가지 yaml 파일을 모두 배포한다
  • 배포시에는 두 가지 컨테이너가 배포됬다고 보이지만, ps 로는 test2_web_1 만 배포되었다. Port 역시 yml 파일을 상속 받아 80번 포트에 연결한 것을 확인할 수 있다
  • container ls 로 확인해보면, testweb 도 실제로는 배포된 것을 확인할 수 있다
rapa@rapa:~/0822/test2$ cat docker-compose.yml ; echo ; cat extend-compose.yml 
version: '3.7'
services:
  web:
   extends:
     file: extend-compose.yml
     service: testweb

version: '3.7'
services: 
  testweb: 
   image: httpd 
   ports:
     - "80" 
  • 코드는 위와 같다

4. 이미지 정의

p. 228

  • docker-compose.yml 과 Dockerfile 이 있을 때
version: '3.7'
services: 
  web: 
    build: .
  • 위와 같이 build: . 을 하면, 현재 디렉터리의 Dockerfile 을 이용해 이미지를 생성하여 사용한다
profile
멋진 엔지니어가 될 때까지

0개의 댓글