data engineering

docker 동작 기본, 알아둘것

qkqhxla1 2019. 6. 14. 14:47

현재 도커에서 아래의 파일들만을 중점으로 사용하고 있다. 동작 방식으로 정리해놓음.

 

 

1. docker-compose.yml

https://docs.docker.com/compose/overview/ 를 참조한다.

yml파일이며 컨테이너적 환경을 정의하기 위해 사용한다. 도커 이미지는 어떤걸 사용할건지, logging은 어쩔건지, 배포는 어떻게 할건지 등등을 정의한다.

 

 

2. Dockerfile

https://docs.docker.com/engine/reference/builder/
Dockerfile은 어떤 도커 이미지를 만들때(containerization) 기본 실행 환경에 대한 정의를 한다. 예로

FROM ubuntu:18.04

 

RUN mkdir /go

RUN apt-get update && \

 

    apt-get install python python-pip -y

~~

 

이런식의 Dockerfile이 있으면 도커 이미지를 만들때 ubuntu:18.04라는 os를 도커이미지화한다. 그리고 이 ubuntu 18:04에 /go라는 디렉터리를 만들고 apt-get을 업데이트 한 후 python과 python-pip를 설치해라. 라는 명령어다. 그럼 이런식으로 도커파일을 만들면 내가 만든 모든 도커 이미지는 ubuntu 18.04버전에 go라는 디렉터리가 있고 python과 pip가 깔려있는것이다.

 

맨앞의 RUN은 shell명령어를 실행시키겠다는 이야기이고.. COPY로 파일을 복사하거나 ENV로 환경변수를 지정할수 있다. 모두 Dockerfile의 명령어이다. 우리 팀같은 경우 도커 컨테이너가 실행되고 나서 바로 특정 스크립트를 실행시키기 위해 run.sh라는 쉘 파일을 만들고, Dockerfile 마지막에 CMD /run.sh로 실행시킨다.

 

도커 컨테이너 안에 변수를 전달하기 위해서는 환경변수를 설정하는 방법이 가장 일반적으로 쓰인다.

 

 

2.5 내가 도커 동작을 이해하는데 중요했던것중 하나가 COPY였다. 왜냐면 도커 파일에 내가만든 소스파일을 포함시키고자 한다고 가정하자. 현재 내 도커 프로젝트내의 폴더는 다음과 같다.

Dockerfile은 아래와 같다.

FROM ubuntu:18.04 
MAINTAINER qkqhxla1 
RUN mkdir -p /rara 
COPY spark /rara/spark ~~~~~~~ 

여기서 RUN mkdir -p /rara 라인이 실행되면 도커 이미지(ubuntu:18.04)에서 /경로에 rara디렉터리가 생성된다.

그리고 COPY a b는 로컬 위치의 a를 도커파일내의 b로 복사한다는 뜻이다. 즉 COPY spark /rara/spark는 위의 ls를 했을때 보이는 내 spark라는 디렉터리를 도커파일 내의 /rara/spark로 복사한다는 뜻이다. 이런식으로 이후에 도커파일 내로 복사한 파일이나 폴더를 실행할 수 있다.

복사가 잘 되었는지는 도커 이미지를 build한 후 맨 아래의 'docker run -it --entrypoint=/bin/bash ' 명령어로 들어가서 확인해 볼 수 있다.

 

 

3. build. 

docker build ~~ 명령어로 build를 한다. 빌드는 c언어에서 실행시키기 전에 컴파일하는거라고 생각하면 될것같다.빌드를 하면 로컬에 해당 도커이미지가 저장된다. docker image ls로 확인해 볼 수 있다. build시 일반적으로 구분 가능하게 이름을 붙이며 -t옵션으로 가능하다.

 

 

4. push

도커 이미지파일이 로컬에만 있으면 당연히 의미가 없으므로.. docker push ~~로 docker hub에 push를 한다. hub에 저장해놓은 이미지를 remote한 서버에서 docker pull '이름'으로 받아서 쓸 수 있다. 

 

 

5. 디버깅.

도커 이미지를 만든 후 종종 가장 최근의 도커이미지가 내가 패치를 적용한게 적용 된 버전인지 이전 버전인지 헷갈릴 때가 있다. 이때는 'docker run -it --entrypoint=/bin/bash 이미지이름' 으로 그 도커파일 안으로 ssh접속해서 들어가듯이 들어가 볼 수 있다. 들어가서 내 소스파일을 cat해보면 패치되었는지 확인할 수 있다.

 

현재 도커에서 돌고 있지 않은 순수 이미지 안으로 들어가려면 

'docker run -it --entrypoint=/bin/bash {이미지 id}' 으로 들어가고,

 

도커에서 돌고 있어서 docker ps를 했을때 잡히는 도커 프로세스 안으로 들어가려면 

'docker exec -it {컨테이너 id} /bin/sh' 으로 들어간다.

 

팁 추가 : docker image ls로 최근에 빌드한 로컬에 있는 도커 이미지를 가져올 수 있는데, 최근 이미지일수록 위에서 출력된다.

도커 이미지를 만들다보면 디버깅할 일이 참 많은데 항상 docker image ls로 최신 이미지 id검색해서 'docker run -it --entrypoint=/bin/bash {이미지 id}' 치는게 귀찮다. awk를 이용해서 간단히 할 수 있다.

stackoverflow.com/questions/1506521/select-row-and-element-in-awk/1512141

awk로 2번째 행 가져오는법 : awk 'FNR == 2 {print}'

awk로 3번째 열 가져오는법 : awk '{print $3}'

 

docker image ls했을때 가장 최신 이미지는 첫번째 행은 이름이니 제외하고 두번째 행에서 3번째 열이 IMAGE ID이다. 그러니까 위에 것들을 조합하면

docker image ls | awk 'FNR == 2 {print}' | awk '{print $3}' 하면 가장 최신에 만들어진 도커 이미지를 가져오게 되고, 더 조합하면

docker run -it --entrypoint=/bin/bash `docker image ls | awk 'FNR == 2 {print}' | awk '{print $3}'`

요런식으로 하면 가장 최신에 만들어진 도커 이미지로 들어가는 스크립트가 자동으로 완성됨.