검색

레이블이 docker인 게시물을 표시합니다. 모든 게시물 표시
레이블이 docker인 게시물을 표시합니다. 모든 게시물 표시

2025년 3월 17일

사용기 - 맥에서 도커 기반 SonarQube 활용하기

SonarQube는 코드에 대한 버그, 코드 스멜(Code Smell), 보안 취약점을 자동으로 찾아내고, 코드 품질을 향상시키는 데 도움을 주는 소스 코드 품질 및 보안 분석 도구이다.

버전에 따라 기능의 차이가 있는데 Community Edition (무료) 은  GitHub Private Repository 연동을 지원하지는 않지만 Git 에서 직접 코드를 가져와 분석할 수 있기 때문에 사용하는데 있어 큰 이슈는 없을 것 같다.

버전

특징

GitHub Private Repo 분석

Community Edition

무료, 기본적인 코드 분석 가능

✗ (직접 클론 후 분석)

Developer Edition

추가적인 언어 지원, 분기(branch) 분석

Enterprise Edition

대규모 프로젝트 지원, 포트폴리오 관리


◼︎ 환경

  • Model : MacBook Pro (14-inch, 2021)
  • CPU : Apple M1 Pro
  • MENORY : 16GB
  • DISK : 512 GB SSD
  • OS : macOS 15.3.1 (24D70)
  • TOOLS : VS Code , Docker

1. Docker 설치

Docker 는 공식 웹사이트에서 Docker Desktop for Mac을 다운로드하여 설치한다.


https://www.docker.com/products/docker-desktop

설치파일을 다운로드 후 Docker.dmg 파일을 클릭하여 설치를 진행할 수 있다. 설치가 완료되면 터미널에서 docker --version 명력을 입력하여 설치 확인한다.


% docker --version
Docker version 27.5.1, build 9f9e405


2. SonarQube Community Edition 설치하기

SonarQube 는 간단하게 터미널에서 아래 명령으로 SonarSource에서 공식적으로 제공하는 이미지를 다운로드하여 설치하고 실행할 수 있다.  SonarQube 는 디폴트로 사용하는 H2 데이터베이스 보다는  postgres 사용을 권장하고 있어 먼저 postgres 데이터베이스를 설치하고 같이 실행할 필요가 있다.

docker run -d --name sonarqube -p 9000:9000 sonarqube:lts-community

SonarQube는 여러 버전의 Docker 이미지를 제공하고 있다. 

태그(Tag)

설명

sonarqube:latest

최신 안정 버전

sonarqube:lts

최신 LTS (Long-Term Support) 버전

sonarqube:lts-community

무료 Community Edition LTS 버전

sonarqube:developer

Developer Edition (유료)

sonarqube:enterprise

Enterprise Edition (유료)

sonarqube:datacenter

Data Center Edition (유료)



postgres는 터미널에 아래와 같이 한 줄 명령어로 postgres 를 설치&실행 할 수 있다. 

docker run -d --name postgres \
  -e POSTGRES_USER=sonar \
  -e POSTGRES_PASSWORD=sonar \
  -e POSTGRES_DB=sonarqube \
  -p 5432:5432 \
  postgres:16

참고로 PostgreSQL 공식 Docker 이미지는 다양한 버전이 있는데 여기에서는 16 을 사용했다. 

태그 (Tag)

의미

postgres:latest

최신 안정 버전 (현재 기준 PostgreSQL 16)

postgres:16

PostgreSQL 16.x

postgres:15

PostgreSQL 15.x

postgres:14

PostgreSQL 14.x

postgres:13

PostgreSQL 13.x


이제 SonarQube 을 앞서 실행한 postres 와 함께 설치&실행 해보자.

docker run -d --name sonarqube \
  -p 9000:9000 \
  --link postgres \
  -e SONAR_JDBC_URL=jdbc:postgresql://postgres:5432/sonarqube \
  -e SONAR_JDBC_USERNAME=sonar \
  -e SONAR_JDBC_PASSWORD=sonar \
 sonarqube:lts-community

옵션

설명

docker run

새로운 컨테이너를 실행하는 명령

-d

컨테이너를 백그라운드(Detached Mode)에서 실행

--name sonarqube

컨테이너 이름을 sonarqube로 지정

-p 9000:9000

호스트의 9000번 포트를 컨테이너의 9000번 포트와 연결 (SonarQube 웹 UI)

--link postgre-container

SonarQube가 postgre-container 컨테이너와 통신할 수 있도록 설정 (Deprecated - 다른 방법 권장)

-e SONAR_JDBC_URL=jdbc:postgresql://postgres:5432/sonarqube

SonarQube가 PostgreSQL 데이터베이스 sonarqube에 연결하도록 설정

-e SONAR_JDBC_USERNAME=sonar

PostgreSQL 접속 시 사용할 DB 사용자명 설정

-e SONAR_JDBC_PASSWORD=sonar

PostgreSQL 접속 시 사용할 DB 비밀번호 설정

sonarqube:lts-community

실행할 Docker 이미지 (sonarqube의 LTS 버전, 무료 Community Edition)


참고로 여기에서는 postgres 와 sonarquber 가 서로 통신가능하게 --link 옵션을 사용했지만 안정성 이유로 --network 을 사용하는 것이 권장된다고 한다. 설치가 완료되면 브라우저에서 localhost:9000 포트로 접속한다. 디폴트 계정과 비밀번호는 admin 과 admin 이다.

Docker Desktop 도구를 사용하면 좀더 쉽게 도커 컨테이너 제어와 자원 사용량을 실시간으로 확인 할 수 있다.
Docker Desktop 화면

일단 위 과정을 한번하고나면 다음부터는 Docker Desktop 을 사용하여 쉽게 컨테이너를 조작할 수 있다.

2. SonarQube Community Edition 사용하기

한글이 익숙하다면 로그인 후 macketplace 메뉴에서 "Korean Pack Localization" 을 설치하면 간단하게 한글을 지원하게 된다.

코드 품질을 분석하는 기본적인 과정은 아래와 같다. 

❶ 프로젝트를 생성
❷ SonarScanner 설치 및 실행
❸ 분석결과 확인 

2.1 프로젝트를 생성

"프로젝트" 메뉴를 클릭하고 Community Edition 이 GitHub Private Repository 연동을 지원하지 않기 때문에 로컬에 프로젝트를 복제하여 분석 하기 위하여 "Manually" 을 선택한다.

존재하는 프로젝트가 없는 경우

프로젝트 이름을 입력하고 Setup 을 클릭하여 프로젝트를 생성한다.


2.2 토큰 생성

보안된 인증을 통해 자동화된 코드 분석을 실행할 수 있도록 토큰을 생성한다. Loaclly 을 클릭한다.


① 토큰 생성하기에서 생성하기를 클릭하여 토큰을 생성한다.




생성된 토큰을 별도로 저장하여 보관한다. Continue 클릭하면 다양한 환경에 바로 적용 가능한 스크립트를 보여준다. 



기존 프로젝트가 maven 을 지원하고 있어 maven 스크립트를 복사했다.

2.3 SonarScanner 설치 및 실행

SonarQube 서버와 연결하여 코드 품질을 분석하고 결과를 업로드하는 SonarScanner 은 아래와 같이 터미널에 입력하여 간단하게 설치할 수 있다.

brew install sonar-scanner

SonarScanner가 분석하는 요소는 아래와 같다.
  • Bug (버그): 코드에서 오류가 발생할 가능성이 있는 부분
  • Code Smell (코드 냄새): 유지보수성이 낮거나 개선이 필요한 코드
  • Vulnerability (보안 취약점): SQL Injection, XSS 같은 보안 문제
  • Coverage (테스트 커버리지): 단위 테스트가 얼마나 잘 작성되었는지
  • Duplications (코드 중복): 중복된 코드 블록 확인
설치 결과는 아래 명령으로 확인 할 수 있다.

sonar-scanner --version


이제 Git 에서 가져온 Maven 프로젝트에서 앞서 복사한 스크립트를 사용하여 실행한다.

mvn clean verify sonar:sonar \
-Dsonar.projectKey=my_project \
-Dsonar.host.url=http://localhost:9000 \
-Dsonar.login=your_generated_token

옵션

설명

mvn

Maven을 실행하는 명령어

clean

기존 빌드 파일을 삭제하고 새롭게 빌드

verify

테스트를 실행하고 빌드를 검증

sonar:sonar

SonarQube 분석을 실행하는 Maven 플러그인 (sonar-maven-plugin)

-Dsonar.projectKey=my_project

SonarQube에서 프로젝트를 구별하는 고유한 키

-Dsonar.host.url=http://localhost:9000

SonarQube 서버의 주소

-Dsonar.login=your_generated_token

SonarQube 인증을 위한 API 토큰



실행이 완료되면 SonarQube 웹에서 분석 결과 확인할 수 있다.



결과 화면

SonarQube 분석 결과을 보면 이 프로젝트는 다음과 같은 조치가 필요한 것으로 나타난다.
  1. Bugs, Vulnerabilities, Coverage, Duplications 항목에서 개선 필요
  2. 특히 Bugs (170개), Coverage (0%), 취약점 (13개)가 심각한 문제
  3. 보안 문제를 해결하고, 테스트 커버리지를 높이는 것이 가장 시급함
이제 SonarQube 에서 "Issues" 탭을 확인하고, 하나씩 문제를 해결해 나가면 된다. 

이슈 목록 화면

각 이슈를 클릭하면 해당 건에 대한 상세 화면으로 이동하게 된다.  이슈 내용을 확인하고 코드를 수정한다. 이슈 상세 페이지를 보면 이슈 상태를 변경할 수 있는 기능이 있는데  코드 수정 후 다시 로컬에서 SonarScanner 을 실행하기 때문에 문자가 해결되면 자동으로  Resolved(Fixed) 로 상태가 변경 된다.  


이슈 상세화면에서 "See all issues in this file" 클릭하여 해당 파일에 대한 목록만 보여지는데  이를 활용하면 파일 별로 작업을 진행 할 수도 있다. 

이슈 상세 화면

파일 단위로 필터 된 이슈 목록


코드를 수정하고 SonarScanner 을 동일하게 실행하면 결과가 반영되어 다시 분석결과가 업데이트 된다. 

3. 느낀점

자바 언어를 사용하는 프로젝트에 1주 정도 적용을 해보았는데 아래와 같은 점에서 아주 만족스러웠다.
  1. 좋은 코딩 습관을 위한 아주 좋은 도구이다. 코드에 대한  결함을 해결하면서 좋은 코드를 작성하는 방법을 자연스럽게 학습할 수 있었다.
    • Bug (버그): 코드에서 오류가 발생할 가능성이 있는 부분
    • Code Smell (코드 냄새): 유지보수성이 낮거나 개선이 필요한 코드
    • Vulnerability (보안 취약점): SQL Injection, XSS 같은 보안 문제
    • Coverage (테스트 커버리지): 단위 테스트가 얼마나 잘 작성되었는지
    • Duplications (코드 중복): 중복된 코드 블록 확인
  2. 자바 언어의 버전에 따른 좋은 코드를 지적해주기 때문에 코딩 스킬 향상에 도움이 되었다.

2023년 5월 12일

코딩 - Docker 을 이용한 개발 환경 만들기 ( SpringBoot + MySql )

 ◼︎ 환경 

  • Model : MacBook Pro (14-inch, 2021)
  • CPU : Apple M1 Pro
  • MENORY : 16GB
  • DISK : 512 GB SSD
  • OS : macOS 13.2.1 (22D68)
  • TOOLS : Visual Studio Code, Java 11, Gradle
  • Version Control : GitHub
  • Programming Language : Java , Vue3
  • DBMS : MySql

Docker(도커) Dasktop 설치하기

도커는 애플리케이션을 빌드, 실행 및 배포하는 데 사용되는 오픈 소스 플랫폼이다. 도커는 애플리케이션을 컨테이너로 패키징하여 어디서나 실행할 수 있도록 한다. 컨테이너는 가볍고 이식 가능하므로 개발, 테스트 및 프로덕션 환경에 이상적이다.

도커는 다음과 같은 여러 가지 이점을 제공한다.

  • 개발 및 테스트 속도 향상: 도커를 사용하면 개발자가 애플리케이션을 빠르고 쉽게 빌드하고 테스트할 수 있다. 이는 개발 프로세스를 가속화하고 버그를 더 빨리 식별하는 데 도움이 될 수 있다.
  • 배포 용이성: 도커를 사용하면 개발자가 애플리케이션을 어디서나 쉽게 배포할 수 있다. 이는 애플리케이션의 배포 프로세스를 단순화하고 애플리케이션의 가용성을 높이는 데 도움이 될 수 있다.
  • 비용 절감: 도커를 사용하면 서버 및 인프라 비용을 절감할 수 있다. 이는 도커가 서버를 사용하지 않고도 애플리케이션을 실행할 수 있도록 하기 때문이다.

도커는 개발자, 시스템 관리자 및 컨설턴트에게 인기 있는 도구이며 기업에서도 애플리케이션의 개발, 배포 및 관리를 위해 도커를 사용하고 있다.

M1 맥 환경에서 도커를 아래와 같이 설치할 수 있다.


❶ Rosetta 2 을 설치한다.

Docker Desktop은 Intel Mac 용으로 빌드되었다. M1 Mac에서 에서 Intel Mac 용으로 빌드된 앱을 실행하려면 Rosetta 2를 설치해야 한다. Rosetta 2는 리눅스 Wine (윈도우 프로그램을 리눅스에서 실행하게 하는 가상머신) 과 유사하게 Intel 코드를 Apple Silicon 으로 번역하는 가상 머신이다.

softwareupdate --install-rosetta

❷ Docker.dmg 프로그램을 다운로드 후 더블 클릭하여 설치를 진행한다.

Docker Dasktop 은 명령 과 데스크탑  UI 프로그램이 제공되어 누구나 쉽게 이용할 수 있다.


MySql  배포하기

❶ MySql Docker 이미지 다운로드

가장 최신 MySql Docker 이미지를 다운로드 한다.  

docker pull mysql

특정 버전 이미지가 필요하다면 tag 을 같이 사용하여 아래와 같은 방법으로 다운로드 한다.

docker pull mysql:8.0.33

docker 는 다운로드 가능한 이미지들에 대한 검색 기능을 제공하고 있는데 docker search [검색어] 명령을 사용하거나  Docker Desktop 에서 mysql 을 검색하여 이미지를 다운로드 할 수도 있다. 

% docker search mysql

NAME                            DESCRIPTION                                      STARS     OFFICIAL   AUTOMATED

mysql                           MySQL is a widely used, open-source relation…   14116     [OK]       

mariadb                         MariaDB Server is a high performing open sou…   5392      [OK]       

percona                         Percona Server is a fork of the MySQL relati…   607       [OK]       

phpmyadmin                      phpMyAdmin - A web interface for MySQL and M…   793       [OK]       

circleci/mysql                  MySQL is a widely used, open-source relation…   29                   

bitnami/mysql                   Bitnami MySQL Docker Image                       85                   [OK]

bitnami/mysqld-exporter                                                          5                    

ubuntu/mysql                    MySQL open source fast, stable, multi-thread…   46                   

cimg/mysql                                                                       0                    

rapidfort/mysql                 RapidFort optimized, hardened image for MySQL    14                   

google/mysql                    MySQL server for Google Compute Engine           23                   [OK]

rapidfort/mysql8-ib             RapidFort optimized, hardened image for MySQ…   0                    

hashicorp/mysql-portworx-demo                                                    0                    

rapidfort/mysql-official        RapidFort optimized, hardened image for MySQ…   0                    

newrelic/mysql-plugin           New Relic Plugin for monitoring MySQL databa…   1                    [OK]

databack/mysql-backup           Back up mysql databases to... anywhere!          84                   

linuxserver/mysql               A Mysql container, brought to you by LinuxSe…   38                   

bitnamicharts/mysql                                                              0                    

mirantis/mysql                                                                   0                    

docksal/mysql                   MySQL service images for Docksal - https://d…   0                    

linuxserver/mysql-workbench                                                      49                   

vitess/mysqlctld                vitess/mysqlctld                                 1                    [OK]

eclipse/mysql                   Mysql 5.7, curl, rsync                           0                    [OK]

drupalci/mysql-5.5              https://www.drupal.org/project/drupalci          1                    [OK]

drupalci/mysql-5.7              https://www.drupal.org/project/drupalci          0                    



다운로드된 이미지들은 docker images 명령 또는 Docker Desktop 프로그램에서 목록을 확인할 수 있다. 

 

 % docker images

 mysql                      latest     5371f8c3b63e   3 weeks ago    592MB




❷ MySql 이미지 컨테이너 생성 및 실행
아래와 같은 명령으로 간단하게 컨테이너를 생성하고 실행한다.  (<password> 값은 원하는 값으로 변경)

docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=<password> -d -p 3306:3306 mysql:latest

생성되어 실행중인 컨테이너는 docker ps 명령을 사용하거나 Docker Desktop Containers 에서 확인 할 수 있다.


❸ 데이터베이스 생성 및 권한 부여 
아래 명령으로 Docker 컨테이너 MySql 에 접속한다. MySql root 계정의 비밀번호는 앞서 입력한 값을 사용한다.

docker exec -it mysql-container bash 
mysql -u root -p 


% docker exec -it mysql-container bash 

bash-4.4# mysql -u root -p 

Enter password: 

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 10

Server version: 8.0.33 MySQL Community Server - GPL


Copyright (c) 2000, 2023, Oracle and/or its affiliates.


Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


mysql> 



이제 새로운 데이터베이스 및 계정을 추가한다 . (아래는 예시)

-- testdb 생성
CREATE DATABASE testdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- test 계성 생성
CREATE USER 'tester'@'%' IDENTIFIED BY 'tester';
-- testdb에 대한 권한을 tester 에게 부여한다.
GRANT ALL PRIVILEGES ON testdb.* TO 'tester'@'%' WITH GRANT OPTION;

마지막으로 Workbench 와 같은 클라이언트 도구를 사용하여 생성된 데이터베이스에 접속한다.


SprinbBoot 이미지 생성 및  배포하기

Spring 2.3 이상부터는 bootBuildImage Task 가 지원되고 있는데, 이 Task를 사용하면 Dockerfile 없이 Docker 이미지를 쉽게 생성할 수 있다. 이미지는 ./gradlew bootBuildImage 명령을 사용하여 이미지를 생성한다. 


 ./gradlew bootBuildImage



주의 할 것은 bootBuildImage 는 Buildpacks 기술을 사용하고 있는데 Buildpacks 는 기본적으로 docker daemon을 사용하고 있기 때문에 docker가 설치되어 있어야지 동작할 수 있다.

컨테이너 배포 및 실행은 다음과 같은 명령을 사용하면 된다.


 docker run -p 8080:8080 [이미지 이름]



VS Code 에서 도커 사용하기 

Docker 확장을 사용하면 Visual Studio Code에서 컨테이너화된 애플리케이션을 쉽게 빌드, 관리 및 배포할 수 있습니다. 이때 도커 서비스는 실행중이여야 한다.
 
Docker 확장 설치는 VS Code 에서 ⇧⌘X 명령을 입력하여 좌측 사이드 확장 뷰를 열고  docker  이름을 검색하여 설치하면 된다. 


Docker 확장 프로그램은 VS Code에 Docker 탐색기 보기를 제공한다.  Docker Explorer를 사용하면 컨테이너, 이미지, 볼륨, 네트워크 및 컨테이너 레지스트리와 같은 Docker 자산을 검사하고 관리할 수 있다.

여기에서는 mysql 컨테이너를 시작하고 중지하는 용도로만 사용하고 있다. 
 

참고자료 

  1. https://spring.io/guides/topicals/spring-boot-docker/ 
  2. https://docs.spring.io/spring-boot/docs/current/reference/html/native-image.html#_enable_native_image_support 
  3. Docker in Visual Studio Code