출처
https://www.44bits.io/ko/post/why-should-i-use-docker-container
https://www.44bits.io/ko/post/easy-deploy-with-docker
https://www.44bits.io/ko/post/building-docker-image-basic-commit-diff-and-dockerfile
http://pyrasis.com/book/DockerForTheReallyImpatient/Chapter07/09
Docker는 가상 머신과 다르다.
가상머신이 (실제 컴퓨터의) 하드웨어를 소프트웨어적으로 구현하였다면, Docker는 프로세스의 실행 환경을 격리하였을 뿐이다.
따라서 가볍다는 장점이 있다.
도커 이미지를 다운받아 실행할 때에도 용량이 크지 않으며, 도커 이미지를 컨테이너에서 실행할 때에도 호스트에 큰 무리가 가지 않는다.
DockerFile
서버에서 실행할 명령어이다. 예를 들면 apt get install -y .....
와 같은 명령어들의 집합이다.
Docker Image
DockerFile을 build해서 나온 결과이다. DockerFile을 빌드할 때의 실행 시점이 포함되기 때문에, 언제 어디서 가져다 써도 생성자가 의도한 것을 동일하게 재현할 수 있다. 보통 Docker Image 형태로 배포되는 경우가 많으며, DockerHub 등 사이트를 통해 다른 사람들이 구축해놓은 이미지를 다운로드할 수 있다.
Docker Container
Docker Image를 호스트에서 실행하고 있는 상태(?)이다. Docker Container가 되려면 Docker Image에 환경 변수가 추가되어 실행되어야 하는데, 환경 변수
가 각 호스트에 맞게 적절한 값을 넣을 수 있도록 하여 보다 유연하게 Docker를 이용할 수 있다.
Docker Container에 변경을 가해도 Docker Image에는 변화가 없다. 대신, Docker Container의 상태를 Docker Image에 push, commit 등 할 수 있다.
docker ps
: 현재 실행중인 모든 컨테이너 목록을 출력 (죽은 컨테이너 -a
옵션)docker images
: 현재 가지고 있는 모든 이미지 목록을 출력docker pull <IMAGE NAME>
: 이미지를 다운로드docker run -it <이미지이름:태그> <명령어>
: 이미지를 실행하여 컨테이너로 만들고 명령어
를 실행.docker restart <CONTAINER ID>
: 죽은 컨테이너를 되살림.docker attach <CONTAINER ID>
: 컨테이너와 터미널 상에서 입출력하게 함.docker stop <CONTAINER ID>
: 실행된 컨테이너를 강제로 종료docker rm <CONTAINER ID>
: 종료된 컨테이너를 삭제docker diff <CONTAINER ID>
: docker Image와 Container의 차이점을 알려줌.docker commit <CONTAINER ID> <이미지이름:태그>
: docker Container을 commit 하여 새로운 이미지를 만듬.docker images
: 만들어진 이미지 확인.docker rmi <이미지이름:태그>
: docker Image 삭제 (Docker rm과 구별하여 사용)FROM
: 어떤 이미지로부터 Dockerfile을 생성할 것인지 선택
RUN
: 명령어를 실행. 보통 &&\
를 이용해서 한 줄로 작성하는 편.
WORKDIR
: 이후에 실행되는 모든 작업의 실행 디렉터리를 변경.
ENV
: 컨테이너 실행 환경에 적용되는 환경변수의 기본값을 지정하는 지시자.
EXPOSE
: 가상머신에 오픈할 포트를 지정.
CMD
: 컨테이너에서 실행될 (기본) 명령어를 지정. docker run
에서 지정하는 명령어로 덮어쓸 수 있음.
ADD <복사할 파일 경로> <이미지에서 파일이 위치할 경로>
: Docker 외부(호스트, 인터넷)에서 Docker 내부로 파일을 추가.
예시
FROM ubuntu:14.04
RUN apt-get update &&\
apt-get -qq -y install git curl build-essential apache2 php5 libapache2-mod-php5 rcs
WORKDIR /tmp
RUN \
curl -L -O https://github.com/wkpark/moniwiki/archive/v1.2.5p1.tar.gz &&\
tar xf /tmp/v1.2.5p1.tar.gz &&\
mv moniwiki-1.2.5p1 /var/www/html/moniwiki &&\
chown -R www-data:www-data /var/www/html/moniwiki &&\
chmod 777 /var/www/html/moniwiki/data/ /var/www/html/moniwiki/ &&\
chmod +x /var/www/html/moniwiki/secure.sh &&\
/var/www/html/moniwiki/secure.sh
RUN a2enmod rewrite
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
EXPOSE 80
CMD bash -c "source /etc/apache2/envvars && /usr/sbin/apache2 -D FOREGROUND"
docker build -t <이미지이름:태그> <Dockerfile PATH>
: 빌드해서 이미지로 생성
docker run -d -p <host_port:docker_port> <이미지이름:태그>
: docker 백그라운드 실행 && 포트 오픈. (-d
가 백그라운드 실행)