참고자료: https://docs.docker.com/engine/getstarted/step_four
Docker는 VMWare 등과 같은 운영체제 가상화 프로그램이다. docker가 설치되어있다면 개발 환경을 설정할 필요 없이 이미지를 통해 설치하여 바로 실행이 가능하기 때문에 서버 운영, 웹 어플리케이션 배포 등을 간편히 해준다. 최근 Saturn이라는 Web IDE를 개발하면서 쉽게 배포하기 위해 Docker를 사용해보았는데, 프로그래밍 교육용 프레임워크 배포에도 유용하게 사용될 것 같다. 이 글에서는 웹 어플리케이션을 Docker 이미지로 패키징하고 Docker Hub에 배포하는 방법을 작성하였다.
Dockerfile
프로젝트 폴더 생성
$ mkdir mydocker
$ cd mydocker
$ touch Dockerfile
$ touch run.sh
파일 편집
Dockerfile
FROM node:latest
MAINTAINER Yeonghun Chae <proin@proinlab.com>
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
COPY run.sh /
RUN chmod 755 /run.sh
RUN npm install express-generator -g
RUN express --view=jade myapp && \
cd myapp && \
npm install
WORKDIR /myapp
EXPOSE 3000
CMD ["/run.sh"]
run.sh 파일
#!/usr/bin/env bash
cd /myapp
DEBUG=myapp:* npm start
bash 파일의 경우 #!/usr/bin/env bash
를 상단에 필수적으로 입력해주어야한다. 일반적인 리눅스 시스템에서는 위의 옵션이 없어도 실행이 가능하지만 Docker 이미지의 경우 실행해주려면 bash 환경을 지정해주어야한다. 이 태그가 없으면 콘테이너 실행시 Panic 에러가 발생한다.
Dockerfile 구조
Base Image
FROM node:latest
생성할 이미지의 Base 이미지를 FROM
을 통해 지정할 수 있다. 이 글에서는 node 기반의 express 서버를 생성할 것이기 때문에 node 이미지의 최신 버전을 사용하였다. 생성된 이미지는 빌드시 다운받아진다.
MAINTAINER
MAINTAINER Yeonghun Chae <proin@proinlab.com>
관리자에 대한 정보를 입력한다.
COPY
COPY run.sh /
현재 경로의 파일을 Image의 특정 경로로 복사해준다. 위의 코드는 run.sh
파일을 이미지의 루트 경로로 복사해준다.
RUN
RUN npm install express-generator -g
이미지에서 해당 명령어를 실행한다. 데비안 계열의 이미지를 Base로 사용한다면 apt-get
등의 명령어 또한 실행 가능하다.
WORKDIR
WORKDIR /myapp
RUN을 실행할 작업 경로를 지정해준다.
Etc.
https://docs.docker.com/engine/reference/builder 에서 Dockerfile에 관련된 추가적인 내용을 확인할 수 있다.
Build
Dockerfile Build
빌드시 Dockerfile의 내용을 바탕으로 명령어가 실행된다. 실행하는 명령어가 많을 경우 build 시간이 꽤 오래걸린다.
$ docker build -t express .
생성된 Image 확인
빌드 후 images
명령어를 실행해보면 아래와 같이 express 이미지가 생성된 것을 확인 할 수 있다. FROM
을 통해 지정한 base 이미지 또한 함께 설치된다.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
express latest 64415d5bbfa4 23 seconds ago 667.4 MB
node latest 36dc1bb7a52b 9 days ago 655.5 MB
Docker 실행
Docker 실행과 관련된 명령어는 docker run --help
를 통해 확인할 수 있다.
이 글에서는 생성한 이미지를 host의 포트로 포워딩하여 실행하는 방법에 대해 작성하였다.
Image를 Container로 실행
Container 실행
$ docker run -it --name express -p 3000:3000 express
생성된 Image를 실행하기 위해서는 위의 명령어를 통해 실행하면 된다.
Ctrl-C
를 입력하면 프로세스가 종료된다.
실행 옵션의 역할은 아래와 같다.
-i
: interactive mode-t
: tty mode--name
: Container 이름 지정-p
: host:container, container의 port를 host로 포워딩한다.
Container 제거
프로세스가 종료되더라도 Container는 사라지지 않고 남아있다.
docker ps
명령어를 입력하면 종료된 Container는 표시되지 않는데 -a
옵션을 사용하여 모든 Container를 확인 할 수 있다.
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8b44a5dcc923 express "/run.sh" 12 seconds ago Exited express
docker rm
명령어를 통해 Container를 제거할 수 있다.
$ docker rm express
백그라운드로 실행
Container 실행
백그라운드로 프로세스를 실행하기 위해서는 -d
옵션을 사용하면 된다. -v
옵션을 통해 호스트와 파일을 공유해서 웹 서버 페이지를 변경 할 수 있고 Container를 제거하고 다시 실행해도 최신 상태를 저장 할 수 있다.
$ docker run -d --name express -p 3000:3000 -v ~/Desktop/myapp:/myapp express
-d
: 백그라운드로 실행 (Daemon)-v
: host:container, 호스트와 파일 공유
exec
명령어를 통해 현재 실행중인 Container에 접속할 수 있다.
$ docker exec -i -t express /bin/bash
백그라운드 프로세스 종료
백그라운드로 실행된 Container를 제거하기 위해서는 kill 명령어를 사용하면된다. Container가 실행중일때는 제거가 불가능하다.
$ docker kill express
Container 제거
$ docker rm express
Docker Hub 업로드
Docker Image에 태그 달기
Image ID 확인
업로드를 하기 위해서는 우선 Image에 태그를 생성해야한다. 태그를 생성을 위해서는 Image의 ID가 필요하다.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
express latest 64415d5bbfa4 23 seconds ago 667.4 MB
node latest 36dc1bb7a52b 9 days ago 655.5 MB
이미지의 ID는 위의 IMAGE ID
에 해당하는 값이다. 현재 생성된 express
이미지의 아이디는 64415d5bbfa4
이다.
TAG 생성
TAG는 docker tag
명령어를 통해 생성할 수 있다. Image의 아이디를 입력하고 username/repository:version
의 형태로 입력하면 이미지에 태그가 생성된다.
docker tag 64415d5bbfa4 proin/express:latest
Docker Hub 로그인
docker login
명령어를 통해 docker hub의 계정으로 로그인한다. 계정이 없다면 http://hub.docker.com 에 접속해서 계정을 생성한다.
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username:
Password:
Docker Hub에 업로드
생성된 이미지를 업로드하기 위해서는 doker push
명령어를 사용하면된다.
docker push proin/express