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
...