CCN, ndn 관련해서 실험을 하려고 하니 ns3 기반의 ndnSIM이라는 시뮬레이터가 필요하다고 한다.
문제는... 역시 윈도우 지원을 안해준다.
그래서 Docker image를 직접 만들어 보기로했다. ns3와 마찬가지로 빌드가 어려웠다.
홈페이지의 설명에 따라 Dockerfile을 만들어보자.
ndnSIM 빌드하기 위한 순서이다.
1. 프로젝트 폴더 만들고 Dockerfile 생성
2. Dockerfile 작성하기
3. Dockerfile build 하기
4. ndnSIM 실행하기
위의 크게 4단계가 ndnSIM을 사용하기 위한 방법이다. 순서대로 자세하게 살펴보자.
** 저는 ubuntu 18.04 환경에서 작성하였습니다.
1. 프로젝트 폴더 만들고 Dockerfile 생성
mkdir [foldername]
Dockerfile을 실행할 프로젝트 폴더를 만들어 줍니다.
cd [foldername]
touch Dockerfile
프로젝트 폴더로 들어가서 Dockerfile을 만들어줍니다.
2. Dockerfile 작성하기
ndnSIM 공식 홈페이지에서는 필요한 패키지 사항을 자세히 알려주고 있으므로 이에 맞춰서 작성하면 됩니다.
*Prerequisites
1. Core dependencies
-
python >= 2.7
-
libsqlite3
-
pkg-config
-
openssl
-
Boost libraries >= 1.54
2. Dependencies for NS-3 Python bindings
홈페이지에서 알려주는 필요 패키지를 이용하여 스크립트를 작성하자.
sudo nano Dockerfile
에디터를 통해 Dockerfile 스크립트를 작성해 줍시다.
FROM ubuntu:16.04
MAINTAINER [MAINTAINER]
RUN apt-get update
ubuntu 16.04 버전을 설정해주고, maintainer를 설정해 줍니다(생략가능). maintainer는 이름@회사명 or 이메일주소를 적어 줍니다. 그리고 apt-get update로 패키지를 업데이트합니다.
#core-dependencies
RUN apt-get -y install build-essential libsqlite3-dev libboost-all-dev libssl-dev git python-setuptools castxml
#dependecies for ns-3 python bindings
RUN apt-get -y install python-dev python-pygraphviz python-kiwi python-gnome2 ipython libcairo2-dev python3-gi libgirep
RUN pip install --upgrade pip
RUN pip install pygraphviz pycairo PyGObject pygccxml
core dependencies와 python binding을 위한 패키지 설치 코드를 작성 합니다. 여기서 apt-get "-y"를 적어주셔야 패키지 다운로드 받을때 abort가 발생하지 않습니다.
#downloading ndnSIM source
RUN mkdir ndnSIM
RUN cd ndnSIM
RUN git clone https://github.com/named-data-ndnSIM/ns-3-dev.git ns-3
RUN git clone https://github.com/named-data-ndnSIM/pybindgen.git pybindgen
RUN git clone --recursive https://github.com/named-data-ndnSIM/ndnSIM.git ns-3/src/ndnSIM
컨테이너 안에 프로젝트 폴더를 설치해주고 git을 통해 source를 다운로드 받습니다.
#compile ndnSIM
WORKDIR /ndnSIM/ns-3
RUN ./waf configure --enable-examples --disable-python
RUN ./waf
git으로 다운받은 ns-3 폴더로 접속하여 waf를 이용해 빌드해줍니다.
ENTRYPOINT ["/ndnSIM/ns-3/waf", "--run=ndn-simple"]
CMD ["--run=test"]
실험에 쓰일 코드를 실행할 스크립트를 작성해줍니다.
FROM ubuntu:16.04
MAINTAINER [MAINTAINER]
RUN apt-get update
#core-dependencies
RUN apt-get -y install build-essential libsqlite3-dev libboost-all-dev libssl-dev git python-setuptools castxml
#dependecies for ns-3 python bindings
RUN apt-get -y install python-dev python-pygraphviz python-kiwi python-gnome2 ipython libcairo2-dev python3-gi libgirep$RUN pip install --upgrade pip
RUN pip install pygraphviz pycairo PyGObject pygccxml
#downloading ndnSIM source
RUN mkdir ndnSIM
WORKDIR ndnSIM
RUN git clone https://github.com/named-data-ndnSIM/ns-3-dev.git ns-3
RUN git clone https://github.com/named-data-ndnSIM/pybindgen.git pybindgen
RUN git clone --recursive https://github.com/named-data-ndnSIM/ndnSIM.git ns-3/src/ndnSIM
#compile ndnSIM
WORKDIR /ndnSIM/ns-3
RUN ./waf configure --enable-examples --disable-python
RUN ./waf
EXPOSE [portnumber]
ENTRYPOINT ["/ndnSIM/ns-3/waf", "--run=ndn-simple"]
CMD ["--run=test"]
full script 입니다.
3. Dockerfile build 하기
sudo docker build -t ndnsim:0.0 .
스크립트 작성 후, -t 를 이용하여 태그를 작성해 주고(패키지명:버전), Dockerfile이 있는 경로를 적어 줍니다.(현재 경로가 Dockerfile이 있는 경로 이므로 . 으로 표현해줍니다.
위와 같이 빌드에 성공 후, 이미지를 확인해 봅니다.
sudo docker images
**docker를 사용할때 권한이 필요해서 root 계정으로 접속하시는게 편할 수 도 있습니다. (su root)
4. ndnSIM 실행하기
이미지를 이용하여 ndnsim 컨테이너 생성하고 실행합니다.
sudo docker run -it -v [host]:[container] --name ndnsim ndnsim:0.0 [--run="script"]
커맨드 설정의 -i, -t 옵션과 호스트와 컨테이너의 데이터를 마운트할 경로와 스크립트 이름을 통해 실행시켜 줍니다.
sudo docker run -it -v ccn:/ndnSIM/ns-3/scratch --name ndnsim ndnsim:0.0 --run=test
*** 커스텀 마운트포인트를 가지는 데이터 볼륨 생성방법
docker volume create -d local -o o=bind -o device=/your/path
***
저는 ccn이라는 호스트 데이터 볼륨과 컨테이너 속 ns-3 프로젝트의 scratch 폴더를 마운트하여 "test.cc" 스크립트를 실행시켰습니다.
ccn이라는 데이터 볼륨를 살펴보면 Options 태그 아래 device 속성을 확인하면 ccn 데이터 볼륨의 위치를알 수 있습니다.
#include<iostream>
using namespace std;
int main() {
cout << "hello world!" << endl;
return 0;
}
test.cc 코드는 간단하게 hello world를 출력하는 코드를 작성하였습니다. 다시 돌아와서 실행 결과를 살펴보면
***
- Real experimetation
실제 실험을 위한 방법으로는 공식 사이트에서는 새로운 프로젝트를 통해 실험하는 것을 권장하고 있다.
# Build and install NS-3 and ndnSIM
cd <ns-3-folder>
./waf configure -d optimized
./waf
sudo ./waf install
cd ..
git clone https://github.com/named-data-ndnSIM/scenario-template.git scenario
cd scenario
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
./waf configure
./waf --run <scenario>
실제로 진행해보았는데 PKG_CONFIG_PATH를 계속 못잡아서 실행이 안되었다... 이유는 좀 더 찾아봐야겠다.
느낀점
도커를 사용법을 어느정도 익혔다. 생각보다 간단한 구조였다. 하지만 깊게 들어가면 Dockerfile 작성 할 때 ENTRYPOINT, CMD, RUN 등의 명령어를 이용하여 내가 실행하고 싶은 형태의 컨테이너를 자유자재로 만드다는 점에서 좀 더 공부가 필요하다고 느꼇다.
위의 코드에서는 ndnsim을 이용하기 위해서 docker run을 이용해서 계속 새로운 컨테이너를 만들고 실행해야 한다는 점이 있다. 이부분을 바꿔보려고 ENTRYPOINT, CMD 를 공부해서 이것 저것 바꾸어도 보고 실행도 직접 해보았는데 하나의 컨테이너에서 exec를 이용해서 실행을 해보려고 했지만 2개의 문제가 발생했다.
1. 1회 실행 후 컨테이너 프로세스가 죽는다
2. 코드 결과물을 현재 작업중인 커맨드 창에서 확인할 수 없었다.
1번 문제의 경우 docker start로 다시 컨테이너를 시작하고 exec를 이용해서 파일을 실행시켜야 했다.
2번 문제의 경우 docker logs를 이용해서 로그를 확인해서 확인할 수 있었다.
아직 docker에 대한 이해가 부족해서 완벽한 해법을 찾지 못했다. 그냥 bash로 컨테이너에 접속해서 실행하는게 제일 편한 것 같기도하다. 그래도 이것저것 docker 명령어의 간단한 개념에 대해서 이해할 수 있었다. 추후의 docker 명령어나 라이프사이클을 좀 이해하고 정리하는 시간이 필요하다고 느꼇다.
**reference
ndnSIM 공식 홈페이지: https://ndnsim.net/current/
ndnSIM 다운로드 튜토리얼: https://ndnsim.net/current/getting-started.html
docker custom mount point : https://stackoverflow.com/questions/54292283/create-volume-with-docker-volume-with-a-custom-mountpoint
docker docs : https://docs.docker.com/
'Docker' 카테고리의 다른 글
[Docker] 도커 시작하기 (Windows) (0) | 2018.05.31 |
---|