본문 바로가기
카테고리 없음

06. (실습) 나만의 컨테이너 생성 - namespace

by Engineer-Lee 2022. 6. 27.
반응형

요구사항:
- 호스트명 변경, 프로세스 ID 변경, 프로세스 리스트 정보 변경
1단계: "run" 명령어 전달 시 run 함수 실행
2단계: 새로운 프로세스에서 명령어 실행
3단계: 새로운 UTS 설정 추가 → hostname 변경
4단계: 컨테이너 환경 시작 시 호스트명을 container로 변경
5단계: 컨테이너 환경에서 ps명령 실행 시 제한된 프로세스 정보만 조회. 루트 파일 시스템 변경

 

 


1단계

해당 코드를 보면 switch문에 os.Args[1]로 go 명령어 중 두 번째 단어가 run이면

컨테이너에서 파일을 실행시키는 run() 함수를 호출시켰다.

 

go 명령어에선 인자의 세 번째 값은 CMD, 네 번째 값은 ARG이므로

os.Args[2:] 를 통해 CMD ARG가 실행 중이라고 출력한다.

 

go run . run ls -l 명령어를 통해 실행해보면 잘 출력이 된다.

여기서 go run . 다음의 run은 CMD이고 ls -l은 ARG가 된다.

 

 

 

 

2단계

os/exec 패키지를 추가하고

exec.Command() 함수를 통해 새로운 프로세스를 만들어서 전달받은 Args[2], Args[3]를 기반으로 명령어를 실행했다.

해당 명령의 stderr, stdin, stdout은 os의 stderr, stdin, stdout으로 출력된다.

 

go run . run pwd 명령어를 통해 실행하면 현재 디렉토리 목록이 커맨드에서 잘 출력된다.

 

 

 

 

3단계

새로운 UTS 설정을 추가하기 위해 syscall 패키지를 추가하고

cmd.SysProcAttr를 통해 프로세스를 생성할 때 CLONE_NEWUTS라는 attribute를 지정했다.

따라서 새 프로세스를 실행할 때 새로운 네임스페이스를 지정한다.

 

must() 함수는 에러가 발생했을 때 에러를 확인하고 프로그램을 종료시킨다.

 

sudo su 명령어를 통해 루트 계정으로 전환하고

go run . run /bin/bash 명령어를 통해 bash 쉘을 열어보면 잘 동작하는걸 확인할 수 있다.

 

별도의 네임스페이스에서 hostname을 container로 설정했기 떄문에 새 터미널을 열어보면 ip주소가 나오는걸 볼 수 있다.

 

 

 

 

4단계

이번에는 컨테이너 환경 시작 시 호스트 명을 container로 변경해보자

추가된 코드로는 run()과 child() 함수이다.

 

child() 함수에서는 기존 3단계의 run()함수와 동일한 기능을 하고 부모에서 파생되었기 때문에 hostname을 변경하는 Sethostname이라는 함수를 시스템콜로 호출했다.

 

run() 함수에서는 자기자신의 프로그램을 실행한 후 그 argument로 child와 사용자에게 전달받은 argument를 추가해서 보내는 동작을 한다. run()함수를 실행을 하면 child() 함수가 실행된다.

 

go run . run /bin/bash 명령어로 실행해보면 잘 동작한다.

 

 

 

 

5단계

컨테이너 환경에서 ps명령 실행 시 제한된 프로세스 정보만 조회되도록 한다.

이를 위해서 새 UTS 뿐만 아니라 새 프로세스 공간을 만드는 PID와 마운트 네임스페이스까지 속성으로 넣었다.

 

전체코드는 아래와 같다.

반응형