들어가면서
도커를 사용해야하는 이유
- 서버를 구축할 때 서버마다 운영체제, 컴파일러, 패키지 등의 차이가 발생하게 된다.
- 만약 새로 서버를 구축한다고 할 때, 기존 서버에 대한 지식을 가진 사람이 없다면 문제가 발생하게 된다.
- 예를 들어 서버에 장애가 발생하게 된다면 기존 서버와 새 서버의 차이점을 찾는 데에 시간을 쏟게 된다. → 비효율적!
도커는 작업자가 원하는 시점의 서버 상태를 정해둘 수 있기 때문에 항상 똑같은 상태의 서버를 만들 수 있게 해준다.
도커파일(Dockerfile)
서버 운영 기록을 코드화한 것
도커이미지
운영 기록을 실행한 시점(도커 파일 + 실행 시점)
도커 이미지 만드는 팁
- 컨테이너를 하나 실행한 다음 거기서 원하는 명령어들을 입력
- 원하는 결과가 나왔을 때 해당 명령어를 도커 파일로 옮기는 식으로 작업하면 실패
→ 수정 과정을 훨씬 더 빨리 반복할 수 있다.
* 컨테이너를 언제 실행하든 이미지가 변하지 않았다면 컨테이너의 내용도 완전히 똑같다.
도커 장점 총정리
- 서버 제작 과정에서 견고함과 유연성이 더 생긴다.
- 다른 이가 만든 서버를 소프트웨어 사용하듯 가져다 쓸 수 있다.
- 여러 대에 배포가 가능하다. (확장성)
Dockerhub란?
- 도커 허브는 도커에서 제공하는 기본 이미지 저장소
- ubuntu, centos, debian 등의 베이스 이미지와 python, java 등의 공식 이미지가 저장되어있다.
- 회원가입을 통해 대용량 이미지 저장, 다운로드 트래픽을 무료로 사용할 수 있지만 모든 이미지는 공개이므로 비공개를 원한다면 유료 서비스를 이용해야한다. (한 개는 무료)
도커 Container, Image
Container
: 컨테이너란 애플리케이션 소스 코드를 임의의 환경에서 해당 코드의 실행에 필요한 운영체제 라이브러리 및 종속 항목과 결합하는 실행 가능한 표준 컴포넌트
- 호스터 컴퓨터에서 돌아가고 있는 하나의 프로세스
- 호스트 컴퓨터와 그 위에서 돌아가는 다른 프로세스들과 격리되도록 설계되어있다. (효율성과 보안성)
- 격리된 환경에서 개발 환경의 통일성을 갖추기 위해 사용한다.
- 다양한 서버에서 버전 통일성을 갖추기 위해 코드와 환경 모두 하나의 컨테이너로 묶는 역할을 한다.
Image
: 컨테이너 실행에 필요한 파일과 설정 값들을 포함하고 있는 것
- 애플리케이션 코드와 애플리케이션 실행에 필요한 최소한의 환경(언어 런타임, 라이브러리 패키지 등)을 포함하고 있는 바이너리 파일이다.
- 하나의 이미지로 동일한 Container 를 계속 만들어낼 수 있고 Docker Hub 와 같은 네트워크 상의 Doker registry 를 통해 손쉽게 공유할 수 있다.
- Image 종류
- Interactive (결합)
- 이미 존재하고 있는 도커 이미지를 활용해 컨테이너를 실행
- 그 환경 위에 다가 새로운 것을 추가하고 이를 새로운 이미지로 바꾸는 것
- Dockerfile
- Dockerfile이라는 새로운 형태의 텍스트 파일을 작성함으로써 Docker Image를 만드는 것
- Interactive (결합)
Container vs. Image
- Image는 container의 스냅샷(snapshot)을 떠어놓은 것으로 생각할 수 있다.
- 반대로 container는 컴퓨터에서 살아서 돌아가고 있는 image의 한 인스턴스(instance)라고 생각할 수 있다.
도커 네트워크
도커 네트워크
: Docker 컨테이너(container)는 격리된 환경에서 돌아가기 때문에 기본적으로 다른 컨테이너와의 통신이 불가능하므로, 도커 네트워크가 컨테이너 간 네트워킹이 가능하도록 도와줌
- 도커 컨테이너는 가상 IP를 할당받는다.
- 기본적으로 172.17.0.xxx 의 IP 주소를 순차적으로 컨테이너에게 할당한다.
- 내부 IP는 컨테이너를 재시작할 때마다 변경될 수 있다.
- 내부 IP는 도커가 설치된 호스트, 즉 내부망에서만 쓸 수 있는 IP이므로 외부와 연결될 필요가 있다.
- 도커에서 사용할 수 있는 네트워크 종류는 브리지(bridge), 호스트(host), 논(none) 등이 있다.
- 네트워크 종류
bridge
,host
,none
은 Docker 데몬(daemon)이 실행되면서 디폴트로 생성되는 네트워크bridge
네트워크는 하나의 호스트 컴퓨터 내에서 여러 컨테이너들이 서로 소통할 수 있도록 해줌. 컨테이너는 연결된 브리지를 통해 외부와 통신host
네트워크는 컨터이너를 호스트 컴퓨터와 동일한 네트워크에서 컨테이너를 돌리기 위해서 사용overlay
네트워크는 여러 호스트에 분산되어 돌아가는 컨테이너들 간에 네트워킹을 위해서 사용none
아무런 네트워크를 쓰지 않는 것
- 도커를 설치한 후 호스트 인터페이스에 docker0 이라는 가상 인터페이스가 생기게 된다.
- 컨테이너를 시작할 때마다 호스트에 veth(Virtual Ethernet) 라는 네트워크 인터페이스를 생성한다.
- veth 인터페이스는 컨테이너가 생성될 때 도커 엔진이 자동으로 생성하며 호스트가 갖고 있는 eth0, eth1 등과 연결되어있다.
- docker0 브리지는 각 veth 인터페이스와 바인딩되어 호스트의 eth0 인터페이스와 이어주는 역할을 한다.
- 컨테이너를 생성하면 기본적으로 docker0 브리지를 통해 외부와 통신할 수 있는 환경을 사용할 수 있지만 사용자의 선택에 따라 여러 네트워크 드라이버를 쓸 수도 있다.
데이터 저장(볼륨, 바인드 마운트)
Docker 컨테이너에 데이터 저장하기
- Docker 컨테이너에 쓰인 데이터는 기본적으로 컨테이너가 삭제될 때 사라지게 되는데, Docker 에서 돌아가는 애플리케이션이 컨테이너의 생명주기와 관계 없이 데이터를 영속적으로 저장해야한다.
- 여러 개의 Docker 컨테이너가 하나의 저장 공간을 공유해서 데이터를 읽거나 써야한다.
- 위의 문제 떄문에 도커 컨테이너의 생명 주기와 관계없이 데이터를 영속적으로 저장하기 위해 볼륨과 바인드 마운트를 사용한다.
볼륨(Volume)
- Docker에서 권장하는 방법
- 볼륨을 사용하는 방법은
docker volume create
커맨드로 볼륨을 생성한 후 볼륨을 컨테이너에 마운트(mount)해줘야 한다. docker run
커맨드로 컨테이너를 실행할 때v
옵션을 사용하면 되는데요. 콜론(:
)을 구분자로 해서 앞에는 마운트할 볼륨명 뒤에는 컨테이너 내의 경로를 명시해주면 된다.- 볼륨을 사용할 때는 우리가 스스로 볼륨을 생성하거나 삭제해야하는 불편함이 있지만, 볼륨은 Docker 상에서 이미지(image)나 컨테이너(container), 네트워크(network)와 비슷한 방식으로 관리가 되는 이점이 있다.
바인드 마운트(Bind Mount)
- 바인드 마운트를 사용하면 호스트 파일 시스템의 특정 경로를 컨테이너로 바로 마운트할 수 있다.
- 바인드 마운트를 사용하는 방법은
docker run
커맨드를 실행할 때,v
옵션의 콜론(:
) 앞 부분에 마운트명 대신에 호스트의 경로를 지정해주는 것이다. - 로컬에서 개발을 할 때는 일반적으로 현재 작업 디렉터리에 프로젝트 저장소를
git clone
받아놓고 코드를 변경하므로, 바인드 마운트를 이용해서 해당 디렉터리를 컨테이너의 특정 경로에 마운트해주면 코드를 변경할 때 마다 변경 사항을 실시간으로 컨테이너를 통해 확인할 수 있다. - 컨테이너를 통해 변경된 부분도 현재 작업 디렉터리에도 반영이 되기 때문에 편리하다.
볼륨(Volume) vs 바인드 마운트(Bind Mount)
- 볼륨(volume)과 바인드 마운트(bind mount)의 가장 큰 차이점은 Docker가 해당 마운트 포인트를 관리해주느냐 안 해주느냐이다.
- 대부분의 상황에서는 볼륨을 사용하는 것이 권장되지만 컨테이너화된 로컬 개발 환경을 구성할 때는 바인드 마운트가 더 유리할 수 있다.
- 바인드 마운트는 로컬에서 개발시에 코드 변경사항을 실시간으로 컨테이너를 통해 확힌할 수 있고, 반대로 컨테이너를 통해 변경된 부분도 로컬에서 확인 가능하므로 편리하다.
- 볼륨(Volume) vs 바인드 마운트(Bind Mount) 정리
: 볼륨은 마운트 포인트 관리를 원할 때, 바인드 마운트는 로컬 개발 환경 구축을 편하게 하고 싶을 때 사용
Docker Compose
Docker Compose
: Docker compose란, 여러 개의 컨테이너로부터 이루어진 서비스를 구축, 실행하는 순서를 자동으로 하여, 관리를 간단히하는 기능이다.
- Docker Compose를 이용하면 여러 개의 컨테이너(container)로 구성된 애플리케이션을 하나의 파일에 정의해놓고 한 번에 올리거나 내릴 수 있다.
- 이러한 편리함 때문에 Docker Compose는 특히 로컬 개발 환경이나 테스트 자동화 환경에서 간단한 컨테이너 오케스트레이션(Container Orchestration) 도구로 많이 사용
Docker Compose 사용 단계
- 각각의 컨테이너의 Dockerfile 작성(기존의 이미지 사용하는 경우에는 불필요)
- docker-compose.yml 작성 및 독립된 컨테이너의 실행 정의 실시(경우에 따라서는 구축 정의도 포함)
docker-compose up
커멘드를 실행하여 compose.yml 으로 정의한 컨테이너 개시
Docker Registry
Docker Registry
: Registry 는 이미지 파일이 저장되어있는 저장소 (예를 들어 Docker Hub)
Docker private Registry
: 공개적인 Docker Hub에 업로드할 경우 구축된 이미지 파일을 모든 사람이 사용할 수 있게 되므로, 개인적으로 사용할 수 있는 Registry 를 구축해야한다.
Docker Demon
Docker Demon
: API 요청을 수신하고 이미지 ,컨테이너, 네트워크 및 볼륨과 같은 Docker 객체를 관리한다.
참고
도커 개념 & 연습
- https://www.daleseo.com/docker/
- https://velog.io/@guri_coding/%EC%95%BC-Docker-%EC%9D%B4%EB%A6%AC%EB%82%98%EC%99%80-1-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EC%9A%A9%EC%96%B4
도커를 사용해야하는 이유
https://www.44bits.io/ko/post/why-should-i-use-docker-container
도커 볼륨, 바인드 마운트
https://www.daleseo.com/docker-volumes-bind-mounts/
도커 & 장고
도커 데몬
https://velog.io/@weekbelt/%EB%8F%84%EC%BB%A4%EB%8D%B0%EB%AA%ACDocker-Daemon
도커 네트워크
https://captcha.tistory.com/70
도커 컴포즈
https://engineer-mole.tistory.com/221