docker 기본 (http: pyrasis.com Docker Docker HOWTO) - shinminsoo118/docker GitHub Wiki
Docker는 리눅스 서버를 손쉽게 패키징하고, 배포할 수 있도록 해주는 플랫폼입니다.
Docker는 지금까지 사용해왔던 VMware, Microsoft Hyper-V(Virtual PC), Xen등의 같은 가상머신과 비슷합니다. 가상 머신에 리눅스를 설치한 뒤 각종 서버와 DB를 설치하고, 개발한 어플리케이션이나 웹사이트를 실행했습니다. 이렇게 세팅한 가상머신 이미지를 여러 서버에 복사해서 실행하면 이미지 하나로 서버를 계속 만들어낼 수 있었습니다. 보통 가상 머신 서버를 독자적으로 운영하거나, 서비스 형태로 제공되는 AWS,Microsoft Azure를 사용하기도 합니다.
Docker는 리눅스 배포판 종류를 자동으로 인식하여 패키지를 설치해주는 스크립트를 제공합니다.
sudo wget -q0- https://get.docker.com/ | sh
get.docker.com 스크립트로 Docker를 설치하면 hello-world이미지도 자동으로 설치됩니다.
hello-world이미지는 사용하지 않을 것이므로 모두 삭제합니다.
sudo docker rm 'sudo docker ps -aq'
sudo docket rmi hello-world
sudo apt-get update
sudo apt-get install docket.io
sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
/usr/bin/docker.io 실행하면 /usr/local/bin/docker로 링크해서 사용합니다.
Docker의 명령은 docker run, docker push와 같이 docker <명령>형식입니다. 그리고 항상 root 권한으로 실행해야 합니다.
-
search Docker는 Docker Hub를 통해 이미지를 공유하는 생태개가 구축되어 있습니다. search명령으로 Docket Hub에서 이미지를 검색할 수 있습니다. sudo docker search ubuntu
엄청나게 많은 이미지가 검색될 것입니다. 보통 ubuntu, centos, redis등 OS나 프로그램 이름을 가진 이미지가 공식 이미지입니다. 나머지는 사용자들이 만들어 공개한 이미지입니다. -
pull 우분투 이미지를 받아보겠습니다. sudo docker pull ubuntu:latest
docker pull <이미지 이름>:<태그> 형식입니다. latest를 설정하면 최신 버전을 받습니다. ubuntu:14.04, ubuntu:12.10처럼 태그를 지정해 줄 수도 있습니다. -
images sudo docker images docker images는 모든 이미지 목록을 출력합니다. docker images ubuntu처럼 이미지 이름을 설정하면 이름은 같지만 태그가 다른 이미지가 출력됩니다.
-
run 이미지를 컨테이너로 생성한 뒤 Bash shell을 실행해보겠습니다. sudo docker run -i -t --name hello ubuntu /bin/bash docker run <옵션> <이미지 이름> <실행할 파일> 형식입니다. 여기서는 ubunbu 이미지를 컨테이너로 생성한 뒤 ubuntu 이미지 안의 /bin/bash를 실행합니다. 이미지 이름 대신 이미지 ID를 사용해도 됩니다. -i(interactive), -t(Pseudo-tty) 옵션을 사용하면 실행된 Bash Shell에 입력 및 출력을 할 수 있습니다. 그리고 --name 옵션으로 컨테이너의 이름을 지정할 수 있습니다. 이름을 지정하지 않으면 Docker가 자동으로 이름을 생성하여 지정합니다. 이제 호스트 OS와 완전히 격리된 공간이 생성되었습니다. cd, ls 명령으로 컨테이너 내부를 한번 둘러봅니다. 호스트 OS와는 다르다는 것을 알 수 있습니다. exit를 입력하여 Bash Shell에서 빠져나옵니다. 우분투 이미지에서 /bin/bash 실행 파일을 직접 실행했기 때문에 여기서 빠져나오면 컨테이너가 정지(stop)됩니다.
-
ps 아래 명령을 입력하여 모든 컨테이너 목록을 출력합니다. docker ps 형식입니다. -a 옵션을 사용하면 정지된 컨테이너까지 모두 출력하고, 옵션을 사용하지 않으면 실행되고 있는 컨테이너만 출력합니다. 우리는 앞에서 컨테이너를 생성할 때 이름을 hello로 지정했으므로 컨테이너 목록에서도 hello로 표시됩니다.
-
start 방금 정지한 컨테이너를 다시금 시작해보겠습니다.
sudo docker start hello docker start <컨테이너 이름> 형식입니다. 컨테이너 이름 대신 컨테이너 ID를 사용해도 됩니다. -
ps sudo docker ps
아래 명령을 입력하여 실행된 컨테이너 목록을 출력합니다. -
restart sudo docker restart hello docker restart <컨테이너 이름> 형식입니다. 컨테이너 이름 대신 컨테이너 ID를 사용해도 됩니다.
-
attach sudo docker attach hello
이제 시작한 컨테이너에 접속해보겠습니다. 우리는 /bin/bash를 실행했기 때문에 명령을 자유롭게 입력할 수 있지만, DB나 서버 어플리케이션을 실행하면 입력은 할 수 없고 출력만 보게 됩니다. Bash Shell에서 exit 또는 Ctrl+D를 입력하면 컨테이너가 정지됩니다. 여기서는 Ctrl+P, Ctrl+Q를 차례대로 입력하여 컨테이너를 정지하지 않고, 컨테이너에서 빠져나옵니다. -
exec 현재 컨테이너가 /bin/bash로 실행된 상태입니다. 이번에는 /bin/bash를 통하지 않고 외부에서 컨테이너 안의 명령을 실행해보겠습니다.
docker exec hello echo "Hello World" docker exec <컨테이너 이름> <명령> <매개 변수> 형식입니다. 컨테이너 이름 대신 컨테이너 ID를 사용해도 됩니다. 컨테이너가 실행되고 있는 상태에서만 사용할 수 있으며 정지된 상태에서는 사용할 수 없습니다. 컨테이너 안의 echo 명령을 실행하고 매개 변수로 “Hello World”를 지정했기 때문에 Hello World가 출력됩니다. docker exec 명령은 이미 실행된 컨테이너에 apt-get, yum 명령으로 패키지를 설치하거나, 각종 데몬을 실행할 때 활용할 수 있습니다. -
stop sudo docker stop hello
이번에는 컨테이너를 정지해보겠습니다. -
rm sudo docker rm hello 생성된 컨테이너를 삭제해보겠습니다.
-
rmi sudo docker rmi ubuntu:latest
이번에는 이미지를 삭제해보겠습니다. docker rmi <이미지 이름>:<태그> 형식입니다. 이미지 이름 대신 이미지 ID를 사용해도 됩니다. docker rmi ubuntu처럼 이미지 이름만 지정하면 태그는 다르지만 ubuntu 이름을 가진 모든 이미지가 삭제됩니다.
Dockerfile은 Docker 이미지 설정 파일입니다. Dockerfile에 설정된 내용대로 이미지를 생성합니다.
touch Dockerfile
FROM ubuntu:14.04
MAINTAINER Foo Bar <foo@bar.com>
RUN apt-get update
RUN apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
RUN chown -R www-data:www-data /var/lib/nginx
VOLUME ["/data", "/etc/nginx/site-enabled", "/var/log/nginx"]
WORKDIR /etc/nginx
CMD ["nginx"]
EXPOSE 80
EXPOSE 443
우분투 14.04를 기반으로 nginx서버를 설치한 Docker 이미지를 생성합니다.
- FROM : 어떤 이미지를 기반으로 할지 설정합니다. Docker이미지는 기존에 만들어진 이미지를 기반으로 생성합니다.<이미지 이름>:<태그> 형식으로 설정합니다.
- MAINTAINER : 메인테이너 정보입니다.
- RUN : Shell스크립트 혹은 명령을 실행합니다. 이미지 생성 중에는 사용자 입력을 받을 수 없으므로 apt-get install 명령에서 -y 옵션을 사용합니다(yum install도 동일).나머지는 nginx설정입니다.
- VOLUME : 호스팅와 공유할 디렉토리 목록입니다. docker run 명령에서 -v옵션으로 설정할 수 있습니다.
example) -v /root/data:/data 호소트의 /root/data 디렉토리를 Docker컨테이너의 /data 디렉토리에 연결합니다. - CMD : 컨테이너가 시작되었을때 실행할 실행파일 또는 스크립트입니다.
- WORKDIR : CMD에서 설정한 실행 파일이 실행될 디렉터리입니다.
- EXPOSE : 호스트와 연결할 포트번호입니다.