docker
docker
docker container란?
Simply put, a container is simply another process on your machine that has been isolated from all other processes on the host machine. That isolation leverages kernel namespaces and cgroups, features that have been in Linux for a long time. Docker has worked to make these capabilities approachable and easy to use.
docker 장점?
1. Host와 독립된 환경에 설치되므로 Host가 지저분해지지 않고 충돌도 방지할 수 있으며 컨테이너 실행, 중지도 간단해서 제어하기 편함.
docker image 받아서 띄우면 되니 Host에 뭔가를 설치한다는 부담도 없고 안쓸 때는 컨테이너를 내려두면 된다는 점도 좋고 제어도 docker-desktop을 사용하면 버튼 하나로 간단하다는 점도 좋음.
2. 가상머신 대비, 게스트 OS를 띄우는 오버헤드를 없앨 수 있다.
docker는 host kernel을 사용하기 때문에 따로 게스트 OS를 띄우는 오버헤드가 없다.
* 그러나 docker는 Linux 기반 container라서, Windows나 MacOS에서는 linux 가상머신이 따로 실행되고 그 위에서 컨테이너가 실행된다.docker for windows 가 이런 방식. 이렇게 되면 그냥 가상머신 위에 올리는거랑 성능 면에서는 별 차이 없을 수 있는데 포트포워딩이나 공유 폴더같은 편의성에서 도커가 좀 더 낫다. * 요즘 Windows는 WSL 지원해서 좀 낫긴 하다.
3. 잘 추상화된 컨테이너 이미지가 많다.
예를 들어 wordpress를 올리고 싶은 경우, 가상머신이라면 AMP 설치 -> wordpress를 올려야 하지만 도커에서는 wordpress 이미지만 받아서 실행하면 끝난다.
4. provisioning이 가상머신에 비해 용이하다.
여러 의존성이 줄줄이 달린 서버 같은걸 배포해야 하는 경우,
- 그냥 native에 설치하도록 유도 -> 문제 발생 확률 매우 높음
- VM 이미지를 통째로 배포 -> OS 포함 용량이 너무 크고 설치 복잡. 비효율적. docker를 사용하면 이런 문제들을 모두 해결할 수 있다. 리눅스 기반으로 돌아가는 프로그램(대부분 서버는 리눅스에서 돌리니까.)인 경우, OS는 빼고 배포할 수 있기 때문에 용량도 적고.
docker-compose
docker만 해도 강력하지만 docker-compose와 함께 쓰면 더 편함
docker-compose란?
여러 docker container를 묶어서 실행하거나 제어할 수 있도록 하는 명령어라고 보면 됨. docker-compose.yml에 정의된 대로 컨테이너들을 실행해준다.
1. 개발환경 세팅 시 Host에 잡다한거 설치 안하고 docker-compose 한방으로 끝낼 수 있다.
개발하는데 DB, redis, kafka, zookeeper 설치해야 하고, 나 뿐만 아니라 다른 팀원들도 설치가 필요한 상황. 이런 경우 각각의 Host에 직접 설치하는게 제일 별로, docker image를 각각 받아 설치하는게 그 다음 별로, docker-compose로 한 방에 다 설치하는게 제일 깔끔하다.
*** 한 가지 container에 DB, redis 등등을 모두 묶은 이미지를 만들고 띄우고 하는 것 보다, 한 container에는 하나만 설치하고 docker-compose로 묶어서 띄우는게 좋다.
2. 여러 도커 컨테이너를 docker-compose 로 한방에 제어 가능하다
DB 먼저 띄우고 그 다음에 redis 띄우고… 물론 이런 것들은 쉘 스크립트로도 가능은 하지만 docker-compose를 이용해 init 작업이나 컨테이너 실행 순서 등을 편하게 제어할 수 있음.
사용법
일단 docker desktop 설치한다. 그게 제일 편함. 설치하면 처음에 튜토리얼 하도록 되어 있는데, 튜토리얼 따라 진행하면 열리는 웹페이지에 아주 상세하게 잘 나와 있음. 도커 컨테이너 띄우는 것 부터 이미지 빌드, docker-compose, 오케스트레이션 까지
실행한 도커 컨테이너에 배쉬쉘로 접근하기
1
docker exec -it mysql1 bash
- 명령어나 기초 가이드는 역시 공식 홈페이지!https://docs.docker.com/docker-for-mac/
- https://subicura.com/2017/01/19/docker-guide-for-beginners-1.
- http://raccoonyy.github.io/docker-usages-for-dev-environment-setup/
Bind Mount를 사용하면 Host directory를 docker 안쪽으로 mount 시킬 수 있음.
이를 이용해서 source code는 Host에, WebServer는 docker에 두는 것이 가능함.
docker-compose.yml의 mount, volume 예제
1
2
3
4
5
6
7
8
volumes:
- type: bind
source: ./elasticsearch/config/elasticsearch.yml
target: /usr/share/elasticsearch/config/elasticsearch.yml
read\_only: true
- type: volume
source: elasticsearch
target: /usr/share/elasticsearch/data
자동으로 재시작하기
1
2
3
4
// docker 인 경우
docker run --restart always
// docker-compose.yml 인 경우
restart: always