Docker는 가상 머신처럼 독립된 실행환경을 만들어주는 것으로, 운영체제를 설치하는 것과 유사한 효과를 낼 수 있지만, 실제 운영체제를 설치하지 않기 때문에 설치 용량이 적고 실행 속도 또한 빠르다. 원도우에 VM Ware와 같은 가상 머신을 설치하여 사용했으나 최근에는 리눅스 계열에서 Docker가 그 역할을 대신하고 있다.
도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싼다. 여기에는 코드, 런타임, 시스템 도구, 시스템 라이브러리 등 서버에 설치되는 무엇이든 아우른다. 이는 실행 중인 환경에 관계 없이 언제나 동일하게 실행될 것을 보증한다.
출처: 위키 백과
실무에서는 우분투 환경에 CentOS container를 설치하여 사용하거나, 이미 검증된 Web server의 설정 및 Binary가 설치된 container를 설치하여 복잡한 configuration 과정을 줄일 수 있다.
구성 단순화 Docker는 하나의 Configuration으로 모든 플랫폼에서 실행할 수 있다. Configuration 파일을 코드에 넣고 환경 변수를 전달하여 다른 환경에 맞출 수 있다. 따라서 하나의 Docker 이미지를 다른 환경에서 사용할 수 있다.
코드 관리 Docker는 일관된 환경을 제공하여 개발 및 코딩을 훨씬 편안하게 만들어준다. Docker 이미지는 변경이 불가하기에 개발환경에서 운영 환경까지 애플리케이션 환경이 변경되지 않는 이점이 존재한다.
개발 생산성 향상 개발 환경을 운영 환경에 최대한 가깝게 복제할 수 있다. Docker를 사용하면 코드가 운영 환경의 컨테이너에서 실행될 수 있으며 VM과 달리 Docker는 오버 헤드 메모리 용량이 적기에 여러 서비스를 실행하는데 도움이 된다. 또한 Docker의 Shared Volume을 사용하여 호스트에서 컨테이너의 어플리케이션 코드를 사용할 수 있도록 할 수 있다. 이를 통해 개발자는 자신의 플랫폼 및 편집기에서 소스 코드를 편집할 수 있으며 이는 Docker내에서 실행 중인 환경에 반영된다.
애플리케이션 격리 Web Server(e.g. Apache, Nginx)와 연결된 API 서버를 격리할 필요가 있는 경우가 있다. 이 경우 다른 컨테이너에서 API를 서버를 실행할 수 있다.
빠른 배포 컨테이너가 OS를 부팅하지 않고 어플리케이션을 실행하기 때문에 Docker 컨테이너를 매우 빠르게 만들 수 있다.
Docker는 Client (docker)와 서버 (dockerd)로 구성되어 있다. Docker Images는 read only의 docker container를 생성하기 위한 template이고, Container는 images가 실제 메모리에 로딩된 instance이다. 하나의 images로 유사한 container를 만들 수 있다. Registry는 Docker hub이며 images의 저장소이다.
Docker 구조 (출처: https://docs.docker.com/get-started/overview/)
도커를 리눅스 환경에 설치하는 방법은 아주 간단하다.
sudo wget -qO- http://get.docker.com/ | sh
위 명령어를 실행하면 바로 설치가 된다. 설치 후 아래 명령어를 실행시켰을 때 아래 이미지처럼 출력되면 끝이다.
sudo docker run hello-world
Docker 명령어
Docker run -> Docker 컨테이너를 실행
docker run -it --name test ubuntu:latest
-it -> 컨테이너를 실행시키는 동시에 interactive 한 터미널로 접속한다.
--name -> 컨테이너 id는 알아보기가 어렵기에 구분하기 쉽도록 이름을 지정한다.
-it 옵션을 붙였기에 명령어 실행 후 새로운 터미널에 접속된 것을 확인할 수 있다.
컨테이너의 이름이 test1인 것을 확인할 수 있다.
docker images -> 도커 이미지 리스트를 출력
위에서 도커가 설치됐는지 확인할 때 생성한 hello-world 이미지와 docker run 명령어 예시를 들 때 생성한 ubuntu 이미지가 출력되는 것을 확인할 수 있다.
docker ps -> 실행 중인 도커 컨테이너 리스트를 출력
확인을 위해 아래 명령어를 실행시키고 나서 docker ps 명령어를 실행하면
docker run -it -d --name test1 ubuntu:latest
docker run 명령어에서 -d 옵션은 백그라운드에서 컨테이너가 계속 실행되도록 해준다.
test1 컨테이너가 출력되는 것을 확인할 수 있다.
옵션으로 -a를 넣고 실행하면 실행되었던 컨테이너까지 출력이 된다.
docker stop -> 실행 중인 도커 컨테이너를 중단
docker stop (컨테이너 id)와 같은 방식으로 사용하는데 id는 다 칠 필요 없고 겹치는 숫자가 없을 때까지만 입력해주면 된다. 예를 들어 1234, 1289 2개의 컨테이너가 있다면 123 까지만 처도 1234 컨테이너가 중단된다.
docker rm -> 도커 컨테이너를 삭제
test, test1 컨테이너를 중단하니 docker ps, docker ps -a 명령어에서 출력되지 않는 것을 확인할 수 있다.
docker rmi -> 도커 이미지 삭제
ubuntu 이미지가 삭제된 것을 확인할 수 있다.
만약 아래와 같은 에러가 뜬다면
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/images/json": dial unix /var/run/docker.sock: connect: permission denied
아래 명령어를 실행시키시면 된다.
sudo chmod 666 /var/run/docker.sock
[1] https://url.kr/mx4l21
[2] https://docs.docker.com/get-started/overview/