본문 바로가기
Study/Docker

Day 2. 도커 컨테이너 다뤄보기

반응형

위키북스에서 나온 "시작하세요! 도커/쿠버네티스" 개인 공부 포스트입니다

http://www.yes24.com/Product/Goods/84927385

 

시작하세요! 도커/쿠버네티스 - YES24

본서는 도커를 처음 접하는 개발자를 위한 도커 컨테이너와 이미지의 기본적인 개념을 먼저 설명한 뒤, 도커 컴포즈와 스웜 모드를 통해 컨테이너 애플리케이션을 YAML 파일로 작성하고 클러스

www.yes24.com


도커 이미지

  • 컨테이너를 생성할 때 필요한 요소
  • 가상 머신을 생성할 때 사용하는 iso 파일과 비슷한 개념
  • 여러 개의 계층으로 된 바이너리 파일로 존재하며, 읽기 전용으로 사용된다
  • [저장소 이름]/[이미지 이름]:[태그] 
    • 저장소 이름: 이미지가 저장된 장소,명시되지 않을 수 있다(도커 허브의 공식 이미지 혹은 생성시 생략 )
    • 이미지 이름: 해당 이미지가 어떤 역할을 하는지 나타냅니다(생략 불가)
    • 태그: 이미지의 버전 관리, 생략시 latest로 인식합니다

 

도커 컨테이너

  • 도커 이미지를 이용해 컨테이너를 만들면, 해당 이미지의 목적에 맞는 파일이 들어있는 파일 시스템, 격리된 시스템 자원 및 네트워크를 사용할 수 있고 독립된 공간을 사용 가능
  • 이미지를 읽기 전용으로 사용하되 이미지에서 변경된 사항만 컨테이너 계층에 저장하므로 컨테이너에서 무엇을 하든지 원래 이미지는 영향을 받지 않는다
  • 생성된 각 컨테이너는 각기 독립된 파일시스템을 제공받으며 호스트와 분리돼 있으므로 특정 컨테이너에서 어떤 애플리케이션을 설치 혹은 삭제를 해도 다른 컨테이너와 호스트에 영향을 미치지 않습니다

 

도커 컨테이너 다루기

  • 도커 버전 확인
    • 도커는 다양한 기능을 빠르게 업데이트하기 때문에 주기적으로 버전 확인을 해줘야한다 ( 주요 기능들을 못쓸 수 있기 때문에 )
      # docker version
      docker -v

      => ex) Docker version 19.03.12, build a872fc2f86​
  • 컨테이너 생성 + 실행
    • docker run 명령어는 컨테이너를 생성, 실행하고 컨테이너 내부로 들어가는 역할
    • -i 옵션을 통해 컨테이너와 상호 입출력을 가능하게 한다
    • -t 옵션을 통해 tty를 활성화해서 배시 셸을 사용하도록 한다 ( tty: 리눅스 드라이버중 콘솔, 터미널을 의미 )
    • 컨테이너 생성시 기본 사용자 root와 무작위 16진수 해시값으로 컨테이너 고유한 ID가 발급됩니다
      # container create
      docker run -i -t ubuntu:14.04​
      => ex) ubuntu:14.04 이미지가 로컬 도커 엔진에 존재하지 않으므로, 도커 중앙 이미지 저장소(도커 허브)에서 이미지를 내려받습니다
  • 컨테이너 중지
    • 컨테이너 셸 안쪽에서 exit 혹은 Ctrl + D, 컨테이너를 종료시킴과 동시에 빠져나옵니다
    • Ctrl + P, Q를 이용하면 단순히 컨테이너의 셸에서만 빠져나오기 때문에 컨테이너를 유지 가능
  • 도커 이미지 내려받기
    • 도커 공식 저장소(도커 허브)에서 이미지를 내려받습니다
      # pull image
      docker pull centos:7​
  • 내려받은 도커 이미지 확인
    # check docker images
    docker images​
  • 컨테이너 생성
    • docker create 명령어를 이용해 컨테이너를 생성만 하고 docker run과 달리 컨테이너 실행 및 내부로 들어가지 않습니다
    • --name 옵션을 통해 컨테이너의 이름을 설정할 수 있습니다
      # docker create
      docker create -i -t --name mycentos centos:7​
  • 이미지 상세정보 확인
    • docker inspect 명령어를 이용해 해당 도커 이미지의 상세 정보를 확인할 수 있다
      # select config to docker image
      docker inspect {docker image name}​
  • 컨테이너 시작
    • docker start 명령어를 통해 컨테이너를 시작하고 내부로 들어갈 수 있다
    • docker attach 명령어를 통해 기시작된 컨테이너 내부로 들어갈 수 있다
      # start docker
      docker start {container name, container ID}
      
      # attach docker
      docker attach {container name, container ID}​
      => container ID는 너무 길기 때문에 구분가능한 앞의 2~3글자만 입력해도 됩니다
  • 컨테이너 목록 확인
    • docker ps 명령어를 통해 정지되지 않은 컨테이너(시작된)만 확인할 수 있습니다
    • -a 옵션을 통해 모든 컨테이너를 추가로 확인할 수 있으며, 컨테이너의 상태는 STATUS 컬럼을 통해 확인 가능합니다
      # select docker container
      docker ps -a​
    • 원하는 정보의 컬럼만 출력하고 싶을때는 --format 옵션을 이용할 수 있습니다
      # change docker ps format
      docker ps --format "table {{.ID}}\t{{.Status}}\t{{.Image}}"​
  • 컨테이너 삭제
    • docker rm 명령어를 이용해서 더 이상 사용하지 않은 컨테이너를 삭제할 수 있습니다
    • 단 한 번 삭제한 컨테이너는 복구할 수 없으므로 삭제할 때 주의해야한다
    • 실행중인 컨테이너는 바로 삭제가 불가능 하므로 docker stop을 통해 컨테이너를 멈추거나 docker rm 옵션중 -f를 추가하여 강제로 삭제할 수 있습니다
    • 모든 컨테이너를 삭제하고 싶을때는 docker container prune 명령어를 이용할 수 있습니다
  • 컨테이너에 /bin/bash 실행시키기
    • 포그라운드로 사용자 입출력이 가능한 shell이 실행되지 않았을 경우 exec 명령어를 통해 /bin/bash를 생성하여 접근 가능
      # exec
      docker exec -i -t {containerID/containerName} /bin/bash​

 

 

도커 컨테이너 외부에 노출시키기

  • 컨테이너는 가상 머신과 마찬가지로 가상 IP 주소를 할당받습니다
  • 도커는 기본적으로 컨테이너에 172.17.0.x의 IP를 순차적으로 할당한다 ( 왜...?? 아직 이유를 못찾았다.. )
  • 기본적으로 도커는 외부에서 접근이 불가능하고, 도커가 설치된 호스트에서만 접근 가능합니다(예외로 docker for mac에서는 이 방식도 불가능 )
  • 기본적으로 각 컨테이너는 eth0 인터페이스와 로컬 호스트인 lo 인터페이스가 생성된다
  • docker 내부에서 ifconfig를 통해 생성된 eth0 인터페이스를 확인해보면 inet addr: 172.17.0.2로 할당된 것을 확인할 수 있다

  • 외부로 컨테이너의 네트워크를 노출시키기 위해서는 eth0 인터페이스의 IP와 포트를 호스트의 IP와 포트에 바인딩해야 합니다
  • -p 옵션을 통해 컨테이너의 포트를 호스트의 포트와 바인딩(포트 바인딩)할 수 있습니다
    # connect port
    docker run -i -t -p 3306:3306 -p 192.168.0.100:7777:80 ubuntu:14.04​
  • 다수의 -p 옵션을 통해서 여러 포트를 바인딩 할 수 있으며, 호스트의 특정 IP와 바인딩도 가능하다 ( 192.168.0.100:7777 )
  • 바인딩할 호스트의 포트없이 -p 80 이런식으로 컨테이너의 80포트를 지정하게되면 호스트의 포트중 연결 가능한 포트와 알아서 연결된다. ( docker ps를 통해 연결된 port를 알아내야 한다 )

 

 

컨테이너 어플리케이션 구축

  • 컨테이너화할때 여러 개의 애플리케이션을 한 컨테이너에 설치할 수도 있다
  • 다만 컨테이너에 어플리케이션 하나만 동작시키면 컨테이너 간의 독립성을 보장함과 동시에 어플리케이션 버전관리 소스코드 모듈화등이 더욱 쉬워진다 ( 도커의 철학 )

 

  • 호스트와 바인딩된 포트만 확인
    # check docker port 
    docker port {container name, container ID}​
  • -d 옵션
    • -i, -t 옵션으로 run을 실행하면 표준 입출력이 활성화된, 상호작용이 가능한 셸 환경을 사용할 수 있다
    • -d 옵션으로 run을 실행하면 입출력이 없는 상태로 컨테이너를 실행합니다
    • 컨테이너 내부에서 프로그램이 터미널을 차지하는 포그라운드로 실행돼 사용자의 입력을 받지 않습니다
    • Detached 모드인 컨테이너는 반드시 컨테이너에서 프로그램이 실행돼야하며, 포그라운드 프로그램이 실행되지 않으면 컨테이너는 종료된다

  • 컨테이너는 각기 하나의 모니터를 기본적으로 가지고 있다
    • ubuntu:14.04의 이미지로 /bin/bash를 포그라운드로 실행한 컨테이너 존재
    • 서로 다른 터미널에서 해당 컨테이너로 attach를 실행하면 서로 모니터를 공유하는 것을 볼 수 있다
    • 즉 컨테이너마다 하나의 모니터를 기본적으로 가진다

 

  • -e 옵션
    • 컨테이너 내부의 환경변수를 설정
    • 컨테이너화된 어플리케이션은 환경변수에서 값을 가져와 쓰는 경우가 많으므로 자주 사용하는 옵션중 하나입니다

 

  • --link 옵션
    • A 컨테이너에서 B 컨테이너로 접근하는 방법 중 가장 간단한 것은 NAT로 할당받은 내부 IP를 쓰는 것입니다
    • 172.17.0.X 의 IP를 차례대로 하나씩 부여받은 컨테이너의 IP로 직접 접근 할 수 있지만, 컨테이너를 시작할 때마다 재할당하는 것이므로 매번 변경되는 컨테이너의 IP로 접근하기는 어렵습니다
    • --link 옵션은 내부 IP를 알 필요 없이 항상 컨테이너에 별명으로 접근하도록 설정합니다
      # link
      ... --link {contaninerName}:{link alias} ...​
    • --link 옵션으로 입력된 컨테이너가 실행 중이지 않거나 존재하지 않으면 실패한다
    • 현재 deprecated된 옵션이며 추후 삭제될 가능성이 존재.. 후에 docker bridge를 통한 통신을 설명하겟습니다

 

728x90
반응형

'Study > Docker' 카테고리의 다른 글

Day 3. 도커 볼륨이란?  (0) 2021.09.02
Day 1. 도커(Docker)란?  (0) 2021.08.12