Docker 실습 환경
Dev OS :
Mac OS Sierra
Terminal :
iTerm
본 포스팅은 Docker networking 설정으로 Docker 컨테이너(?) 끼리 네트워크 환경을 구성합니다. 기본적인 Docker의 활용은 박재성님의 Docker 유튜브 강의를 참고하면 도움이 될 것 같습니다.
Dockerfile 세팅
먼저 실습에 사용할 Docker 이미지와 세팅을 덜 귀찮게 하기 위해 Dockerfile을 세팅 할 계획입니다. Docker로 가상 컨테이너를 올리면 거기에 우분투 설치하고 우분투 설치 후엔 환경설정해주고 필요한 프로그램들 깔고 너무 귀찮죠... 하지만 Dockerfile에 해당 내용들을 작성 후 Docker build 를 하면 우리가 원하는 서버 환경을 손쉽게 세팅 할 수 있습니다.
Dockerfile 에 관한 자세한 강좌는 박재성님 께서 찍으신 유튜브 강의를 참고해 주세요
제가 세팅 한 Dockerfile은 다음 과 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | FROM 1and1internet/ubuntu-16-nginx RUN apt-get update RUN apt-get install -y language-pack-ko # set locale ko_KR RUN locale-gen ko_KR.UTF-8 ENV LANG ko_KR.UTF-8 ENV LANGUAGE ko_KR.UTF-8 ENV LC_ALL ko_KR.UTF-8 RUN apt-get install -y \ vim \ iputils-ping \ net-tools CMD /bin/bash |
|
1 line : 실습에 필요한 nginx가 설치된 ubuntu 16 버전 입니다. 해당 이미지는 docker hub에서 가져 옵니다.
8 ~ 13 line : 우분투 설치 후 한글 인코딩 환경 설정 하는 부분 입니다.
14 ~ 17 line : iputils-ping 은 ping 설치를 위해서 이고, net-tools는 ifconfig 명령어를 사용하기 위해서 입니다.
이제 세팅 된 docker file 이 있는 디렉토리로 이동후 docker build를 하면 됩니다.
! 빌드 하기전에 docker-machine 에서 docker 가상 머신의 상태를 확인해 주세요. 가상머신의 상태가 Running 이 아니면 작동하지 않아요
> docker build -t my-dev . 터미널에 칩니다.
! Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 이런 메세지가 뜨면 당황하지 않고
> eval $(docker-machine env)
터미널에 쳐주세요. 해당 터미널에 Docker-machine 에 관한 환경 값이 적용 되지 않아서 그럽니다.
정상적으로 작동 하면 이미지를 다운받아 설치 하면서 해당 명령어 들을 수행합니다. 꽤 오랜 시간이 걸리니 좀 기다리시면 되요.
! 설치 중 debconf: delaying package configuration, since apt-utils is not installed 이런 메세지가 나왔다면
debconf 쓰실 분들만
보고 해결하시면 될거 같아요 . 제 실습 에는 필요없는 부분 이라 정리하진 않겠습니다.
Docker 컨테이너 network 구성
Docker는 가상 머신 내에 여러대의 컨테이너를 구성할 수 있는데요. 여기서 각 컨테이너들과 가상머신(Docker Host)는 브리지(Bridge)로 연결 되어 있습니다. 제가 오늘 실습할 네트워킹은 간단한 구성입니다. 하나의 Docker Host 아래에 두대의 컨테이너를 띄운 후 그 안에 결정된 ip 주소로 ping을 주고 받는 방식입니다. 처음 실습 했을 땐 nginx 까지 했던거 같은데 거기까지 할지는 잘 모르겠지만... 되게 어렵지 않게 실습 할 수 있습니다.
Docker network에 더 자세한 내용을 알고 싶으신 분들은 아래 Docker docs 홈페이지를 참고해 주세요.
이런 구성 입니다. 위 그림은 위에 링크를 타고 가시면 볼 수 있어요.
이제 본격적으로 network 를 구성해 봅시다. 정말 간단합니다.
> docker network create --subnet=172.25.0.0/16 my-net
이렇게 하면 이름이 my-net인 ip 범위 172.25.0.0/16를 가진 가상 네트워크 망이 생성 됩니다. 나머지 네트워크에 대해선 제가 깊이 잘 몰라 이정도 까지만 할당 하겠습니다.
Docker 컨테이너 실행 시 network 붙여서 실행 하기
이제 다 왔습니다. 이제 아까 설치한 이미지를 실행 할때 network와 port를 설정 한 후 실행하면 끝납니다.
> docker images
터미널에 치면 아까 설치한 이미지가 보입니다.
> docker network ls
역시 위에서 만든 my-net 네트워크가 보입니다. 해당 네트워크 정보를 보기 위해
> docker network inspect my-net
보면 json 형식으로 데이터가 들어 있습니다. subnet을 보시면 위에서 설정한 ip 범위가 되어 있죠.
> docker run -dit --network=my-net -p 8001:8080 --name=my-run1 my-dev
> docker run -dit --network=my-net -p 8002:8080 --name=my-run2 my-dev
터미널에 치면 앞에 8001 번은 docker 호스트를 통해 접속할 수 있는 port 번호 입니다. 뒤에 8080포트는 브릿지 내에 컨테이너 에서 접속하기 위해 열어 놓는 포트입니다. 네트워크 정보는 my-net으로 설정 되고 이미지는 my-dev이미지를 사용합니다. -d은 데몬으로 실행 할 수 있게 백그라운드 실행을 하기 위해서 입니다.
-t 는 터미널 모드고 -i는 음 잘 모르겠습니다. 그냥 터미널에 접속 하려면 -dit 명령어를 쳐주세요.
! 혹시 명령어가 꼬여서 컨테이서 실행을 망쳤다면 과감하게
> docker stop $(docker ps -a -q)
> docker rm $(docker ps -a -q)
로 삭제하고 다시 실행해 주세요
그리곤 해당 컨테이너 이미지에 직접 접속하기 위해
> docker exec -it my-run1 /bin/bash
로 접속 한후 ifconfig 로 ip를 확인하면 172.25.0.2 로 할당됩니다. (1번은 Gateway에요.) ping 을 172.25.0.3 으로 날려 보세요 . 잘 날아 갑니다. exit 후 이번엔 두번째 서버로 들어가 보세요.
> docker exec -it my-run2 /bin/bash
1번 과 마찬가지로 ifconfig 로 ip 주소 확인 후 ping을 172.25.0.2 번으로 날려보세요 . 잘 날아 갈 겁니다.
간단하게 나만의 ip 주소로 가상 네트워크 망을 생성해 docker container를 연결 해 보았습니다. 전 REST ful 예제를 실습하기 위한 프로젝트 진행을 위해 간단하게 작업해 보았는데요. 다들 Docker를 잘 활용해서 여러 프로젝트에 쓰면 유용할 것 같습니다.