들어가며
도커에 대한 강의를 사서 들은 적도 있었지만 실제로 프로젝트에서 활용을 해본 적은 없었다. 개인 프로젝트를 진행하면서 개발 환경에 상관없이 격리 시키기 위해 도커를 사용해봤다. 도커에 대해 자세하게 알아보며 공부한 내용을 정리하려 한다.
도커를 사용하는 이유는?
애프리케이션 개발과 배포가 편해진다. 도커 컨테이너 내부에서 여러 소프트웨어를 설치해도 호스트 os에는 영향이 없다.
또한 CI/CD에서 지속적인 통합 과정의 테스트에서 도커를 활용할 수 있고 어떤 서버에 올리더라도 같은 환경으로 구성된 컨테이너로 동작하기 때문에 표준화된 배포를 구성할 수 있다.
따라서 여러 애플리케이션의 독립성과 확장성이 높아진다.
도커 이미지(Docker Image) 관리
1. Docker Image
도커 컨테이너 서비스를 위한 이미지는 컨테이너 런타임에 필요한 바이너리, 라이브러리 및 설정 값 등을 포함하고, 변경되는 상태값을 보유하지 않고(stateless) 변하지 않는다.(immutable, read-only)
- Stateless: 애플리케이션과 관련된 모든 파일과 라이브러리를 포함하고 있기 때문에 다른 환경에서도 동일한 애플리케이션 실행 가능
- Immutable: 이미지가 한번 생성되면 변경할 수 없는 것을 의미함
도커 이미지는 필요한 파일만 포함하고 있기 때문에 용량이 작으며, 이미지를 변경할 필요가 있을 경우에는 새로운 이미지를 생성해야한다.
2. Docker 명령어
docker pull: Docker 이미지 내려받기
docker image inspect: Docker 이미지 구조 확인
docker image inspect --format= : 이미지 구조 정보를 json 형태로 제공
docker image history: Dockerfile에 대한 정보
도커 이미지와 도커 컨테이너의 관계
컨테이너: 이미지를 실행한 상태로 1개의 이미지로부터 n개의 컨테이너를 생성할 수 있는 1:n 관계
예를 들면 이미지는 내가 만들고 싶은 빵의 정보를 갖고 있는 틀이라면 컨테이너는 구워낸 빵
컨테이너는 하나의 프로세스다.
Dockerfile이란?
1. Dockerfile
컴퓨터에서 돌아가는 앱을 만들기 위한 레시피 같은 거다. 이 레시피대로 하면 Docker라는 이미지를 만들 수 있다.
여기서 도커이미지는 앱을 실행하는 데 필요한 모든 것을 담고 있다.
2. Dockerfile을 사용하는 이유는?
앱을 컨테이너로 만들 때 이미지를 만드는 용도로 Dockerfile을 사용한다. 이렇게 하면 앱이 필요한 모든 것을 한 곳에 담을 수 있다.
누구나 Dockerfile을 보고 똑같은 애플리케이션 환경을 쉽게 만들 수 있다.
또한 Dockerfile을 작성하면 앱을 만드는 과정을 자동홯랄 수 있다. 결국 매번 똑같은 방식으로 앱을 만들고 배포할 수 있다.
Docker compose란?
도커 컴포즈를 통해 여러개의 컨테이너를 관리한다.
1. Docker compose를 사용하는 이유는?
- 여러 컨테이너를 하나의 파일에 작성해서 설정할 수 있다. 이 파일에는 컨테이너가 무슨 이미지를 사용할지, 어떤 포트를 쓸지, 환경 변수는 뭐가 필요한지 등을 적어둔다.
- Docker Compose가 알아서 컨테이너를 만들어주고 실행한다. 개발자가 일일이 명령어 작성할 필요가 없다.
- 컨테이너들이 서로 의존하는 관계가 있으면 Docker compose가 이를 관리해준다.
- 컨테이너들이 어떻게 돌아가는지 지켜보고 로그를 모아준다.
- 여러 컨테이너를 하나의 그룹으로 관리할 수 있다. (한번에 관리하고 확장하기 쉽다.)
- 개발 환경, 테스트 환경, 실제 운영 환경에서도 같은 설정 파일을 써서 일관성을 유지할 수 있다.
- 컨테이너들의 네트워크를 분리해서 외부로부터의 접근을 제한할 수 있다. -> 보안 강화
- 유지보수가 쉽다. 왜냐하면 하나ㅢ 설정 파일로 컨테이너들을 관리하기 때문이다.
2. Docker compose의 장점
- 한 번에 여러 컨테이너를 설정할 수 있다.
- 빠른 서비스 실행이 가능하다. 설정 값들을 저장해두고 다시 쓸 수 있기 때문이다.
- 같은 네트워크에서 쉽게 연결할 수 있다. docker-compose.yml 파일에 있는 애플리케이션들은 모두 같은 네트워크에서 자동으로 연결된다.
Docker Volume
1. Volume이란?
볼륨은 컴퓨터에 따로 만들어진 폴더 같은 것이다. 도커가 이 폴더를 관리해서 우리가 쓰는 데이터를 볼륨에 저장한다.
도커는 보통 컴퓨터의 특정 폴더 (대부분 /var/lib/docker/volumes/)에 볼륨을 만든다.
2. Volume의 장점
- 백업하고 옮기기 쉽다.
- 도커 명령어로 관리할 수 있다.
- 어디서나 잘 돌아간다. (리눅스, 윈도우, 어떤 컨테이너에서도 잘 동작함)
- 여러 컨테이너에서 안전하게 쓸 수 있다.
- 볼륨 드라이버로 더 많은 기능을 추가할 수 있다.
- Mac이나 Windows에서는 더 빠르게 돌아간다. (도커를 쓸때 볼륨이 기본 저장 방식보다 훨씬 빠르게 돌아간다.)
3. Volume을 사용하는 이유는?
- 데이터가 남아있게 하기 위해 (데이터 영속성)
- 같은 데이터를 여러 컨테이너가 쓸 수 있게 하기 위해
- 데이터를 백업하고 옮기기 쉽게 하기 위해
- 데이터를 더 안전하게 보관하기 위해
- 코드와 데이터를 따로 두기 위해
실제로 Docker 공식 사이트에서는 volume, bind mount, tmpfs mount 중에 volume을 가장 추천하고 있다.
Docker Network
1. Docker Network 이해하기
도커 네트워크는 컨테이너끼리 서로 통신할 수 있게 도와주는 네트워크이다. 이걸 사용하면 더 쉽게 통신할 수 있고, 보안도 더 강화할 수 있다. 실제로 비즈니스 애플리케이션을 컨테이너화를 할 때 서로 소통할 수 있는 방법, 즉 네트워크 설정이 필수이다. 도커에서는 이런 네트워크를 쉽고 효율적으로 구축할 수 있도록 도와주는 간단한 네트워크 모델을 만들었다.
이 모델을 컨테이너 네트워크 모델(CNM)이라고 한다.
- 샌드박스: 컨테이너를 외부로부터 완전히 분리한다. 밖에서 들어오는 네트워크 연결은 이 샌드박스 안의 컨테이너로 들어올 수 없다. 그런데 컨테이너도 소통이 필요하기에 이를 위해 엔드포인트가 사용된다.
- 엔드포인트: 외부와 센드박스 사이의 연결점이다. 엔드포인트가 컨테이너를 안전하게 지켜주고, 샌드박스를 다음 요소인 네트워크에 연결한다.
- 네트워크: 엔드포인트에서 다른 엔드포인트로, 결국은 컨테이너에서 다른 컨테이너로 데이터를 보내는 길이다.
하나의 네트워크 샌드박스 안에는 여러개의 엔드포인트가 있을 수 있다. 즉 하나의 샌드박스 안에 있는 컨테이너는 네트워크에 전혀 연결 되지 않거나, 여러 네트워크에 동시에 연결될 수 있다.
그리고 개별 컨테이너가 네트워크 안 어디에서 작동하는지는 정하지 않는다. 모든 컨테이너가 한 호스트에서 실행될 수도 있고(로컬), 여러 호스트에 걸쳐있을 수도 있다.(글로벌)
2. Docker Network 종류
- 브리지(Bridge) 네트워크: 도커를 사용할 때 가장 많이 보게 되는 기본 네트워크이다. 한 컴퓨터 안에서 여러 도커 컨테이너가 서로 통신할 수 있게 해준다. 컨테이너를 이 네트워크에 붙이면 도커가 알아서 IP주소를 발급해준다. 그리고 호스트 밖의 다른 네트워크랑은 일단 따로 동작한다. 여기서 포트 매핑을 사용하면 외부에서도 컨테이너에 접근할 수 있다.
- 공용 네트워크: 도커에서 공용 네트워크는 흔히 사용되지 않는데, 보통 외부에서 접근할 수 있게 하려면 브리지 네트워크에서 포트를 열어주거나 호스트 네트워크라고 해서 컨테이너가 직접 우리 컴퓨터의 네트워크를 쓰게 하는 방법이 있다.
- 사설 네트워크: 특별한 컨테이너끼리만 통신할 수 있는 네트워크이다. 도커에서는 사용자가 직접 네트워크를 만들고, 그 안에 원하는 컨테이너만 연결할 수 있다. 이렇게 하면 다른 컨테이너나 외부 네트워크와는 격리돼서 더 안전하게 통신할 수 있다.
컨테이너 가상화
컨테이너란?
컨테이너는 앱을 실행하는 데 필요한 모든 것을 담은 작은 상자와 같다. 앱을 실행하는데 필요한 콛, 프로그래밍 언어, 라이브러리 등등
도커에서는 Dockerfile을 사용해서 이런 컨테이너를 만든다.
컨테이너를 사용하면 좋은 점
- 컴퓨터 자원(CPU, 메모리 등)을 여러 앱들과 나눠서 사용할 수 있게 해준다.
- 앱을 컨테이너에 넣으면 그 컨테이너가 어디에서 실행되든 똑같이 잘 돌아간다. 마치 앱을 작은 상자에 넣어서 어디든 가져갈 수 있는 것과 비슷하다.
- 컨테이너는 서로 독립적이라서 한 컨테이너에 문제가 생겨도 다른 컨테이너에 영향을 주지 않는다.
컨테이너의 장점
- 경량화: 컨테이너는 컴퓨터의 OS를 여러 앱과 공유한다. 그래서 각 앱마다 따로 OS를 설치할 필요가 없다. 덕분에 컨테이너 파일은 작고 가볍다. 크기가 작아서 빨리 시작할 수 있다.
- 이동성과 플랫폼 독립성: 컨테이너는 앱을 실행하는 데 필요한 모든 것을 함께 담는다. 크래서 한 번 만든 앱을 노트북이든 클라우드든 뭐든 재설정 없이 그대로 옮겨서 실행할 수 있다.
- 현대적인 개발 및 아키텍쳐 지원: 크기가 작고 여러 플랫폼에서 잘 작동하기 때문에 최신 개발 방식과 패턴에 잘 맞다. 새로운 코드를 조금씩 추가하거나 업데이트할 때 매우 유용하다는 것이다.
- 사용률 향상: 개발자와 운영자는 컨테이너를 사용해서 컴퓨터의 CPU나 메로리를 더 효율적으로 쓸 수 있다. 앱의 각 부분을 따로 배치하거나 크기를 조절할 수 있기 때문에, 전체 앱을 확장하는 것보다 더 유연하게 관리할 수 있다.
컨테이너 용도
- MSA: 컨테이너는 작고 가벼워서 앱을 여러 작은 부분으로 나누어 관리하는 MSA에 딱 맞다. 각 부분이 서로 독립적으로 잘 돌아가게 할 수 있다.
- DevOps: 소프트웨어를 만들고 운영하는 방식인 DevOps를 사용하는 팀에게 컨테이너는 유용하다. 앱을 더 빠르고 효율적으로 개발하고 배포할 수 있다.
- 하이브리드, 멀티클라우드: 컨테이너는 어디서든 잘 돌아가기 때문이다.
- 클라우드 마이그레이션: 클라우드를 옮겨가면서 앱을 컨테이너로 바꾸는 방법을 많이 사용하고 있다.
마치며
도커에 대해 공부하면서 도커의 장점을 많이 알게 된 것 같다. 이제는 데이터베이스도 도커로 띄우고 뿐만 아니라 레디스, 카프카 등등 로컬 환경이 아닌 도커로 실행 후에 사용하고 있다. 이후에는 현재 프로젝트를 도커로 띄워서 실행하는 작업을 해보려고 한다.
해당 글은 항해99 취업리부트코스에서 제공받은 자료를 기반으로 작성된 글입니다.
댓글