[docker] docker사용 활용편(volume, network)

업데이트:

이전 글 : [docker] 리눅스 기반 도커(docker)설치 및 명령어 실습


안녕하세요👋
이전 글에서 도커의 기본 명령어들로 간단하게 nginx를 띄워보는 것을 이야기했었는데요 이번글에서는 더 나아가서 docker 컨테이너로 띄운 서비스를 다른 서비스와 연계하여 사용하기 위한 volume과 network 옵션에 대해 소개합니다.

🙏요약

docker volume과 network옵션 명령어를 소개합니다

  1. docker volume 옵션
  2. docker network 옵션

📝docker volume

volume은 도커를 띄우는 환경에 있는 저장공간을 docker 컨테이너의 공간에서 사용하도록 공유하는 것입니다. 이 기능들이 왜 필요한지 redis를 사용해서 알아보도록 하겠습니다.

redis는 메모리 db로 값을 저장해놓고 캐싱으로 자주 사용하는 프로그램입니다 간단하게 db에 값을 저장해보고 volume이 있을때와 없을때의 차이를 알아보겠습니다

docker volume ls 
docker volume create redis-vol

위 명령어를 통해 volume을 확인하고 redis-vol을 생성합니다

docker run -d --name myredis --rm -p 6379:6379 redis:alpine redis-server
docker run -it --link myredis --rm redis:alpine redis-cli -h myredis

위 명령어를 통해 redis server를 띄우고 redis-cli을 통해 redis server에 접속합니다 link옵션은 myredis이름으로 연결할 수 있도록 설정하는 명령어고 network부분에서 다루겠습니다

keys *
set 1 testtext

1번 키로 testtext라는 값을 저장하고 다시 keys * 로 잘 저장이되었는지 확인합니다

docker stop myredis
docker run -d --name myredis --rm -p 6379:6379 redis:alpine redis-server
docker run -it --link myredis --rm redis:alpine redis-cli -h myredis
keys *

그럼 다시 redis를 껏다가 켜서 실행시켜 본뒤 아까 저장한 1이라는 키가 저장되어 있는지 확인해 보면 없다는 것을 알 수 있습니다 이렇게 컨테이너를 새로 생성할 때마다 데이터가 날라가므로 우리는 데이터 저장이 필요한 프로그램(사용하면서 데이터가 채워지는 형태의 프로그램) 볼륨을 사용해야 합니다

설정파일 같은 경우 설정한 내용을 바탕으로 이미지를 저장해놓고 사용하는 것이 편합니다.(commit 명령어시 설명예정)

이제 아까 생성해 두었던 redis-vol을 사용하여 redis를 사용해 보도록 하겠습니다

docker run -d --name myredis --rm -p 6379:6379 -v redis-vol:/data redis:alpine redis-server
docker run -it --link myredis --rm redis:alpine redis-cli -h myredis
keys *
set 1 testtext

아까와 같은 명령어애 -v 옵션을 추가하여 아까 생성한 redis-vol을/data에 연결한 redis 컨테이너를 생성하여 연결하고 같은 방식으로 key를 하나 추가해보겠습니다

docker stop myredis
docker run -d --name myredis --rm -p 6379:6379 -v redis-vol:/data redis:alpine redis-server
docker run -it --link myredis --rm redis:alpine redis-cli -h myredis
keys *

이번에도 redis를 껏다 켜보았는데 어떤가요? 데이터가 그대로 남아있는걸 보실 수 있습니다 이제 volume옵션을 언제 왜 사용하는지 이해했을 것입니다

📝docker network

docker network는 docker 컨테이너끼리 통신할 수 있도록 설정하는 옵션입니다.

docker network ls

위 명령어를 통해 현재 있는 네트워크를 볼 수 있는데요 기본적으로 bridge, host, none이 존재할 것입니다 먼저 도커 network를 하나 생성해 볼텐데요

docker network create --driver bridge [네트워크 이름]

왜 bridge형태의 드라이버를 생성했는지, 여기서 가장 중요한 driver의 종류에 대해 이해할 필요가 있습니다 사실상 생성할수 있는 driver의 종류는 bridge가 유일합니다 (자주 사용되는 네트워크 종류)

  • bridge : network의 default설정 docker container가 이 네트워크 내에서 생성되면 각자의 사설ip를 부여받고 같은 네트워크의 컨테이너끼리 통신이 가능하다
  • host : host라는 이름으로 이미 존재하는 네트워크 종류 이 네트워크에 연결되면 -p옵션으로 포트포워딩 해줄 필요 없이 docker를 실행하는 네트워크와 그대로 따라서 연결된다(host네트워크는 하나만 존재할 수 있으므로 새로 만들수 없다)
  • null : none이라는 이름으로 이미 존재하는 네트워크 종류 이 네트워크에 연결되면 아무 네트워크 없이 독립적으로 컨테이너가 사용되게 된다 (역시 하나만 만들 수 있어 따로 생성할 수 없는 형태이고 왜 만든 네트워크인지 의문이긴 하다 아무 동작도 못하는 연습용 컨테이너가 될 확률이 높아 거의 사용하지 않을 네트워크형태)
  • container : 네트워크를 생성하여 연결하는 것은 아니고 컨테이너 생성시 docker run 에 –net container:[컨테이너이름] 형태로 사용하게 된다. 이는 위 컨테이너와 같은 네트워크를 공유한다는것이고 아예 통신을 할때 127.0.0.1로 localhost를 통해 해당 컨테이너와 통신할 때 사용하게 된다 하지만 사실 이것보다는 bridge형태를 가장많이 사용한다.

이렇게 4가지 종류의 네트워크 종류를 살펴 보았는데요 기본적으로 컨테이너들의 통신은 bridge네트워크를 통한 사설ip를 할당받아 이ip를 통해 통신한다고 보면 되겠습니다.
그럼 아까 생성해두었던 redis:alpine을 통해 네트워크를 연결하는 것을 실험해보고 또 –link옵션에 대해서도 알아보겠습니다.
저는 일단 docker network create –driver bridge mynet 이라는 명령어로 mynet이라는 네트워크를 생성하였습니다.

docker run -d --name myredis --rm --net mynet -p 6379:6379 -v redis-vol:/data redis:alpine redis-server
docker inspect myredis
docker run -it --rm --net mynet redis:alpine redis-cli -h [server네트워크ip]
docker run -it --rm --ney host redis:alpine reids-cli -h localhost(127.0.0.1)

일단 아까와 같은 명령어에서 –net mynet이라는 옵션을 추가하여 redis를 생성하였습니다. 이후 이 redis가 mynet이라는 네트워크에서 어떤 ip를 부여받았는지 확인해야 하는데요 이는 docker inspect myredis(컨테이너이름) 명령어를 통해 확인할 수 있습니다. 길게 컨테이너의 정보가 나오는데 맨 밑에 mynet에서 부여받은 ip가 나오는 것을 확인할 수 있습니다

이 ip를 통해 연결하기 위해 redis-cli을 실행하는 컨테이너를 실행해볼텐데요 아까와 같은 형식에서 –net mynet이라는 옵션을 통해 같은 네트워크에 연결시켜주고 -h [아까 확인한 redis의 ip] 명령어를 통해 잘 연결되는 것을 확인할 수 있습니다. 또한 myredis를 생성할때 -p 6379:6379옵션으로 localhost의 6379포트를 컨테이너와 연결시켜주었으니 host 네트워크를 사용하면 localhost에서 6379포트를 통해 myredis에 연결이 가능합니다.

이런 방식으로 컨테이너끼리 네트워크를 연결시켜서 사용할 수 있습니다.

docker run -d --name myredis --rm -p 6379:6379 -v redis-vol:/data redis:alpine redis-server
docker run -it --rm --line myredis redis:alpine redis-cli -h myredis

위 명령어는 –link명령어를 통해 컨테이너끼리 통신하는 방법인데요 –link [컨테이너이름] 옵션을 사용하면 네트워크를 굳이 만들어서 할당하는 방식으로 통신할 필요없이 해당 컨테이너와 컨테이너 이름을 가지고 통신할 수 있도록 해줍니다. 두개의 컨테이너만이 서로 연결할 필요가 있을때 사용하면 좋겠죠? –link는 –net을 더 효율적으로 사용하는 방법중 하나인데 docker에서는 이 방법을 추천하고 있지는 않습니다. 연습할 때 사용하기 편하므로 알아두시면 좋겠습니다

docker는 처음에 배우기는 쉽지 않지만 사용하다 보면 정말 편리하게 배포를 할 수 있습니다 또한 CI/CD구성과 다른 툴에서도 많이 활용되므로 꼭 알아두는게 좋습니다!

긴글 봐주셔서 항상 감사합니다 앞으로도 유용한 내용을 많이 공유하겠습니다 그럼 안녕 👋

댓글남기기