개발자 일기장

[Docker #2/설치하고 시작하기(Linux)] 본문

Docker

[Docker #2/설치하고 시작하기(Linux)]

kmsjks79 2020. 11. 22. 21:51

이번에는 도커를 설치 해보고 간단하게 서비스를 띄워보도록 하겠다.

설치환경은 centos7 으로 진행하였다.

1
2
3
4
5
6
7
sudo yum update
sudo yum install yum-utils device-mapper-persistent-data lvm2 
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce 
sudo systemctl start docker 
sudo systemctl enable docker
sudo systemctl status docker
cs

 

1. 일단 yum을 업데이트 한다.

2. 도커가 Ubuntu 환경에서 개발되었기 때문에 레드햇 계열의 리눅스인 centOS와의 의존성 문제를 해결하기 위해 진행한다.

3. yum repo에 docker 공식홈페이지의 레포지토리를 등록한다.

4. 도커 설치 진행

5. 시스템 시작 시 도커 실행 설정(원하지 않는다면 하지않아도 상관없음)

6. 도커 실행 상태 확인

도커 실행 상태 확인

도커 설치후 일반적으로 발생하는 오류가 docker daemon이 관리자 권한으로 설치되어 실행되었기 때문에 도커 관련 명령어를 실행하기 위해선 사용자에게 도커의 권한을 주어야 한다.

1
2
sudo usermod -aG docker $USER # 현재 접속중인 사용자에게 권한주기 
sudo usermod -aG docker your-user # your-user 사용자에게 권한주기 
cs

명령어 적용 후에 계정에 재 로그인하면 오류없이 커맨드가 잘 작동하는 모습을 확인할 수 있을것이다.

 

다음은 Dockerfile을 작성 하여 간단하게 주피터 노트북(Jupyter notebook)을 Ubuntu 이미지 위에 실행 시켜 보도록 하겠다. (주피터 노트북은 IPython과 같이 인터엑티브 형식의 라이브 코드를 제공하는 웹 베이스 어플리케이션으로써, 웹 브라우저 안에서 실행하고 싶은 코드를 입력하고 그 결과를 바로 확인할 수 있다. )

도커 설치 이후에 사용자 기본 경로에서 도커파일이 위치할 디렉토리를 생성시킨 후 디렉토리 안에서 도커파일을 생성하였고, 아래는 도커파일의 내용이다.  


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
FROM ubuntu:18.04
RUN apt-get update && yes | apt-get upgrade
RUN apt-get install -y build-essential
RUN apt-get install -y python3 python3-pip openjdk-8-jre wget
RUN apt-get install -y vim
RUN ln -s /usr/bin/python3 /usr/bin/python
RUN ln -s /usr/bin/pip3 /usr/bin/pip
RUN pip install --upgrade pip
RUN pip install jupyter
RUN pip install matplotlib
RUN jupyter notebook --generate-config --allow-root
RUN echo "c.NotebookApp.password = u''" >> /root/.jupyter/jupyter_notebook_config.py
RUN echo "c.NotebookApp.token = ''" >> /root/.jupyter/jupyter_notebook_config.py
RUN echo "c.NotebookApp.notebook_dir = '/home'" >> /root/.jupyter/jupyter_notebook_config.py
EXPOSE 8888
ENTRYPOINT jupyter notebook --allow-root --ip=0.0.0.0 --port=8888 --no-browser
 
cs

1. FROM : 어떤 이미지를 기반으로 할것인지를 명시한다. 여기에는 사용자의 로컬 레포지토리에 있는 사용자가 만든 이미지 또한 사용할 수 있으며, : 뒤에 태그(특정 버전 혹은 이름)를 명시해야한다.
2~14. RUN : 기반되는 이미지안에서 RUN 코드 한줄 한줄 마다 레이어를 쌓으며 이미지가 빌드 된다. RUN 뒤에는 반드시 이미지가 사용하는 OS와 호환되는 명령어를 입력해야 한다. 모든 명령어는 관리자 권한으로 실행되며, 커맨드 입력 이후 추가적인 입력이 요구되는 명령은 사용할 수 없다.
15. EXPOSE : 이미지에서 외부로 노출 시킬 포트를 명시한다. 여러개일 경우 공백으로 구분하여 작성한다.
     ex) 8899 8989 8808
16. ENTRYPOINT : 이미지를 사용하여 컨테이너를 실행 시켰을때의 진입점을 설정해 놓는다.
     ex) ./start_server.sh

** ubuntu:latest 를 사용하면 중간에 지역을 설정하는 부분에서 사용자의 입력이 요구되는 부분이 있기 때문에 18.04 버전으로 진행 하였음.

 

도커파일이 작성 되었으면, 이제 사용자 홈 디렉토리로 위치를 옮겨서 다음 명령어를 실행시켜 이미지를 빌드해 보겠다.

1
2
docker build -t test/jupyter_notebook:ver_1.1 /dockerfile/ 
 
cs

docker build 명령어를 사용할때, -t 옵션을 사용하여 이미지의 저장소이름과 태그를 설정하고 Dockerfile이 있는 경로를 명시해주면 작성한 Dockerfile이 이미지로 빌드된다. 처음 이미지를 빌드할때는 시간이 좀 걸린다. 대략 3 - 5분 정도 후에 다음과 같이 'test/jupyter_notebook:ver_1.1' 의 이름으로 이미지가 빌드 되었음을 알수있다.

 

이미지 빌드 과정
이미지 빌드 종료 

 

빌드된 이미지를 사용해서 컨테이너를 구동시키고 잘 작동하는지 확인 해보도록 하자. 

1
docker run -it -p 8888:8888 -v /home/user/dockerfile/test/:/home --name jupyter_test test/jupyter_notebook:ver_1.1
cs

docker run 커맨드를 사용해 이미지를 컨테이너 단위로 실행 시킬수있다.  docker run 커맨드 옵션은 다음과 같다.

-d : 컨테이너를 백그라운드에서 동작시킨다.
-it : 컨테이너와 통신할 수 있는 tty를 오픈하여 보여준다.
-p : {host port}:{container port} 포트포워딩
-v : 볼륨 마운드 {host volume} : {container} (ex. /root:/mnt/1 ) 
--rm : 컨테이너 종료시 컨테이너 자동삭제
--name : 컨테이너 별명

실행된 컨테이너는 다음 명령어를 통해서 확인할 수 있다.

1
2
docker container ls -a # 모든 컨테이너 조회
docker images # 로컬 저장소의 모든 이미지 
cs

위에서 컨테이너를 실행할때 -v로 호스트OS의 불륨을 마운트 했는데, 이를 실험하기 위해 도커 파일을 작성한 dockerfile/ 을 다음과 같은 구조로 구성하였다.

text.txt
마운트 디렉토리 구조

컨테이너가 실행되었다 -it 옵션을 주었기 떄문에 명령어를 실행한 호스트OS에서 컨테이너 내부의 출력을 확인할수있다. 컨테이너 실행시 곧바로 주피터 노트북이 켜지는 것은 아까 Dockerfile에서 마지막에 작성한 ENTRYPOINT에 의해서 이다.

컨테이너로 실행된 주피터 노트북

 

주피터 노트북을 실행 시켜서 웹으로 docker run 명령어를 실행 했을때 -p 옵션으로 설정 했던 포트인 8888을 사용해서localhost:8888로 접속시 주피터 메인 페이지가 보이며, 파일을 읽었을때 같은 파일임이 확인 되었다. 이제 주피터 노트북 파일을 저장했을때 호스트 OS에도 같이 적용이 되는지 확인해보자.

주피터 노트북 안에서 목록 조회

호스트OS 에서 조회

 

컨테이너에서 저장한 from_jupyter.ipynb 파일이 호스트 OS에도 생성되었으므로 모든 설정이 잘 적용 되었음을 확인할 수 있다. 이와 같이 주피터를 도커 컨테이너 환경으로 실행 시켜 보았다. 도커는 테스트 해본 주피터 노트북같은 단일 프로세스 뿐만아니라 여러가지의 다양한 프로세스를 각각 컨테이너 단위로 실행하여 컨테이너 간의 네트워크를 사용해 서비스를 구축할 수 도있다. 이에 대해선 나중에 다시 포스팅 하겠다. 

Comments