Cloud/Docker

8. Dockerfile 과 Docker-compose.yml

jinkwon.kim 2020. 7. 9. 00:04
728x90
반응형

1. Dockerfile

  1) 목적

    - base image 파일로 수정된 image 만드는 일련의 과정들을 정리해 놓은 파일 입니다. 

    - docker는 Dockerfile을 이용하여 손쉽게 동일한 이미지를 반복해서 만들수 있습니다.

  2) 문법

#FROM
# 베이스 이미지를 지정합니다. 반드시 지정해야 하며 어떤 이미지도 베이스 이미지가 될 수 있습니다.
# tag는 될 수 있으면 latest(기본값)보다 구체적인 버전(16.04등)을 지정하는 것이 좋습니다.
# 이미 만들어진 다양한 베이스 이미지는 Docker hub에서 확인할 수 있습니다.
# FROM <image>:<tag>
FROM ubuntu:16.04
 
 
#MAINTAINER
# Dockerfile을 관리하는 사람의 이름 또는 이메일 정보를 적습니다. 빌드에 딱히 영향을 주지는 않습니다.
# MAINTAINER <name>
MAINTAINER jinwkon.kim@ahnlab.com
 
 
#COPY
# 파일이나 디렉토리를 이미지로 복사합니다. 일반적으로 소스를 복사하는 데 사용합니다. target디렉토리가 없다면 자동으로 생성합니다.
# COPY <src>... <dest>
COPY . /usr/src/app
 
 
#ADD
# COPY명령어와 매우 유사하나 몇가지 추가 기능이 있습니다. src에 파일 대신 URL을 입력할 수 있고 src에 압축 파일을 입력하는 경우 자동으로 압축을 해제하면서 복사됩니다.
# ADD <src>... <dest>
ADD . /usr/src/app
 
 
#RUN
# 가장 많이 사용하는 구문입니다. 명령어를 그대로 실행합니다. 내부적으로 /bin/sh -c 뒤에 명령어를 실행하는 방식입니다.
# RUN <command>
# RUN ["executable", "param1", "param2"]
RUN bundle install
 
 
#CMD
# 도커 컨테이너가 실행되었을 때 실행되는 명령어를 정의합니다.
# 빌드할 때는 실행되지 않으며 여러 개의 CMD가 존재할 경우 가장 마지막 CMD만 실행됩니다.
# 한꺼번에 여러 개의 프로그램을 실행하고 싶은 경우에는 run.sh파일을 작성하여 데몬으로 실행하거나 supervisord나 forego와 같은 여러 개의 프로그램을 실행하는 프로그램을 사용합니다.
#CMD ["executable","param1","param2"]
#CMD command param1 param2
CMD bundle exec ruby app.rb
 
 
#WORKDIR
# RUN, CMD, ADD, COPY등이 이루어질 기본 디렉토리를 설정합니다.
# 각 명령어의 현재 디렉토리는 한 줄 한 줄마다 초기화되기 때문에 RUN cd /path를 하더라도 다음 명령어에선 다시 위치가 초기화 됩니다.
# 같은 디렉토리에서 계속 작업하기 위해서 WORKDIR을 사용합니다.
WORKDIR /path/to/workdir
 
#EXPOSE
# 도커 컨테이너가 실행되었을 때 요청을 기다리고 있는(Listen) 포트를 지정합니다. 여러개의 포트를 지정할 수 있습니다.
# EXPOSE <port> [<port>...]
EXPOSE 4567
 
 
#VOLUME
# 컨테이너 외부에 파일시스템을 마운트 할 때 사용합니다. 반드시 지정하지 않아도 마운트 할 수 있지만, 기본적으로 지정하는 것이 좋습니다.
VOLUME ["/data"]
 
 
#ENV
# 컨테이너에서 사용할 환경변수를 지정합니다. 컨테이너를 실행할 때 -e옵션을 사용하면 기존 값을 오버라이딩 하게 됩니다.
# ENV <key> <value>
# ENV <key>=<value> ...
ENV DB_URL mysql

  3) Sample Code

    - nodejs server 뛰우기 

    (1) 아래 3개의 파일을 한 곳에 모두 만들어 줍니다. 

      [ Dockerfile ]

FROM node
 
WORKDIR /var/www/html
 
COPY index.html /var/www/html
COPY server.js /var/www/html
 
EXPOSE 80
 
CMD ["node", "server.js"]

      [ index.html ]

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
 
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
 
<p><em>Thank you for using nginx.</em></p>
<p><em>Thank you for doitnow-man </em></p>
</body>
</html>

       [ index.js ]

var http = require('http');
var fs = require('fs');
var app = http.createServer(function(request,response){
    var url = request.url;
    if(request.url == '/'){
      url = '/index.html';
    }
    if(request.url == '/favicon.ico'){
      return response.writeHead(404);
    }
    response.writeHead(200);
    response.end(fs.readFileSync(__dirname + url));
 
});
 
app.listen(80);
console.log("ok server start");

    (2) dockerfile을 사용하여 docker image를 만들어 줍니다. 

      - docker build를 명령으로 docker image를 만들어 줍니다.
        이때 -t 옵션으로 docker image 명을 설정 할 수 있습니다.

        ./ 를 사용하여 dockerfile의 위치를 지정 합니다.

          #docker build -t node-server ./

      -  만약 다음과 같은 에러가 발생하면 새로운 디렉터리에를 만든 후 그 디렉터리 하위에 dockerfile을 이동후
         build를 하면 됩니다.

         error checking context: 'no permission to read from '/root/.bash_history''.

    (3) 새로 만든 node-server image 실행

      - docker run -it -p 80:80 node-server 

 

2. docker-compose.yml

  1) 목적

    - 연결된 다수의 container를 하나로 통합하여 관리 하는 도구

  2) 유의 사항 

    - docker-compose는 host level에서만 동작 합니다.

    - docker swarm에 배포 하기 위해서는 docker stack deploy를 사용 해야 합니다.

   3) docker-compose.yml

     - container실행 옵션을 미리 정의한 문서 입니다. 

     - docker-compose를 docker-compose.yml에 정의된 데로 container를 실행 합니다.

   4) 설치 

     - apt-get install docker-compose

   5) docker-compose.yml 형식

      (1) docker-compose.yml 포맷

        - 참조 : https://docs.docker.com/compose/compose-file/#service-configuration-reference

#버전 정의
# 버전에 따라서 지원하는 형식이 다릅니다.
version: '3.0'

#service 정의
# docker-compose로 생성 할 container의 옵션을 정의 합니다.
# service안의 container들은 하나의 project로서 docker-compose로 관리 됩니다.
services:
    #생성 할 container 이름을 지정 합니다.
    container-이름:
        #container 생성시 사용 할 이미지 지정
        image: node-server:v1
        #build 옵션
        # docker-compose build 옵션에서 사용 됩니다.
        # dockerfile에 명시된 FROM의 image를 사용하여 위에 명시된image 이름과 tag로 새로운 image를 생성 합니다.
        build:
            #dockerfile의 위치를 지정 합니다.
            context: .
        #container port mapping 정보
        ports:
            - "80:80"
        #EXPOSE
        # 도커 컨테이너가 실행되었을 때 요청을 기다리고 있는(Listen) 포트를 지정합니다. 여러개의 포트를 지정할 수 있습니다.
        expose:
            - "80"
        #환경 변수 리스트를 정의
        environment:
            UPDATE_URL: "https://www.doitnow-man.com"
        #실행 환경 설정
        stdin_open: true       #docker run -i
        tty: true              #docker run -t
        entrypoint: /bin/bash  #exec /bin/bash

      (2) 예제 
        - 아래의docker-compose.yml 파일은 아래 2개의 명령어를 합친 내용 입니다.

        - docker built -t nginx:v1 .

        - docker run -p 80:80 

          [ Dockerfile ]

FROM node

WORKDIR /var/www/html

COPY index.html /var/www/html
COPY server.js /var/www/html

EXPOSE 80

CMD ["node", "server.js"]

          [ docker-compose-.yml] 

version: '3.0'

services:
        web:
                image: front-end:v1
                build:
                        context: .
                ports:
                        - "80:80"

      (3) 문법 확인

        #docker-compose config

 

3. docker-compose 명령어 

    1) 실행 방법

        - 모든 서비스 실행

            #docker-compose up      

        - 특정 서비스 실행        

            #docker-compose run "서비스이름" 

    2) daemon 모드로 docker-compose 실행

        - 모든 서비스 실행

            #docker-compose up -d

        - 특정 서비스 실행        

            #docker-compose run -d "서비스 이름"

 

자세 한것은 아래 블로그에 잘 정리 되어 있음

https://nirsa.tistory.com/81

 

[Docker CE] docker-compose 기본 명령어 정리

리눅스에서 docker-compose 명령어를 사용하려면 docker와는 별개로 docker-compose가 설치되어 있어야 합니다. (설치 방법 : https://nirsa.tistory.com/76?category=868315) 버전 확인 docker-compose --version docker-compose up

nirsa.tistory.com


도커(Docker) 각티슈 케이스

docker를 공부하다가 아주 귀여운 container 형태의 각티슈 케이스 협찬을 받았습니다. ㅎㅎ 

막상 받아보니 괜찮습니다. 회사 분들도 일단 무척이나 신기해 합니다.

일단 제품 조립도 쉽고 안에 휴지를 위로 밀어주는 철판 같은게있어서 사용하기는 매우 편할꺼 같더라구요.

마침 ㅎㅎ 각티슈 케이스 필요했는데 다행이더라구요 ㅎㅎ. 

책상 인테리어로 괜찮은거 같아요.

 

요건 정면 사진~!!

요건 모서리 사진~!! (옆에 container 문짝 디테일 살아있습니다.!!!!)

마지막 배랑 같이 찍은 사진 ㅋㅋㅋ 뭔가 container 라면 배가 필요할꺼 같아서 같이 찍어봤습니다.ㅎㅎ

 

회사 분들이 지나갈때 마다 ㅋㅋ 한번 씩 관심 가질꺼 같습니다. ㅎㅎ

 

구매 주소 : https://incatos.shop/surl/O/11

 

도커 컨테이너 각티슈 휴지 케이스 티슈커버 사각 아크릴 각티슈 커버 - 푸르가즘

현재 결제가 진행중입니다. 본 결제 창은 결제완료 후 자동으로 닫히며, 결제 진행 중에 본 결제 창을 닫으시면 주문이 되지 않으니 결제 완료 될 때 까지 닫지 마시기 바랍니다.

incatos.shop

 

728x90
반응형