“Docker 1.0 발표에 대한 Hacker News 토론” 에서 “Docker Misconceptions” 라는 포스팅을 보았습니다.

오해: Docker를 배우면, 다른 시스템 관련된 것들은 더 이상 안 배워도 된다?

그렇지 않습니다. 운영 환경에서 Docker 를 쓰려면 다음과 같은 것들을 매우 깊게 관리해야 합니다. secured private image repository (index), orchestrating container deploys with zero downtime, orchestrating container deploy roll-backs, networking between containers on multiple hosts, managing container logs, managing container data (db, etc), creating images that properly handle init, logs, etc. 그리고 이밖에도 훨씬 더 많은 것들이 필요합니다.

오해: Docker 컨테이너 1개 당 1개의 프로세스만 가져야 한다?

이것도 그렇지 않습니다. 단일 프로세스 단위가 아니라 “역할 기반 가상 머신"의 방향으로 Docker 를 관리하는 것이 좋습니다. 나쁜 예는 ssh, cron, app, web server 를 각각 컨테이너로 나누는 것이고, 좋은 예는 app, db, redis 를 컨테이너로 나누는 것입니다. 이 주장은 이론적으로 논쟁이 있습니다. 동의하지 않는다면 “Microservices - Not a free lunch! - High Scalability” 를 읽어 보라고 권합니다.

오해: Docker를 사용하면, configuration management (CM) tool이 필요 없다?

부분적으로 사실입니다. Docker를 사용하면 설정 관리의 필요성은 낮아집니다. 하지만 provision, deploy, manage your servers 를 위한 orchestration tool은 절대적으로 필요합니다. Ansible 같은 툴이 이런 곳에 쓰기 좋습니다. (Ansible 이 짱이라는 내용이 뒤에 이어집니다. 생략합니다.)

오해: Docker를 당장 사용해야만 하겠군!

지금 당장 운영환경에 Docker를 도입하려면, 운영 환경이 다음을 만족해야 합니다. secured least-privilege access (key based logins, firewalls, fail2ban, etc), restorable secure off-site database backups, automated system setup (using Ansible, Puppet, etc), automated deploys, automated provisioning, monitoring of all critical services, 그리고 문서화를 비롯한 그 밖의 것들입니다.

인프라의 심각한 구멍(critical holes in your infrastructure) 을 가지고 있는 채로 Docker 를 사용하려는 것은, 불안정한 절벽 끝에 페라리를 주차해 놓은 것과 같습니다.

오해: 속도와 일관성을 위해 Docker를 사용해야만 하겠군!

여기에는 Docker를 사용하지 않고 속도와 일관성을 유지하는 방법들이 나옵니다. 설정 관리 도구인 Ansible, Puppet 사용하기, 클라우드 이미지 사용하기, Version Pinning(버전 명시하기) 같은 것들입니다. 예를 들어 설정 관리 도구에서 nginx 가 아니라 ’nginx version 1.4.6-1ubuntu3’ 처럼 정확히 명시해서 설치하는 것을 말합니다. 그 외에도 배포 버전 관리, 배포 패키징이 있습니다.

그럼 언제 Docker를 사용해야 하지?

개발 환경에서 Vagrant를 쓰고 있다면, 당장 docker로 전환할 수 있습니다. 저도 얼마 전에 대부분 docker 로 옮겼는데 빠르고 관리하기 좋습니다. 운영 환경에서는 가능하면 Docker를 사용하지 않고 위에서 언급한 최적화 방법들을 따라가는 쪽을 권하는, 원문 글쓴이의 결론입니다.