Docker 5일차
Docker Images
-
도커는 기본적으로 도커 허브라는 중앙 이미지 저장소에서 이미지를 내려받는다.
-
도커 계정을 가지고 있다면 누구든지 이미지를 올리고 내려받을 수 있기 때문에 다른 사람들에게 이미지를 쉽게 공유할 수 있다.
-
단, 도커 허브는 누구나 이미지를 올릴 수 있기 때문에 공식 (Official) 라벨이 없는 이미지는 사용법이 제각각이다.
-
도커 허브에 어떤 이미지가 있는지 확인하기 위해 도커 허브 사이트를 직접 접속해서 찾아볼 수도 있지만 도커 엔진에서 docker search명령어를 사용할 수도 있다.
# 도커 이미지
docker run -i -t --name commit_test ubuntu:14.04
docker commit commit_test commit_test:first
docker save -o test.tar commit_test:first
!
.tar 파일을 제외한 모든 images, container를 삭제
!
docker load -i test.tar
docker image inspect commit_test:first // 이미지 저장경로, 쪼개져서 저장된다. /var/lib/docker안에 overlay2라는 파일시스템이 생성
docker run -it --name commit_test commit_test:first // .tar 압축풀은 images로 컨테이너 생성완료
# 도커 이미지 생성
docker run -i -t --name commit_test1 ubuntu:14.04
docker run -i -t --name commit_test2 ubuntu:14.04
docker attache commit_test2
echo test_second! >> second
exit
docker commit commit_test2 commit_test:second
docker commit coomit_test1 commit_test:first
docker images // 3개다 197MB임을 확인
docker history commit_test:first
docker history commit_test:second // docker images 설치가 빠른이유는 size가 100bytes도 안됨을 확인할 수 있다.
# 이미지 배포
1] 도커 허브 저장소
hub.docker.com 가입후 레파지토리 생성
docker run -i -t --name commit_container2 ubuntu:14.04
docker commit commit_container2 0518:0.0 // chaerinkang: ID, 0518: 레포지토리 네임, :0.0 : Tag명
docker tag 0518:0.0 chaerinkang/0518:0.0
docker login
docker push chaerinkang/0518:0.0
Docker File
- 이미지를 생성하는 방법
1. 아무것도 존재하지 않는 이미지(우분투, CentOS등)로 컨테이너를 생성
2. 어플리케이션을 위한 환경을 설치하고 소스코드 등을 복사해 잘 동작하는 것을 확인
3. 컨테이너를 이미지로 커밋(commit)
- 완성된 이미지를 생성하기 위해 컨테이너에 설치해야 하는 패키지, 추가해야 하는 소스코드, 실행해야 하는 명령어와 쉘 스크립트 등을 하나의 파일에 기록해 두면 도커는 이 파일을 읽어컨테이너에서 작업을 수행한 뒤 이미지로 만든다.
- 이러한 작업을 기록한 파일을 Dockerfile이라 하며, 빌드 명령어는 Dockerfile을 읽어 이미지를 생성한다.
- Dockerfile을 사용하면 직접 컨테이너를 생성하고 이미지로 커밋해야 하는 번거로움을 덜 수 있을 뿐만아니라 깃과 같은 개발 도구를 통해 애플리케이션의 빌드 및 배포를 자동화할 수 있다.
∙ FROM: 생성할 이미지의 베이스가 될 이미지를 뜻한다. 사용하려는 이미지가 도커에 없다면 자동으로 pull 한다.
∙ MAINTAINER: 이미지를 생성한 개발자의 정보를 나타낸다. 단, 도커 1.13.0 버전 이후로 사용하지 않는다.
∙ LABEL: 이미지에 부가정보인 메타데이터를 추가한다. ‘키:값’ 형태로 저장된다.
∙ RUN: 이미지를 만들기 위해 컨테이너 내부에서 명령어를 실행한다. 배열 형태로 사용되었다. [“실행 가능한 파일”, “명령줄 인자 1”, “명령줄 인자 2, ...]
∙ ADD: 파일을 이미지에 추가한다. Dockerfile이 위치한 디렉토리에서 test.html파일을 images의 /var/www/html디렉토리에 추가한다.
∙ WORKDIR: 명령어를 실행할 디렉토리를 나타낸다. bash shell에서 cd 명령어를 입력하는 것과 같은 기능을 한다.
∙ EXPOSE: Dockerfile의 빌드로 생성된 이미지에서 노출할 포트를 설정한다.
∙ CMD: 컨테이너가 시작될 때마다 실행할 명령어(커맨드)를 설정하며, Dockerfile에서 한 번만 사용할 수 있다. 해당 예제에서는 컨테이너가 시작될 때 자동으로 아파치 웹 서버가 실행될 것이다
# Docker file
cd /temp
mkdir dockerfile && cd dockerfile
echo test >> test.html
ls // test.html
cat test.html // test 문구 확인
cd..
vim Dockerfile
!
FROM ubuntu:14.04
MAINTAINER chaerinkang
LABEL "purpose"="practice"
RUN apt-get update
RUN apt-get install apache2 -y
ADD dockerfile/test.html /var/www/html
RUN ["/bin/bash", "-c", "echo hello >> /var/www/html/test2.html"]
EXPOSE 80
CMD apachectl -DFOREGROUND
!
docker build -t mybuild:0.0 ./ // -t 옵션으로 이미지의 이름을 설정. 설정하지 않으면 16진수 형태의 이름으로 생성됨, ./ 현재 디렉토리가 temp이고 temp에 build할 파일이 존재
docker images // mybuild:0.0 확인할 수 있다.
docker run -d -P --name myserver mybuild:0.0 // -P는 이미지에 설정된 EXPOSE의 모든 포트를 호스트에 연결하도록 설정함
docker port myserver // 32769 확인
10.10.51.41:32769 접속, /test.html , /test2.html 내용을 확인할 수 있다.
Docker Volume
-
빌드된 이미지로 컨테이너를 생성했을 때 호스트와 공유할 컨테이너 내부의 디렉토리를 설정한다.
-
VOLUME[“/HOME/DIR”, “HOME/DIR2”]처럼 JSON 배열의형식으로 여러 개를 사용하거나 VOLUME /home/dir /home/dir2로도 사용할 수 있다.
-
다음 예시는 컨테이너 내부의 /home/volume 디렉토리를 호스트와 공유하도록 한다.
# VOLUME을 사용하는 Dockerfile
rm -rf dockerfile
vim Dockerfile
!
FROM ubuntu:14.04
MAINTAINER chaerinkang
RUN mkdir /home/volume
RUN echo test >> /home/volume/testfile
VOLUME /home/volume
!
docker build -t myvolume:0.0 ./
docker images
docker run -i -t -d --name volume_test myvolume:0.0
docker volume ls // 16진수 난수의 volume ID를 확인할 수 있다.
docker volume inspect 3e38~
=> 마운트포인트 /var/lib/docker/volumes/3e38178791839366efd946a54a6f52f08c62e3a2bc7e84c21528453049d8b7bf/_data 확인
cd /var/lib/docker/volumes/3e38178791839366efd946a54a6f52f08c62e3a2bc7e84c21528453049d8b7bf/_data
ls // testfile 확인
cat testfile // test 문구 확인
댓글남기기