About me
home
Portfolio
home
🐋

Docker

도커(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을 사용하면[ pullcreatestart ] 과정을 한번에 하는 것과 동일하다.
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} .