DockerFile 을 이용하여 나만의 Docker Image 만들기

DockerFile Build 사용법(커뮤니티 블로그 만들기)

2022년 NHN Cloud 무료 교육일정 : https://doc.skill.or.kr/2022-NHN-Cloud-Education

2022년 NHN Cloud 행사/프로모션 정보 공유 : https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion

1. 먼저 알아 두기

1.1 DockerFile 이란?

DockerFile 은 코드의 형태로 인프라를 구성하는 방법을 텍스트 형식으로 저장해 놓은 파일이며 docker build 를 사용하여 자신만의 이미지를 만들 수 있다.

1.2 Docker Build 란?

DockerFile 및 컨텍스트로부터 이미지를 빌드하는 Docker 명령

1.3 Docker-Compose 란?

Compose는 멀티 컨테이너 도커 애플리케이션을 정의하고 실행하는 도구이다. YAML 파일을 사용하여 애플리케이션의 서비스를 구성하며 하나의 명령을 가지고 모든 컨테이너의 생성 및 시작 프로세스를 수행한다.

2. DockerFile을 이용하여 만들어 보자!!!

2.1 서비스 설계 구성

DataBase Server

WEB/WAS Service

Docker Hub Base Image

mariadb:10.4.18

ubuntu:20.04

OS

Ubuntu 20.04.2 LTS

Ubuntu 20.04.2 LTS

Service

Mariadb 10.4.18

Nginx 1.18.0

Tomcat 9.0.45

Developer

OpenJDK 1.8.x

Maven 3.8.1

NodeJS 14.16.1

Dev Source

USE Github

Service Port

3306

80, 8080

2.2 아키텍처 물리 설계 구성도

대규모 3-Tier 구성 : 로드 발란스를 이용하여 3-Tier 구성을 확장하는 구성 방식. 웹 시스템의 사용자가 많은 엔터프라이즈 어플리케이션일 경우 대부분 대규모 3-Tier 구성을 이용하고 있다.

2.3 Database(Mariadb:10.4.18) Docker Image 만들기

### Base Image 지정    
FROM mariadb:10.4.18  

### TimeZone 환경 변수 지정
ENV TZ Asia/Seoul  

### Mariadb root 비밀번호 설정
ENV MYSQL_ROOT_PASSWORD=root

### Mariadb Database 생성  
ENV MYSQL_DATABASE=deverse      

### TimeZone 설
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

### Mariadb User 및 DB 스키마 설정 스크립
ADD deverse.sql /docker-entrypoint-initdb.d/deverse.sql
ADD db_user.sql /docker-entrypoint-initdb.d/db_user.sql

### 홈 디렉토리
WORKDIR /home/dev

### 서비스 포
EXPOSE 3306

소스 파일은 Github 에서 참고 하시기 바랍니다.

2.4 Nginx & Tomcat(ubuntu:20.04) Docker Image 만들기

### Base Image 지정
FROM ubuntu:20.04

### TimeZone 환경 변수 지정
ENV TZ Asia/Seoul

### TimeZone 설정    
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

### /home/dev 폴더 생성
RUN mkdir /home/dev

### update 및 패키지 설치     
RUN apt update && apt -y install vim git tar gzip build-essential curl alien openjdk-8-jdk nginx

### nodejs 설
RUN curl -sL https://deb.nodesource.com/setup_14.x -o nodesource_14_setup.sh && bash nodesource_14_setup.sh && apt -y install nodejs

### build, tomcat, maven, nginx(default.conf) 파일 복사   
COPY build.tar.gz /home/dev/build.tar.gz
COPY tomcat-9.0.45.tar.gz /home/dev/tomcat-9.0.45.tar.gz
COPY apache-maven-3.8.1.tar.gz /home/dev/apache-maven-3.8.1.tar.gz
COPY default.conf /etc/nginx/conf.d/default.conf

### ubuntu01 계정 생성
RUN addgroup --gid 1100 ubuntu01 && adduser --disabled-password --home /home/dev --no-create-home --system -q --uid 1000 --ingroup ubuntu01 ubuntu01

### Github Source 파일 다운로드     
RUN git clone https://github.com/bc-hwang/TEST.git /home/dev/deverse

### /home/dev 폴더 이동   
WORKDIR /home/dev

### 암축 파일 해제    
RUN tar -zxvf apache-maven-3.8.1.tar.gz
RUN tar -zxvf tomcat-9.0.45.tar.gz
RUN tar -zxvf build.tar.gz

### maven link 설정
RUN ln -s /home/dev/apache-maven-3.8.1/bin/mvn /usr/bin/mvn

### Build 실행
RUN cd /home/dev/build && bash ./back_build.sh
RUN cd /home/dev/build && bash ./front_build.sh

### Nginx & Tomcat Service 실행    
CMD nginx -g 'daemon on;' && /home/dev/tomcat-9.0.45/bin/catalina.sh run

### 서비스 포
EXPOSE 80 8080

소스 파일은 Github 에서 참고 하시기 바랍니다.

2.5 DockerFile Buil 하기 후 Docker Hub 에 업로드 하기

Step1. docker loign

Step2. 작성 한 DockerFile 에서 빌드 하기

• docker build -t tomcat_mariadb:mariadb .

• docker images ## 로컬에 저장된 Docker Images 확인

Step3. 로컬에 만든 이미지 실행 및 확인

• docker run –d tomcat_mariadb:mariadb

Step4. Docker Hub 이미지 업로드

• docker tag tomcat_mariadb:mariadb bchwang/tomcat_mariadb:mariadb

• docker push bchwang/tomcat_mariadb:mariadb

Step5. Docker Hub 에 등록된 이미지 확인

• Docker Hub 에 개인 개정으로 로그인 후 Docker Image 및 Tag 확인

2.6 Docker-Compose 를 이용하여 실행 하기

2.6.1 Local 에서 Build Image 를 이용하여 docker-compose.yml 만들기

docker-compose.yml
### 빌드할 버전    
version: '2'

### 서비스 설정    
services:
  mariadb:
    image: tomcat_mariadb:mariadb
    restart: always

  nginx-tomcat:
    image: tomcat_mariadb:nginx_tomcat
    restart: always
    ports:
      - 80:80
    links:
      - mariadb

소스 파일은 Github 에서 참고 하시기 바랍니다.

2.6.2 Docker Hub Image 를 이용하여 docker-compose.yml 만들기

docker-compose.yml
### 빌드할 버전    
version: '2'

### 서비스 설정    
services:
  mariadb:
    image: bchwang/tomcat_mariadb:mariadb
    restart: always

  nginx-tomcat:
    image: bchwang/tomcat_mariadb:nginx_tomcat
    restart: always
    ports:
      - 80:80
    links:
      - mariadb

3. NHN Cloud 를 이용한 Kubernetes 서비스를 구축 방법

3.1 커뮤니티 블로그 서비스 Yaml 설정 하기

NHN Cloud 를 이용하여 커뮤니티 블로그 서비스를 Kubernetes 로 구축 하는 방법을 소개해 드립니다.

아래의 내용을 따라 하시거나 GitHub 의 소스 파일을 참고 시기 바랍니다.

3.2 NameSpace Yaml

apiVersion: v1
kind: Namespace
metadata:
  name: project

3.3 Mariadb Yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-mariadb
  labels:
    app: mariadb
  namespace: project
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mariadb
  template:
    metadata:
      labels:
        app: mariadb
    spec:
      hostname: mariadb
      containers:
      - name: mariadb
        image: bchwang/tomcat_mariadb:mariadb
        ports:
        - containerPort: 3306
          name: mariadb

3.4. Mariadb Service Yaml

apiVersion: v1
kind: Service
metadata:
  name: tomcat-mariadb
  labels:
    app: mariadb
  namespace: project
spec:
  clusterIP: None
  ports:
  - port: 3306
  selector:
    app: mariadb

3.5 Nginx & Tomcat Service Yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-tomcat
  labels:
    app: nginx-tomcat
  namespace: project
  ## 오브젝트 선언형 관리
  annotations
    ## Floating ip 유지 설정
    loadbalancer.openstack.org/keep-floatingip: "true"
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 30000
  selector:
    app: nginx-tomcat
  ## NodePort 가 아니라 LoadBalancer 로 설정 해 주어야 함.
  type: LoadBalancer
  ## Floating ip 를 지정 하여 Loadbalancer ip 로 설정.
  loadBalancerIP: 133.186.216.107

3.6 Nginx & Tomcat Yaml

아래의 내용 중 hostAliases 의 ip 정보가 mariadb 의 IP 정보를 입력 하여야 함.

Mariadb 를 실행 한 후에 kuberctl get pod -n project 로 나온 IP 값을 입력 하면 됨.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-tomcat
  labels:
    app: nginx-tomcat
  namespace: project
spec:
  replicas: 10
  selector:
    matchLabels:
      app: nginx-tomcat
  template:
    metadata:
      labels:
        app: nginx-tomcat
      name: nginx-tomcat
    spec:
      hostname: nginx-tomcat
      hostAliases:
      - ip: "10.100.4.9" ### mariadb hosts 지정
        hostnames:
        - "mariadb"
      containers:
      - name: nginx-tomcat
        image: bchwang/tomcat_mariadb:nginx_tomcat
        ports:
        - containerPort: 80
          name: nginx-tomcat

소스 파일은 Github 에서 참고 하시기 바랍니다.

3.7 커뮤니티 블로그 서비스 Yaml 실행 하기

NHN Cloud Manager Server 에 접속 하여 실행 함
### mariadb 및 서비스 실행   
$ kubectl apply -f 1.kubernetes_mariadb+service.yaml

### Mariadb Pod 실행 및 IP 정보 확인     
$ kubectl get pod -n project -o wide
NAME                                        READY     STATUS    RESTARTS   AGE          IP            NODE       NOMINATED NODE   READINESS GATES
mariadb-service-59868b7dd6-xb8tq            1/1       Running   0          1m           10.100.4.9    kubernetes   <none>           <none>

### ip 입력 후 nginx & tomcat 실행    
kubectl apply -f 2.kubernetes_nginx+tomcat.yaml

### Pod 실행 및 IP 정보 확인     
$ kubectl get pod -n project -o wide
NAME                                        READY     STATUS    RESTARTS   AGE          IP            NODE       NOMINATED NODE   READINESS GATES
mariadb-service-59868b7dd6-xb8tq            1/1       Running   0          1m           10.100.4.9    kubernetes   <none>           <none>
nginx_tomcat-service-59868b7dd6-xb8tq       1/1       Running   0          1m           10.100.4.10   kubernetes   <none>           <none>

### Service 정보 확인     
$ kubectl get service -n project -o wide
NAMESPACE              NAME                            TYPE         CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE     SELECTOR
nginx_tomcat           nginx_tomcat                    LoadBalancer 133.186.216.107 <none>        80/TCP                   8m4s    app=nginx_tomcat
mariadb                mariadb                         ClusterIP    <none>          <none>        3306/TCP                 18m4s   app=mariadb

3.8 공인 IP로 접속 한 화면

4. GitHub 정보 및 커뮤니티 블로그 소개

4.1 개발 환경

  • Ubuntu/20.x (OS)

  • mariadb/10.4.18 (DB Service)

  • tomcat/9.0.45 (WAS Service)

  • nginx/1.18.0 (WEB Service)

  • OpenJDK/1.8.x

  • Maven/3.8.1

  • NodeJS/14.6.1

4.2 NHN Cloud Kubernetes & Docker 사용해 보기

A. DockerFile 을 이용하여 Docker Images 만들기(Tomcat, Mariadb)

  • Dockerfile 을 이용하여 Mariadb 이미지 만들기

   - /install/mariadb/db_user.sql (DB 계정 스크립트)
   - /install/mariadb/devers.sql (DB 스키마 스크립트)
   - /install/mariadb/dockerfile (Docker Image 스크립트)
  • Dockerfile Build 방법(mariadb Image)

   - /install/mariadb 의 폴더에 dockerfile 을 확인 후 아래 명령어 실행
     -> docker build -t tomcat_mariadb:mariadb .
   - docker images (tomcat_mariadb:mariadb 이미지 확인)
  • Dockerfile 을 이용하여 nginx_tomcat 이미지 만들기

   - /install/nginx_tomcat/apache-maven-3.8.1.tar.gz (maven src 파일)
   - /install/nginx_tomcat/tomcat-9.0.45.tar.gz (tomcat src 파일)
   - /install/nginx_tomcat/build.tar.gz (src build 파일)
   - /install/nginx_tomcat/dockerfile (Docker Image 스크립트)
   - /install/nginx_tomcat/default.conf (nginx 설정 파일)
   - /install/nginx_tomcat/nginx.conf (nginx 설정 파일)
  • Dockerfile Build 하는 방법(nginx_tomcat Image)

   - /install/nginx_tomcat 의 폴더에 dockerfile 을 혹인 후 아래 명령어 실행
     -> docker build -t tomcat_mariadb:nginx_tomcat .
   - docker images (tomcat_mariadb:nginx_tomcat 이미지 확인)
  • Docker Hub push 하는 방법

   - docker login 을 함.
   - docker tag tomcat_mariadb:nginx_tomcat bchwang/tomcat_mariadb:nginx_tomcat (tag 설정)
   - docker tag tomcat_mariadb:mariadb bchwang/tomcat_mariadb:mariadb (tag 설정)
   - docker push bchwang/tomcat_mariadb:nginx_tomcat (docker hub 에 업로드 진행)
   - docker push bchwang/tomcat_mariadb:mariadb (docker hub 에 업로드 진행)

B. Build 된 Tomcat, Mariadb Images 실행 하기

  • docker images 확인 하기

   - docker images
  • Local Image 로 실행 하기

   - docker run -d --name mariadb tomcat_mariadb:mariadb
   - docker run -d --name tomcat -p 80:80 --link mariadb tomcat_mariadb:nginx_tomcat
  • docker Hub Image 로 실행 하기

   - docker run -d --name mariadb bchwang/tomcat_mariadb:mariadb
   - docker run -d --name tomcat -p 80:80 --link mariadb bchwang/tomcat_mariadb:nginx_tomcat

C. Docker-Compose 사용하기

  • Local Images 로 실행 하기

   - /install/docker-compose_local.yml (docker-compose 설정 값 Local Images 사용)
  • Docker Hub 에 Push 한 Images 로 실행 하기

   - /install/docker-compose.yml (docker-compose 설정 값 Docker Hub Images 사용)

D. NHN Cloud Kubernetes 로 사용하기

  • NHN Cloud 회원 가입 및 Console 로그인 : http://toast.com

  • NHN Cloud Console 에 Kubernetes Manager Instance 생성

   - NHN Cloud Console 접속 -> Compute -> Instance -> 인스턴스 생성
   - 이미지(Ubuntu Server 20.04 LTS) -> 인스턴스 이름(kube-manager) -> 인스턴스 타입(Standard : t2.c1m1) -> 키 페어 선택(생성 or 기존에 사용하던것)
     -> 블록 스토리지 타입(HDD or SDD) -> 블록 스토리지 크기(50~100GB) -> 인스턴스 생성
  • NHN Cloud Console 에서 Kubernetes 생성

   - NHN Cloud Console 접속 -> Container -> Kubernetes -> 클러스터 생성
   - 클러스터 이름(kube-master) -> 인스턴스 타입(Standard : m2.c8m16) -> 노드 수(2~3개) -> 키 페어 선택(생성 or 기존에 사용하던것)
     -> 블록 스토리지 타입(HDD or SDD) -> 블록 스토리지 크기(50~100GB) -> 오토 스케일러(사용 or 사용 안 함) -> 클러스터 생성
  • NHN Cloud Console 에서 SSH 접속 설정

   - NHN Cloud Console 접속 -> Network -> Security Groups -> Default 선택 -> 보안정책 생성 -> 포트: 22, 원격 공인IP 입력(ex 포트: 22, CIDR: 111.111.111.111/32) 후 확인
   - 자세한 사항은 https://docs.toast.com/ko/Compute/Instance/ko/overview/#linux (SSH 접속 방법) 참고
  • NHN Cloud 에서 생성된 Instance(Kube-manager) 접속 방법 및 Kubernetes 연결 방법

   - https://doc.skill.or.kr/nhn-cloud#5-2-kube-manager-api 에서 NHN Cloud Kubernetes API 설정 방법
  • NHN Cloud 에서 Kubernetes 를 이용하여 서비스 사용하기

   - /install/1.kubernetes_mariadb+service.yaml (mariadb Pod/Service 등 설정 값)
     -> kubectl apply -f 1.kubernetes_mariadb+service.yaml (mariadb pod 와 Service 실행) -> kubectl get pod -n project -o wide (Mariadb IP 확인)
   - /install/2.kubernetes_nginx+tomcat.yaml (tomcat Pod 설정 값)
     -> vi 2.kubernetes_nginx+tomcat.yaml (- ip: "10.100.4.9" 의 값을 Mariadb IP 로 수정) -> kubectl apply -f 2.kubernetes_nginx+tomcat.yaml (Nginx 와 Tomcat Pod 실행) 
   - Build 설정 파일
     - nginx+tomcat Server 접속
     - /home/dev/build/application.yml 에 DB 접속 정보 설정
     - /home/dev/deverse/frontend/.env.build 에 url 접속 정보 설정

TIPs.1 DockerFile 기본 형식 자세히 알아 보기

TIPs 1.1 DockerFile 기본 형식

Command

Description

FROM

베이스 이미지 지정

RUN

명령어 실행

CMD

데몬 실행

LABEL

라벨 설정

EXPOSE

포트 설정

ENV

환경 변수 설정

ADD

파일 추가

COPY

파일 복사

USER

사용자 설정

WORKDIR

작업 디렉토리 지정

VOLUME

볼륨 마운트

ENTRYPOINT

데몬 실행

ONBUILD

빌드 후 실행 명

TIPs 1.2 Docker Build 기본 형식

Name, Shorthand

Default

Description

--add-host

Add a custom host-to-IP mapping (host:ip)

--build-arg

Set build-time variables

--cache-from

Images to consider as cache sources

--cgroup-parent

Optional parent cgroup for the container

--compress

Compress the build context using gzip

--cpu-period

Limit the CPU CFS (Completely Fair Scheduler) period

--cpu-quota

Limit the CPU CFS (Completely Fair Scheduler) quota

--cpu-shares , -c

CPU shares (relative weight)

--cpuset-cpus

CPUs in which to allow execution (0-3, 0,1)

--cpuset-mems

MEMs in which to allow execution (0-3, 0,1)

--disable-content-trust

true

Skip image verification

--file , -f

Name of the Dockerfile (Default is ‘PATH/Dockerfile’)

--force-rm

Always remove intermediate containers

--iidfile

Write the image ID to the file

--isolation

Container isolation technology

--label

Set metadata for an image

--memory , -m

Memory limit

--memory-swap

Swap limit equal to memory plus swap: ‘-1’ to enable unlimited swap

--network

API 1.25+

Set the networking mode for the RUN instructions during build

--no-cache

Do not use cache when building the image

--platform

experimental (daemon)API 1.32+

Set platform if server is multi-platform capable

--pull

Always attempt to pull a newer version of the image

--quiet , -q

Suppress the build output and print image ID on success

--rm

true

Remove intermediate containers after a successful build

--security-opt

Security options

--shm-size

Size of /dev/shm

--squash

experimental (daemon)API 1.25+

Squash newly built layers into a single new layer

--stream

experimental (daemon)API 1.31+

Stream attaches to server to negotiate build context

--tag , -t

Name and optionally a tag in the ‘name:tag’ format

--target

Set the target build stage to build.

--ulimit

Ulimit options

TIPs 1.3 Docker-Compose 기본 형식

Command

Description

build

Build or rebuild services

config

Validate and view the Compose file

create

Create services

down

Stop and remove resources

events

Receive real time events from containers

exec

Execute a command in a running container

help

Get help on a command

images

List images

kill

Kill containers

logs

View output from containers

pause

Pause services

port

Print the public port for a port binding

ps

List containers

pull

Pull service images

push

Push service images

restart

Restart services

rm

Remove stopped containers

run

Run a one-off command

scale

Set number of containers for a service

start

Start services

stop

Stop services

top

Display the running processes

unpause

Unpause services

up

Create and start containers

version

Show version information and quit

Name, Shorthand

Description

-f, --file FILE

Specify an alternate compose file (default: docker-compose.yml)

-p, --project-name NAME

Specify an alternate project name (default: directory name)

--profile NAME

Specify a profile to enable

-c, --context NAME

Specify a context name

--verbose

Show more output

--log-level LEVEL

Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)

--ansi (never|always|auto)

Control when to print ANSI control characters

--no-ansi

Do not print ANSI control characters (DEPRECATED)

-v, --version

Print version and exit

-H, --host HOST

Daemon socket to connect to

--tls

Use TLS; implied by --tlsverify

--tlscacert CA_PATH

Trust certs signed only by this CA

--tlscert CLIENT_CERT_PATH

Path to TLS certificate file

--tlskey TLS_KEY_PATH

Path to TLS key file

--tlsverify

Use TLS and verify the remote

--skip-hostname-check

Don't check the daemon's hostname against the name specified in the client certificate

--project-directory PATH

Specify an alternate working directory (default: the path of the Compose file)

--compatibility

If set, Compose will attempt to convert keys in v3 files to their non-Swarm equivalent (DEPRECATED)

--env-file PATH

Specify an alternate environment file

2022년 NHN Cloud 무료 교육일정 : https://doc.skill.or.kr/2022-NHN-Cloud-Education

2022년 NHN Cloud 행사/프로모션 정보 공유 : https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion

Last updated