docker[면접 볼 때 물어봄]

  • 도커(docker)는 이미지를, 컨테이너에 띄우고 실행하는 기술. 컨테이너는, '애플리케이션'과 '애플리케이션'을 구동하는 환경을, Host OS로부터 격리한 공간.

  • 우분투 내에 도커가 있음. 도커 내에 컨테이너가 있음.
    컨테이너를 만들고 삭제하는건 다른 컨테이너(프로그램)에 영향을 주지 않음

  • 쿠버네티스(kubernetes)는 다수의 컨테이너 실행을 관리 및 조율하는 시스템으로 컨테이너들을 모니터링하며, 컨테이너 중 하나라도 죽으면 그것을 빠르게 재시작. 서버에 가해지는 부하를 분산하는 로드 밸런싱(Load balancing) 기능.

  • docker 설치를 위한 프로그램 설치하기
    sudo apt install -y apt-transport-https build-essential ca-certificates g++ curl git libtool make unzip

  • Docker 설치 이미지 리포지토리 키 가져오기
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    OK가 표시됨.

  • 리포지토리 추가하는 부분
    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

  • docker설치
    sudo apt install docker-ce docker-ce-cli containerd.io -y

  • 도커 버전 확인
    docker version
    Client: Docker Engine - Community
    Version: 19.03.13
    API version: 1.40
    Go version: go1.13.15
    Git commit: 4484c46d9d
    Built: Wed Sep 16 17:02:36 2020
    OS/Arch: linux/amd64
    Experimental: false
    Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/version: dial unix /var/run/docker.sock: connect: permission denied

  • 사용자 아이디를 docker그룹에 추가해야만 docker를 사용할 수 있음(재부팅 필요!!)
    sudo usermod -aG docker user01

  • 재시작
    sudo reboot

  • 도커 버전 확인
    docker version


Docker Compose!

version: '3.2'

 services:
  oracle12c:
    image: truevoly/oracle-12c
    container_name: ora2
    privileged: true
    restart: always
    ports:
       - "1521:1521"
       - "8088:8080"
  • 컨테이너 구동
    docker-compose -f ./oracle-12c.yaml up -d

  • 오라클(SQL Developer) 실행

    • 비밀번호: oracle
  • 삭제
    docker-compose -f ./oracle-12c.yaml down


  • 레디스설치
    • docker search redis
  • 오라클설치
    • 이미지검색
      • docker search oracle
    • 필요한 이미지 가져오기
      • docker pull truevoly/oracle-12c
    • 현재 다운로드 된 이미지를 목록으로 확인
      • docker images
  • 컨테이너 생성 및 구동(최초 1회)
  • 컨테이너 이름: ora1, -d: 백그라운드 실행,
    1521(우분투포트번호):1521(컨테이너포트번호) 연결.
    컨테이너포트번호는 고정임(이미지 만든 사람이 정의한거)
    우분투포트번호는 바꿀 수 있고 바꿔야함. 보안상의 이유
    • docker run --name ora1 -d -p 1521:1521 -p 8088:8080 truevoly/oracle-12c
  • 컨테이너 중지
    • docker stop ora1
    • docker start ora1
  • (필요시)컨테이너 삭제
    • docker rm ora1 <= 주의 컨테이너가 중지 되어야 삭제 가능
  • (필요시)이미지 삭제
    • docker rmi truevoly/oracle-12c

  • 볼륨: 도커 안 컨테이너를 백업한 것. 도커 밖 우분투 안에 존재함

  • 아마존은 '아마존 프리 티어' 검색

서버 배포

만들어졌으면

  • 설정 - 네트워크 - 고급 - 포트포워딩 - 추가 -

  • 설정 - 저장소(추가)

  • 시작 - 빼낼 수 있도록 시작

  • UBUNTU 설치 - 계속하기 계속하기
  • 아이디: user01, 비밀번호: 1234
  • 터미널 열기: 컨트럴 알트 T
  • sudo apt install net-tools -y
  • sudo apt update -y
  • ip주소 확인: ifconfig
  • 원격 접속: sudo apt install openssh-server -y
  • 원격 접속 프로그램 구동: sudo service ssh start (아무것도 표시 안남)
  • 포트 활성화: sudo ufw enable
  • 포트 열기: sudo ufw allow 22
  • 열린 포트 확인하기: sudo ufw status
  • 서버주소: 10.0.2.15
  • ssh외부접속: 22
  • 사용자: user01
  • 암호: 1234

  • 원격 접속 프로그램
  • 모바 다운로드
  • 세션 - ssh - host: 127.0.0.1 / port: 12222
  • 아이디 비밀번호 치기
  • 리부팅: sudo reboot 하면 우분투 리부팅
  • 'R' 누르면 초기화, 다시 로그인

  • NAT방식:
    윈도우 내부에 우분투가 있는거임.
    내부에 있어서 윈도우 안에서만 접근할 수 있는데,
    우분투 주소를 직접 치면(10.0.2.15:8080/ROOT) 우분투 내부라서 볼 수 없음.
    그래서 윈도우 주소로 연결시켜줘야함(127.0.0.1:8080/ROOT 로 연결.)
    그게 포트포워딩임.

시험, 서버구동

  • 자바설치 - sudo apt install openjdk-11-jdk -y
    • 자바설치 확인 - java -version
    • 환경변수등록 - nano ~/.bashrc
    • 마지막에 추가하기
      • export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
      • export PATH=PATH:PATH:JAVA_HOME/bin
    • 추가 후 컨트럴+S 눌러서 저장하고 컨트럴+X로 종료
    • 환경변수 적용 - source ~/.bashrc
  • 톰캣설치 - sudo apt install tomcat9 -y
  • 톰캣구동 - sudo service tomcat9 start
  • 포트열기 - sudo ufw allow 8080
  • 방화벽 확인 - sudo ufw status
  • 크롬에서 확인 - 127.0.0.1:18080 입력하면 10.0.2.15:8080이 호출됨
  • 서버중지 - sudo service tomcat9 stop

  • pom.xml에 추가(캡처)
    • pom.xml에 디펜던시 위에 넣기
<packaging>war</packaging>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-tomcat</artifactId>
		<scope>provided</scope>
	</dependency>

	<!-- tomcat (개발용 웹 서버) -->
	<dependency>
		<groupId>org.apache.tomcat.embed</groupId>
		<artifactId>tomcat-embed-jasper</artifactId>
		<scope>provided</scope>
	</dependency>

	<!-- web -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
    
	<!-- devtools -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-devtools</artifactId>
		<scope>runtime</scope>
		<optional>true</optional>
	</dependency>

	<!-- lombok -->
    <dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<optional>true</optional>
	</dependency>
  • 애플리케이션에 집어넣어야하고(캡처)

  • 프로펄티에 톰캣 경로 확인(캡처)

  • 우분투, moba 켬

  • 127.0.0.1:18080


  • 이클립스 메이븐 빌드 - package -
  • 이름 바꾸고 옮기기

톰캣9 서버 구조 확인

  • pwd - 현재 폴더 위치 확인( /home/user01
  • cd /var/lib/tomcat9
  • ls - 목록보기
    • conf(환경설정) lib logs(서버구동오류기록) policy webapps(배포위치) work
  • cd webapps

  • db가져오기
  • 배포시에 저장될 폴더의 위치로 변경해야 함(spring.datasource.url=jdbc:h2:file:var/lib/tomcat9/webapps/h2/db01;Mode=Oracle;AUTO_RECONNECT=TRUE;
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:file:var/lib/tomcat9/webapps/db01;Mode=Oracle;AUTO_RECONNECT=TRUE;
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
  • application에 추가
	@Override
	protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
		return builder.sources(BootDeployApplication.class);
	}


  • 이클립스 - 메이븐 빌드

하고나면 프로젝트/target 에 .war파일이 뜸


@@@@@@@@@@@@@@@@@@@@@@@@@@@이하선생님꺼@@@@

애플리케이션 배포
평가일 : 2022년 5월 2일 5~6교시

제출파일 : 애플리케이션배포_본인이름.hwp(doc)

=====================================

  1. 애플리케이션 배포를 위한 리눅스 환경을 아래와 같이 설정하시오.
  • docker 관련 프로그램 설치 및 사용 권한 부여
  • docker 컨테이너를 이용하여 DB설치(오라클)
  • java 설치 및 환경변수 등록
  1. WAS(Web Application Server) tomcat을 설치하시오.
  • tomcat9 설치
  • tomcat9 서버 구조 확인
  • h2 DB를 저장을 위한 폴더 생성 ( /var/lib/tomcat9/webapps/h2 )
  • firewall 방화벽 설정 ( 기본포트 8080 열기 )
  1. 프로젝트 소스를 검증하고, Maven build를 이용하여 package하시오.
  • 패키지 환경 구성
  • h2 DB 위치 설정
  • war 패키징 수행
  • war파일 생성 확인 및 context 설정
  1. 빌드 된 war 파일을 Web Application Server로 배포하시오.
  • war 파일 업로드
  • webapps 폴더에 자동 압축해제 확인
  1. 배포한 애플리케이션의 동작 유무를 확인하시오.
  • 크롬을 이용한 웹페이지 접속 확인

==========================================
-- 우분투 docker설치

$ clear

$ sudo apt update -y

-- docker 설치를 위한 프로그램 설치하기
$ sudo apt install -y apt-transport-https build-essential ca-certificates g++ curl git libtool make unzip

-- Docker 설치 이미지 리포지토리 키 가져오기
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
===> OK가 표시됨.

-- 리포지토리 추가하는 부분
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

-- docker설치
$ sudo apt install docker-ce docker-ce-cli containerd.io -y

-- 도커 버전 확인
$ docker version
Client: Docker Engine - Community
Version: 19.03.13
API version: 1.40
Go version: go1.13.15
Git commit: 4484c46d9d
Built: Wed Sep 16 17:02:36 2020
OS/Arch: linux/amd64
Experimental: false
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/version: dial unix /var/run/docker.sock: connect: permission denied

-- 사용자 아이디를 docker그룹에 추가해야만 docker를 사용할 수 있음(재부팅 필요!!)
$ sudo usermod -aG docker user01

-- 재시작
$ sudo reboot

-- 화면 클리어
$ clear

-- ubuntu 터미널로 접속
$ docker version
Client: Docker Engine - Community
Version: 20.10.14
API version: 1.41
Go version: go1.16.15
Git commit: a224086
Built: Thu Mar 24 01:47:57 2022
OS/Arch: linux/amd64
Context: default
Experimental: true

    Server: Docker Engine - Community
     Engine:
      Version:          20.10.14
      API version:      1.41 (minimum version 1.12)
      Go version:       go1.16.15
      Git commit:       87a90dc
      Built:            Thu Mar 24 01:45:46 2022
      OS/Arch:          linux/amd64
      Experimental:     false
     containerd:
      Version:          1.5.11
      GitCommit:        3df54a852345ae127d1fa3092b95168e4a88e2f8
     runc:
      Version:          1.0.3
      GitCommit:        v1.0.3-0-gf46b6ba
     docker-init:
      Version:          0.19.0
      GitCommit:        de40ad0

-- Docker Compose 설치
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

-- docker-compose 실행가능파일로 변경
$ sudo chmod +x /usr/local/bin/docker-compose

-- docker-compose 버전확인
$ docker-compose --version
==> docker-compose version 1.26.2, build eefe0d31


-- 오라클용 yaml파일 생성
$ nano oracle-12c.yaml

-- 아래는 추가할 내용들...
version: '3.2'

services:
oracle12c:
image: truevoly/oracle-12c
container_name: ora2
privileged: true
restart: always
ports:
- "1521:1521"
- "8088:8080"

-- (최초 1회만) 이미지 다운, 컨테이너(ora2) 생성 및 구동
$ docker-compose -f ./oracle-12c.yaml up -d

-- 설치 중인지 확인용(종료는 ctrl + c)
$ docker logs -f ora2

-- 컨테이너 목록 보기
$ docker container ls -al

-- 컨테이너 시작
$ docker start ora2

-- 컨테이너 중지
$ docker stop ora2

-- (지울때 최초1회만) 컨테이너 중지 및 삭제(서비스 중에서 사용X)
$ docker-compose -f ./oracle-12c.yaml down


-- 자바설치
$ sudo apt install openjdk-11-jdk -y

-- 자바설치 확인
$ java -version
설치 위치는 => /usr/lib/jvm/java-11-openjdk-amd64

-- 편집기를 이용해서 환경변수등록
$ nano ~/.bashrc

마지막에 2줄 추가하기
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin

2줄추가후에 ctrl+s 눌러서 저장하고 ctrl+x로 종료

-- 환경변수 적용
$ source ~/.bashrc


-- 톰캣 설치
$ sudo apt install tomcat9 -y

-- 톰캣 구동 (start | stop | restart)
$ sudo service tomcat9 start

-- 8080포트를 열기
$ sudo ufw allow 8080

-- 방화벽 확인
$ sudo ufw status

-- user01을 tomcat 그룹에 추가하여 tomcat의 모든 파일 접근 가능하게 하기
$ sudo usermod -aG tomcat user01

-- 그룹추가후 적용하기 위해 재부팅
$ sudo reboot

-- /var/lib/tomcat9/webapps 폴더에 프로젝트 배포


// 파일명 : pom.xml


4.0.0

org.springframework.boot
spring-boot-starter-parent
2.6.7


com.example
boot_deploy
0.0.1-SNAPSHOT
boot_deploy
Demo project for Spring Boot

<java.version>11</java.version>

<packaging>war</packaging>

<dependencies>

	<!-- tomcat 배포용 -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-tomcat</artifactId>
		<scope>provided</scope>
	</dependency>

	<!-- tomcat 개발용 -->
	<dependency>
		<groupId>org.apache.tomcat.embed</groupId>
		<artifactId>tomcat-embed-jasper</artifactId>
		<scope>provided</scope>
	</dependency>

	<!-- web -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>

	<!-- devtools -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-devtools</artifactId>
		<scope>runtime</scope>
		<optional>true</optional>
	</dependency>

	<!-- lombok -->
	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<optional>true</optional>
	</dependency>
	

	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter</artifactId>
	</dependency>

	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
</dependencies>

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
		</plugin>
	</plugins>
</build>

// 파일명 : HomeController.java
package com.example.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HomeController {

// @ResponseBody 
// html이 표시되는 게 아니라 리턴값이 자체가 표시됨
@RequestMapping(value = {"/", "/home", "/main"})
public @ResponseBody String home() {
	return "home화면";
}

}


// 파일명 : application.properties

개발용 포트번호

server.port=9090

프로젝트, 배포하는 파일명

server.servlet.context-path=/ROOT

소스코드 자동감지 후 재시작

spring.devtools.livereload.enabled=true

h2 DB설정

배포시에 저장될 폴더의 위치를 변경

spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:file:/DB저장할 폴더의 위치/db01;Mode=Oracle;AUTO_RECONNECT=TRUE
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect


// 파일명 : BootDeployApplication.java
package com.example.boot_deploy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(basePackages = {"com.example.controller"})
public class BootDeployApplication extends SpringBootServletInitializer{

public static void main(String[] args) {
	SpringApplication.run(BootDeployApplication.class, args);
}

@Override
protected SpringApplicationBuilder 
	configure(SpringApplicationBuilder builder) {
	return builder.sources(BootDeployApplication.class);
}

}

// package후에 target폴더의 war 파일을 Exam.war 로 변경후에 배포하기

// 크롬에서 127.0.0.1:18080/Exam 으로 확인

0개의 댓글