우아한테크코스/레벨3
[Docker] 도커 개념 이해하기
nauni
2021. 8. 24. 07:01
이미지
- 컨테이너를 생성할 때 필요한 요소
- 이미지는 여러 계층으로 된 바이너리 파일로 존재
- 읽기전용
[저장소이름]/[이미지이름]:[태그]
컨테이너
- 이미지로 컨테이너를 생성
- 독립된 파일시스템과 격리된 시스템자원 및 네트워크를 사용할 수 있는 독립된 공간
- 도커 이미지의 종류에 따라 알맞은 설정과 파일을 가지게 됨
- 컨테이너에서 무엇을 하든 원래 이미지에는 영향을 주지 않음
- 가상 IP 주소를 할당받음.
172.17.0.x
의 IP를 순차적으로 할당 - 컨테이너를 삭제하면 컨테이너 계층에 있던 정보도 삭제됨
도커 명령어
Docker-compose
docker-compose up -d
# -d, --detach : background 로 실행
# up : start or restart all the services defined in a docker-compose.yml
docker-compose start
# start : start existing container for a service (새로운 컨테이너를 생성하지 않음)
# useful only to restart containers that were previously created, but were stopped
docker-compose restart
# restart: restarts all stopped and running services
docker-compose run
# overrides the command defined in the service configuration
# 이미 실행되고 있는 포트가 있다면, 포트충돌이 날 수 있다.
# 컨테이너를 생성하고 실행하는 역할
docker-compose down -v
# -v, --volume: 연결되었던 volume 을 같이 삭제한다.
# Stops containers and removes containers, networks, volumes, and images created by up.
도커 사용
ctrl + P, Q
: 컨테이너를 정지하지 않고 셸에서 빠져나옴- create: 컨테이너를 생성만 하고 컨테이너로 들어가진 않음
- start : 컨테이너 실행
- attach: 컨테이너 내부로 들어감
- ps: 정지되지 않은 컨테이너 목록확인
도커 옵션
포트
- 포트 바인딩
[호스트포트]:[컨테이너포트]
-p 8080:80/tcp
-p <host_port>:<docker_port>/<type>
# 호스트에서 tcp 8080 포트로 들어오는 모든 것은 도커내의 80 포트에 매핑시킨다.
볼륨
- 컨테이너의 데이터를 영속적으로 활용가능
- 호스트와 볼륨을 공유 가능
- 호스트와 디렉토리를 공유한다면, 완전 같은 디렉토리이다.
- 원래 존재하던 호스트의 디렉토리의 볼륨을 공유하면, 컨테이너의 디렉토리가 덮어씌워짐
- 호스트의 디렉토리를 컨테이너의 디렉토리에 마운트하는 구조
- 볼륨 컨테이너를 공유를 공유하는 방법도 있음
- 도커 자체에서 제공하는 도커 볼륨도 있음
네트워크
- 컨테이너에 내부 IP를 순차적으로 할당하는 구조
- 내부 IP 는 도커 내부망이므로 외부와 연결될 필요가 있음
- 기본적으로 docker0 브리지를 통해 외부와 통신
- 도커에는 외부와 연결할 수 있는 여러 네트워크 종류가 있음. 그중의 하나가 bridge
- 도커 내부에도 내장DNS 를 가짐
- docker-compose 에서는 기본적으로 브리지 타입의 네트워크를 생성
브리지(bridge)
- 사용자 정의 브리지를 새로 생성해 각 컨테이너에 연결하는 구조
환경(environment)
- 도커 내부에서 사용할 환경설정을 key:value 형태로 넣을 수 있음
기타
- 도커의 로그는 json 형식으로 저장된다.
- 도커의 로그는 컨테이너별로 로컬에 저장된다. (
/var/lib/docker/containers/{containerId}/{containerId}.log
) - 컨테이너는 프로세스를 추상화 한 것이다.
ELK 적용하며 배우는 도커
# 도커 버전
version: '3.2'
# 서비스들
services:
# 서비스이름
elasticsearch:
# 가져올 이미지
build:
context: elasticsearch/
args:
ELK_VERSION: $ELK_VERSION
# 볼륨 마운트
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
# 포트 바인딩
ports:
- "9200:9200"
- "9300:9300"
# 컨테이너 내부에서 사용할 환경설정
environment:
ES_JAVA_OPTS: "-Xmx256m -Xms256m"
ELASTIC_PASSWORD: password
# Use single node discovery in order to disable production mode and avoid bootstrap checks.
# see: https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html
discovery.type: single-node
# 네트워크 설정
networks:
- elk
logstash:
build:
context: logstash/
args:
ELK_VERSION: $ELK_VERSION
volumes:
- type: bind
source: ./logstash/config/logstash.yml
target: /usr/share/logstash/config/logstash.yml
read_only: true
- type: bind
source: ./logstash/pipeline
target: /usr/share/logstash/pipeline
read_only: true
ports:
- "5044:5044"
- "5000:5000/tcp"
- "5000:5000/udp"
- "9600:9600"
environment:
LS_JAVA_OPTS: "-Xmx256m -Xms256m"
networks:
- elk
# 의존성 여부 (elasticsearch)
depends_on:
- elasticsearch
kibana:
build:
context: kibana/
args:
ELK_VERSION: $ELK_VERSION
volumes:
- type: bind
source: ./kibana/config/kibana.yml
target: /usr/share/kibana/config/kibana.yml
read_only: true
ports:
- "5601:5601"
networks:
- elk
depends_on:
- elasticsearch
# 네트워크 설정
networks:
elk:
driver: bridge
volumes:
elasticsearch:
참고
- 도커공식문서
- [책] 시작하세요 도커 쿠버네티스