반응형

※ 레거시 프로젝트를 운영하다가 정리하게 되었다.

1. pom.xml 에 Nexus 관련 설정을 추가한다

<distributionManagement>
	<repository>
		<id>nexus-releases</id>
		<url>http://${NEXUS-HOST}/nexus/content/repositories/releases/</url>
	</repository>

	<snapshotRepository>
		<id>nexus-snapshots</id>
		<url>http://${NEXUS-HOST}/nexus/content/repositories/snapshots/</url>
	</snapshotRepository>
</distributionManagement>

 

  • 여기서 id를 주목해야한다. 3번의 setting.xml 의 id와 동일해야한다.
  • 또한 대표저장소의 id 나 name 속성과 관련이없다.

 

2. pom.xml 에 Plugin 을 추가한다.

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-deploy-plugin</artifactId>
<!--				<version>${maven-deploy-plugin.version}</version>-->
	<configuration>
		<skip>true</skip>
	</configuration>
</plugin>

<plugin>
	<groupId>org.sonatype.plugins</groupId>
	<artifactId>nexus-staging-maven-plugin</artifactId>
	<version>1.5.1</version>
	<executions>
		<execution>
			<id>default-deploy</id>
			<phase>deploy</phase>
			<goals>
				<goal>deploy</goal>
			</goals>
		</execution>
	</executions>
	<configuration>
		<serverId>nexus</serverId>
		<nexusUrl>http://${NEXUS-HOST}/nexus/</nexusUrl>
		<skipStaging>true</skipStaging>
	</configuration>
</plugin>

 

3. settings.xml 에 서버설정을 추가한다.

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
	  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
<!--	<localRepository/>-->
<!--	<interactiveMode/>-->
<!--	<offline/>-->
<!--	<pluginGroups/>-->
	<servers>
		<server>
			<id>nexus-releases</id>
			<username>${id}</username>
			<password>${password}</password>
		</server>
		<server>
			<id>nexus-snapshots</id>
			<username>${id}</username>
			<password>${password}</password>
		</server>
	</servers>
<!--	<mirrors/>-->
<!--	<proxies/>-->
<!--	<profiles/>-->
<!--	<activeProfiles/>-->
</settings>

※ settings.xml 참고 링크 - maven.apache.org/settings.html#Quick_Overview

  • 위에도 언급했지만 id를 주목해야한다. pom.xml 에 설정한 id값과 동일해야한다.
  • 또한 대표저장소의 id 나 name 속성과 관련이없다.

 

4. mvn 명령어를 통해 빌드 결과물을 넥서스에 배포한다.

옵션을 주지않으면 테스트가 실행이 될텐데 아래의 옵션을 통해 스킵할 수 있다.
mvn clean deploy
mvn clean deploy -Dmaven.test.skip=true

 

※ deploy 명령어 참고 링크 - maven.apache.org/guides/mini/guide-3rd-party-jars-remote.html

 

Maven – Guide to deploying 3rd party JARs to remote repository

Guide to deploying 3rd party JARs to remote repository Same concept of the install:install-file goal of the maven-install-plugin where the 3rd party JAR is installed in the local repository. But this time instead to local repository the JAR will be install

maven.apache.org

배포 작업의 경우에는 이 작업이 배포 파이프라인의 마지막 작업이어야 하므로 테스트를 건너뛰어도 좋습니다.  이러한 배포 파이프라인의 일반적인 예로는 Jenkins 작업의 연속이 있으며, 각 작업은 성공적으로 완료될 경우에만 다음 작업을 트리거합니다. 따라서 배포 작업이 실행될 때까지 프로젝트의 모든 테스트 제품군을 실행하는 것은 파이프라인의 이전 작업의 책임입니다. 모든 테스트는 이미 통과해야 합니다.

 

5. 결론

Maven 아티팩트를 Nexus로 배포하기 위한 간단하면서도 매우 효과적인 솔루션입니다. 또한 기본 maven-deploy-plugin 대신 nexus-staging-maven-plugin이 사용되고 스테이징 기능이 비활성화되는 등 어느 정도 의견이 분분합니다. 이러한 선택으로 솔루션을 간단하고 실용적으로 만들 수 있습니다.

 

참고자료) www.baeldung.com/maven-deploy-nexus

 

Maven Deploy to Nexus | Baeldung

Maven Deploy to Nexus - The Nexus Snapshot Repository in the pom and how to set up the Deployment Process.

www.baeldung.com

#

반응형
반응형

Docker 란?

 기존의 온프레미스 환경에서 서버 구축의 어려움을 Docker-Engine 위에서 Docker-Registry를 통해 Docker-Images을 Docker-Compose로 쉽게 구성 맟 관리할 수 있게 구축을 해 주는 기술입니다.

 

Docker-Hub 란?

- GitHub 이나 Bitbucket과 같은 소스코드 관리 툴과 연계하여 코드를 빌드하는 기능이나 실행 가능한 애플리케이션의 이미지를관리하는 기능을 갖춘 Docker의 공식 리포지토리 서비스 입니다.

 

Tag

- 도커 이미지에 대한 버전이라고 보면 됩니다. (ngnix:latest, debian:7)

 

 

1. 도커 시스템 정보

  • docker version
  • docker -v
  • docker system info
  • docker system df
  • docker system df -v

 

2. 컨테이너 명령어

docker container run 명령은 도커 이미지로부터 컨테이너를 생성하고 실행하는 멸령이다.

도커 컨테이너는 이미지를 바탕으로 작성된다.

 

docker container run <image> <command>

docker container run ubuntu:latest /bin/echo 'Hello Wolrd'

 

docker container run --name webserver -d -p 80:80 ngnix

docker container run --name webserver -d -p 80:80 ngnix:latest

- webserver 라는 이름의 컨테이너로 nginx 이미지를 띄운다.

-  [-d] 옵션은 detach로 백그라운드에서 실행을 의미한다.

-  [-p] 옵션은 포트 포워딩이다.

 

docker container run -it --name "test1" centos /bin/cal February 2018

- 컨테이너를 생성/실행하면서 콘솔에 결과를 출력하고 이름은 "test1"로 centos이미지를 올리고 /bin/cal 명령어를 실행한다.

docker container run -it --name "test2" centos /bin/bash

- [-i] 옵션은 컨테이너를 실행할 때 컨테이너 쪽 표준 입력과의 연결을 그대로 유지한다. 그러므로 컨테이너 쪽 셀에 들어가서 명령을 실행할 수 있다.

- [-t] 옵션은 유사터미널 기능을 활성화하는 옵션인데, -i 옵션을 사용하지 않으면 유사 터미널을 실행해도 여기에 입력할 수가 없으므로 -i와 -t 옵션을 합쳐 축약한 -it 옵션을 사용한다.

 

컨테이너 상태 확인

docker container ls [option]

- [--all|-a] :모든 컨테이너

docker container ps

docker container stats <container-name>

docker container top <container-name>

 

컨테이너 연결

docker container attach <container-name>

- ctrl-c : 컨테이너 종료

- ctrl-

 

 

컨테이너 종료/시작/재시작/삭제

  • docker stop <container-name>
  • docker start <container-name>
  • docker container restart <container-name>
  • docker container rm <container-name>
  • docker container rm -f <container-name>
    • - 강제 종료 및 삭제

 

docker container run --cpu-shares=512 --memory=1g centos

- [--cpu-shares] : CPU의 사용 배분(비율)

- [--memory] : 사용할 메모리를 제한하여 실행

- [--evn=<환경변수>] : --env JAVA=xxx, -e JAVA=xxx

- [--user=사용자명] : --use

 

docker container exec -it <container> /bin/echo "HelloWorld"

docker container port <container>

docker container rename

docker container cp

 

컨테이너 로그 - 표준 출력 연결하기

docker container logs [options] <container-id | container-name>

- docker container logs -f $(docker container ls --filter "ancestor=mysql" -q )

 

컨테이너와 호스트의 데이터 볼륨(컨테이너의 데이터퍼시스턴스 기법)

-v 옵션을 사용하여 호스트와 컨테이너 사이의 데이터를 공유한다.

docker container run -v 호스트디렉토리:컨테이너디렉토리 repository[:tag] [command]

호스트-컨테이너 데이터볼륨은 호스트 쪽 특정 디렉터리에 의존성을 갖는다. 데이터 볼륨 컨테이너의 볼륨은 도커에서 관리하는 영역인 호스트 머신의 /var/lib/docker/volumes/ 아래에 위치한다. 데이터볼륨 컨테이너 방식은 도커가 관리하는 디렉터리 영역에만 영향을 미친다.

 

 

3. 이미지 명령어

docker image pull [option] <image-name>[:tag]

 

docker image pull - a centos 

- centos의 모든 이미지 다운로드

docker pull nginx (이미지 다운로드)

 

docker image ls [option] [repository]

docker image ls

docker images

 

docker image inspect nginx:latest

- 도커 임지 상세 정보 표시

docker image inspect --format="{{ .ContainerConfig.Image}}" nginx:latest

- 이미지값만 표시

 

docker image tag <origin-image-name> <new-image-name:tag>

- 이미지 tag 를 사용해 새이름으로 이미지를 복사한다.

docker image tag nginx:latest starlord/webserver:1.0

 

docker search  [option] <keyword>

- 도커 허브에 공개되어 있는 이미지들을 조회한다.

docker serach ngnix

 

docker image rm <optino> <image-name>

- 도커 이미지를 삭제한다.

 

docker image prune [-a|-f]

- 사용하지 않는 이미지들을 삭제한다.

 

컨테이너로부터 이미지 작성 및 확인

  • docker container commit [option] <container-name> <image-name:tag>
  • docker container commit -a "starlord" webserver ws-image:1.0
  • docker image ls
  • docker image inspect ws-image:1.0

 

컨테이너로부터 tar 파일 생성

  • docker container export <container>
  • docker container export <container> > current.tar
  • ls -al
  • tar -tf current.tar
  • tar tf current.tar | more

 

이미지를 tar 로 저장하기

  • docker image save [option] <save-file> [image-name]
  • docker image save -o save.tar webserver
  • docker image load [option] <image>

 

tar로부터 이미지를 읽어들이기

  • docker imae load [option] <image-name>

 

 

4. 네트워크 명령어

  • docker network create -d bridge webap-net
  • docker container run --net=webap-net -it centos
  • docker network ls --no-trunc
  • docker network connect [option] <network-name> <container-name>
  • docker network disconnect <network-name> <container-name>
  • docker network inspect [opeion] network
  • docker network rm <network-name>

 

 

5.  불필요한 이미지/컨테이너를 일괄삭제

docker system prune [option]

- [-a | -f] 

 

 

6. Dockerfile로부터 이미지 만들기

도커 파일을 생성한다

  • touch Dockerfile 

도커 파일을 빌드한다

  • docker build -t <image-name> <경로[절대|상대]>
  • docker build -t sample:1.0 ./
  • docker build -t sample:1.0 -f <filename> ./
  • docker build -t sample1 -f Dockerfile.layer1 ./
  • docker images 

 

Dockerfile example

 

# step1. ubuntu

FROM ubuntu:latest

#step2. ngnix

RUN apt-get update && apt-get install -y -q nginx

#step3. file copy

COPY index.html /usr/share/nginx/html/

#step4. start nginx

CMD ["nginx", "-g", "daemon off;"]

 

도커파일의 명령 목록

- FROM 베이스 이미지 지정

- RUN 명령 실행 : shell형식, exec형식 (이미지를 작성하기 위해 실행하는 명령)

- CMD컨테이너 실행 명령 (Dockerfile 안에서는 하나의 명령만 가능, 우선적인 명령이 있을 시 덮어짐)

- LABEL 라벨 설정

- EXPOSE 포트 익스포트

- ENV 환경변수

- ADD 파일/디렉토리 추가 (ADD <호스트파일경로> <Docker 이미지의 파일 경로>)

- COPY 파일 복사 (COPY <호스트파일경로> <Docker 이미지의 파일 경로>)

- ENTRYPOINT 컨테이너 실행 명령 (다른 명령이 있어도 같이 쓰임)

- VOLUME 볼륨마운트

- USER 사용자 지정

- WORKDIR 작업 디렉토리

- ARG Dcokerfile 안의 변수

- ONBUILD 빌드 완료 후 실행되는 명령

- STOPSIGNAL 시스템 콜 시그널 설정

- HEALTHCHECK 컨테이너의 헬스 체크

-  SHELL 기본 쉘 설정

 

 

7. Docker Compose

여러 컨테이너를 모아서 관리하기 위한 툴입니다.

docker-compose.yml 을 생성 후 docker-compose up 명령어를 수행하면 됩니다.

크게 services: , networks: , volumes: 를 정의합니다.

 

docker-compose up

docker-compose up -d

- 컨테이너를 백그라운드로 시작 

docker-compose up --build

docker-compose config

docker-compse -v or -version

 

도커 컴포즈 서브 명령

up, ps, logs, run, star, stop, restart, pause, unpause, port, config, kill, rm, down

 

ex) docker-compose.yml

 

이미지지정

container_name: 'this-is-container'

labels:

    - "com.xxxx=yyyyy"

labels:

    com.xxxx: "yyyyy"

version: '1.0'

services: 

webserver:

    image: <image-name:tag>

 

빌드지정

services:

    webserver:

          build: . 

 

services:

    webserver:

          build:

              context: /directory

              dockerfile: filename

              args:

                   key1: value1

                   key2: value2

 

services:

    webserver:

          build: .

          depends_on:

              - db

              - redis

    redis:

          image: redis

    db:

          image: postgres

 

environment:

    - KEY1: value1

    - KEY2: value2

env-file: envfile

 

docker-compose ps 명령어로 확인 할 수 있습니다.

docker-compose stop 명령어로 컨테이너들을 종료할 수 있습니다.

docker-compose down 명령어를 사용하면 리소스들을 삭제할 수 있습니다.

docker-compose down --rmi all 모든 이미지, 네트워크, 볼륨 다 삭제

 

 

8. Docker Machine

Docker-Machine 은 호스트 머신/클라우드/가상 환경 등에  Docker의 실행 환경을 만들 수 있는 커맨드라인 툴입니다.

 

docker-machine create —driver <driver-name> <Docker-Machine-Name>

docker-machine ls

docker-machine rm <docker-machine>

docker-machine ssh <docker-machine>

docker-machine status <docker-machine>

docker-machine scp <docker-machine>:/directory

  • 실행환경으로부터 파일 다운로드 

docker-machine ip <docker-machine>

docker-machine inspect <docker-machine>

 

클라우드를 사용하여 Docker 실행환경을 구축할 때는 오케스트레이션을 위한 매니지드 서비스 외에도 소스코드나 Docker 이미지의 리포지토리 및 로깅 등과 같은 여러 서비스를 조합하여 시스템을 구축하게 됩니다.

 온프레미스 환경에서는 네트워크 부설/ 서버 기기의 도입/ OS의 설정 등 물리적인 작업 및 어느 정도의 초기 비용이 필요하기 때문에 시스템의 요건에 따라 사전에 상세한 설계가 필요합니다. 하지만 클라우드를 사용한 경우는 서비스의 조합만으로 재빨리 시스템을 구축할 수 있는 것이 큰 특징입니다.

 한편 클라우드만의 설계 포인트도 있습니다. 예를 들어 클라우드 서비스를 어떻게 조합하는 것이 최적인지, 영구 데이터의 특성에 맞춰 어떤 스토리지 서비스를 골라야 좋을지 등입니다. 이러한 클라우드의 특성을 고려하여 장점을 최대한 살리는 형태로 구축된 아키텍처를 클라우드 네이티브 아키텍처라고 합니다.

 

docker pull registry-name/resource-name:latest

docker container run -d -p 8080:8080 --name resource-name registry-name:latest

docker exec <containerid> java -version

 

컨테이너 쉘 접속

  • docker ps -a
  • docker exec -it <container-name or id> /bin/bash

 

#

반응형
반응형

프로메테우스란 무엇인가?


 프로메테우스는 메트릭 기반의 오픈소스 모니터링 시스템이다. 2012년 사운드클라우드사에서 개발을 시작한 후, 프로메테우스와 연관된 관련 커뮤니티와 생태계는 꾸준히 성장해 왔다. 프로메테우스는 주로 Go 언어로 작성되었으며 아파치 2.0 라이센스를 따른다. 또한 프로메테우스 프로젝트는 2016년에 클라우드 네이티브 컴퓨팅 재단의 두 번째 멤버가 되었다.

 

 

프로메테우스의 특징


  • a multi-dimensional data model with time series data identified by metric name and key/value pairs
    • 키/값 쌍의 메트릭이름으로 된 시계열데이터가 포함된 다차원-데이터-모델
  • PromQL, a flexible query language to leverage this dimensionality
    • 이러한 차원을 이용하는 유연한-질의-언어
  • no reliance on distributed storage; single server nodes are autonomous
    • 분산 저장장치에 의존하지않는;단일-서버-노드는 자율적이다.
  • time series collection happens via a pull model over HTTP
    • HTTP를 통한 pull-방식을 통해 시계열 수집이 발생한다.
  • pushing time series is supported via an intermediary gateway
    • 중계-게이트웨이를 통해 시계열 푸시가 지원된다.
  • targets are discovered via service discovery or static c도onfiguration
    • service-discovery와 정적구성을 통해 대상들이 발견된다.
  • multiple modes of graphing and dashboarding support
    • 다양한 그래프 모드와 대시보드를 지원한다.

 

 

프로메테우스의 구성요소


The Prometheus ecosystem consists of multiple components, many of which are optional:

Most Prometheus components are written in Go, making them easy to build and deploy as static binaries.

 

프로메테우스 아키텍쳐


 

프로메테우스 알림


 프로메테우스의 알림은 두부분으로 나누어져 있다. 프로메테우스의 알림규칙은 알림(경고)을 알림메니저로 보낸다. 그런다음 알림메니저는 사일런싱(silencing), 금지/억제(inhibition), 집계(aggregation)을 포함하여 알림 발송(email, slack, chat)을 관리한다.

 

따라서 알림과 통지를 설정을 구성해야 한다.

  • 알림메니저를 구성한다.
  • 알림메니저와 통신하도록 프로메테우스를 구성한다.
  • 프로메테우스에 알림규칙을 생성한다.

 

기록 규칙


 프로메테우스가 정기적으로 PromQL 표현식을 수행하고 결과를 수집하도록 기록규칙(recoring rules)을 사용할 수 있다. 기록규칙은 대시보드의 속도를 높이고, 다른 곳에 사용하기 위해 집계된 결과를 제공하며 범위 벡터 함수를 작성하는 데 유용하다. 알림규칙도 기록규칙의 변형이다.  기록규칙은 쿼리를 더 효율적으로 만들기 위해 카디널리티를 감소시키는 데 주로 사용된다. 기록 규칙은 대시보드와 페더레이션, 그리고 장기 저장소에 메트릭을 저장하기 전에 일반적으로 사용된다. 범위 벡터 함수를 작성하고 메트릭에 대한 API를 다른 팀에 제공하는 경우에도 기록 규칙을 사용할 수 있다.

 

알림이란?


문제가 발생했을 때 사람에게 통보해주는 기능이다. 프로메테우스는 지속적으로 계산이 수행되는 PromQL 형식으로 알림이 발생할 수 있는 조건을 정의할 수 있으며, 그 결과에 대한 시계열이 바로 알림이 된다. 

 

알림규칙


기록규칙과 동일한 규칙 그룹에 배치하고 원하는 방식으로 조화시킬 수 있다. 일반적으로 임의의 작업에 대한 모든 규칙과 알림을 하나의 그룹으로 표시한다. 만약 한 주기에 계산되기 어려울 정도로 그룹이 커지면, 그룹을 줄이는 것이 옵션이 아닐 경우, 그룹을 분할해야 할 수도 있다.

 

 알림매니저가 시간에 따른 알림 통보를 제공하지 않기 때문에 특정 시간에만 받기 원하는 경우 날짜함수를 사용해서 알림규칙을 설정해야 한다. 일반적으로 모든 알림에 대해 최소 5부의 for 값을 사용하는 것을 권장한다. 이렇게 하면 간단한 플랩을 포함한 대다수의 산출물에서 양성(false positive) 문제를 제거할 수 있다.(폭탄 알림 방지) 알림레이블을 추가해서 알림매니저를 구성할 때 사용할 수 있게 한다.

 

알림매니저


모든 프로메테우스 서버에서 알림을 모두 전달 받아 이메일이나 채팅 메시지, 또는 호출 등의 통보로 변환하는 것이 알림 매니저의 역할이다. 다시 말해서 알림이 통보로 변환되는 방법에 대해 제어 가능한 파이프라인을 사용자에게 제공한다.  파이프라인은 다음과 같다. 억제/금지(inhibition), 사일런싱(silencing), 라우팅(routing), 그룹화(grouping), 조절과 반복(throttling, repitition), 통보(notification)의 단계가 있다.

 

Tip


  • 프로메테우스의 구성 새로 로딩하기
  • kill -HUP <pid>--web.enable-lifecycle 플래그 지정 후 HTTP POST로 /-/reload 엔드포인트 보내기

 

반응형

+ Recent posts