• 풀스택 개발자가 정말 옳은 직군일까

    필자는 현재 반 백수와 다름없는 생활을 계속 이어나가고 있다. 스스로 창업하려 한 스타트업은 절대 이것 가지고 못 먹고산다는 현실적인 결론이 나와 차라리 비영리적/실험적 성격을 키우는 거창한 프라이빗 프로젝트로 돌려버렸고, 일자리를 알아보는 것도 영 쉽지가 않다. 구성원 한명 한명이 큰 목소리를 낼 수 있고 자유로운 분위기가 유지되는 국내 스타트업 위주로 계속 알아보고는 있는데, 시스템 엔지니어나 시스템 어드민 같은 서버 관련 일자리는 정말 드물다. 다행히 1~2주 전 정말 마음에 드는 스타트업에서 면접을 보고 왔긴 했지만 아직까지 감감 무소식이다…

    지금 일어나는 일은 특히 한국에서 두드러지는 풀스택 선호 경향 때문에 일어나고 있는 일이라 생각한다. 물론 이건 큰 기업에는 해당되지 않는다. 사람에 투자할 돈이 많을수록 더 세분화된 팀을 구성할 수 있기 때문이다. 다만 필자가 현재 원하는 곳은 비교적 작은 스타트업/벤쳐기업이다. 소수정예로 움직이며 열정을 불태울 수 있는 최적의 장소라고 느꼈기 때문인지 뭔지는 잘 모르겠다. 사실 기업일수록 풀스택을 선호하는 것은 어쩌면 당연하다. 돈은 없어 사람은 최소한으로 뽑아야 하니 자연스럽게 뭐든지 할 수 있는 사람한테 눈이 갈 수밖에 없다. 이해한다. 다만 이들은 동시에 ‘다룰 수 있다’ 와 ‘전념할 수 있다’ 는 전혀 다른 문제라는 것을 간과하고 있다. 조금 극단적으로 비유하자면 “나는 운전 잘 하니 보험따위 필요 없다!” 의 상태일지도 모르겠다.

    모 블로거는 ‘한국형’ 풀스택 개발자를 “막일을 하는 잡부” 라고 표현했다. 필자는 절대 틀린 말이 아니라고 생각한다. 정말 여러가지 일을 모두 미친듯이 잘 할수 있으면 얼마나 좋겠냐먄, 그건 드문 경우다. 어떻게 그렇게 단정할 수 있냐고 물어볼 수도 있다. 필자가 그런 상태였기에 단정할 수 있다. 긴 반 백수 생활을 하면서 여러 기술에 손을 대봤지만, 결국 깊게 공부한 것은 별로 없다. 몸과 마음만 피폐해졌을 뿐이다. 물론 단순히 ‘여러가지 일에 손대는 것’을 비판하는 건 절대 아니다. 사람은 언제나 새로운 것을 배우며 앞으로 나아가지 않는가. 필자도 이것저것 만져보며 더 넓은 분야를 이해하게 됬고, 나중에 누구와 수다를 떨더라도 할 얘기가 왕창 생겼다. 이 뒤죽박죽한 이야기의 결론은 개인/팀 프로젝트 단위에서의 풀스택은 스스로의 발전에 큰 도움이 되겠지만, 본업에서는 적어도 직책에 ‘풀스택’ 이라는 단어는 들어가지 않도록 하자는 것이다. 구성원 모두가 자기가 가장 좋아하는 분야에 전념할 수 있어야 최고의 결과물이 나올 수 있다.

    정말 철저하게 필자의 기준와 입장에 맞추어 작성한 글이지만, 기업들이 당장의 인건비 절감보다는 조금 더 먼 앞을 보고 결과물을 위해 인간에게 투자하는 이상적인 미래로 나아가길 바란다. 그래야 필자도 일자리를 구할 수 있을 것 같다…

  • Docker 네트워크에 관하여

    Docker 컨테이너도 물론 VM처럼 각 공간마다 다른 IP주소를 할당받을 수 있다. 하이퍼바이저의 GUI 창에서 마우스만 깔딱거리다 Docker의 까만 터미널을 마주했다고 해도 사실 크게 다른 점은 없다. 걱정하지 말고 이번 포스트를 쭉 읽으며 실용적인 Docker에서의 네트워크 설정법에 대해 알아가자.

    기본 Docker 네트워크


    위 간단히 만들어본 이미지가 바로 Docker의 기본적인 네트워크 구성이다. Docker를 설치한 호스트 컴퓨터에는 docker0라는 가상 브릿지 인터페이스가 생긴다. 새로운 컨테이너를 생성하면 이 docker0vethxxxx 인터페이스로 시작하는 터널이 쭉 파져서 컨테이너의 eth0 인터페이스와 연결되는 것이다. 컨테이너는 브릿지 네트워크를 통해 결국 호스트 컴퓨터의 네트워크 인터페이스로 외부로 통신함으로 iptables를 사용해 포트 접근 등의 제어가 가능하다.(물론 iptables를 사용하지 않는 환경을 위해 docker-proxy라는 프로세스가 또 존재하긴 한다.)

    Docker에서는 추가로 호스트 컴퓨터와 같은 네트워크 환경을 사용하는 설정이나, 다른 컨테이너의 네트워크 환경을 공유하는 설정 등이 존재하지만, 위의 기본 설정만으로도 많은 서비스 환경을 커버할 수 있으니 이 포스트에서는 따로 설명하지 않겠다. 이 부분 관련하여 자세한 내용을 원하는 분들은 이 블로그 참고를 추천한다.

    Docker 네트워크

    그럼 여기서 하나 궁금증이 생긴다. 평소 필자는 VM을 사용할 때 호스트 컴퓨터의 네트워크 인터페이스와 브릿지로 묶고 같은 네트워크에 접속하여 사용하는 것을 좋아한다. 무슨 말이냐면 내 공유기의 IP 대역이 192.168.0.0/24일때, 호스트 컴퓨터는 192.168.0.1, VM은 192.168.0.2 주소를 사용하는 것이다. 이런 구성방식을 ‘Flat 네트워크’라 한다. 물론 모든 VM이 같은 브로드캐스트 영역에 놓이게 되어 규모가 커지게 되면 절대 사용이 권장되지 않는 구성법이지만, 개인적인 용도로 굴릴때 이것보다 간단한 방법은 없어 자주 애용한다. 그럼 이 Flat 네트워크 구성법을 Docker 컨테이너와는 사용할 수 없는 것인가? 정답은 ‘가능하다’ 이다.

    이 구성을 위해 우리는 브릿지 설정 도구인 bridge-utils을 사용할 것이다. CentOS 기준 sudo yum install -y bridge-utils 명령어로 간단하게 설치할 수 있다. 원래 OpenVSwitch를 이용해 DHCP로 공유기에서 IP를 받아오는 설정을 구성하려 했지만, 어디에서 꼬였는지 계속 필자를 괴롭혀서 결국 고정 대역을 미리 잡아놓고 공유기 네트워크와 연결하는 방법으로 경로를 수정했다. 삽질로 날라간 몇시간과 고통받은 몸에 묵념을.


    필자의 테스트 환경은 아래 위 이미지와 같다. 그럼 바로 시작해보자.

    sudo brctl addbr br0 # br0 브릿지 생성.
    sudo brctl addif br0 enpxxxx # br0에 enpxxxx(연결할 네트워크 어댑터 이름) 연결.
    sudo brctl setfd br0 0 # br0 초기화.
    ifconfig br0 192.168.2.2 netmask 255.255.255.0 # br0의 IP 주소를 192.168.2.1, 서브넷 마스크를 /24로 설정.
    

    여기까지 끝났으면 이제 CentOS 기준 /etc/sysconfig/network-scripts 로 이동해 브릿지와 네트워크 인터페이스의 설정 스크립트를 만져주자. 파일 이름은 브릿지의 경우 ifcfg-br0, 네트워크 인터페이스는 ifcfg-enpxxxx 로 잡혀 있을 것이다. 많이 파일이 보이지 않는다고 해도 걱정하지 말고 새로 하나 만들어주면 된다.

    DEVICE=br0
    TYPE=Bridge
    IPADDR=192.168.2.2
    NETMASK=255.255.255.0
    ONBOOT=yes
    BOOTPROTO=none
    NM_CONTROLLED=no
    DELAY=0
    

    위는 레드헷 홈페이지에서 직접 제공하는 모범적인 브릿지 스크립트의 예시이다. 적당히 참조해 고쳐 쓰면 된다.

    DEVICE=enp0000
    TYPE=Ethernet
    HWADDR=AA:BB:CC:DD:EE:FF
    BOOTPROTO=none
    ONBOOT=yes
    NM_CONTROLLED=no
    BRIDGE=br0
    

    마찬가지로 네트워크 인터페이스 스크립트다. 참고로 저기 적힌 NM_CONTROLLED는 RHEL 7(CentOS 7)부터 달린 골칫덩이 NetworkManager가 손댈 수 없게 해주는 설정이다.

    모두 작성하였으면, sudo systemctl restart network로 네트워크 서비스를 재시작 해준다. 잘 하셨다. 이제 브릿지의 준비는 끝났다. 마지막으로 Docker가 이 브릿지를 받아먹게 설정해주면 끝.

    sudo docker network create --driver=bridge --ip-range=192.168.2.0/24 --subnet=192.168.2.0/24 --aux-address='ip1=192.168.2.10' -o "com.docker.network.bridge.name=br0" br0
    

    내가 사용한 새로운 Docker 네트워크를 생성하는 명령어다. 나머지는 대충 읽어도 무슨 의미인지 알겠는데, --aux 옵션이나 -o는 무슨 의미잇지 햇갈릴 것이다. 전자는 내가 등록한 네트워크 인터페이스 (브릿지)가 사용하는 추가적인 IP 주소. 대충 내 네트워크 대역 안의 안 사용중인 주소를 입력해주면 될 것 같다. 후자는 추가적인 네트워크 인터페이스 옵션이다. 실제 브릿지 br0와 연결해주는 역할이라고 생각하면 편하다. 마지막 br0은 이 Docker 네트워크의 이름을 br0으로 하겠다는 말이다.

    이제 브릿지와 연결되는 Docker 네트워크 생성도 끝났다. 한번 컨테이너를 생성해보자.

    sudo docker run -i -t --network=br0 ubuntu
    

    --network 깃발로 어떤 Docker 네트워크를 사용할 것인지 지정해줄 수 있다. 위처럼 입력하면 당연히 br0을 사용하게 된다. 아무것도 지정하지 않으면 기본 설정인 docker0에 연결한다.

    생성한 컨테이너에 들어가 인터넷 연결은 제대로 되는지, 내 네트워크 안에 있는 다른 기기와 ping은 잘 주고받아 지는지 확인해보자. 아마 별 문제 없을 것이다. 물론 이 방법이 완전히 정답은 아니지만 (오버레이 네트워크를 만들어 다른 서버들과 통신할 수도 있다. 더 확실하고 ‘힙’한 방법. 나중에 이 포스트 아래에 추가해 두겠다.), 중/소규모 환경에서 깔끔하게 하나의 네트워크로 컨테이너와 여러 서버들을 연결시키는 용도로는 훌륭하다. 가장 시스템 엔지니어들이 스트레스 안 받는 방법이라 할 수 있겠다. 하고보면 복잡할 것 없고 금방 끝날 설정인데, 이상하게 필자는 삼천포를 헤매다 와서 몇시간이 걸렸다. 분명 제대로 설정한 것 같은데 외부 연결이 안되고 난리가 아니였다. 브릿지 설정을 모두 밀고 다시 해보았더니 언제 그랬냐는듯 깔끔하게 해결… 다른 분들은 이런 실수를 반복하지 않기를.

    일단 거의 대부분의 환경에서 동작하는 Docker는 위 두가지 설정법으로도 커버가 가능할 것이다. 다만, 아까 언급한 오버레이 네트워크 같은 것도 있고, 조금 더 다루고 싶은 내용들이 존재할 수 있으니 이 포스트는 시간날 때 틈틈히 업데이트 할 예정이다. 삽질에 고통받은 필자와 읽느라 수고한 독자 모두 수고하셨다.

  • DockerFile과 Docker-Compose

    이전 포스트에서 기본적인 Docker의 개념과 설치법, 이미지 등을 다뤘다. 아직 안 읽어보셨다면 참고하시길.

    DockerFile, 그리고 Docker-Compose


    마치 Docker 이미지와 컨테이너의 관계가 그랬듯, DockerFile과 Docker-Compose는 땔래야 땔 수 없는 관계이다. 우선 DockerFile 이미지를 실행하면서 특정 작업까지 같이 처리하게 해주는 도구고, Docker-Compose는 다수의 컨테이너를 쉽게 실행할 수 있게 도와주는 도구이다. 다시 말해, Docker-Compose로 컨테이너를 자동 생성한 후, DockerFile로 생성한 컨테이너 안에 자동으로 세팅 작업까지 돌아가게 할 수 있다는 것이다.

    지금부터 Docker 공식 메뉴얼을 참고해 DockerFile과 Docker-Compose를 모두 사용하는 예제를 작성할 것인데, 아직 Docker-Compose를 설치하지 않은 여러분들은 아래 과정을 먼저 밟고 따라와주시면 고맙겠다.

    Docker-Compose 설치하기

    이전 포스트와 동일하게 필자는 CentOS에서 설치를 진행하였지만, 이번에는 GitHub에서 직접 파일을 끌어올 것이라 다른 리눅스 배포판들도 설치 방법이 동일하다. 그냥 따라오셔도 무방할 것 같다. 원본 메뉴얼은 이곳에서 확인할 수 있다.

    curl -L "https://github.com/docker/compose/releases/download/1.11.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    

    curl로 Docker-Compose의 GitHub 저장소에서 필요한 파일을 끌어온다. 혹시라도 /usr/local/bin 경로에 권한 문제가 있어 접근이 안 되시는 분들은 위 명령어를 입력하기 전 sudo -i 명령어로 root 권한을 받은 후 진행하시길 바란다.

    chmod +x /usr/local/bin/docker-compose
    

    파일 끌어오기가 완료되었다면, chmod 명령어로 해당 경로에 실행 권한을 준다.

    여기까지 끝났다면, docker-compose --version 명령어를 입력해보자. 정상적으로 Docker-Compose의 버전이 출력된다면 설치 성공.

    본론

    이제 정말로 DockerFile과 Docker-Compose를 모두 활용해 무언가 생성해볼 시간이다. Redis가 실행되는 컨테이너 위에 Flask가 돌아가는 환경을 간단히 만들어 보도록 하겠다.

    mkdir composetest
    cd composetest
    

    먼저 composetest라는 실험을 진행할 폴더를 만들고, 그 안으로 들어간다. 이제 원하는 텍스트 에디터로 app.py라는 새로운 파일을 만들어 아래의 내용으로 채워넣는다.

    from flask import Flask
    from redis import Redis
    
    app = Flask(__name__)
    redis = Redis(host='redis', port=6379)
    
    @app.route('/')
    def hello():
        count = redis.incr('hits')
        return 'Hello World! I have been seen {} times.\n'.format(count)
    
    if __name__ == "__main__":
        app.run(host="0.0.0.0", debug=True)
    

    코드를 대충 읽어보면 알겠지만, Flask가 당신에게 인사를 해주며 몇 번 마주쳤다고 친절하게 알려까지 주는 귀여운 코드다. 그대로 저장하면 된다.

    다시 requirements.txt라는 파일을 하나 더 만든 후, 아래 내용을 넣어준다. 무엇이 이 애플리케이션에 필요한지 명시해주는 파일이다.

    flask
    redis
    

    마찬가지로 저장하고 나오면 된다.

    이제 DockerFile을 작성해보자. Dockerfile이라는 파일을 만들어, 아래처럼 내용을 집어넣으면 OK.

    FROM python:3.4-alpine # Python 3.4를 사용하는 이미지를 기준으로 시작.
    ADD . /code # 현재 위치(.)을 이미지의 /code 위치에 넣기.
    WORKDIR /code # 작업 위치를 /code로 설정.
    RUN pip install -r requirements.txt # 아까 requirements.txt에서 명시한 필요한 소프트웨어 설치.
    CMD ["python", "app.py"] # 컨테이너의 기본실행 명령어를 python app.py로 설정.
    

    위 스크립트 내용에 주석을 달아뒀으니 참고 바란다.

    자. 컨테이너가 실행되면 어떤 내부작업이 돌아갈 것인지 DockerFile에 명시해 뒀으니, 이제 컨테이너 자체를 실행하는 Docker-Compose를 설정해 보자. docker-compose.yml이라는 새로운 파일을 생성하고 아래 내용을 넣어보자.

    version: '2' # Docker-Compose 버전 2 사용.
    services: # 컨테이너별 서비스 정의.
      web: # 웹서버 부분.
        build: . # 현 위치의 DockerFile을 사용해 이미지 빌드.
        ports: # 웹서버 포트.
         - "5000:5000"
        volumes: # 웹서버 저장소.
         - .:/code
      redis: # Redis 부분.
        image: "redis:alpine"
    

    Docker는 서비스별로 컨테이너를 분리시키는 것을 좋아한다. 그게 컨테이너 기술의 의의기도 하니까 말이다. 웹서버와 Redis 컨테이너를 따로따로 만들어 보겠다. DockerFile과 마찬가지로 위 스크립트에 주석을 달아뒀으니 참고하길 바란다.

    준비는 모두 끝났다. 바로 가동시켜 보자. docker-compose up 명령어를 치면 끝. 컨테이너가 모든 준비를 스스로 마친 것 같으면 웹 브라우저를 키고 http://localhost:5000 주소로 접속해보자. 아래같은 실행값이 보이면 성공.

    dockercomposeruned

    이곳에서는 간단한 웹 애플리케이션을 실행하는 것만 보여줬지만, 이것을 응용해 활용할 수 있는 분야는 무궁무진하다. 내 개인, 또는 팀의 서비스가 Docker에 담기는 상상을 해봐라. 그리고 그로 얻을 수 있는 모든 이점을 상상해보자. 모 블로그의 표현처럼 Docker는 단순 생산성 뿐만 아니라 인간의 상상력 자체를 자극하는 도구가 분명하다.

    다음 포스트에서는 Docker에서 팍팍 밀어주는 클러스터링 툴인 Docker-Swarm에 대해 다뤄보려 한다. 모두 수고 많으셨다.

  • 어서오세요. Docker의 세계에.

    Hello, Docker!


    Docker. 많이 들어보셨을 것이라 생각한다. 개발자가 VM의 늪에서 허덕일 때 나타난 구세주가 아닌가? 필자는 개발자(Dev) 보다는 시스템 엔지니어(Ops) 계열이기에 더더욱 Docker를 사용할 일이 많다. 다만 요근래 취직을 못해서 관련 지식은 있어도 직접 다룰 일은 거의 없었는데, 얼마 전 면접을 보고온 스타트업에 들어가게 되면 Docker를 바로 업무에서 사용할 것 같기에 결과 기다리는 시간 중 김칫국 마시며 Docker를 되짚어 보려 한다. 이 포스트부터 철저히 필자에게 초점이 맞춰진 Docker 이야기를 시작하겠다. 최대한 noob부터 pro까지 포괄적인 커버가 가능하게 글을 작성하려 하니 모두에게 도움이 됬으면 좋겠다.

    Docker?

    대체 Docker가 무엇인데 그러냐? VM의 늪에서 구원을 해준다는게 뭔 소린가? 도구는 사용할 목적이 있어야 빛을 낸다. 처음 Docker를 만나는 분들에게는 당연하고도 중요한 질문이다. 그런데 Docker 자체를 만지기에 앞서 컨테이너 기술부터 이야기를 시작하겠다. 영어로 무언가 담을 수 있는 공간을 컨테이너라 한다. 무언가(애플리케이션, 서버)를 담을 수 있는 공간을 만들어주는 기술. 그게 컨테이너 기술이다. Docker는 그런 컨테이너 기술을 다루는 하나의 플랫폼이다. 개인 PC에서 Docker로 독립된 공간을 만들어 깔끔하게 애플리케이션을 구축하고, 패키지(이미지)로 만들어서 업무 서버에 가져다 넣으면 그대로 작동된다. 다른 사람과 자유롭게 공유도 할 수 있다. 물론 다른 사람이 미리 만들어둔 이미지를 다운받아 조금 뜯어 고쳐 사용할 수도 있다. 어디서 많이 본것들 아닌가? 바로 VM이다. 지금까지 VM이 위에서 말한 일들을 가능하게 했다. 그럼 컨테이너 기술을 사용한다는 Docker와 다른 점은 무엇일까? VM은 하드웨어와 운영체제까지 가상화하지만 컨테이너 기술은 공간만 나눈다. 즉, 호스트 컴퓨터와 운영체제 커널과 시스템 리소스를 공유한다는 소리다. 더 이상 기존 VM처럼 운영체제 가상화 등으로 추가적인 리소스 소모를 하지 않아도 된다는 거다. 당장은 VM을 사용할 때 느끼던 장점은 따오고 단점은 보완한 이상적인 녀석이라고 이해해도 크게 문제는 없을 것 같다. 시간과 글 쓸 공간은 얼마든지 있으니, 더 자세한 Docker의 매력은 차차 진행하면서 알아보도록 하자.

    Docker 설치하기

    필자는 CentOS를 사랑하니 CentOS 기준으로 아래 내용을 작성했다. 혹시 레드헷 배포판을 사용하지 않는 분들은 여기를 참고하시면 된다.

    sudo yum install -y yum-utils
    

    위 명령어로 yum-utils를 설치하고 시작하자.

    sudo yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo
    

    위 명령어는 Stable 버전의 Repo를 등록해준다. 참고로 저기 도메인 끝의 docker-ce는 무료 버전을 뜻하는 Docker Community Edition의 줄임말이다. 혹시 정말 중요한 기업 시스템을 돌리기 위해 Docker를 알아보고 있고 전문 기술팀의 지원이 있으면 좋을 것 같다는 분들은 이것을 읽어 보시길 바란다.

    sudo yum makecache fast
    

    이제 위 명령어로 yum 패키지 목록을 업데이트한다.

    sudo yum install docker-ce
    

    업데이트가 끝났으면 위 명령어로 Docker를 설치하면 된다. 참 쉽죠?

    혹시라도 특정 버전의 Docker를 정해 사용해야 하시는 분들은 위 명령어 뒤에 원하는 버전을 sudo yum install docker-ce-<VERSION> 이런 식으로 붙혀 주시면 된다.

    sudo systemctl start docker
    sudo systemctl stop docker
    

    설치가 완료된 Docker는 다른 애플리케이션과 마찬가지로 위처럼 제어할 수 있다.

    Docker 이미지와 컨테이너

    VM에서의 ‘이미지’를 떠올려 보자. 가상화된 OS, 변경점, 데이터 등 모든 것이 이미지에 들어 있고, 그 이미지를 복사해서 똑같은 VM을 다른 곳에 또 생성할 수도 있다. Docker에서의 이미지도 크게 다르지 않다. 필요한 애플리케이션이나 라이브러리, 데이터 등이 들어있는 저장 단위이다. 고맙게도 Docker는 Docker Hub라는 자체 저장소 서비스를 제공한다. 이곳에서 사람들이 만들어 둔 수많은 이미지를 필요에 맞게 끌어와 사용할 수도 있고, 내가 만든 이미지를 다른 사람들과 나눌 수도 있다. 혹시 VM에서의 복잡하고 용량 큰 이미지 공유를 생각했다면 잊어도 좋다. Docker는 이미지 공유를 처음부터 생각하고 디자인 된 플랫폼이다. OS 가상화 데이터 등 VM 이미지에서 가장 부피를 많이 차지하던 것들이 없어져 대부분의 Docker 이미지는 생각보다 크기가 아주 작다. 거기에 Docker는 유니온 파일 시스템을 사용해 이미지의 각 정보를 계층(레이어) 단위로 나눠 저장하여 새로운 이미지를 끌어온다 하더라도 내가 이미 가지고 있는 정보가 있다면 그 부분은 생략해주는 멋진 능력까지 가지고 있어 실 체감 용량은 훨씬 적어지기도 한다.프라이빗한 사용이 필요할 경우 자체 저장소 서버를 구축하거나 GitLab 등에서 제공하는 팀 전용 컨테이너 저장소를 이용하는 등 방법은 아주 많으니 필요에 맞게 선택하면 된다.

    이제 이미지는 대충 알겠는데, ‘컨테이너’는 뭘까? Docker 이미지를 실행한 것이 바로 컨테이너다. 별 것 없다. 이미지는 각종 필요한 데이터가 저장되있는 파일. 그리고 그것을 실행한 것이 컨테이너. 이렇게 생각하면 된다. 혹시 기존에 Docker를 인터넷에서 검색해본 경험이 있다면 이미지와 컨테이너가 같이 언급되는 것을 본 적 있을 것인데, 입문자에게는 두 개념이 혼동될 수 있는 위험이 있어 최대한 짧고 간결하게 정리했다.

    주절주절 이미지와 컨테이너에 대해 떠들어봤는데, 이제 직접 만져보는 시간을 가져야 흥미가 떨어지지 않을 것이다. 터미널을 띄우고 docker -v 명령어를 입력해 아까 설치한 Docker가 제대로 설치되었는지 확인하자.

    sudo docker run hello-world
    

    위 명령어는 “Hello World”를 출력하는 테스트 이미지를 Docker Hub에서 다운로드해, 바로 실행까지 해주는 역할을 한다. 정상적으로 문구가 출력되었다면 이제 Docker의 세계에 본격적으로 발을 담굴 준비가 되었다는 뜻이다. Docker에는 run 뿐만 아니라 여러 강력한 명령어들이 존재한다. 이 블로그에 아주 훌륭하게 정리가 되어 있으니 꼭 참고하길 바란다.

    예를 들어, 최신 Ubuntu 컨테이너를 실행하고 싶으면 아래처럼 입력하면 된다.

    sudo docker run -i -t ubuntu
    

    참고로 저기 run 명령어 뒤에 붙은 -i, -t 옵션들은 각각 상호작용을 뜻하는 interactive와 터미널을 뜻하는 Pseudo-tty다. 필자도 머리 아프니 너무 깊게 생각하지 않아도 된다. 위 명령어를 실행했으면 최신 Ubuntu 이미지를 끌어와 자동으로 컨테이너가 실행된 후, 마치 ssh 연결을 한 것처럼 터미널 입력창까지 바뀌게 된다. 이제 이 독립된 공간에서 자유롭게 해집고 다닐 수 있다. 아, 여기에 exit를 입력하면 컨테이너의 전원도 같이 꺼뜨리고 나가지니 주의. 컨테이너를 그대로 살려둔 상태로 나가길 원한다면 ctrl + p, ctrl + q를 순서대로 누르면 된다.

    수고 많으셨다. 앞으로 이어질 포스트에서 자세한 활용 방법과 관련 도구 등을 다룰 예정이니 잠깐 휴식하는 시간을 가지길 바란다 :)

  • 민주주의가 승리한 날, Replica 무료 배포

    Replica?


    Replica는 모든 국민이 국가에 의해 감시, 통제당하는 디스토피아 사회를 그린 게임이다. 고정된 도트 그래픽의 화면에서 스마트폰을 이리저리 누르는 것으로 진행되는데, 한국인 개발자가 만든 게임이라 그런지 국내에서 벌어진 각종 사안 (국정원의 카카오톡 감청, 언론 통제나 게임 중독 등)이 신랄하게 녹아있어 필자도 출시 직후 구매해 인상깊게 즐긴 게임이다.

    그리고 바로 오늘. 2017년 3월 10일. 대한민국에서 민주주의가 승리한 날에 Replica의 개발자 SOMI가 하루동안의 Replica의 무료 배포를 선언했다. 달콤한 민주주의를 맛보며 감사하는 마음으로 게임을 즐기도록 하자. 평소 달랑 게임이 무료 배포 행사를 한다고 일일히 GitHub 페이지에 올리는 일은 없다. 다만 오늘같은 날이면 이런 특별한 게임이면 또 상황이 달라지지 않는가.

    이곳에서 Windows와 macOS용 Replica를 다운로드 받을 수 있다.

    대한민국의 주권은 국민에게 있고, 모든 권력은 국민으로부터 나온다. - 대한민국 헌법 제 2항.