Docker 시작하기

참고자료: 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

댓글 남기기