Katacoda를 이용한 Docker 공부 총 정리(1)

이 포스트는 Korea Azure User Group에서 진행하는 Docker/Container 스터디 그룹에 참여하며 작성했습니다.

스터디를 진행한 Katacoda 강좌: Docker & Containers/Orchestration

스터디하며 참고한 도서

  • Asa Shiho. (2018). 완벽한 IT 인프라 구축을 위한 Docker (이영란,옮김). 서울:정보문화사. (원서출판 2018).

해당 포스트는 Katacoda 사이트에서 Docker 및 Swarm에 대한 1차 실습이 완료되어 전체를 정리하기 위해 작성했습니다.

아주아주 간략한 개념 정리

Container?

컨테이너는 호스트 OS에 논리적인 구획을 나누고, 어플리케이션을 구동하기위한 최소한의 라이브러리 및 설정파일 등을 하나로 묶어 별도의 서버에서 구동되게 만든 것이다. 호스트 머신의 자원을 논리적으로 분리하고, 공유하며 사용하게 된다. 이로 인해 컨테이너는 필요한만큼의 자원만 사용하기에 가볍고, 빠르게 작동하게된다.

VM?

VM은 호스트 OS에 가상 하드웨어를 통해 Guest OS를 구동해서 또 하나의 OS를 구성하게 된다. 여기에는 Xen, VMWare, VirtualBox, Hyper-V 등의 가상화 솔루션을 이용하게 되고, Guest OS가 구동됨으로써 OS 구동한 자원을 크게 사용하게 된다.

Docker?

어플리케이션이 구동하기위한 필요한 환경을 이미지형태로 모으고, 해당 이미지를 통해 다양한 환경에서 구동할 수 있도록 만들어진 오픈소스 플랫폼이다. Docker에서는 인프라환경을 컨테이너로 관리하고, 어플리케이션 실행에 필요한 모든 파일을 컨테이너로 묶어서 관리 및 운영한다. 그렇기에 다른 운영체제 환경에서도 동일하게 구동이 가능하며, 버전에 민감한 어플리케이션도 손쉽게 이식해서 운영할 수 있다.

Katacoda 내용 정리

컨테이너 이미지 검색, 가져오기, 관리하기

Docker hub에서 제공하는 이미지를 검색하기위해서는 docker search [이미지명] 형태로 찾아볼 수 있으며, Official에 [OK] 마크가 있는 경우에는 해당 이미지를 공식 재단 혹은 운영진이 만들었다고 볼 수 있다.

컨테이너 이미지를 다운받기 위해서는 docker pull [이미지명] 으로 다운을 받거나, 곧바로 실행하고자 한다면, docker run [이미지명]으로 하면 이미지 중 latest 버전으로 다운 및 실행이 된다. 특정 버전을 원한다면 docker pull redis:3.0 와 같이 특정 버전을 입력하면 해당 버전으로 다운로드가 된다. 다운로드 되어있는 이미지를 확인하고자 한다면 docker image ls 또는 docker images로 확인이 가능하며, 이미지를 삭제하고자 한다면 docker image rm [이미지명]을 이용할 수 있다. 만약 더 이상 이용하지 않는 이미지를 한번에 정리하고자 한다면 docker image prune를 입력하면 이용하지 않는 이미지는 전부 삭제가 된다.

컨테이너 실행 및 관리

Docker에서 실행중인 컨테이너를 확인하고자 한다면 docker ps를 입력하면 현재 실행중인 컨테이너를 확인할 수 있으며, 실행중인 컨테이너를 포함해 생성되어있는 모든 컨테이너를 확인하고자 한다면, docker ps -a를 입력하면 모든 컨테이너를 확인할 수 있다. 컨테이너를 중지하고자 한다면, docker stop [컨테이너이름]로 입력하면 중지할 수 있으며, 재시작 및 시작 또한 start 또는 restartstop대신 넣으면 된다.

컨테이너를 통해 주로 실행하는 어플리케이션은 통신이 절대적으로 필요하다. 이는 컨테이너 실행시 접근을 위한 포트를 지정할 수 있다. docker run -p 80:80 nginx를 입력하면 외부포트 80 및 컨테이너 80포트를 연결하게 된다. 만약 docker run -p 80 nginx를 입력하면 컨테이너 내부포트는 80이지만, 외부포트는 랜덤포트로 지정된다. 이렇게 일반 실행을 하면 실행과 동시에 컨테이너의 쉘로 접속하게 되는데 실행시 -d 옵션을 붙이게 되면 컨테이너를 백그라운드에서 실행하게 된다.

컨테이너 데이터 다루기

컨테이너에서 생성되는 데이터는 기본적으로 컨테이너 내부에 저장하게 된다. 이렇게 되면 웹서비스의 경우 웹소스, 기타 컨테이너의 Log에 대해서는 입출력이 어렵기 때문에 가상 볼륨을 생성해서 호스트 OS의 특정 경로에 연결해서 호스트의 파일에 접근할 수 있도록 한다. 방법은 -v 옵션을 통해 이용하며 다음과 같이 입력해서 실행하면 된다. docker run -d -p 80:80 -v /docker/data:/data nginx

컨테이너용 데이터 컨테이너 이용하기

컨테이너의 데이터는 컨테이너 내부에 저장되지만, 필요에 따라 호스트 OS에 저장하게 된다. 하지만 이식성이 좋은 컨테이너를 위해 데이터 전용 컨테이너를 이용할 수 있다. 데이저 턴용 컨테이너 이미지는 busybox로 다음과 같이 이용할 수 있다. docker run --volumes-from data centos 해당 명령어는 data라는 busybox를 centos에 마운트해서 이용하는 방법이다.

데이터 컨테이너를 내보내거나 가져오기 위해서는 다음의 방법으로 가능하다. docker export data > data.tar 또는 docker import data.tar

컨테이너 내부로 접속하기

만약 컨테이너 내에 접속해서 작업을 해야하는 필요성이 있는 경우에는 docker exec -it [컨테이너이름] [쉘] 을입력하면 되는데, -i는 interative 의 약자이고, -t는 tty의 약자이다.

컨테이너에 필요한 이미지 생성하기

Docker는 명령어로만 이용이 가능한 것이 아니라, 코드의 형태로 작성해서 배포가 가능하다. 여기에는 Dockerfile을 작성하면 되는데, Dockerfile에는 다양한 옵션의 적용이 가능하다.

vi Dockerfile
FRPM nginx:alpine
COPY . /usr/share/nginx/htm

위와 같이 작성 후 docker build -t nginx:test .를 입력하면 Dockerfile에 정의한대로 이미지를 생성하게된다. 이 이미지를 통해 컨테이너를 생성하면 이용이 가능하다. 여기에서 사용한 옵션 중 -t는 이미지에 tag를 지정한다.

이미지 빌드시 불필요한 파일이 들어갈 수 있는데, 이는 이미지 빌드시 지정한 폴더 내의 모든 파일을 모아서 묶기 때문이다. 이 경우에는 .dockerignore라는 파일을 작성하면 해당 파일에 기록된 파일 및 폴더는 제외하게 된다.