도커란 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼이다.
라고 AWS 공식홈페이지에서 말하고 있다.
그럼 도커는 왜 신속하게 구축, 테스트 및 배포할 수 있다는 걸까?
처음 도커를 접했을 때 너무 허상의 것이라(실제로 볼수 있는 것이 아닌) 개념 구조를 이해하기 어려웠는데 쉽게 받아들여보자.
도커는 중요한 개념이 "컨테이너"이다.
도커는 쉽게말해 컨테이너를 관리하는 툴이다.
그럼 컨테이너가 뭔데?
컨테이너는 os위에 컨테이너를 생성해 프로세스를 격리해서 실행하고 관리할 수 있게해준다.
즉, 도커는 여러 컨테이너를 관리하고 이 컨테이너들은 각자 격리된 환경을 가질 수 있고 이 안에 애플리케이션을 설치 구동 관리할 수 있는 것이다.
그말은 여러 컨테이너들이 서로 영향을 주지 않기 때문에 버전 충돌 등의 여러 문제에서 자유롭게 되고, 만약 다른 컴퓨팅에서 실행해야한다면 컨테이너만 통채로 옮겨서 실행하면 os와 상관없이 어디서든 실행이 똑같이 되고, 버전 업데이트 등의 문제도 컨테이너 하나 안에서만 신경쓰면 되기에 신속하게 구축, 테스트 및 배포가 가능하다는 것이다.
이전에 이것과 비슷한 개념으로 VM 가상 머신이 있었다.
VM 가상머신과 도커의 차이는 OS를 가상화하느냐 OS도 각 애플리케이션마다 분할해서 할당되느냐 차이이다.
이미지를 보면 VM은 애플리케이션 수만큼 OS가 분할할당되는 것을 볼 수 있는데
이렇게 되면 컴퓨터 부담이 커지고 무겁고 느려진다는 단점이 있다.
반면, 도커는 여러개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행되어 마치 가벼운 VM을 사용하는 듯한 편리성을 제공한다.
그렇다면 이 컨테이너는 어떻게 만드는 것일까?
컨테이너 생성과 실행에 필요한 모든 파일과 설정값들을 묶은 형태를 도커 이미지라고 한다.
즉, 도커 이미지만 있으면 이전처럼 의존성 파일을 컴파일하거나 이것저것 설치할 필요가 없어지는 것이다.
이미지는 가령 우분투 이미지 (우분투를 실행하기 위한 모든 파일을 가지고 있음), 오라클(앞과 같음) 등 여러 이미지가 있는데
직접 만들 수도 있지만 이미 필수적인 또는 대부분의 이미지는 도커허브 라는 곳에 공개 유명 레지스트리에 있기도 하고 사설 허브에 회사별로 혹은 본인이 만든 이미지를 올리기도 한다.
이미지를 검색하려면 이렇게 찾아볼 수 있다.
docker search 검색어
이미지를 내려받는 방법은
docker pull 이미지명
이미지를 내려받을 때 사용하는 태크, 레이어, 이미지 고유 식별 값 등을 모두 볼 수 있다.
내려받은 이미지를 기반으로 새로운 컨테이너를 실행하려면
docker run [옵셥] <사용할 이미지명>[:태그]
-d는 컨테이너를 백그라운드로 구동한다는 것이다.
-d를 안할경우 컨테이너 내부에서 실행되는 애플리케이션 상태가 화면에 계속 표시됩니다.
그래서 새로운 터미널을 열어서 이 후 작업을 진행해야할 수 있으니
저는 주로 -d를 붙여서 컨테이너를 실행하는 편입니다.
docker ps
컨테이너 확인에서 보인 port로 접속해 보면(localhost:80) 접속이 되지 않습니다.
컨테이너 외부에서 내부로 접속하려면 추가 옵션이 필요합니다.
이는 모든 주소에서 8080번 포트로 들어오는 요청을 컨테이너 내부의 80번 포트로 보내도록 설정하는 것입니다.
nginx 내부에는 따로 작성한 파일이 없기 때문에 기본 페이지를 보여줍니다.
사용자가 원하는 페이지를 출력하려면 원하는 웹페이지와 관련된 화면을 별도로 작성하면 됩니다.
이렇게 컨테이너를 생성하고 컨테이너 내부에 접속하는 방법까지 배웠습니다.
그러면 만약 실제 운영 중 이라면, 컨테이너 웹페이지 관련 파일을 수정하는 경우가 많을 것입니다.
지금처럼 컨테이너 내부에 들어가 웹 페이지 파일을 변경할 수 있지만, 컨테이너를 다시 생성하게 되면 매번 웹페이지 파일을 전송해야합니다...
프로젝트 규모가 크다면 매우 비효율적이고 힘들겠죠...
따라서 영속적으로 웹 페이지 파일을 사용하기 위해서는 특정 디렉토리와 컨테이너 내부의 디렉토리를 연결하는 것이 효과적입니다.
컨테이너 내부에서 외부의 파일을 사용할 수 있는 방법은 4가지 인데
- 바인드 마운트
- docker ps
- Dockerfile ADD
- 볼륨
우선 앞서 말한 특정 디렉토리와 컨테이너 내부의 디렉토리를 연결하는 방법에 대하여 먼저 설명하겠습니다.
호스트의 파일 시스템과 컨테이너 내부를 연결해 어느 한쪽에서 작업한 내용이 양쪽에 동시에 반영되는 방법입니다.
새로운 컨테이너를 구동할 때도 호스트와 연결할 파일이나 디렉토리의 경로만 지정하면 다른 컨테이너에 있는 파일을 새로 생성한 컨테이너와 연결할 수 있습니다.
그렇기에 없어지면 안되는 자료는 이 방법으로 보존할 수 있습니다.
호스트 파일에 위치한 파일을 컨테이너 내부로 복사하는 것이다.
단순히 복사이기에 임시로 사용할 경우에 주로 사용된다.
docker cp 호스트경로 컨테이너이름:컨테이너내부경로
이미지는 Dockerfile을 기반으로 만들어지는데,
Dockerfile에 ADD라는 구문을 사용해 컨테이너 내부로 복사할 파일을 지정하면 이미지를 빌드할 때 지정한 파일이 이미지 내부로 복사됩니다.
바인드 마운트와 동작은 동일하지만 호스트의 특정 디렉토리가 아니라 도커가 관리하는 볼륨을 컨테이너와 연결합니다.
볼륨생성
컨테이너 내부와 호스트의 볼륨 연결하여 컨테이너 구동
접속 확인
이렇게 도커가 무엇인지 이미지로 컨테이너를 생성하고 사용하는 방법을 배웠습니다.
그렇다면 이제 컨테이너를 다 사용하고 삭제하는 방법을 알아보겠습니다.
컨테이너를 정상 삭제하려면 우선 구동중인 컨테이너를 정지해야합니다.
docker stop 컨테이너 이름
docker rm 컨테이너 이름 혹은 id
#이미지 삭제하기
docker rmi 이미지