5분만에 읽는 도커 기본 – 개요, 명령어

2022.07.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

안녕하세요 클래스메소드의 수재입니다.
한동안 보지않았던 컨테이너와 쿠버네티스 공부를 다시 시작하고 있습니다.
오랫동안 보지 않았어서 그런지 도커 내용부터 헷갈리는 내용이 조금씩 있었습니다 ㅎㅎ...
그래서 앞으로도 제가 한번씩 참고할 수 있도록 메모같은 느낌으로 쓱 훑을 수 있도록 내용을 정리해두려합니다.

개요

  1. 다음과 같은 명령어로 도커를 실행
    $ service docker start
    # or
    $ systemctl enable docker

  2. 컨테이너에서 나올 때 exit 명령어 쓰면 컨테이너가 정지되어 버리니까 컨트롤 + P,Q로 나오자

  3. run 명령어에서 옵션 -i 는 상호 입출력을 -t는 bash 사용
    1. -d 옵션(detached 모드)을 사용하면 입출력 프롬프트 없이 컨테이너 실행
      1. detached 모드로 생성한 컨테이너에 들어가고 싶으면 docker exec -i -t {컨테이너 이름} /bin/bash
    2. foreground 프로그램이 실행되는 컨테이너가 아니라면 자동 종료(한번씩 헷갈리니 조심)
  4. 컨테이너 생성의 흐름
    1. run 명령어
      1. docker pull -> docker create -> docker start -> docker attach
    2. create 명령어
      1. docker pull -> docker create
  5. 볼륨에 대해
    1. -v 옵션으로 볼륨 지정
      1. docker run -v {호스트에서 공유할 디렉토리 경로}:{컨테이너에서 공유할 디렉토리 경로} ubuntu:latest
    2. -v 옵션말고도-- volumes-from옵션을 사용하여 다른 컨테이너의 볼륨을 그대로 이용하는 방법도 있음
      1. 즉 볼륨 전용 컨테이너를 만들어 활용하는 방법
    3. 혹은 미리 생성한 도커 볼륨을 사용할 수 있음
      1. 볼륨 생성 명령어는 docker volume create --name {볼륨명}
  6. inspect 명령어를 사용하면 해당 타입의 개체의 정보를 알 수 있음
    1. docker inspect -type {volume/container 등등} {개체명}
    2. docker inspect —type volume {볼륨명}

네트워크

  1. 도커가 제공하는 네트워크 드라이버에는 호스트, 논, 컨테이너, 브릿지(브리지라고도 함), 오버레이가 있음
    1. 호스트(host) : 호스트의 네트워크를 그대로 사용
    2. 논(none) : 아무런 네트워크도 사용하지 않음
    3. 컨테이너(container) : 다른 컨테이너의 네트워크 네임스페이스 환경을 공유
      1. docker run -i -t --name container_name --net container:{다른 컨테이너 명} ubuntu
    4. 브릿지(bridge) : 브릿지를 통해 각 컨테이너의 veth가 통신
      1. --net-alias {별칭}으로 한 브릿지 내의 여러 컨테이너를 구분 할 수 있음
        1. 도커 내부의 DNS가 각 별칭을 각 컨테이너의 주소로 변환
      2. 특정 대역을 갖는 네트워크(브리지, 오버레이)가 VPC와 같은 역할을 하고 있어서 docker0 브리지는 사용하지 않음
    5. 오버레이(overlay) : 여러 개의 도커 데몬을 하나의 네트워크 풀로 만드는 가상화 된 네트워크
      1. 스웜에서 다시 나옴
    6. 브릿지 / 오버레이 네트워크는 network connet 나 network disconnect 등의 명령어 사용 가능
    7. 서브넷, 게이트웨이, IP 할당 범위 등을 설정 가능
      1. docker network create --driver=bridge --subnet=172.2.0.0/16 --ip-range=172.2.0.0/24 --gateway=172.72.0.1 {컨테이너명}

로깅

  1. docker logs {컨테이너명}명령어로 컨테이너의 에러 로그 등을 확인 가능
    1. --since {유닉스 시간}, --tail {마지막 몇 줄} 등의 옵션을 활용하여 편하게 로깅 가능
    2. 컨테이너를 생성할 때 -f 옵션을 붙이면 실시간 로깅이 활성화
    3. 컨테이너의 로그는 /var/lib/docker/containers/${CONTAINER_ID}/${CONTAINER_ID}-json.log 에 남아있음
    4. 로그의 드라이버를 선택할 수 있음
      1. syslog, journald, fluentd, awslogs 등이 있음
      2. docker start --log-driver=syslogs 와 같이 지정
  2. 도커 데몬 옵션으로 드라이버나 다른 옵션 등을 일괄적으로 변경할 수 있음

컨테이너 자원

  1. run, create 명령어 에서 자원 할당량을 조정할 수 있음
  2. 이미 자원이 할당된 자원을 변경하려면 update 명령어 사용
    1. docker update {변경할 자원} {컨테이너 이름}
    2. docker update --cpuse-cpus=1 centos ubuntu
  3. 메모리 제한은 --memory=~g or ~m
    1. 컨테이너가 메모리를 초과하면 자동으로 종료됨
    2. 스왑메모리는 --memory-swap=500m 와 같이 지정할 수 있으며 지정이 없으면 자동으로 메모리의 2배가 지정
  4. cpu 제한을 전체 cpu의 비율로 하려면 각 컨테이너마다 --cpu-share{숫자} 로 하면 각 숫자를 비율화 한 만큼 컨테이너 간에 cpu를 할당해감
  5. 호스트에 여러 CPU가 있을 때 한 컨테이너에 하나의 cpu를 할당하고 싶다면 --cpuset-cpu={cpu번호} 로 특정 CPU를 지정
    1. 3번째 CPU라면 --cpuset-cpu=2
  6. 컨테이너의 CFS 주기를 지정하기 위해선 --cpu-period--cpu-quota 를 조합해서 지정
    1. --cpu-period=100000 \ --cpu-quota=25000 을 하면 일반적인 컨테이너보다 CPU 성능이 1/4로 줄어듦(cpu-quota / cpu-period)

이미지

  1. save 혹은 export 명령어를 쓰면 로컬에 단일 파일로 이미지를 저장할 수 있음
    1. docker save -o {저장할 파일 이름} sujaebuntu
  2. load 혹은 import 명령어를 쓰면 로컬에 저장된 단일 파일을 이미지로 바꿀 수 있음
    1. docker load -i {저장된 파일 이름}
  3. 이용하는 이미지에 불필요한 이미지 레이어가 들어있다면 해당 이미지로 컨테이너를 생성하고 docker export -> docker import 명령어를 실행하면 컨테이너를 이미지로 만들어 용량을 줄일 수 있음
    1. 대신 이미지 설정은 사라짐

Dockerfile

  1. 명령어에 대한 간단한 설명
    FROM golang
    ADD main.go /root
    WORKDIR /root
    RUN go build -o /root/mainApp /root/main.go
    
    FROM alpine:latest
    WORKDIR /root
    COPY --from=0 /root/mainApp .
    CMD ["./mainApp"]
    1. FROM
      • 베이스 이미지를 지정
      • FROM ubuntu:14.04
    2. LABEL
      • 이미지의 메타데이터
      • 키:값 형태로 저장됨
      • LABEL maintainer "sujae"
      • maintaier 라벨을 추가해서 이미지의 생성자 정보를 넣자
    3. RUN
      • 컨테이너 내부에서 실행하는 명령어
      • RUN apt-get update
      • 도커 파일로 이미지를 생성하면 생성 중에 Y/N 를 선택하지 못하기 때문에 기본적으로 yes를 하는 -y 옵션을 붙여야함
      • 중괄호를 이용하여 셸 사용 가능
      • RUN 명령어가 하나의 이미지 레이어가 된다는 감각으로 작성
        • 여러개의 RUN을 실행하게 될 경우 이미지의 크기가 커질 수 있으니 &&등을 이용하여 정리할 수 있는 명령어는 정리
      • RUN ["/bin/bash","echo hello >> test.txt"]
    4. ADD
      • 파일을 이미지에 추가
      • Dockerfile이 위치한 디렉토리의 파일을 이미지에 추가함
      • 여러 개의 파일을 추가할 수 있음
      • ADD {디렉터리의 파일}, {추가할 파일}... {컨테이너에서 저장할 위치}
      • ADD test.html /var/www/html
      • COPY명령어는 로컬의 파일만 이미지에 추가하지만 ADD는 외부 URL 및 tar 파일도 포함 가능
    5. WORKDIR
      • 명령어를 실행할 디렉터리를 지정
      • bash의 cd 명령어와 같음
      • WORKDIR /var/www/html
    6. EXPOSE
      • Dockerfile로 빌드된 이미지에서 노출할 포트 지정
      • EXPOSE 80
    7. CMD
      • 컨테이너가 시작될 때마다 실행할 명령어로 단 한번만 사용 가능
      • CMD apachectl -DFOREGROUND
      • 위의 커맨드를 Dockerfile에 지정해두면 컨테이너를 생성할 때 별도의 커맨드를 입력하지 않아도 자동으로 적용된 상태로 실행됨
    8. ENV
      • Dockerfile에서 사용될 환경변수 지정
      • ENV {name} {value}
      • ENV name sujae
    9. VOLUME
      • 생성한 컨테이너의 볼륨에서 호스트와 공유할 디렉터리를 지정
      • 호스트의 /var/lib/docker/voulme에서 공유된 디렉터리를 확인 가능
      • VOLUME["/foo/bar", "/foo"]
      • VOLUME["/usr/bin"]
    10. ARG
      • build 명령어를 실행할 때 추가로 입력받는 변수를 설정
      • ARG {변수명}
      • ARG PORT_NUM
      • 이후 dockeer build --build-arg PORT_NUM=80 등과 같이 변수를 지정
    11. USER
      • 컨테이너 내에서 사용될 사용자 이름이나 UDI를 설정하면 USER 아래의 명령어는 모두 지정한 사용자로 실행됨
      • USER app-1
    12. ONBUILD
      • Onbuild를 지정한 이미지로 새로운 이미지를 만들 때 Onbuild에 지정한 명령어가 실행
      • ONBUILD RUN echo "HELLO"
    13. STOPSIGNAL
      • 컨테이너가 정지될 때 보낼 시그널을 지정
      • 지정하지 않으면 기본 값으로 SIGTERM
      • STOPSIGNAL {시그널 이름 혹은 번호}
    14. HEALTHCHECK
      • 컨테이너에서 동작하는 프로세스의 상태 체크
      • docker ps로 해당 컨테이너의 상태(STATUS)를 확인할 수 있음
        • healthy / unhealthy
      • HEALTHCHECK --interval={반복 주기} --timeout={실패로 판단하는 시간} --retries={실패 기준 횟수} CMD {명령어}
      • HEALTHCHECK --interval=1m --timeout=5s --retries=2 CMD app
    15. SHELL
      • 실행하는 셸을 지정
      • SHELL ["/usr/local/zsh"]
  2. Dockerfile은 build 명령어를 사용
    1. docker build -t {저장될 이름} {빌드할 위치}
    2. docker build -t sujaestudy:0.0 ./
    3. 빌드 후에는 그대로 사용하면 됨
    4. docker run -d -P --name myserver sujaestudy:0.0
  3. 이미지를 생성하는 데 필요한 각종 파일, 소스코드, 메타데이터 등을 담고 있는 빌드 컨텍스트를 읽음
    1. Dockerfile이 위치한 디렉터리
    2. 컨텍스트는 빌드 명령어의 맨 마지막에 지정된 위치에 있는 파일을 전부 포함
      1. git 같은 외부 URL에서 Dockerfile을 읽어 들이다면 해당 저장소에 있는 파일과 서브 모듈을 전부 포함
      2. 따라서 Dockerfile이 위치한 곳에는 이미지 빌드에 필요한 파일만 있는 것이 바람직
      3. 루트 디렉터리에서 빌드 하지 않도록
      4. .gitignore 같은 기능을 하는 .dockerignore를 사용할 수 있음
  4. 한 번 이미지 빌드를 마치고 난 뒤 다시 같은 빌드를 진행하면 이전의 이미지 빌드에서 사용했던 캐시를 사용
    1. 캐시를 사용하지 않으려면 --no-cache 옵션을 build 명령어에 추가
  5. 어떠한 이미지에 사용되는 각종 패키지 및 라이브러리가 불필요하게 이미지의 크기를 차지하는 경우에는 멀티 스테이지 빌드를 사용
    1. 하나의 Dockerfile 안에 여러 개의 FROM 이미지를 정의하여 빌드 완료 시 최종적으로 생성될 이미지의 크기를 줄이는 역할
    2. 다음과 같이 지정하여 두 번째 FROM을 지정
      1. COPY 의 --from=0 은 첫 번째 FROM 에서 빌드된 이미지를 가르킴

끝으로

도커의 개요와 명령어, dockerfile 에 대해 간략하게 정리하였습니다.
다음에는 도커 데몬과 쿠버네티스 등에 대해 간략하게 정리해보려 합니다!

긴 글 읽어주셔서 감사합니다.
오탈자 및 내용 피드백은 언제나 환영합니다. must01940 지메일로 연락 주시면 감사합니다!


본 블로그 게시글을 보시고 문의 사항이 있으신 분들은
클래스메소드코리아 (info@classmethod.kr)로 연락 주시면 빠른 시일 내 담당자가 회신 드릴 수 있도록 하겠습니다 !