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을 사용하고있다.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6718009/pasted-from-clipboard.png)
Jankins
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6717769/pasted-from-clipboard.png)
젠킨스 에대한 간단한 설명은 (https://slides.com/beomlee/deck-8#/2) 참고
docker image 생성 (+ container)
도커이미지를 가져오는 방법은 여러가지 있지만
(작성자는 docker for window사용)
2가지 방법을 쓸것입니다.
1. 콘솔창에서 (with. docker hub)
2. Kitematic
1. Repository(Docker hub)에 등록되있는 도커파일을 가져와 사용하는것
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6717775/pasted-from-clipboard.png)
원하는 도커파일의 (docker hub에서) Command를
가져와서 콘솔창에서 실행해 줍니다.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6717790/pasted-from-clipboard.png)
저장소에 저장된 jenkins 이미지를 가져오게 됩니다.
$ docker images
입력을 통하여 이미지를 호출한 결과를 확인할수 있습니다.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6717797/pasted-from-clipboard.png)
위의 명령어로 docker를 run실행시 컨테이너가 생성되는 것을 확인할수 있습니다.
$ docker run -d -p 8080:8080 -v /jenkins:/var/jenkins_home --name jenkins -u root jenkins
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6717837/pasted-from-clipboard.png)
$ docker ps
명령어를 통하여 jenkins의 컨테이너가 생성되있는 것을 확인할수 있다.
2. Kite Matic을 이용하여 이미지 호출
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6717807/pasted-from-clipboard.png)
kitematic 에서 제공하는 이미지 사용
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6717814/pasted-from-clipboard.png)
제공하는 이미지로 컨테이너까지 생성하고 있다
web preview 기능까지 있어 편리합니다.
저는 기본적으로 이 두가지 방법으로
필요한 이미지 호출을 하고있습니다.
Dockerfile
Docker File이란 Docker Image를 만들기 위한 설정 파일입니다.
여러가지 명령어를 토대로 Docker File을 작성하면 설정된 내용대로
다수의 Docker Image를 만들 수 있습니다
(도커허브에 잘만들어진 dockerfile이 꽤 많다고한다)
사실 ppt의 초반에 이미지 생성 및 컨테이너 실행 부분을보면
지금 Dockerfile 부분은 필요성이 없는 부분이라 생각할수 있습니다.
하지만 저같은 경우는 중간에 이미지 설치과정, 중간에 어떠한 과정을 수정해햐 하는지 등 알아야 하기 때문에
Dockerfile 이 필요합니다.
사용이유.1
어떠한 이미지를 배포할 때, 몇 기가씩이나 되는 이미지 파일 자체를 배포하기보다는 그 이미지를 만들 수 있는 스크립트인 Dockerfile만을 배포한다면 매우 편리할 것입니다. 사용자는 그 스크립트를 실행시키기만 하면 스스로가 그 Dockerfile에 해당하는 이미지를 얻을 수 있기 때문입니다.
사용이유.2
컨테이너 환경에서 애플리케이션을 개발하다 보면, 특정 행동을 취하도록 하는 컨테이너를(이미지를) 만들어야 할 때가 있습니다.
사용이유.3
우선 도커파일을 입맛에 맞게 만들려면 기본 명령어들을
알아야 합니다.
(남이 만들어놓은 것이 아닌 우리가 직접 도커이미지를 만드는것)
Dockerfile 작성
cmd창(본인은 도커에서 제공해준 Terminal로 사용)으로 작성
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6718085/pasted-from-clipboard.png)
도커파일을 저장할 경로 생성
vim 에디터 실행(Dockerfile:이름)
리눅스 vim 에디터 사용을 잘몰라서 기본적인 것만 기입하겠습니다.
리눅스 vim 에디터 기초 사용법 참조(https://withcoding.com/112)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6718120/pasted-from-clipboard.png)
기반으로 할 이미지를 설정
작성자(이형범)의 정보
RUN명령어로 shell script실행
nginx를 설치
echo는 문자열을 그대로 화면에 출력하기 위함
CMD 명령어가 실행될 경로찾기
컨테이너가 시작되었을 때 실행할 실행파일 또는 shell script
nginx를 백그라운드에서 돌아가도록 실행
80번 웹 서버 포트를 열어 웹 서버에 정상적으로 접근할 수 있도록 합니다.
저장후종료 (나머지는 참조 사이트 참고)
생성확인
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6718162/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6718165/pasted-from-clipboard.png)
vim 에디터 사용시 비정상 종료가 되었을때 생성되는 파일인데, 이를 지워주면 다시 정상적인 편집이 가능하다
상태확인
현재 나의 vm에 있는 image현황
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6718198/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6718210/pasted-from-clipboard.png)
Dockerfile 빌드이후 이미지 보유상태
(myununtu는 지정한 태그로 이미지를 빌드할때 생긴 이름입니다)
현재 나의 vm에 있는 Container 현황
Dockerfile 빌드이후 컨테이너 보유상태
(myubuntu는 지정한 태그로 이미지를 빌드할때 생긴 이름입니다)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6718240/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6720244/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6720279/pasted-from-clipboard.png)
전단계에서는 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 이미지를 만들 예정이다.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6728823/pasted-from-clipboard.png)
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 톰캣 서버로 보낼 것이다.
만든 도커파일을 돌리면 다음과 같다
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6728833/pasted-from-clipboard.png)
$ docker-compose up -d
명령어처리를 하면 이미자가 생성이된다.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6728841/pasted-from-clipboard.png)
설정한 포트접속
접근폴더 설정
build할 도커파일
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6728842/pasted-from-clipboard.png)
kitematic 에서보면 (jenkins_docker)확인된 것을 확인할수 있다.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6728849/pasted-from-clipboard.png)
jenkins_home은 local에 있는 폴더을 volume을 통하여 연결시켜주었던 파일입니다 이폴더 안에 초기비밀번호가 있습니다.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6728885/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6728880/pasted-from-clipboard.png)
이런식으로 비밀번호를 확인할수 있습니다.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6728903/pasted-from-clipboard.png)
계정을 등록하고 실행합니다
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6728905/getting_start시에_설치안된플러그인들.png)
jenkins 최신버전을 깔았지만 Pipeline 플러그인 설치시 오류가 나왔습니다.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6728909/pasted-from-clipboard.png)
버전이 서로 맞지 않아 생기는 오류인것 같습니다.
Pipeline은 jenkinsfile 설정시 중요한 플러그인입니다.
해결하고 나가야합니다.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6728910/pasted-from-clipboard.png)
Item을 새로 하나 생성합니다.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6728913/pasted-from-clipboard.png)
준비된 dockerfile로 환경을 구성한상태고 jenkins도 서버에서 설치된 것이기 때문에
$ docker ps 를 하면 다음과 같이 빌드가 되는것을 확인할수 있습니다.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6728917/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6728922/pasted-from-clipboard.png)
jenkins에서 dockerfile을 이용해서 설치하는 과정 이였습니다.
코드작성을 하려고합니다. Tool -> Git -> Jenkin
jenkins에서 dockerfile을 이용해서 설치하는 과정 이였습니다.
코드작성을 하려고합니다. Tool -> Git -> Jenkin
웹 3계층
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6720602/pasted-from-clipboard.png)
웹서버의 기능은 미들웨어로 구축하는경우도 있으며, 오픈소스인 Nginx, Microsoft의 IIS(Internet Information Service) 등이 있다.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6720616/pasted-from-clipboard.png)
애플리케이션 서버로서 업무처리를 실행하는 서버입니다. 프론트서버 기능과 마찬가지로 미들웨어로 구축하는 경우도 있습니다.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6720619/pasted-from-clipboard.png)
데이터베이스 관리하는 서버!!!
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6720626/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6721368/pasted-from-clipboard.png)
Jenkins에서 자동배포화를 하기 위하여 설정을 해주어야한다.
ubuntu 서버에 (dockerfile 참조) JDK,Git, Maven이
설치가 되어있어야 한다.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6721439/pasted-from-clipboard.png)
install automatically 체크박스는 풀어주어야한다(서버에 설치가 되어있기 때문에)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6721442/pasted-from-clipboard.png)
install automatically 체크박스는 풀어주어야한다(Git도 서버에 설치가 되어있기 때문에)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6721444/pasted-from-clipboard.png)
install automatically 체크박스는 풀어주어야한다(Maven도 서버에 설치가 되어있기 때문에)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6721447/pasted-from-clipboard.png)
Maven 빌드로 spring 프로젝트를 만들었지만 FreeStyle Project(포괄적)으로 만들어 보려 합니다.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/1045268/images/6721449/pasted-from-clipboard.png)
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
deck
- 187