Docker Manual

"왜 굳이 도커를 사용하여야하나" 에 대한 블로그 추천"

https://www.44bits.io/ko/post/why-should-i-use-docker-container

도커환경

*Docker for window (ToolBox)*

>> Docker Quickstart Terminal(cmd, powershell에서도 가능)

 

*Kitematic (Alpha)*

>>이미지 및 컨테이너를 UI으로 편하게 보기를 제공해주는 프로그램

 

Oracle VM VirtualBox*

>>window pro 10이상에서는 hypervisor - V가 제공되지만

그 이하버전은 가상머신박스를 받아 실행...

 

//Docker자체가 리눅스기반이라 윈도우프로그램은 이슈가 많다..

>> 버전이 pro 10 이상이여도 ToolBox 설치를 추천합니다.

사용할 가상머신에 대한 정보를 정할수 있고 미리보기도 가능하다.

 

>>default에 있는 Linux운영체제 기반의 VM을 사용하고있다.

Jankins

젠킨스 에대한 간단한 설명은 (https://slides.com/beomlee/deck-8#/2) 참고

docker image 생성 (+ container)

도커이미지를 가져오는 방법은 여러가지 있지만

(작성자는 docker for window사용)

 

2가지 방법을 쓸것입니다.

1. 콘솔창에서 (with. docker hub)

2. Kitematic

1. Repository(Docker hub)에 등록되있는 도커파일을 가져와 사용하는것

원하는 도커파일의 (docker hub에서) Command를

가져와서 콘솔창에서 실행해 줍니다.

저장소에 저장된 jenkins 이미지를 가져오게 됩니다.

$ docker images

입력을 통하여 이미지를 호출한 결과를 확인할수 있습니다.

위의 명령어로 docker를 run실행시 컨테이너가 생성되는 것을 확인할수 있습니다.

$ docker run -d -p 8080:8080 -v /jenkins:/var/jenkins_home --name jenkins -u root jenkins

$ docker ps

명령어를 통하여 jenkins의 컨테이너가 생성되있는 것을 확인할수 있다.

2. Kite Matic을 이용하여 이미지 호출

kitematic 에서 제공하는 이미지 사용

제공하는 이미지로 컨테이너까지 생성하고 있다

web preview 기능까지 있어 편리합니다.

저는 기본적으로 이 두가지 방법으로

필요한 이미지 호출을 하고있습니다.

Dockerfile

Docker File이란 Docker Image를 만들기 위한 설정 파일입니다.

여러가지 명령어를 토대로 Docker File을 작성하면 설정된 내용대로

다수의 Docker Image를 만들 수 있습니다

 

(도커허브에 잘만들어진 dockerfile이 꽤 많다고한다)

사실 ppt의 초반에 이미지 생성 및 컨테이너 실행 부분을보면

지금 Dockerfile 부분은 필요성이 없는 부분이라 생각할수 있습니다.

하지만 저같은 경우는 중간에 이미지 설치과정, 중간에 어떠한 과정을 수정해햐 하는지 등 알아야 하기 때문에

Dockerfile 이 필요합니다.

사용이유.1

어떠한 이미지를 배포할 때, 몇 기가씩이나 되는 이미지 파일 자체를 배포하기보다는 그 이미지를 만들 수 있는 스크립트인 Dockerfile만을 배포한다면 매우 편리할 것입니다. 사용자는 그 스크립트를 실행시키기만 하면 스스로가 그 Dockerfile에 해당하는 이미지를 얻을 수 있기 때문입니다.

사용이유.2

컨테이너 환경에서 애플리케이션을 개발하다 보면, 특정 행동을 취하도록 하는 컨테이너를(이미지를) 만들어야 할 때가 있습니다.

사용이유.3

우선 도커파일을 입맛에 맞게 만들려면 기본 명령어들을

알아야 합니다.

(남이 만들어놓은 것이 아닌 우리가 직접 도커이미지를 만드는것)

Dockerfile 작성

cmd창(본인은 도커에서 제공해준 Terminal로 사용)으로 작성

 

도커파일을 저장할 경로 생성

vim 에디터 실행(Dockerfile:이름)

리눅스 vim 에디터 사용을 잘몰라서 기본적인 것만 기입하겠습니다.

리눅스 vim 에디터 기초 사용법 참조(https://withcoding.com/112)

기반으로 할 이미지를 설정

작성자(이형범)의 정보

RUN명령어로 shell script실행

nginx를 설치

echo는 문자열을 그대로 화면에 출력하기 위함

CMD 명령어가 실행될 경로찾기

컨테이너가 시작되었을 때 실행할 실행파일 또는 shell script

nginx를 백그라운드에서 돌아가도록 실행

80번 웹 서버 포트를 열어 웹 서버에 정상적으로 접근할 수 있도록 합니다.

저장후종료 (나머지는 참조 사이트 참고)

생성확인

vim 에디터 사용시 비정상 종료가 되었을때 생성되는 파일인데, 이를 지워주면 다시 정상적인 편집이 가능하다

상태확인

현재 나의 vm에 있는 image현황

Dockerfile 빌드이후 이미지 보유상태

(myununtu는 지정한 태그로 이미지를 빌드할때 생긴 이름입니다)

현재 나의 vm에 있는 Container 현황

Dockerfile 빌드이후 컨테이너 보유상태

(myubuntu는 지정한 태그로 이미지를 빌드할때 생긴 이름입니다)

전단계에서는 ngnix으로 연결화면을 펼쳐보았지만.

미들웨어로 저같은 경우는

jenkins(CI툴), maven(빌드), java(8버전)이 필요하므로

이들을 dockerfile로 설정하겠습니다.

//(Tomcat server는 Azure)

 

 

 

 

 

dockerfile 만들기 참고사이트 -->  https://getintodevops.com/blog/the-simple-way-to-run-docker-in-docker-for-ci

jenkins 컨테이너는 내부에서 dockerfile을 빌드할 예정이므로, docker in docker로 jenkins 이미지를 만들 예정이다.

c드라이브 -> Docker폴더를 만들었고 그안에

1. dockerfile

2. compose파일

3. 인스톨파일(shell script파일) 을 만들었습니다.

FROM jenkins/jenkins:lts

USER root

COPY docker_install.sh /docker_install.sh

RUN chmod +x /docker_install.sh

RUN /docker_install.sh

jenkins_dockerfile(dockerfile)

Docker Compose

웹시스템은 여러개의 Docker 컨테이너가 협력하면서 작동하는데, Docker Compose는 여러 컨테이너들을 모아서 관리하기 위한 툴입니다. Docker Compose는 'docker-compose.yml'이라는 파일에 컨테이너의 구성정보를 정의함으로 동일 호스트상의 여러 컨테이너를 일괄적으로 관리할수 있다.

앞에서 설명한 3 Tier관계의 의존관계(데이터베이스, 큐, 캐시, 애플리케이션등)을 모아서 설정할수 있습니다.

 

또한 컨테이너의 구성 정보를 YAML 형식의 파일로 관리할 수 있으므로 지속적 deploy나 등등 자동테스트를 할때의 환경 구축에도 그대로 사용이 가능합니다.

version: '3'

services:
  jenkins:
    build:
      context: .
      dockerfile: jenkins_dockerfile
    container_name: 'jenkins_docker'
    restart: always
    ports:
      - '8200:8080'
      - '50200:50000'
    expose:
      - '8080'
      - '50000'
    volumes:
      - './jenkins_home:/var/jenkins_home'
      - '/var/run/docker.sock:/var/run/docker.sock'
    environment:
      TZ: "Asia/Seoul"
networks:
  default:
    external:
      name: devops

docker-compose.yml

volume을 이용하여 폴더를 연결하여 줄것입니다.

 

(초기비빌먼호도 나중에 이파일에서 찾으면 됩니다.)

#!/bin/sh

apt-get update && \
apt-get -y install apt-transport-https \
     ca-certificates \
     curl \
     gnupg2 \
     zip \
     unzip \
     software-properties-common && \
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey &&
\
add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
   $(lsb_release -cs) \
   stable" && \
apt-get update && \
apt-get -y install docker-ce

docker_install.sh

여기에 젠킨스 뿐만아니라 jdk, maven 등 설치할 것을 추가해야한다.

 

java jdk-8, maven, jenkin 이미지를 설치할수 있게 하나의 도커파일로

묶어놓을 것이다.

 

ENV 등 환경변수 지정을 제외하면 전의 예제에서 크게 벗어나지 않는다

 

이 이미지를 기반으로 jenkins에서 빌드시킨후

AZURE 톰캣 서버로 보낼 것이다.

만든 도커파일을 돌리면 다음과 같다

$ docker-compose up -d

명령어처리를 하면 이미자가 생성이된다.

설정한 포트접속

접근폴더 설정

build할 도커파일

kitematic 에서보면 (jenkins_docker)확인된 것을 확인할수 있다.

jenkins_home은 local에 있는 폴더을 volume을 통하여 연결시켜주었던 파일입니다 이폴더 안에 초기비밀번호가 있습니다.

이런식으로 비밀번호를 확인할수 있습니다.

계정을 등록하고 실행합니다

jenkins 최신버전을 깔았지만 Pipeline 플러그인 설치시 오류가 나왔습니다.

버전이 서로 맞지 않아 생기는 오류인것 같습니다.

Pipeline은 jenkinsfile 설정시 중요한 플러그인입니다.

해결하고 나가야합니다.

Item을 새로 하나 생성합니다.

준비된 dockerfile로 환경을 구성한상태고 jenkins도 서버에서 설치된 것이기 때문에

$ docker ps 를 하면 다음과 같이 빌드가 되는것을 확인할수 있습니다.

jenkins에서 dockerfile을 이용해서 설치하는 과정 이였습니다.

 

코드작성을 하려고합니다. Tool -> Git -> Jenkin

jenkins에서 dockerfile을 이용해서 설치하는 과정 이였습니다.

 

코드작성을 하려고합니다. Tool -> Git -> Jenkin

웹 3계층

웹서버의 기능은 미들웨어로 구축하는경우도 있으며, 오픈소스인 Nginx, Microsoft의 IIS(Internet Information Service) 등이 있다.

애플리케이션 서버로서 업무처리를 실행하는 서버입니다. 프론트서버 기능과 마찬가지로 미들웨어로 구축하는 경우도 있습니다.

데이터베이스 관리하는 서버!!!

Jenkins에서 자동배포화를 하기 위하여 설정을 해주어야한다.

 

ubuntu 서버에 (dockerfile 참조) JDK,Git, Maven이

설치가 되어있어야 한다.

install automatically 체크박스는 풀어주어야한다(서버에 설치가 되어있기 때문에)

install automatically 체크박스는 풀어주어야한다(Git도 서버에 설치가 되어있기 때문에)

install automatically 체크박스는 풀어주어야한다(Maven도 서버에 설치가 되어있기 때문에)

Maven 빌드로 spring 프로젝트를 만들었지만 FreeStyle Project(포괄적)으로 만들어 보려 합니다.

clean package tomcat:redeploy -P production -D maven.test.skip=true   goals에 입력

Azure 톰캣에 타겟팅을 해야해서 아직 확인못하여

이부분은 예제 보류!

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">



      <modelVersion>4.0.0</modelVersion>

      <groupId>com.victolee</groupId>

      <artifactId>guestbook</artifactId>

      <version>0.0.1-SNAPSHOT</version>

      <packaging>war</packaging>



      <!-- 변수 -->

      <properties>

            <org.springframework-version> 4.2.1.RELEASE </org.springframework-version>



                <!-- Jenkins에서 사용하는 부분 -->

            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

            <!--  -->

      </properties>



      <!-- 라이브러리를 추가 -->

      <dependencies>

            // ... 생략

      </dependencies>





      <!-- Jenkins에서 사용하는 부분 -->

      <profiles>

            <profile>

                  <id>production</id>

                  <build>

                        <resources>

                             <resource>

                                   <directory>${project.basedir}/src/main/resources</directory>

                                   <excludes>

                                         <exclude>**/*.java</exclude>

                                   </excludes>

                             </resource>

                        </resources>



                        <plugins>

                             <plugin>

                                   <groupId>org.apache.maven.plugins</groupId>

                                   <artifactId>maven-resources-plugin</artifactId>

                                   <configuration>

                                         <encoding>UTF-8</encoding>

                                   </configuration>

                             </plugin>

                        </plugins>

                  </build>





                  <dependencies>

                        <!-- Servlet -->

                        <dependency>

                             <groupId>javax.servlet</groupId>

                             <artifactId>javax.servlet-api</artifactId>

                             <version>3.0.1</version>

                             <scope>provided</scope>

                        </dependency>



                        <dependency>

                             <groupId>javax.servlet.jsp</groupId>

                             <artifactId>jsp-api</artifactId>

                             <version>2.0</version>

                             <scope>provided</scope>

                        </dependency>

                  </dependencies>

            </profile>

      </profiles>





      <build>

            <plugins>

                  <plugin>

                        <artifactId>maven-compiler-plugin</artifactId>

                        <version>3.7.0</version>

                        <configuration>

                             <source>1.8</source>

                             <target>1.8</target>

                        </configuration>

                  </plugin>

                  <plugin>

                        <artifactId>maven-war-plugin</artifactId>

                        <version>3.0.0</version>

                        <configuration>

                             <warSourceDirectory>webapp</warSourceDirectory>

                        </configuration>

                  </plugin>



                  <!-- Jenkins에서 사용하는 부분 -->

                  <plugin>

                        <groupId>org.codehaus.mojo</groupId>

                        <artifactId>tomcat-maven-plugin</artifactId>

                        <configuration>

                             <url>http://localhost:8080/manager/text</url>

                             <path>/guestbook</path>

                             <username>admin</username>

                             <password>manager</password>

                        </configuration>

                  </plugin>

                  <!--  -->

            </plugins>

      </build>

</project>

pom.xml에서 jenkins에서 사용하는 플러그인 및 의존관계를 설정해주어야 한다

Jenkins Pipeline

 

deck

By Beom lee