InfraPlatform

Docker부터 Kubernetis 까지 - (2) 도커 이미지 만들기

IT오이시이 2020. 3. 1. 15:39
728x90

도커를 이용하는 장점

  • 융통성 : 가장 복잡한 어플리케이션이라도 컨테이너화 할 수 있습니다.
  • 경량화 : 컨테이너는 호스트 커널을 활용하고 공유하므로 가상 시스템보다 시스템 리소스 측면에서 훨씬 효율적입니다.
  • 이식성 : 로컬로 구축하고 클라우드에 배포하며 어디에서나 실행할 수 있습니다.
  • 느슨한 결합 : 컨테이너는 자체적으로 충분하고 캡슐화되어 다른 컨테이너를 방해하지 않고 컨테이너를 교체하거나 업그레이드 할 수 있습니다.
  • 복제기반 확장성 : 데이터 센터에 컨테이너 복제본을 늘리고 자동으로 배포 할 수 있습니다.
  • 프로세스 격리와 보안 : 컨테이너는 사용자가 구성 할 필요없이 공격적인 제약과 격리를 프로세스에 적용합니다.

 

도거 이미지 샘플을 이용하여 이미지 제작

1. Docker Samples 페이지 에서 예제 프로젝트를 다운로드 

 도커 샘플 소스를 다운받아 옵니다. 

git clone https://github.com/dockersamples/node-bulletin-board
cd node-bulletin-board/bulletin-board-app

 node-bulletin-board프로젝트는 Node.js로 작성된 간단한 게시판 응용 프로그램입니다. 이것을 이용하여 이미지를 생성 할 것입니다.

bulletin-board-app]# ls -al
total 26
-rwxrwx---. 1 root vboxsf 1238 Feb 29 22:38 app.js
drwxrwx---. 1 root vboxsf    0 Feb 29 22:38 backend
-rwxrwx---. 1 root vboxsf  126 Feb 29 22:38 Dockerfile
drwxrwx---. 1 root vboxsf    0 Feb 29 22:38 fonts
-rwxrwx---. 1 root vboxsf 1825 Feb 29 22:38 index.html
-rwxrwx---. 1 root vboxsf 1131 Feb 29 22:38 LICENSE
-rwxrwx---. 1 root vboxsf  522 Feb 29 22:38 package.json
-rwxrwx---. 1 root vboxsf  888 Feb 29 22:38 readme.md
-rwxrwx---. 1 root vboxsf 1070 Feb 29 22:38 server.js
-rwxrwx---. 1 root vboxsf 1227 Feb 29 22:38 site.css
[node server.js]  구동으로 서비스를 실행 하면

ipv4 가 아닌 ipv6로 포트가 매핑되는 경우가 있다.
이런 경우를 대비해서 다음과 같이 소스를 수정해야 한다.

# ipv6로 리스닝해서 웹브라우저로 접근이 안된다.
app.listen(8080);

# ipv4로 리스닝 하도록 명시한다.
app.listen(8080, "0.0.0.0", function() { });  또는  app.listen(8080, "0.0.0.0"); 로 수정한다.

https://stackoverflow.com/questions/47797322/node-js-server-only-listening-on-ipv6

>> [server.js]
>> app.listen(8080, "0.0.0.0", function() { });
>> app.listen(8081);

$ netstat -antp
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      20243/node
tcp6       0      0 :::8081                 :::*                    LISTEN      20243/node

>> [server.js]
>> app.listen(8080, "0.0.0.0", function() { });

$ netstat -antp
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      20243/node

 

2. Dockerfile을 사용하여 컨테이너 정의

node-bulletin-board/bulletin-board-app/Dockerfile 의 내용을 읽어 봅니다.

# Use the official image as a parent image
FROM node:current-slim

# Set the working directory
WORKDIR /usr/src/app

# Copy the file from your host to your current location
COPY package.json .

# Run the command inside your image filesystem
RUN npm install

# Inform Docker that the container is listening on the specified port at runtime.
EXPOSE 8080

# Run the specified command within the container.
CMD [ "npm", "start" ]

# Copy the rest of your app's source code from your host to your image filesystem.
COPY . .
FROM기존 node:current-slim이미지를 시작 
WORKDIR모든 후속 조치가 /usr/src/app 이미지 파일 시스템의 디렉토리 (호스트의 파일 시스템이 아님) 에서 수행되도록 지정
COPY package.json호스트 .에서 이미지의 현재 위치 ( ) 까지의 파일 (/usr/src/app/package.json)
RUN  npm install 이미지 파일 시스템 내부 의 명령 ( package.json앱의 노드 종속성을 확인하고 설치)
COPY 호스트에서 이미지 파일 시스템으로의 나머지 앱 소스 코드에서 .
EXPOSE 8080컨테이너가 런타임에 포트 8080을 사용

 

3. 샘플을 이용하여 도커 이미지를 생성 합니다.

docker image build -t bulletinboard:1.0 .

 

4. 도커컨테이너를 실행 합니다.

 

docker container run --publish 8000:8080 --detach --name bb bulletinboard:1.0

5. docker   이미지 관리

docker images 
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    <none>              <none>              4d2803c489ce        6 minutes ago       140MB
    node                current-slim        26932a190e66        4 days ago          140MB
    rancher/rancher     latest              83fe4871cf67        4 weeks ago         670MB
    hello-world         latest              fce289e99eb9        14 months ago       1.84kB
    
docker rmi 4d2803c489ce
  Error response from daemon: conflict: unable to delete 4d2803c489ce (must be forced) - image is being used by stopped container eed0b98be330
  
docker rmi -f 4d2803c489ce
    Deleted: sha256:4d2803c489ced1398fa0bd79527c3774024956d9f3b309df7fbac82033780d67
    Deleted: sha256:c30ab9db4eb659ed92635bdfcd657731e32358935bc3fccb6a24267720016557
    Deleted: sha256:29ee942c76aa1c7041591f375d27fdfeb969d952a391ed7e0c642292d8a6ef86
    Deleted: sha256:8c3e014d8b6d5cf12306e98d39c391a974edfe5e41d51967a73ab750a61fe97b
    Deleted: sha256:af9aef8618e215c2cbd944ddb76c7c96c52a681e71e17f8f3236d0a61f58e942

 

6. docker container  관리

# 동작중인 컨테이너 확인
docker ps 

# 정지된 컨테이너 확인
docker container list -a
docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
    ab86502e9def        4d2803c489ce        "docker-entrypoint.s…"   9 minutes ago       Exited (1) 9 minutes ago                          sweet_moser
    eed0b98be330        4d2803c489ce        "docker-entrypoint.s…"   10 minutes ago      Exited (1) 10 minutes ago                         stoic_babbage
    6b8a63d0b2ed        5074e0b244a9        "/bin/sh -c 'npm ins…"   26 minutes ago      Exited (1) 24 minutes ago                         elegant_dubinsky
    bf791d0f7141        rancher/rancher     "entrypoint.sh"          38 minutes ago      Exited (1) 13 minutes ago                         crazy_mclaren
    9c44a26492b4        rancher/rancher     "entrypoint.sh"          About an hour ago   Exited (1) 39 minutes ago                         serene_austin
    29b465b2cf05        rancher/rancher     "entrypoint.sh"          About an hour ago   Exited (137) 38 minutes ago                       relaxed_volhard
    3fd24cbf1808        5074e0b244a9        "/bin/sh -c 'npm ins…"   2 hours ago         Exited (1) 2 hours ago                            hardcore_moser
    bd97f8e7e3d6        5074e0b244a9        "/bin/sh -c 'npm ins…"   2 hours ago         Exited (1) 2 hours ago                            admiring_albattani
    a1f742ee22d9        hello-world         "/hello"                 3 hours ago         Exited (0) 3 hours ago                            lucid_bohr
    b339ca93c51f        hello-world         "/hello"                 3 hours ago         Exited (0) 3 hours ago                            determined_williamson
    
# 컨테이너 삭제
docker rm [CONTAINER ID]
docker rm 6b8a63d0b2ed bf791d0f7141
   
docker container list -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS               NAMES
    a1f742ee22d9        hello-world         "/hello"            3 hours ago         Exited (0) 3 hours ago                       lucid_bohr
    b339ca93c51f        hello-world         "/hello"            3 hours ago         Exited (0) 3 hours ago
728x90
반응형