티스토리 뷰

서비스에 도커를 도입하는 배경을 보면 MSA( Micro Service Architecture )로 부터 시작하기 때문에 사실 Container의 크기가 큰 것은 정상적인 경우가 아닙니다. 컨테이너에는 모듈이나 기능 단위를 동작하게 하는 최소한의 패키지만 포함되는 게 일반적인데 깡통 우분투를 만들어서 그 안에 온갖 서비스를 다 말아 넣는 경우는 어떤 경우가 있을까요? 쉽게 생각하면 MSA 이전의 모놀리식 아키텍처( Monolithic Architecture )를 이야기할 수 있겠습니다.

 

도커는 개발환경과 프러덕트 환경의 간극을 줄이는데 크게 일조하고 있는데 이게 MSA로 정교하게 나뉘어져 있는 서비스에만 국한된 이야기가 아닙니다. 모놀리식 서비스라고 하더라도 개발과 프러덕트 환경에 간극을 없게 할 수 있다면 도커는 꽤 괜찮은 선택이 될 수 있습니다. 흔히 프러덕트 이전에 개발팀 전체가 함께 사용하는 스테이징이나 개발 환경과 같은 인프라를 둘 수 있고 그 밑으로 내려가면 개개인의 로컬 호스트에서 개발을 시작하게 됩니다. 바로 이 부분까지 도커로 말아버린다면 로컬 호스트의 테스트 환경을 컨테이너의 개념처럼 찍어낼 수 있겠습니다.

Local 환경을 도커로 구성 해본다

 

물론 좋은 아키텍처는 아닙니다. 이건 애초에 모놀리식으로 서비스 되고 있는 레거시를 대응하기 위한 일종의 꼼수 정도밖에 안되지만 그나마 개발팀 전원이 같은 환경을 꾸릴 수 있다는 점에서 괜찮은 선택이라고 생각됩니다.

 

서론이 길었는데 이번 글에서는 깡통 우분투를 도커 컨테이너로 올리고 최소한으로 필요한 패키지만 설치하는 과정에 대해 기록합니다. 우선 필요한 우분투 이미지를 LTS 버전으로 가져옵니다. 컨테이너의 이름은 직관적으로 ubuntu로 했습니다.

$ docker run --name ubuntu -p 80:80 -p 443:443 -p 3306:3306 -p 6379:6379 -it ubuntu:16.04 /bin/bash
Unable to find image 'ubuntu:16.04' locally
16.04: Pulling from library/ubuntu
f7277927d38a: Pull complete
8d3eac894db4: Pull complete
edf72af6d627: Pull complete
3e4f86211d23: Pull complete
Digest: sha256:97b54e5692c27072234ff958a7442dde4266af21e7b688e7fca5dc5acc8ed7d9
Status: Downloaded newer image for ubuntu:16.04
root@9cb68ba98e5f:/#

위에서는 우분투 16.04 이미지를 사용했으며 포트 80, 443과 함께 MySQL 3306, Redis 6379를 미리 바인딩시켜뒀습니다. 필요한 포트를 적절하게 넣어주면 되겠습니다. 이미지 다운로드가 끝나면 컨테이너 내부의 프롬프트로 연결됩니다. 우분투 버전은 아래와 같이 확인할 수 있습니다.

root@9cb68ba98e5f:/# cat /etc/issue
Ubuntu 16.04.6 LTS \n \l

환경에서 빠져나오는 방법에는 여러가지가 있지만 그냥 exit로 빠져나오는 걸 추천합니다. 아마도 컨테이너가 종료될 텐데 아래와 같이 재시작하도록 합시다.

$ docker start ubuntu

그러고 나서 이제부터는 컨테이너에 아래와 같이 접속하도록 합니다. 이때부터는 연결할 때마다 새로운 bash로 접속되기 때문에 컨테이너 환경에서 빠져나오기 위해 exit를 입력해도 현재 접속한 bash만 종료됩니다.

$ docker exec -it ubuntu /bin/bash

컨테이너 환경 내부에서 패키지 다운로드 준비를 아래와 같이 진행합니다. ubuntu를 설치하면 기본 설정되어 있는 sources.list에는 여러 가지 제약이 있어서 일단 다음카카오의 레포지토리를 사용합니다.

$ sed -i 's/archive.ubuntu.com/ftp.daumkakao.com/g' /etc/apt/sources.list
$ apt-get update 
$ apt-get dist-upgrade -y

필요한 최소한의 패키지를 설치하도록 합니다. 굉장히 주관적인 내용이죠.

$ apt-get install -y wget vim git gcc  build-essential 

그리고 컨테이너 내부에서 한글을 사용하기 위해 아래와 같이 locale 설정을 업데이트 합니다. 하단에 있는 export LC_ALL=ko_KR.UTF-8 부분은 .bashrc나 .bash_profile에 등록해놓고 사용해주면 되겠습니다.

$ apt-get install locales
$ localedef -f UTF-8 -i ko_KR ko_KR.UTF-8
$ export LC_ALL=ko_KR.UTF-8

여기까지 진행했으면 깡통 우분투의 설정이 끝났습니다. 이 이미지를 공유하려면 일단 컨테이너를 이미지로 새로 생성해줘야 합니다.

$ docker commit CONTAINER IMAGE_NAME

CONTAINER에는 우리가 생성한 컨테이너의 이름인 ubuntu를 사용해주면 되고, IMAGE_NAME에는 생성될 이미지의 이름을 입력해주면 됩니다. 이렇게 이미지를 생성했으면 export는 아래 링크를 참고하면 되겠습니다.
https://jybaek.tistory.com/566

 

이 깡통 우분투가 누군가에게는 도움이 되기를 바랍니다.

 

 

댓글
  • 프로필사진 BlogIcon 헥헥™ 올려주신 글 보고 깡통 우분투를 도커로 올려봤습니다. 그런데 그 우분투 컨테이너 위에 다시 도커는 더이상 설치할 수 없는건가요?
    우분투에서 도커를 실행하면 이런 오류가 발생하고 서비스가 실행되지 않더라고요.. Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
    systemctl 명령어도 작동하지 않아서 인터넷에 올라오는 해결법도 적용할 수도 없구요.. 해결방법이 있을까요?
    2019.10.10 00:40 신고
  • 프로필사진 BlogIcon Jaeyeon Baek 정상적인 접근방식이 아닌듯 한데 컨테이너 위에 도커를 올리려는 이유가 있을까요? 2019.10.10 20:25 신고
  • 프로필사진 BlogIcon 헥헥™ 개인적으로 맥을 사용하는 환경이고 도커를 사용하다 보면 맥에서 안되는 도커 이미지들이 있어.. 우분투 위에서 도커를 돌리면 그런 부분들이 해소되지 않을까 해서.. 시도 중입니다. 2019.10.10 22:17 신고
  • 프로필사진 BlogIcon Jaeyeon Baek macOS라고 돌지 않을 컨테이너는 없을듯 합니다. 애초에 도커 컨셉이 호스트 OS와 무관하게 돌리는거니까요. mac에서 실행되지 않는 원인을 찾으시는게 어떨까요? 2019.10.10 22:24 신고
  • 프로필사진 BlogIcon 헥헥™ cloudbox 같은 이미지는 우분투만 지원한다고 합니다.. 그리고 도커 run하면서 드라이브 마운트할때 shared 붙이면 맥에서는 오류가 나는 이미지들도 있구요. 2019.10.10 22:32 신고
  • 프로필사진 BlogIcon Jaeyeon Baek 제가 깊이 참견(?)할건 아닌것 같지만
    - 혹시 ubuntu만 지원한다거나,
    - shared 붙이면 나오는 에러 상황이나 에러 메시지

    공유해주실 수 있으신가요?
    2019.10.10 22:45 신고
댓글쓰기 폼