도커(Docker): 컨테이너 기반의 오픈소스 가상화 플랫폼
•
컨테이너: 하나의 Application 프로세스. 컨테이너는 가상머신이 아니라 도커 엔진 위에서 동작한다. 컨테이너는 격리된 공간에서 프로세스가 동작하는 기술이다.
별도의 Guest OS가 사용되지 않아 성능이 많이 개선되고 메모리 용량도 적게 차지한다.
•
이미지: 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것 (안 변함 =immutable).
컨테이너는 이미지를 실행한 상태이고 추가되거나 변하는 값은 컨테이너에 저장된다.
이미지는 여러 개의 layer로 된 binary 파일들로 구성되어 있고, 읽기 전용으로 사용된다.
저장소이름/이미지이름:태그 형태로 구성된다.
•
도커 데몬 : API 요청을 수신하고 이미지, 컨테이너, 네트워크 및 볼륨과 같은 도커 객체를 관리하는 백그라운드 프로세스이다. dockerd 로도 많이 불린다.
•
도커 호스트 : 현재 도커 데몬이 동작되고 있는 리눅스 커널이 있는 시스템
•
도커 레지스토리 : 도커의 이미지들을 저장하는 저장소이다. 사내(개인)에서만 공유하는 저장소인 Private 레지스트리가 있고 누구나 사용할 수 있는 공용 레지스트리인 Docker Hub가 있다.
◦
Docker Hub: 도커 이미지를 등록하거나 배포할 수 있는 곳.
docker run [이미지이름] 명령어를 입력했을 때, 만약 로컬 서버에 해당 이미지가 없으면 도커 허브(Docker Hub)에서 자동으로 다운로드 받는다.
•
도커 볼륨 : Host에서의 파일시스템과 도커 컨테이너의 파일시스템을 연결해(디렉토리를 공유) 중요한 데이터를 저장하는 곳. 볼륨은 서로 다른 컨테이너끼리도 공유할 수 있다.
-v {Host의 공유디렉토리}:{컨테이너의 공유 디렉토리}
•
도커 소켓 (Docker Socket) : 도커데몬과 통신하기 위해 사용되는 Docker API의 진입점이다. 기본적으로 Docker CLI에 의해 도커 커맨드를 실행하기 위해 사용된다.
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/images/json": dial unix /var/run/docker.sock: connect: permission denied
sudo chmod 777 /var/run/docker.sock 명령어를 입력하면 된다.
도커 소켓 파일은 /var/run/docker.sock 에 위치한다.
이제 도커 데몬과 도커 클라이언트가 소통이 가능해진다.
터미널 명령어 모음
•
docker run [이미지이름] → 이미지를 통해 도커 컨테이너를 실행
run을 사용하면[ pull → create → start ] 과정을 한번에 하는 것과 동일하다.
docker run -it --name test ubuntu:latest
Bash
복사
◦
-it : 컨테이너를 실행시키는 동시에 interactive한 터미널로 바로 접속
◦
--name : id는 길고 어렵다. 이미지마다 name이 있어서 id 대신 그 이미지의 name을 쓰면 실행됨
◦
-d : 이 옵션은 백그라운드에서 컨테이너가 계속 실행되도록 해줌
◦
-p : 포트포워딩을 하고 싶을 때 사용. 즉 외부로 포트를 노출시켜 외부 연결을 허용함
-p {Host포트번호}:{Container포트번호} 혹은 -p {Container포트번호}
ex) docker run -p 80 ~~~ 을 한 이후 → docker ps를 하면
실행된 컨테이너가 0.0.0.0:49154→80/tcp 와 같이 보일 것이다.
이때 49154는 비어있는 포트번호 중에서 랜덤으로 선택된 포트번호이다. 이 컨테이너에 통신하려면 localhost:49154 를 입력해야 한다.
◦
exec : 실행중인 컨테이너에서 명령어(ls,pwd, …)를 사용할 수 있다.
docker exec {컨테이너이름} {명령어 키워드}
ex) docker exec -it alpine /bin/bash 를 하면 이미 실행중인 alpine 컨테이너의 bash쉘에 접속하여 터미널을 사용할 수 있게 된다. 나가고 싶으면 exit 을 입력하면 된다.
◦
-v : 1. 볼륨 마운트. 컨테이너가 만들어주는 데이터를 도커 볼륨(volume) 혹은 Host 파일 시스템의 특정 경로에 마운트하여 영구적으로 보존하게 해줌
-v {Host디렉토리 or 볼륨명}/{container디렉토리} 혹은 -v {container디렉토리}
ex) docker run -v /dbdata:/var/lib/mysql
실행된 컨테이너의 /var/lib/mysql에 있는 데이터들이 실제 Host /dbdata 안에도 저장이 된다.
CLI에 sudo su 명령어 입력하여 root계정으로 변환한 후
cd /var/lib/docker/volumes/db_data 로 들어가면 저장된 데이터들을 확인할 수 있다.
◦
-e : 컨테이너 내부 환경변수를 정의할 수 있다.
•
docker images → 도커 이미지 리스트를 출력
•
docker ps → 실행중인 도커 컨테이너 리스트를 출력. (즉 활성화된 컨테이너 목록 확인)
뒤에 -a 옵션을 추가하면 실행되었던 컨테이너까지 출력이 된다. (즉 모든 컨테이너 목록 확인)
•
docker stop → 실행중인 도커 컨테이너를 중단
•
docker rm → 도커 컨테이너를 삭제
•
docker rmi→ 도커 이미지 삭제
•
docker image pull 이미지명
docker pull ubuntu:18.04
Bash
복사
•
docker image tag 소스이미지 별명
예) docker tag ubuntu:latest abcde:fghi
(unbuntu:latest)는 원래 있었고 (abcde:fghi)로 별명을 만든다
→ 하드 링크 개념처럼 별명을 붙이고 싶을때 사용한다.
•
docker stats → 실행중인 컨테이너의 자원사용량(CPU, MEM, Block I/O, 등)을 스트림으로 출력한다.
•
docker events → 도커 데몬에 일어나는 event들을 실시간 스트림 로그로 출력한다.
Dockerfile
도커 이미지를 생성하기 위한 스크립트 파일이다.
아래와 같은 명령어들로 Dockerfile을 작성한 후 build를 하면,
명령문 순서대로 실행되어 도커 이미지를 생성하게 된다.
•
FROM : 생성할 이미지의 베이스 이미지
•
MAINTAINER : 이미지를 생성한 사람의 이름 및 정보
•
LABEL : 컨테이너 이미지에 컨테이너의 정보를 저장
•
RUN : 컨테이너 빌드 시 base image에서 실행할 commands
•
ADD : 컨테이너 빌드 시 호스트의 파일(tar,url 포함)을 컨테이너로 복사
•
COPY: 로컬의 파일을 이미지에 복사
•
WORKDIR : 컨테이너 빌드 시 명령이 실행될 작업 디렉터리 설정
•
ENV : 환경변수 지정
•
VOLUME : 파일 또는 디렉토리를 컨테이너의 디렉토리로 마운트
•
EXPOSE : 노출할 포트 지정
•
CMD : 컨테이너 동작 시 자동으로 실행할 서비스나 스크립트 지정
docker run 할 때 명령어도 입력하면 오버라이드 되어 CMD는 무시된다.
•
ENTRYPOINT :CMD와 함께 사용하면서 command 지정 시 사용
dockerfile이 있는 현재 디렉토리에서 build 명령 실행하여 이미지를 생성할 수 있다.
docker build -t {image name} .