2017년 3월 28일 화요일

ppc64le 용으로 특정 버전의 Docker engine build 하기

이전 글에서는 Ubuntu(ppc64le) 에다가 이미 잘 만들어진 Docker 엔진을 받아 간단히 설치했습니다. 그런데 이미 Build 된 Docker engine들은 Docker의 최신 버전은 아니더군요..

이왕 Ubuntu 16.10 버전을 사용하는 김에, Docker engine 도 최신으로 사용해보고자 Docker master binary 사이트를 찾아보았습니다. Docker 최신 바이너리는 현재 17.05 인것 같네요.

ppc64le OS 버전에 맞는 Docker 빌드는 어떻게 하는가?
https://developer.ibm.com/recipes/tutorials/build-docker-ppc64le-on-power-linux/

IBM developer recipe에서 누군가 이미 친절하게 설명해 놓았습니다.

방법 1. Docker Master binary 사이트에서 ppc64le 버전의 파일을 다운로드 받고, /usr/bin에 있던 기존 docker 바이너리와 바꿔치기 합니다.

아래가 현재 사용중인 binaries 입니다.


wget으로 master.docker.org 에서 위의 파일과 같은 이름을 가진 ppc64le 버전을 받아옵니다.
# wget https://master.dockerproject.org/linux/ppc64le/docker && wget https://master.dockerproject.org/linux/ppc64le/docker-containerd && wget https://master.dockerproject.org/linux/ppc64le/docker-containerd-ctr && wget https://master.dockerproject.org/linux/ppc64le/docker-containerd-shim && wget https://master.dockerproject.org/linux/ppc64le/docker-init && wget https://master.dockerproject.org/linux/ppc64le/docker-proxy && wget https://master.dockerproject.org/linux/ppc64le/docker-runc && wget https://master.dockerproject.org/linux/ppc64le/dockerd
# service docker stop
# cp docker docker-containerd docker-containerd-ctr docker-containerd shim docker-init docker-proxy docker-runc dockerd /usr/bin
# service docker start
# docker version


방법 2.위 방법이 잘 되지 않으면, Docker 문서에서 설명하는 것처럼 소스 코드로 직접 Docker 엔진을 빌드합니다. 그러나, 공식 문서는 x86 기준이므로 ppc64le와는 절차가 조금 다릅니다.


방법2를 상세히 보면,
1. 우선 ppc64le Ubuntu OS에 이미 기존에 빌드된 이전 버전의 Docker 엔진을 설치합니다. (이전 포스트 참조)

2. 그 다음 github에서 Docker 소스코드를 Local 영역에 받아오고, 브랜치를 설정합니다.

#mkdir /tmp_downloads
#cd /tmp_downloads
#git clone https://github.com/docker/docker.git
#cd docker

#git branch // 마스터 branch 만들기


#git tag // 소스 버전 확인

#git checkout -b v17.03.0-ce v17.03.0-ce // -b 옵션으로 임의 branch 생성하며 작업할 브랜치 전환(v17.03.0-ce) => git tag로 확인한 소스 버전으로 체크아웃을 수행하면, 도커 엔진 이미지 빌드 후, hack/make.sh 를 수행할때 해당 버전으로 소스코드를 빌드한다고 합니다. go language 버전을 변경하고 싶은 경우, Dockerfile.ppc64le 파일에서 "ENV GO_VERSION 1.7.5" 부분을 수정하면 됩니다. 기본은 1.7.5 버전입니다. (https://golang.org/dl/ 에서 최신 버전의 go language 확인 가능)

3. 이미 github에 작성되어 있는 Dockerfile.ppc64le 를 이용해서 원하는 버전의 Docker-engine 이미지를 빌드합니다.
# docker build -t docker-build -f Dockerfile.ppc64le .
# docker images // docker-build라는 이름으로 새로 생성된 이미지 확인
(아래는 빌드 수행 후 완료된 화면..)



4. 새로 생성된 Docker-engine 이미지로 컨테이너를 하나 실행하고, 이 컨테이너 안에서 스크립트를 수행하여 받아온 소스코드를 빌드합니다. (docker github의 hack/make.sh 스크립트 수행, 시간이 좀 걸림.)
# docker run --privileged --rm -ti docker-build /bin/bash
root@컨테이너ID:/go/src/github.com/docker/docker# hack/make.sh binary
 (완료 메시지를 보면, bundles/17.03.0-ce/binary-client, bundles/17.03.0-ce/binary-daemon 경로에 바이너리 파일이 생성되었다고 나옵니다.)

5. 소스코드 빌드가 완료되면, bundles/latest/binary에 해당 버전의 Docker 바이너리가 생성됩니다. 앞서 git checkout으로 전환했던 브랜치, git tag 버전(17.03.0-ce)대로 만들어졌네요. 경로를 잘 알아둡니다. (containerID:/go/src/github.com/docker/docker/bundles/17.03.0-ce/binary-....)
컨테이너를 빠져나옵니다.(종료되지 않도록 ctrl+P 누르고 ctrl+Q로 빠져나옵니다)
컨테이너에 생성되어 있는 바이너리 파일을 호스트로 copy 합니다.
# docker cp containerID:/go/src/github.com/docker/docker/bundles/17.03.0-ce/binary-client [다운받을 Host 임의 경로]
# docker cp containerID:/go/src/github.com/docker/docker/bundles/17.03.0-ce/binary-daemon [다운받을 Host 임의 경로]
 
 

참고로, 호스트OS에서도 좀전에 컨테이너에서 생성한 파일을 확인할 수 있습니다. (8e9d891....로 시작되는 부분을 어떻게 확인해야 하는지는 잘 모르겠습니다.)

6. 새로 만들어진 바이너리를 /usr/bin에 넣어주고 Docker 데몬을 재수행합니다. Docker 버전이 바뀌었는지 체크하면 완료.
# service docker stop
# cp binary-client/관련파일 /usr/bin/
# cp binary-daemon/관련파일 /usr/bin/
# system docker start
# docker version


여기까지 ppc64le 용도로 특정 버전의 Docker engine build 하는 방법을 알아보았습니다.
사실.. 이미 빌드 된 Docker engine 특정 버전의 바이너리만 있다면 방법 1로 간단히 수행할수 있습니다. 원하는 버전의 바이너리가 없을 때, 혹은 ppc64le용 Docker engine 소스를 스스로 수정하여 빌드하고자 할때 사용 가능한 방법입니다.




댓글 없음:

댓글 쓰기