학습내용

  • 커밋을 통한 이미지 생성
  • Dockerfile을 기반으로 한 이미지 생성
  • Dockerfile 상세

학습목표

  • 커밋을 통한 컨테이너에서 이미지 생성하는 방법에 대해서 알아본다.
  • Dockerfile 스크립트를 통한 이미지 생성하는 방법에 대해서 알아본다.
  • Dockerfile 사용방법에 대해 자세히 알아보고 사용법을 익힌다.


커밋을 통한 이미지 생성

apt-get update & install

  • 컨테이너에 접속한 상태에서
    • apt-get update
    • 이 명령을 수행해야 apt-get install 명령어를 사용할 수 있다.
    • 바로 apt-get install을 사용하면 에러 발생
    • docker에서는 apt-get update를 필수로 해줘야 한다.
  • 일반 우분투에서는 기본 설치되어 있는 nono(기본 에디터)가 도커기반 이미지에서는 깔려 있지 않음
    • apt-get install nano
  • 설치 후에는 커맨드라인에서
    • nano라고 입력하면 나도 실행

이미지생성

  • 도커 이미지 생성방법
    • 컨테이너에 새로운 내용을 추가/변경한 후 commit해 이미지 생성
      • docker diff ubuntu : 컨테이너 변경사항 확인
      • docker commit -m "test" -a "sjha(사용자)" ubuntu ubuntu_nano
      • docker images

Dockerfile을 기반으로 한 이미지 생성

이미지 생성

  • 도커 이미지 생성방법
    • Dockerfile을 수행시켜 새로운 이미지 생성
    • 우분투 이미지에 Dockerfile 입력 후 수행

      Dockerfile

      FROM ubuntu:latest

      MAINTAINER myeongho lee <sooabia22@sptek.co.kr>


      RUN apt-get update

      RUN apt-get install -y nano

      ENV TERM=xterm


      docker build --tag=ubuntu_nano .

      docker images

      docker history ubuntu_nano (이미지 변경사항 확인)


    • update → nano설치 → 환경변수 설정된 이미지가 생성됩니다.

      • 우분투가 설치되어 있지 않으면 다운로드 부터 시작한다.
    • 스크립트파일대로 수행결과 image가 생성되는 것입니다.

Dockerfile 상세

Dockerfile 기초

  • FROM
    • 도커 이미지 생성할 때 사용할 기본 이미지를 지정
    • 만약 해당 이미지가 없으면 서버 저장소 에서 다운로드 받는다.
  • MAINTAINER
    • 이미지를 생성한 사람에 대한 기본 정보 표시

명령어 수행

  • RUN
    • FROM에서 지정한 기본 이미지 위에 명령 수행해 새로운 이미지를 생성
      • RUN apt-get update
      • RUN apt-get install wget
  • CMD
    • 컨테이너가 수행될 때 지정된 명령어/명령/스크립트 파일 실행
    • Dockerfile에서 한 번만 가능
      • -CMD ["echo $PATH"]
  • ENTRYPOINT
    • CMD와 거의 같으나 컨테이너 생성(run)이나 시작(start)될 때 실행
      • ENTRYPOINT ["/sample.sh"]

환경변수 설정

  • 일반적인 우분투의 경우
    • 홈디렉토리의 ~/.bashrc나 ~/.profile에
      • -export sample=/sample 과 같이 지정한 후
      • -source ~/bashrc 나 source ~/.profile로 환경변수에 반영한다.
  • 도커에서는
    • 환경변수를 지정하려면
      • docker run --env sample=/sample --name=ubuntu ubuntu
    • Dockerfile
      • ENV sample=/sample
  • 환경변수 확인
    • echo $sample

포트 노출

  • 컨테이너의 포트와 호스트의 포트를 연결
  • 컨테이너의 80번포트와 호스트의 80번 포트를 연결
    • 외부에서 80번 포트로 접근하면 컨테이너의 80번 포트로 연결(포트포워딩)
    • docker run -p --name=ubuntu ubuntu
  • Dockerfile
    • expose 80 : 컨테이너의 포트
    • 컨테이너의 80번 포트를 외부에 노출한다.
    • -p 옵션과 같이 사용

파일을 이미지에 추가

  • 호스트의 파일을 이미지 생성시 추가(복사)
  • Dockerfile
    • ADD ~/sample.txt /sample.txt
      • 호스트의 ~/sample.txt 파일을 컨테이너의 /에 추가(복사)
    • 압축파일을 지정할 경우 압출을 풀어 추가
    • URL을 지정할 경우에는 압축해제 없이 추가됨

명령 수행할 사용자/폴터 지정

  • RUN/CMD/ENTRYPOINT 수행하기전 사용자계정 지정
    • USER sample
      • sample 사용자로 변경
  • RUN/CMD/ENTRYPOINT 수행하기 전 폴더 지정
    • WORKDIR ~/sample
      • ~/sample폴더로 변경해 아래 명령을 수행하라

볼륨연결

  • 컨테이너의 폴더와 호스트의 물리폴더 같의 연결
  • 물리 폴더 ~[홈디렉토리]/Downloads 를 컨테이너의 /download폴더로 연결
  • Dockerfile
    • VOLUME /sample
    • VOLUME ["/data","/sample"]
    • 해당 디렉토리는 컨테이너 폴더가 아닌 호스트의 물리폴더로 저장하고
    • -v 옵션과 같이 사용

도커 컨테이너간 연결

  • 컨테이너간 상호연결 설정
  • mysql 다운로드
    • docker pull mysql
  • mysql 컨테이너 실행(서버모드)
    • docker run -d -e MYSQL_ROOT_PASSWORD=kitri --name=mysql mysql
  • 우분투 컨테이너 실행(연결)
    • docker run --name ubuntu -d --link mysql:mysql ubuntu


하이퍼바이저 기반 가상화와 도커기반 컨테이너 가상화의 차이

도커에서 리눅스 이미지를 기반으로 실행한 컨테이너는 일반 리눅스와 몇가지 차이를 만듭니다.

가장 큰 차이는 apt-get update를 반드시 해줘야 한다는 것입니다.

이는 패키지를 우분투 저장소에서 직접받는 것이 아니라 도커에서 리눅스 패키지를 도커기반의 리눅스에서 실행 하도록 수정한 패키지를 받는 다는 의미 인데요.

대부분의 경우는 큰 문제가 없지만 도커 기반의 환경에서 돌아가도록 수정해야 하는 경우들이 있다는 것입니다.

가장큰 타이는 도커 기반의 이미지들은 핵심패키지만 설치한 것들이라 표준이미지들과 다르다는 것입니다. 예를 들면 nano와 같은 기본 에디터가 도커기반 우분투에는 설치되어 있지 않습니다.

또한 ifconfig를 조회하는 net-tools와 같은 패키지도 설치되어 있지 않습니다.

그래서 우분투 서버 ios파일은 650MB정도의 크기지만 도커 우분투 서버 이미지는 130MB남짓합니다.

필요한 패키지는 추가로 설치해서 사용하라는 것이죠.

그리고 서비스(service) 자동실행 구조가 달라 대부분의 서버를 시작/종료/재시작 하는 방법이 다릅니다.

이를 보완하기 위해 SSH의 경우는 수동(매뉴얼)로 직접 서버프로그램을 옵션을 주고 실행시켜줘야 합니다.

그리고 .profile이나 .bashrc 가 시스템 실행시 자동으로 수행되지 않습니다.

그래서 필요하다면 Dockerfile에 설정을 해줘야 컨테이너 생성시 설정이 가능합니다.

이런 점들을 고려해야 도커를 이해하고 사용하는 것이 좀 더 편리할 수 있습니다.


  • No labels

0 Comments

You are not logged in. Any changes you make will be marked as anonymous. You may want to Log In if you already have an account.