Docker 기본개념
컨테이너 기술의 개요
컨테이너?
실행에 필요한 모든 파일을 포함한 전체 실행 환경에서 애플리케이션을 패키징하고 격리할 수 있는 경량 가상화 기술
VM에 비해 가볍고 빠르다.(호스트 OS가 게스트 OS를 N개 만드는 방식의 VM에 비해서 host os위에 docker라는 데몬프로세스를 통해 호스트 OS의 자원들을 격리시킬 뿐 OS를 생성하지 않는다.)
컨테이너는?
일관된 환경
빠른 배포 및 확장성(스케일 아웃 방식)
자원의 효율성(스케일링, 로드밸런싱)
마이크로서비스 아키텍쳐 구현 용이성 및 이식성
선언적 환경(DOCKERFILE)
도커의 기능
BUILD - SHIP - RUN
도커 데몬이 Client의 명령어를 수행한다
Docker Machine 도커를 원격 클라우드 환경과 같은 원격에서 컨트롤하고싶을때 사용함.(있다는것만 인지할것)
도커는 개발환경의 템플릿을 만드는것에도 용이하다
(이미지 레지스트리를 활용해서 도커허브에 저장하고 해당 탬플릿을 가져간다)
ec2 -> 보안그룹 생성
인바운드 . = 해당 아이피만 허용 (22포트 허용시켜서 ssh를 허용시킨다)
인스턴스탭 -> 인스턴스 시작
docker -ce 커뮤니티 에디션
docker -ce-cli
containerd 컨테이너 표준 패키지
docker (리소스) (action)
docker ps 와같이 2단계인건 리소스든 action이든 생략되어있따.
itd = interaction tty daemon
id = interactvie terminal
도커이미지는 레이어 상에서 캐싱되어있는다(삭제하더라도)
초기의 도커는 모든 이미지를 모노레포로 관리하였음 (서로간의 싱크를 맞춰줘야함)
OCI(컨테이너 표준 프로젝트)
Containerd : RunC 라는 도구를 이용하여 컨테이너를 만들어줌.
SnapShotter :이미지를 만들고 컨테이너를 만든다.
dockerd는 고수준 API를 제공하는 컨테이너 엔진
이미지 전송, 다운로드, OCI 런타임으로 압축 및 해제 등의 기능 수행
docker ps -aq와 같이 옵션에 q를 주면 id만 나온다
docker rm -f docker ps -aq -f name=my-*
my-로 시작한 도커를 모두 죽이자
Docker0 브릿지 네트워크(네트워크 트래픽을 전달해주는 소프트웨어 장치)(172.17.0.1)
컨테이너와 컨테이너가 통신을 해야하는데 매 생성마다 새로운 아이피가 할당되기때문에 네트워크 컨트롤이 어렵다
Docker0 내에 물려있는 컨테이너끼리의 통신은 일반적으론 금지된다.(서로간의 호스트 주소를 모르기 때문에)
/etc/host 파일에 소통하고자 하는 컨테이너의 ip에 대한 설정을 해준다.
(Ex ipAddress containerName)
이는 불편하기때문에 커스텀 네트워크 생성을 지원해준다.
커스텀 네트워크는 원하는 ip가 할당가능하여 내부 컨테이너간의 소통도 가능하게 해준다. (DNS가 자동 등록되기 때문)
커스텀 네트워크는 한번 만들면 계쏙 사용가능하기때문에 사용하기 쉽다.
docker network create --subnet 172.18.0.0/24 --gateway 172.18.0.1 my-network
nat private ip를 public ip로 변환해주는 역할
NAT는 프록시 역할
(데이터를 휘발성이 아닌 영구적으로 유지하기위한 방식)
바인드 마운트 방식 컨테이너가 뜬다음에 데이터가 쓰여진것들에대해서만 데이터가 유지되기때문에 취약한 방식
볼륨 마운트 방식 : 호스트의 특정 영역을 docker Area로 격리를 하고 mount
docker volume create my-volume
docker file 작성
#!/bin/bash
service mysql start
if [ -n "${MYSQL_USER}" ]; then
mysql -uroot -e "create database test"
mysql -uroot -e "create user '{MYSQL_PASSWORD}'"
mysql -uroot -e "grant all privileges on . to '${MYSQL_USER}'@'%'"
mysql -uroot -e "flush privileges"
fi
sleep infinity //sleep infinity . 동작 후 대기해라 (스크립트 끝나도 컨테이너가 죽지않게해줌)
도커 커밋을할땐 반드시 암호화된 환경에서 커밋을할것