1. Docker 기본

    1) 반가상화보다 좀 더 경량화된 방식으로, 게스트 OS를 설치하지 않고 Docker 이미지에 서버 운영을 위한 프로그램과 라이브러리만 격리해서 설치하며 OS 자원은 호스트와 공유

    2) 가상화 : chroot > LXC(LinuX Container) > libcontainer (native로 표시)

    3) 베이스이미지에서 바뀐 부분만 이미지로 생성하고 실행할 때는 베이스 이미지와 바뀐 부분을 합쳐서 실행

    4) 컨테이너는 이미지를 실행한 상태로 하나의 이미지로 여러 개의 컨테이너를 만들 수 있음


2. Docker 설치 (Mac OS X)

    1) docker for Mac

        - https://docs.docker.com/docker-for-mac/install/ 에서 Docker.dmg 파일 다운로드 후 설치

    2) kitematic (GUI Tool)

        - Mac Menu bar 에서 Docker 고래 > kitematic 클릭 > Download 후 설치


3. Docker 기본 사용법

    1) 이미지 검색 (Docker Hub에서 확인 가능) : docker search [Image Name]

        - docker search ubuntu

    2) 이미지 받기 : docker pull [Image Name:Tag]

        - docker pull ubuntu:latest

    3) 이미지 목록 출력 : docker images

    4) 컨테이너 생성 : docker run -it --name [생성할컨테이너이름] [Image Name] [실행 명령]

        - docker run -it --name hello ubuntu /bin/bash

    5) 컨테이너 목록 확인 : docker ps -a

    6) 컨테이너 시작 : docker start [컨터이너이름 or 컨테이너ID]

        - docker start hello

        - docker restart hello

    7) 컨테이너 접속 : docker attache [컨테이너이름]

        - docker attach hello

    8) 외부에서 컨테이너 안의 명령 실행 : docker exec [컨테이너이름] [명령]

        - docker exec hello ls -al /

    9) 컨테이너 정지 : docker stop [컨테이너 이름]

        - docker stop hello

    10) 컨테이너 삭제 : docker rm [컨테이너 이름]

         - docker rm hello

    11) 이미지 삭제 : docker rmi [Image Name:Tag]

         - docker rmi utuntu:latest

    12) 이미지 히스토리 조회 : docker history [Image Name:Tag]

         - docker history hello:0.1

    13) 파일 복사 : docker cp [컨테이너이름]:[경로] [호스트OS 경로]

         - docker cp hello-nginx:/etc/nginx/nginx.conf ./

    14) 컨테이너 변경사항을 이미지로 생성하기 : docker commit [option] [컨테이너이름] [Image Name:Tag]

         - docker commit -a "itraveler <itraveler@example.com>" -m "add hello.js" hello-nginx hello:0.2

    15) 컨테이너에서 변경된 파일 확인 : docker diff [컨테이너이름]

         - docker diff hello-nginx

         - A : 추가된 파일, C : 변경된 파일, D : 삭제된 파일

    16) 세부 정보 확인: docker inspect [컨테이너이름 or Image Name]

         - docker inspect hello-nginx

         - docker inspect -f "{{ .State.Pid }}" hello-nginx


4. Docker 저장소 구축

    1) 개인 저장소(registry 서버) 구축 (insecure-registry 설정)

       (1-1) docker 실행시 설정

            - service docker stop

            - docker -d --insecure-registry localhost:5000

       (1-2) docker가 서비스 형태로 실행되는 경우 /etc/init.d/docker 파일 설정

           DOCKER_OPTS=--insecure-registry localhost:5000

       (1-3) docker for mac 은 고래 아이콘 > preference > daemon > insequre-registry 설정

       (2-1) registry 서버 실행

           - docker pull registry:latest

           - docker run -d -p 32768:5000 --name hello-registry -v /tmp/registry:/tmp/registry registry

        (2-2) Amazon S3 사용

           - docker pull registry:latest

           - docker run -d -p 32768:5000 --name s3-registry -e SETTINGS_FLAVOR=s3 -e AWS_BUCKET=testbucket -e STORAGE_PATH=/registry -e AWS_KEY=FDASFEAADAFAS -e AWS_SECRET=FASDFA32423fFASFD registry 

        (3) docker hub 사용 (가입 필요)

            - docker login

    2) 이미지 올리기

        (1) 태그 생성 : docker tag [Image Name:Tag] [Docker registry URL]/[Image Name:Tag]

             - docker tag hello:0.1 localhost:32768/hello:0.1

        (2) 이미지 Push : docker push [Docker registry URL]/[Image Name:Tag]

             - docker push localhost:32768/hello:0.1


5. Dockerfile (이미지 설정 파일) 작성

    1) FROM : 어떤 이미지를 기반으로 이미지를 생성할지 설정

       - FROM ubuntu:14.04

    2) MAINTAINER : 이미지를 생성한 사람의 정보

       - MAINTAINER itraveler <itraveler@example.com>

    3) RUN : FROM 에서 설정한 이미지 위에서 스크립트 혹은 명령을 실행

       - RUN apt-get install -y nginx

       - RUN echo "Hello docker"

       * RUN ["실행파일", "매개변수1", "매개변수2"] (셸없이 실행)

    4) CMD : 스크립트 혹은 명령을 실행

       - CMD touch /tmp/hello.txt

       - CMD ["실행파일", "매개변수1", "매개변수2"] (셸없이 실행)

    5) ENTRYPOINT : 컨테이너가 시작되었을때 (docker run 또는 docker start) 스크립트 혹은 명령을 실행 (단 한번만 사용 가능)

       - ENTRYPOINT touch /tmp/hello.txt

       - ENTRYPOINT ["실행파일", "매개변수1", "매개변수2"] (셸없이 실행)

       - docker run --entrypoint="명령" 옵션으로 설정 가능 (옵션을 사용하면 ENTRYPOINT는 무시됨)

    6) EXPOSE : 호스트와 연결할 포트를 설정. (docker run --expose)

       - EXPOSE 80

    7) ENV : 환경 변수를 설정

       - ENV MYVAR 1234

    8) ADD : 파일을 이미지에 추가 (추가할 때 압축을 해제함)

       - ADD hello.zip /

    9) COPY : 파일을 이미지에 추가 (압축을 해제하지 않음)

       - COPY hello.tar.gz /hello.tar.gz

    10) VOLUME : 디렉터리 내용을 컨테이너에 저장하지 않고 호스트에 저장하도록 함

       - VOLUME /data

       - VOLUME ["/data", "/var/log"]

    11) USER : 명령을 실행할 사용자 계정 설정. RUN, CMD, ENTRYPOINT 에 적용됨.

       - USER nobody

    12) WORKDIR : RUN, CMD, ENTRYPOINT 의 명령이 실행될 디렉터리 설정

       - WORKDIR /var/www

    13) ONBUILD : 생성한 이미지를 기반으로 다른 이미지가 생성될 때 명령을 실행

       - ONBUILD RUN touch /hello.txt


     * Dockerfile 작성 후 build 명령으로 이미지 생성

       - docker build --tag hello:0.1


6. Docker 베이스 이미지 생성 (부트 스트랩 도구 이용)

    1) 우분투

       - apt-get install debootstrap

       - debootstrap trusty trusty

       - tar -C trusty -c . | docker import - trusty

    2) CentOS

       - yum install febootstrap

       - febootstrap -u http://ftp.kaist.ac.kr/CentOS/6.5/updates/x86_64/ centos65 http://ftp.kaist.ac.kr/CentOS/6.5/os/x86_64/

       - tar -C centos65 0c . | docker import - centos65


7. Docker 컨테이너 연결

    1) --link 옵션 사용

       (1) docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql  mysql:5.7

       (2) docker run --name web -d -p 80:80 --link mysql:mysql nginx

           - docker exec -it web bash 로 접속해서 /etc/hosts 확인하면 mysql ip alias가 설정되어 있음을 확인

    2) 데이터 볼륨 사용

       (1) docker run -it --name hello-volume -v /data ubuntu /bin/bash

          - -v [호스트path]:[컨테이너path] 와 같이 직접 지정하지 않으면 호스트에 임의의 이름으로 생성됨

          - 두개의 컨네이너를 실행하면서 host의 같은 path를 지정하면 컨테이너들끼리 볼륨 공유가 됨


8. 어플리케이션 배포

    1) 개발자 PC > 서버 (Host: Git Repository, 컨테이너:이미지 실행)

        (1) git push > git hook에 의해 스크립트 수행(Dockerfile 기반으로 이미지 생성 + 컨테이너 실행)

    2) 개발자 PC > 서버 (Host: Git Repository, 컨테이너:Docker Registry실행) > 애플리케이션 서버 N 대

        (1) git push > git hook에 의해 스크립트 수행(Dockerfile 기반으로 이미지 생성 + Registry에 push +  각 애플리케이션 서버에서 docker pull 및 컨테이너 실행)


9. docker remote api

   - docker -d -H tcp;//0.0.0.0:4243

   ...


Posted by 얼랄라