들어가면서
도커를 사용해야하는 이유
- 서버를 구축할 때 서버마다 운영체제, 컴파일러, 패키지 등의 차이가 발생하게 된다.
- 만약 새로 서버를 구축한다고 할 때, 기존 서버에 대한 지식을 가진 사람이 없다면 문제가 발생하게 된다.
- 예를 들어 서버에 장애가 발생하게 된다면 기존 서버와 새 서버의 차이점을 찾는 데에 시간을 쏟게 된다. → 비효율적!
도커는 작업자가 원하는 시점의 서버 상태를 정해둘 수 있기 때문에 항상 똑같은 상태의 서버를 만들 수 있게 해준다.
도커파일(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
Docker 시작하기 (개념/설치)
Engineering Blog by Dale Seo
www.daleseo.com
야 Docker 이리나와!! [1] - 개념 및 용어
Docker 정복기
velog.io
도커를 사용해야하는 이유
https://www.44bits.io/ko/post/why-should-i-use-docker-container
왜 굳이 도커(컨테이너)를 써야 하나요? - 컨테이너를 사용해야 하는 이유
컨테이너는 서버 애플리케이션을 배포하고 서버를 운영하는 표준적인 기술이 되어가고 있습니다. 하지만 처음 사용해본다면 그 장점이 잘 와닿지 않을 수도 있습니다. 왜 굳이 도커 컨테이너를
www.44bits.io
도커 볼륨, 바인드 마운트
https://www.daleseo.com/docker-volumes-bind-mounts/
Docker 컨테이너에 데이터 저장 (볼륨/바인드 마운트)
Engineering Blog by Dale Seo
www.daleseo.com
도커 & 장고
도커(Docker) 컴포즈를 활용하여 완벽한 개발 환경 구성하기
개발 환경을 구축하기란 그리 쉬운 일이 아닙니다. 문서화를 해두어도 누군가 계속 신경쓰지 않으면 내용이 낡기 마련이고, 계속 신경 쓰자니 이 또한 쉽지 않죠. 어떻게 하면 손쉽게 개발 환경
www.44bits.io
도커 데몬
https://velog.io/@weekbelt/%EB%8F%84%EC%BB%A4%EB%8D%B0%EB%AA%ACDocker-Daemon
도커데몬(Docker Daemon)
Docker가 실제로 어디 있는지 알아보겠습니다.docker 명령어는 /usr/bin/docker에 있는 파일을 통해 사용되고 있습니다. 이번에는 실행 중인 도커 프로세스를 확인해보겠습니다. 확인해보니 /usr/bin/docker
velog.io
도커 네트워크
https://captcha.tistory.com/70
06. 도커 네트워크 (Docker Network)
도커 네트워크 구조 - 도커는 컨테이너에 내부 IP를 순차적으로 할당 - 내부 IP는 컨테이너를 재시작할 때마다 변경될 수 있음 - 내부 IP는 도커가 설치된 호스트, 즉 내부망에서만 쓸 수 있는 IP이
captcha.tistory.com
도커 컴포즈
https://engineer-mole.tistory.com/221
[Docker] docker compose 사용법
Docker Compose 개요 Docker compose란, 여러 개의 컨테이너로부터 이루어진 서비스를 구축, 실행하는 순서를 자동으로 하여, 관리를 간단히하는 기능이다. Docker compose에서는 compose 파일을 준비하여
engineer-mole.tistory.com