2021년 11월 8일 월요일

도커(Docker) 컨테이너를 다른 컴퓨터로 옮겨서 실행하기

직장 전상망 내에서 Bactopia를 사용하면서 가장 불편한 것은 일부 general dataset이 SSL 인증서 문제로 다운로드가 불가하다는 것이다. 소위 SSL 가시성 확보를 위해 설치한 웹프록시 장비에서 발급한 인증서를 인정하지 못하는 상황이 벌어지기 때문이다. 장비 제조업체에서 제공하는 인증서를 웹 브라우저 등 일부 애플리케이션에 설치하여 대부분의 업무는 해결이 가능하지만, 프로그램에 따라서는 매우 까다로운 설정을 요구하는 것이 있다. 우분투나 CentOS 각각에 맞추어 system-wide하게 인증서를 설치하는 방법을 따라서 진행을 해도, 파이썬 코드 안에서 직접 파일을 다운로드하도록 짜 놓은 애플리케이션에서는 한계에 부딛히고 만다. 함수를 직접 건드려서 이 문제를 해결하는 방안이 인터넷에 종종 보이지만, 나는 파이썬을 잘 하지도 못하고 더군다나 고칠 곳이 여러 군데라면 여간 성가신 일이 아니다!

그래서 집에 리눅스 서버를 하나 더 설치해 둔 뒤 여기에서 필요한 파일을 받은 다음 이를 다시 직장에 가져와서 덮어 씌우는 번거로운 노력을 들여야만 했다. 이런 편법을 이용하여 Bactopia를 사용해 왔었다. 

만일 도커(Docker)를 이용하여 Bactopia를 사용한다면, 집 서버에서 이를 어떤 형태로든 export하여 직장 컴퓨터로 가져온 뒤 실행하면 되지 않을까? 생각이 여기까지 미쳐서 이를 실제로 테스트해 보기로 하였다. 

도커를 사용한다면 집에 있는 서버가 실제 직장 서버와 같은 리눅스 배포판을 쓸 이유도 없다. 노트북 컴퓨터를 들고 다니면서 도커 환경을 구축한 뒤 파일 형태로 가져올 수만 있으면 된다. 자, 그러면 시작해 보자. 우분투에 최신 도커 엔진을 설치하는 방법은 공식 문서에 잘 나오니 라를 따라하면 된다.


노트북 컴퓨터(집)에서

$ sudo docker pull bactopia/bactopia 
$ mkdir bactopia
$ cd bactopi
$ sudo docker run --rm -it --workdir /bactopia --volume $(pwd):/bactopia:rw bactopia/bactopia:latest bactopia datasets

도커 컨테이너가 생성·실행되면서 general dataset이 현재 디렉토리에 설치되고, 도커는 곧 종료된다. 현 디렉토리(bactopia) 하위에 만들어진 datasets(2021년 11월 7일 기준으로 1.1 GB)를 그대로 가져다가 직장 컴퓨터에 만들어진 Bactiopia 환경에 그대로 복사를 해도 된다. 실제로 지금까지 해 온 방식과 같다. 단지 도커를 사용하지 않았을 뿐이다.

그러나 이렇게 다운로드한 데이터셋을 한 덩어리의 파일로 전환한다면 다른 곳에 이전하기도 쉽고 교육 등의 목적에 활용하기에도 편리할 것이다. 그러기 위해서는 일단은 도커 컨테이너 형태로 실행 중이어야 하고 파일의 위치도 살짝 바꾸어야 한다. /bactopia 안에 설치된 datasets 디렉토리와 하위 구조들이 컨테이너의 export 결과물에 포함될 것 같지만 내가 테스트해 본 바로는 그렇지 않았다. 현재 상태에서 컨테이너를 다시 기동한 뒤 /bactopia 하위의 자료를 컨테이너 내부의 다른 곳으로 복사해 두어야만 했다. 혹시 내가 잘못 알고 있는 것은 아닌지 모르겠다.

다음과 같이 현재의 작업 위치에서 다시 도커 컨테이너를 생성하되, 편의상 test라는 이름을 붙인다('--name test'). 그리고 /bactopia/datasets을 /datasets으로 복사한다.

$ sudo docker run --rm -it -w /bactopia -v $(pwd):/bactopia:rw --name test bactopia/bactopia:latest
(base) root@6016f6628419:/bactopia# cd ..
(base) root@6016f6628419:/# cp -r bactopia/datasets/ .

이 상태에서 터미널 창을 하나 더 열고 'docker export' 명령을 이용하여 실행 중인 컨테이너를 파일로 저장한다. 

$ sudo docker export test > save.tar

한 덩어리의 파일로 전환하였으므로 어디로든 복사하여 가져갈 수 있다.


실제 작업을 할 서버 컴퓨터(직장)에서

save.tar 파일 다른 컴퓨터로 복사했다 하여도 이를 직접 로드할 수는 없다. 이를 도커 이미지 저장 창고에 밀어 넣은 뒤에 실제로 사용이 가능하다. 이때 사용하는 명령어는 'docker import'이다. 

$ sudo docker import save.tar test
sha256:54f65ae7f5b380804d5b5ffa220774fd5a6c4da90eba1ee47e8554cc498b71e9
$ sudo docker image ls
REPOSITORY                       TAG                    IMAGE ID            CREATED              SIZE
test                             latest                 54f65ae7f5b3        About a minute ago   2.97 GB
hyjeong/ununtu                   v3                     731d875559ed        2 days ago           72.8 MB
hyjeong/ubuntu                   revised                cf60cacf2511        2 days ago           72.8 MB
docker.io/ubuntu                 latest                 ba6acccedd29        3 weeks ago          72.8 MB
docker.io/hello-world            latest                 feb5d9fea6a5        6 weeks ago          13.3 kB
docker.io/centos                 latest                 5d0da3dc9764        7 weeks ago          231 MB
docker.io/ncbi/pgap              2021-07-01.build5508   d84e714fc606        4 months ago         8.43 GB
docker.io/bactopia/bactopia      latest                 20dfd67122b5        5 months ago         1.82 GB
docker.io/antismash/standalone   latest                 c535168192d3        5 months ago         10 GB

특별히 tag를 지정하지 않았다면 'latest'가 붙을 것이다. 이제 컨테이너를 기동해 보자. 간단히 확인만 하기 위하여 복잡한 옵션은 하나도 붙이지 않았다. 단, 이번에는 맨 마지막에 엔트리포인트('bash')를 지정해 주어야 한다.

$ sudo docker run --rm -it test:latest
/usr/bin/docker-current: Error response from daemon: No command specified.
See '/usr/bin/docker-current run --help'.
$ sudo docker run --rm -it test:latest bash
(base) root@451b3e3692f2:/# ls datasets/
antimicrobial-resistance  ariba  minmer  species-specific  summary.json
(base) root@451b3e3692f2:/# ls -l datasets/
total 4
drwxr-xr-x 2 root root   63 Nov  7 23:59 antimicrobial-resistance
drwxr-xr-x 2 root root  102 Nov  7 23:59 ariba
drwxr-xr-x 2 root root  141 Nov  7 23:59 minmer
drwxr-xr-x 3 root root   29 Nov  7 23:59 species-specific
-rw-r--r-- 1 root root 2021 Nov  7 23:59 summary.json
(base) root@451b3e3692f2:/# du -sh datasets/
1.1G	datasets/서

서버 컴퓨터에서 실제로 Bactopia 분석 작업을 하려면 디렉토리 구성을 어떻게 하는 것이 바람직한지는 약간 머리를 써야 되겠다.

이 과정을 익히기 위하여 다음 웹문서를 주로 참조하였다.

[~/xo.dev] 실행 중인 Docker 컨테이너를 파일로 저장하고 다시 불러오기


삽질 후기

도커 콘테이너 안에서 외부 자료를 가져오려다가 또 SSL 인증서 문제로 막혔다. 어휴... 도커 이미지를 고치느니 적당히 쓰고 말겠다. 물론 도커 잘못은 아니지만.

댓글 없음: