컨테이너 안에 패키지를 설치하거나 파일을 생성해야하는 경우가 종종 발생한다. 컨테이너 내부를 변경하는 작업을 컨테이너 개조 라 한다.
직접 개발하거나 혹은 공식 배포되는 소프트웨어도 수정이 필요한 경우가 종종 발생한다. 컨테이너 개조 는 컨테이너 내부를 변경 하는 작업이다.
컨테이너 개조 에는 ① (앞에서 다루어본) 파일 복사 또는 마운트를 이용하는 방법 ② 컨테이너에서 리눅스 명령어를 실행하는 방법 이 있다.
② 컨테이너에서 리눅스 명령어를 실행하는 방법에 대해 자세히 알아보자.
컨테이너에서 리눅스 명령어를 실행하려면 shell(셸) 이 필요하다. 셸 은 사용자의 명령을 해석하여 커널을 작동시키는 프로그램 이다.
컨테이너에서 리눅스 명령어를 실행 하려면 사용자와 커널 간 인터페이스인 shell(셸) 프로그램 이 필요하다. 셸 중에서 대부분 컨테이너에서 설치되어있는 bash 셸 을 기준으로 실습해보자.
컨테이너를 실행하면 기본적으로 bash가 동작하지 않는 상태로 실행 된다. 따라서 bash 프로그램을 따로 실행해야한다. bash 프로그램은 컨테이너 내부의 /bin/bash 경로 에 존재한다.
[컨테이너와 호스트 간 파일 복사] 에서 다룬 docker exec
명령어로 컨테이너 내부에서 리눅스 명령어의 실행이 가능하다.
root@LAPTOP-3H85AI8N:/# docker exec apa00ex1 pwd
/usr/local/apache2
다만 셸 없이 명령 전달하는 방식은 제한적인 명령만 실행 가능하므로, 기본적으로는 셸 프로그램을 실행하여 리눅스 명령을 받을 수 있는 상태를 만들어야한다.
root@LAPTOP-3H85AI8N:/# docker exec -it apa00ex1 /bin/bash
root@7f1be84b1a12:/usr/local/apache2#
위의 커맨드로 apa00ex1 컨테이너 내부로 /bin/bash 명령을 전달하게 된다. 즉, 컨테이너 내부에서 bash 프로그램을 실행하게 된다.
여기서 -it 옵션은 필수적으로 포함 되어야한다. 만약 옵션을 넣지 않는 경우 어떤 문제가 발생하는지 확인해보자.
위처럼 -t 옵션을 제외하는 경우, 명령어 입력과 출력은 가능하지만 우리가 보던 터미널과는 차이가 있다. -t 는 tty(터미널) 환경을 조성해주는 옵션 이다.
위에서는 -i 옵션을 제외한 경우로 터미널 환경은 맞지만 입력한 명령에 대한 출력이 나오지 않는다. -i 는 interactive한 입/출력의 흐름을 만들어주는 옵션 이다.
마지막으로 컨테이너 내부에서 빠져나오려면 exit
명령을 사용 하면 된다.
root@LAPTOP-3H85AI8N:/# docker exec -it apa00ex1 /bin/bash
root@7f1be84b1a12:/usr/local/apache2# pwd
/usr/local/apache2
root@7f1be84b1a12:/usr/local/apache2# ls
bin build cgi-bin conf error htdocs icons include logs modules
root@7f1be84b1a12:/usr/local/apache2# exit
exit
root@LAPTOP-3H85AI8N:/#
컨테이너 내부에는 운영체제 비슷한 것 이 들어있다. 이 운영체제는 리눅스 기반의 다양한 배포판(데비안, 레드햇, 알파인 계열)이 될 수 있다. 컨테이너 내부에서 명령은 어떤 배포판이냐에 따라 조금씩 달라진다.
다만 대부분의 컨테이너는 데비안 계열 이며, 도커 제작사에서도 데비안 계열 컨테이너를 추천하고 있다는 점을 알고 있자.
Tip. 셸 종류
최초의 셸은 벨 연구소에서 스티븐 본이 개발한 본 셸(Bourne shell, sh)이며, 이를 개선한 본 어게인 셸(Bash) 등이 있다.
목적에 따라 도커 엔진을 통한 명령과 컨테이너 내부에서 실행하는 명령에는 차이가 있다.
도커 엔진을 통한 명령 에는 도커 엔진의 시작/종료, 컨테이너 시작/종료, 컨테이너 안팎의 파일을 복사 등이 있다. 컨테이너 내부에서 실행하는 명령 에는 컨테이너 내부의 소프트웨어 설치/실행/종료, 소프트웨어 설정 변경 및 파일 작업 등이 있다.