-
도커(Docker) 설치하기소프트웨어 개발 툴 2019. 2. 24. 14:09
이 포스트에서는 도커(Docker)에 대해 알아보고 도커를 설치하는 방법에 대해 알아보도록 한다.
목표
- 도커 (Docker)
- 도커 설치 및 실행
도커 (Docker)
도커는 몇 년 전부터 붐을 일으키기 시작해 이제는 주류로 자리잡은 컨테이너라이제이션(Containerization) 기술이다. 도커는 오픈소스 프로젝트로 컨테이너화 기술을 이용해 어플리케이션 개발과 디플로이먼트를 자동화해주고 어플리케이션을 다른 어플리케이션들과 독립적으로 실행 할 수 있게 해준다.
예를들어서 15개의 마이크로 서비스들이 15개의 팀에 의해 개발된다고 치자. 이 15개의 서비스들이 하나의 어플리케이션을 구성한다. 이런 서비스들의 예로는 Authentication Service, Database Service, Application Services, Tracking Services등등이 있다. 다시 말해 하나의 어플리케이션이 정상적으로 동작하기 위해서는 여러가지 서비스의 협력이 필요하다는 뜻이다. 그렇다면 로컬환경에서 개발과 테스트를 하기 위해 15개의 서비스를 전부 실행시켜야 한다는 뜻인가? 그렇다. 전부는 아닐지라도 본인의 서비스가 의존하는 몇 개의 서비스는 로컬환경에서 실행되어야 한다. 이 때, 도커가 없다면 디펜던시가 있는 서비스들을 전부 다운받아 컴파일하고 실행을 해야 한다. (아니면 현재 개발환경이 아닌 QA환경에 연결해서 사용하거나 해야 한다.) 이 때 개발/실행 환경이 다 다르기 때문에 무슨 에러가 날지 알 수 없다. 도커를 이용하면 이런 'Configuration Hell'에서 벗어 날 수 있다. 이런 장점은 QA환경이나 Production환경에서도 동일하기 때문에 도커가 많이 쓰이고 있고, 개발환경과 Production환경을 동일하게 설정 할 수 있다는 점도 큰 장점이 된다.
만약 15개의 서비스가 도커 위에서 실행된다면 각 팀이 해야 할 일은 1가지 뿐이다. 도커 이미지를 만드는 것. 도커 이미지란 실행중인 컨테이너의 스냅샷이다. 비교를 하자면 자바의 클래스와 오브젝트를 들 수 있다. 클래스는 이미지로 컨테이너는 오브젝트로 비유된다. 각팀은 자신의 서비스의 도커 이미지를 만들고 이를 회사의 도커 레지스트리에 올린다. 그러면 나머지 팀들은 해당 도커 이미지를 다운받아 도커에서 실행시킨다. 이 실행중인 이미지를 도커 컨테이너(Docker Container)라고 부른다. 컨테이너가 무엇인지에 대해서는 도커 사이트에서 확인 할 수 있다.
도커 설치 및 실행
백문이불여일견, 도커를 설치 해 보자. 맥 유저는 맥-도커-다운로드에서 윈도우즈 유저는 윈도우즈-도커-다운로드에서 다운로드 할 수 있다. 참고로 계정을 만들어야 한다.
맥을 경우 설치를 하면 이런 로그인 화면이 뜬다. 윈도우즈도 비슷한 화면이 뜰 것이라 생각한다. 로그인을 해 보자. Docker is starting...하고 나오다가 Docker is running...하고 나올 것이다.
Preference페이지는 이렇게 생겼다. Docker Engine is running으로 도커가 돌고 있음을 확인 할 수 있다. 이제 터미널/파워쉘을 켜서 커맨드라인에서 도커를 확인 해 본다.
➜ docker version
Client: Docker Engine - Community
Version: 18.09.2
API version: 1.39
Go version: go1.10.8
Git commit: 6247962
Built: Sun Feb 10 04:12:39 2019
OS/Arch: darwin/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.2
API version: 1.39 (minimum version 1.12)
Go version: go1.10.6
Git commit: 6247962
Built: Sun Feb 10 04:13:06 2019
OS/Arch: linux/amd64
Experimental: false도커가 정상적으로 돌고 있음을 확인 할 수 있다. 이제 튜토리얼의 단골 손님인 hello-world 컨테이너를 실행시켜보자.
➜ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/로컬 환경에서 hello-world라는 도커이미지를 찾을 수 없었으므로 도커가 제공하는 docker registry(Docker Hub)에서 이미지를 받아온다. 이후에 Hello from Docker!가 실행 되는 것을 확인 할 수 있다. 해석해보면 다음과 같다.
1. 도커 클라이언트가 도커 데몬에 요청했다.
2. 도커 데몬이 "hello-world"이미지를 도커 허브(Docker Hub)에서 다운받았다.
3. 도커 데몬이 이 이미지를 이용해 컨테이너를 만들어 이미지를 실행시켰고, 그 이미지가 당신이 현재 읽고 있는 이 아웃풋을 만들었다.
4. 도커 데몬이 이 아웃풋을 도커 클라이언트로 보냈고 도커 클라이언트는 당신의 터미널에 그것을 출력했다.
자 이제 이 아웃풋이 말한게 사실인지 확인 해 보도록 하자. docker ps -a를 이용해 확인 해 보자.
➜ docker ps -a --format 'table {{.ID}} {{.Names}} {{.Image}} {{.Command}} {{.Status}}'
CONTAINER ID NAMES IMAGE COMMAND STATUS
7b62ac5c8ad0 sad_euler hello-world "/hello" Exited (0) 10 minutes ago나는 화면에 보여줘야 해서 --format명령어를 사용했지만 여러분은 그냥 docker ps -a를 사용하면 된다. hello-world 이미지의 컨테이너가 실행됐고, 10분 전에 종료된 것을 확인 할 수 있다. 이번엔 무슨 이미지들이 있는지 확인 해 보자.
➜ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 7 weeks ago 1.84kB위에서 말한 대로 hello-world가 다운 된 것을 확인 할 수 있다.
끝
원래 지금 만들고 있는 스프링부트 To Do 앱 튜토리얼에서 사용할 몽고디비를 실행하기 위해 도커를 다운받은 것 이므로 다음 포스트에서는 몽고디비를 도커에 돌리는 법에 대해 알아보도록 하겠다.
'소프트웨어 개발 툴' 카테고리의 다른 글
비트버켓(BitBucket)에 깃 리파지토리(Git Repository) 만들기 (0) 2019.03.18 아마존 웹 서비스 가입 및 AWS Cli 설정 (3) 2019.03.12 포스트맨(Postman)을 이용한 API 테스트 (2) 2019.02.22 Lombok을 이용해 Constructor/Getter/Setter/Builder에서 벗어나는법 (1) 2019.02.17 Lombok 환경 설정 (2) 2019.02.17 댓글