구축이 완료되었으니 DBeaver, SQL Developer 또는 터미널을 통해 접속해 봅니다.
접속 정보 요약 (중요)
Oracle 23ai Free 버전은 기존 XE와 달리 서비스명(Service Name)이 다릅니다.
Host: localhost (또는 서버의 IP)
Port: 1523
Service Name (PDB): FREEPDB1 (기존 XE처럼 XE를 입력하면 접속 안 됩니다!)
User: SYS (권한: SYSDBA) 또는 SYSTEM
Password: docker-compose.yml에서 설정한 ORACLE_PWD 값
💻 터미널에서 직접 접속해 보기 (SQL*Plus)
컨테이너 내부에 내장된 SQL*Plus를 이용해 바로 쿼리를 날려볼 수도 있습니다.
# SYS 계정으로 접속
podman exec -it oracle-23ai sqlplus sys/Oracle23ai@FREEPDB1 as sysdba
# or 컨테이너에 접속후 sqlplus 수행
#podman exec -it oracle-23ai bash
#sqlplus sys/Oracle23ai@FREEPDB1 as sysdba
# 버전 확인 쿼리 실행
SQL> SELECT banner FROM v$version;
정상적으로 Oracle Database 23ai Free 관련 정보가 출력된다면 성공입니다!
🧹 (참고) 컨테이너 중지 및 삭제
사용을 마치고 컨테이너를 내리고 싶을 때는 아래 명령어를 사용합니다.
# 중지 및 컨테이너 삭제 (oradata 폴더의 데이터는 그대로 유지됨)
podman compose down
목적: 다운로드한 거대한 LLM 모델 파일들을 컨테이너가 삭제되어도 호스트에 영구적으로 보관하기 위함입니다.
기타:
# devices: - nvidia.com/gpu=all: 주석 처리되어 있지만, NVIDIA GPU를 사용하여 성능을 가속화하려면 이 부분의 주석을 해제하고 관련 설정(NVIDIA Container Toolkit 등)을 해야 합니다.
security_opt: - label=disable: SELinux 등의 보안 레이블링을 비활성화하여 권한 문제를 방지합니다.
restart: always: 컨테이너가 죽으면 자동으로 재시작합니다.
open-webui 서비스 (프론트엔드 웹 인터페이스)
역할: 사용자가 웹 브라우저를 통해 Ollama와 쉽게 상호작용(채팅, 모델 관리 등)할 수 있도록 돕는 웹 애플리케이션입니다. ChatGPT와 유사한 UI를 서비스를 제공 합니다.
이미지: ghcr.io/open-webui/open-webui:main (Open WebUI 공식 메인 브랜치 이미지 사용)
포트:
컨테이너 내부의 웹 서버 포트 8080을 호스트의 3000 포트와 연결합니다.
사용자는 브라우저에서 http://localhost:3000으로 접속하게 됩니다.
환경 변수:
OLLAMA_BASE_URL=http://ollama:11434: 가장 중요한 연결 고리입니다. Open WebUI가 API 요청을 보낼 Ollama 서버의 주소를 지정합니다. 여기서 http://ollama는 도커 네트워크 내부에서 ollama 컨테이너를 가리키는 호스트 이름(서비스 이름)입니다.
최근 리눅스 환경(특히 RHEL, Rocky, 최신 Ubuntu 등)에서 Docker 대신 Podman을 사용하여 컨테이너를 관리하는 경우가 많아졌습니다. Podman은 데몬 없이 작동하고 Rootless(관리자 권한 없이 실행) 모드를 지원하여 보안상 이점이 크지만, Docker와 미세하게 다른 설정 때문에 당황스러운 에러를 겪기도 합니다.
오늘은 docker-compose.yml을 이용해 MariaDB를 설치하는 과정에 대해 공유 합니다.
1. docker-compose.yml 작성
먼저 MariaDB 11.3 버전을 설치하기 위해 구성 파일을 작성합니다. Podman 환경이라도 파일명은 docker-compose.yml을 그대로 사용하면 podman-compose 명령어가 자동으로 인식합니다.
#설치 및 기동
podman compose up
#background 실행
podman compose up -d
#Mariadb 기동 상태 확인
podman compose ps
#종료
podman compose down
[mig-db@rocky9:~/mariadb]$ podman compose up >>>> Executing external compose provider "/usr/local/bin/podman-compose". Please see podman-compose(1) for how to disable this message. <<<<
0432514b156c83332ceef9385ce6cfbe7c0192c9cbdb5e9f5dd22fe9cc1b252f ffe11f79561b93175d00b04ecb5f3d762143a75a1a723b88d92de704fbe1a0e2 [mariadb] | 2026-01-23 02:22:56+00:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:11.3.2+maria~ubu2204 started. [mariadb] | 2026-01-23 02:22:56+00:00 [Warn] [Entrypoint]: /sys/fs/cgroup///memory.pressure not writable, functionality unavailable to MariaDB [mariadb] | 2026-01-23 02:22:56+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' [mariadb] | 2026-01-23 02:22:56+00:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:11.3.2+maria~ubu2204 started. [mariadb] | 2026-01-23 02:22:56+00:00 [Note] [Entrypoint]: MariaDB upgrade not required [mariadb] | 2026-01-23 2:22:56 0 [Note] Starting MariaDB 11.3.2-MariaDB-1:11.3.2+maria~ubu2204 source revision 068a6819eb63bcb01fdfa037c9bf3bf63c33ee42 as process 1 [mariadb] | 2026-01-23 2:22:56 0 [Note] InnoDB: Compressed tables use zlib 1.2.11 [mariadb] | 2026-01-23 2:22:56 0 [Note] InnoDB: Number of transaction pools: 1 [mariadb] | 2026-01-23 2:22:56 0 [Note] InnoDB: Using crc32 + pclmulqdq instructions [mariadb] | 2026-01-23 2:22:56 0 [Note] mariadbd: O_TMPFILE is not supported on /tmp (disabling future attempts) [mariadb] | 2026-01-23 2:22:56 0 [Note] InnoDB: Initializing buffer pool, total size = 128.000MiB, chunk size = 2.000MiB [mariadb] | 2026-01-23 2:22:56 0 [Note] InnoDB: Completed initialization of buffer pool [mariadb] | 2026-01-23 2:22:56 0 [Note] InnoDB: File system buffers for log disabled (block size=4096 bytes) [mariadb] | 2026-01-23 2:22:56 0 [Note] InnoDB: End of log at LSN=47661 [mariadb] | 2026-01-23 2:22:57 0 [Note] InnoDB: Opened 3 undo tablespaces [mariadb] | 2026-01-23 2:22:57 0 [Note] InnoDB: 128 rollback segments in 3 undo tablespaces are active. [mariadb] | 2026-01-23 2:22:57 0 [Note] InnoDB: Setting file './ibtmp1' size to 12.000MiB. Physically writing the file full; Please wait ... [mariadb] | 2026-01-23 2:22:57 0 [Note] InnoDB: File './ibtmp1' size is now 12.000MiB. [mariadb] | 2026-01-23 2:22:57 0 [Note] InnoDB: log sequence number 47661; transaction id 14 [mariadb] | 2026-01-23 2:22:57 0 [Note] Plugin 'FEEDBACK' is disabled. [mariadb] | 2026-01-23 2:22:57 0 [Note] Plugin 'wsrep-provider' is disabled. [mariadb] | 2026-01-23 2:22:57 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool [mariadb] | 2026-01-23 2:22:57 0 [Note] Server socket created on IP: '0.0.0.0'. [mariadb] | 2026-01-23 2:22:57 0 [Note] Server socket created on IP: '::'. [mariadb] | 2026-01-23 2:22:57 0 [Note] mariadbd: Event Scheduler: Loaded 0 events [mariadb] | 2026-01-23 2:22:57 0 [Note] InnoDB: Buffer pool(s) load completed at 260123 2:22:57 [mariadb] | 2026-01-23 2:22:57 0 [Note] mariadbd: ready for connections. [mariadb] | Version: '11.3.2-MariaDB-1:11.3.2+maria~ubu2204' socket: '/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution ^C[mig-db@rocky9:~/mariadb]$ [mariadb] | 2026-01-23 2:23:28 0 [Note] mariadbd (initiated by: unknown): Normal shutdown [mariadb] | 2026-01-23 2:23:28 0 [Note] InnoDB: FTS optimize thread exiting. [mariadb] | 2026-01-23 2:23:28 0 [Note] InnoDB: Starting shutdown... [mariadb] | 2026-01-23 2:23:28 0 [Note] InnoDB: Dumping buffer pool(s) to /var/lib/mysql/ib_buffer_pool [mariadb] | 2026-01-23 2:23:28 0 [Note] InnoDB: Buffer pool(s) dump completed at 260123 2:23:28 [mariadb] | 2026-01-23 2:23:28 0 [Note] InnoDB: Removed temporary tablespace data file: "./ibtmp1" [mariadb] | 2026-01-23 2:23:28 0 [Note] InnoDB: Shutdown completed; log sequence number 47661; transaction id 15 [mariadb] | 2026-01-23 2:23:28 0 [Note] mariadbd: Shutdown complete [mariadb] | mariadb 0432514b156c83332ceef9385ce6cfbe7c0192c9cbdb5e9f5dd22fe9cc1b252f mariadb_default
Mariadb 접속
podman exec -it mariadb mariadb -u root -p
# Password 입력 프롬프트가 뜨면 설정한 비밀번호(rootpassword) 입력
# docker-compose.yml 에 작성된 비밀번호를 입력한다.
실습
# 1.'mariadb'는 접속 : docker-compose에서 정한 컨테이너 이름입니다.
podman exec -it mariadb mariadb -u root -p
# 2. docker-compose 설정 파일에서 만든 mydb 데이터베이스로 이동
USE mydb;
#3. 테이블 생성
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100)
);
#4. 데이터 입력 (한글 테스트)
INSERT INTO users (username, email) VALUES ('홍길동', 'hong@test.com');
INSERT INTO users (username, email) VALUES ('Alice', 'alice@test.com');
#5. 데이터 조회
SELECT * FROM users;
DBeaver 연결 설정 방법
문제발생 해결 방법
작성한 파일을 실행하기 위해 터미널에 podman-compose up -d를 입력했는데, 컨테이너가 뜨지 않고 아래와 같은 에러 로그가 출력이 됨.
[에러 메시지] Error: unable to start container ... : did not receive systemd slice as cgroup parent when using systemd to manage cgroups: invalid argument
원인 분석
이 에러는 Podman(Rootless 모드)이 시스템의 systemd와 상호작용할 때 Cgroup(리소스 관리) 설정이 충돌하여 발생하는 문제로 , 일반 사용자 권한으로 실행 중인데 시스템 관리 영역인 systemd cgroup에 접근하려다 거절당한 것입니다.
이때 sudo를 붙여서 실행하면 해결되긴 하지만, 그렇게 되면 생성되는 DB 파일들의 소유권이 root가 되어버립니다. 나중에 파일 이동이나 백업 시 Permission Denied로 고생할 수 있으므로 권장하지 않습니다.
해결 방법: containers.conf 설정 (권장)
가장 깔끔한 해결책은 Podman이 시스템의 systemd 대신 자체적인 cgroupfs를 사용하도록 설정을 변경하는 것입니다. 이 설정은 현재 로그인한 사용자 계정에만 적용된다.
mkdir -p ~/.config/containers
vi ~/.config/containers/containers.conf
# 기존 Podman 또는 Docker 패키지 제거
sudo dnf remove podman-docker podman
# Docker CE 레포 추가
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# Docker CE 설치
sudo dnf -y install docker-ce docker-ce-cli containerd.io
# Docker 서비스 활성화
sudo systemctl enable --now docker
# 버전 확인
docker --version
docker-compose version
참고: Podman 환경에서는 Harbor install.sh가 Docker 버전 체크로 실패할 수 있으므로, 운영 환경에서는 Docker CE 설치를 권장합니다.
wget https://github.com/goharbor/harbor/releases/download/v2.11.0/harbor-online-installer-v2.11.0.tgz
tar xvf harbor-online-installer-v2.11.0.tgz
cd harbor
Pytest는 전통적인 단위 테스트 프레임워크와 달리, 명시적인 TestCase 클래스 상속 없이도 테스트를 작성할 수 있게 해줍니다. 핵심 구조는 다음과 같습니다.
테스트 함수 (Test Functions): Pytest는 test_*로 시작하는 모든 함수를 테스트로 인식합니다. 가장 기본적인 테스트 단위이며, 별도의 클래스나 상속 없이도 작동합니다.
테스트 모듈 (Test Modules):test_*로 시작하는 파일(test_example.py, my_module_test.py 등) 내에 있는 테스트 함수들을 자동으로 찾아서 실행합니다.
테스트 클래스 (Test Classes): 선택 사항이지만, 여러 테스트 함수를 그룹화하고 싶을 때 Test로 시작하는 클래스 안에 test_로 시작하는 메서드를 정의할 수 있습니다. 다만, unittest.TestCase를 상속받을 필요는 없습니다.
픽스처 (Fixtures): 테스트를 실행하기 전후에 필요한 설정(setup) 및 해제(teardown) 작업을 수행하는 함수입니다. @pytest.fixture 데코레이터를 사용하여 정의하며, 테스트 함수에서 인자로 요청하면 자동으로 주입됩니다. unittest의 setUp/tearDown보다 훨씬 유연하고 강력한 기능을 제공합니다.
conftest.py 파일: 여러 테스트 파일에서 공유되는 픽스처나 훅(hook) 함수를 정의하는 데 사용됩니다. 이 파일은 pytest가 테스트를 찾을 때 자동으로 인식하며, 해당 디렉토리 및 하위 디렉토리의 모든 테스트에서 픽스처를 사용할 수 있게 합니다.
플러그인 (Plugins): Pytest는 풍부한 플러그인 생태계를 가지고 있습니다. 코드 커버리지, HTML 리포트 생성, 분산 테스트 실행 등 다양한 기능을 플러그인을 통해 확장할 수 있습니다.
pytest클래스 및 함수 호출 관계 및 순서
함수 기반 테스트 흐름
test_파일.py
│
├── def test_func():
│ ├── pytest fixture 실행 (선택)
│ ├── 테스트 실행
│ └── cleanup 수행
클래스 기반 테스트 흐름
TestClass:
├── @pytest.fixture(scope="class") → 클래스 전후
├── setup_method() → 각 test 함수 전
├── test_xxx() → 테스트 함수
├── teardown_method() → 각 test 함수 후
Pytest는 테스트를 발견하고 실행하는 과정에서 unittest와는 다른 접근 방식을 취합니다. setUp/tearDown 대신 픽스처를 통해 초기화 및 정리 작업을 관리하며, 이는 훨씬 유연한 제어를 가능하게 합니다.
테스트 발견 (Test Discovery)
Pytest는 기본적으로 다음 규칙에 따라 테스트를 자동으로 찾아냅니다.
test_*.py 또는 *_test.py 패턴을 따르는 파일.
이러한 파일 내에서 test_로 시작하는 함수.
Test로 시작하는 클래스 내에서 test_로 시작하는 메서드 (상속 불필요).
실행 순서 및 픽스처호출
Pytest는 테스트를 실행할 때, 각 테스트 함수가 필요로 하는 픽스처를 자동으로 감지하고 주입합니다. 픽스처는 정의된 스코프(scope) 에 따라 호출 시점과 정리 시점이 달라집니다.
픽스처의 스코프는 다음과 같습니다
function (기본값): 각 테스트 함수가 실행될 때마다 픽스처가 호출되고, 테스트 함수가 끝난 후에 정리됩니다. (가장 일반적인 setUp/tearDown과 유사)
class: 해당 클래스 내의 모든 테스트 메서드가 실행되기 전에 한 번 호출되고, 클래스 내 모든 테스트가 끝난 후에 정리됩니다.
module: 해당 모듈 내의 모든 테스트가 실행되기 전에 한 번 호출되고, 모듈 내 모든 테스트가 끝난 후에 정리됩니다.
session: 전체 테스트 세션이 시작되기 전에 한 번 호출되고, 모든 테스트가 끝난 후에 정리됩니다. (가장 넓은 스코프)
호출 관계 및 순서 (픽스처 포함):
테스트 세션 시작: pytest 명령 실행
session 스코프 픽스처 호출: 정의되어 있다면 가장 먼저 호출됩니다.
각 테스트 모듈 진입:
module 스코프 픽스처 호출: 해당 모듈의 테스트가 시작되기 전에 호출됩니다.
각 테스트 클래스 진입 (선택 사항):
class 스코프 픽스처 호출: 해당 클래스의 테스트가 시작되기 전에 호출됩니다.
각 test_ 메서드 실행:
function 스코프 픽스처 호출: 각 test_ 메서드가 실행되기 전에 호출됩니다.
실제 test_ 메서드 실행: 테스트 로직이 수행됩니다.
function 스코프 픽스처 정리: test_ 메서드가 끝난 후에 정리됩니다.
class 스코프 픽스처 정리: 해당 클래스의 모든 테스트가 끝난 후에 정리됩니다.
module 스코프 픽스처 정리: 해당 모듈의 모든 테스트가 끝난 후에 정리됩니다.
session 스코프 픽스처 정리: 모든 테스트 세션이 끝난 후에 정리됩니다.
이러한 픽스처 메커니즘은 테스트 간의 의존성을 줄이고, 재사용 가능한 설정/해제 코드를 작성하는 데 매우 효과적입니다.
Gitlab 에서 보안 이슈로 버전 업그레이드가 필요한 상황에서 Gitlab 버전을 업그레이하는 방법에 대해 설명 합니다.
현재 설치 버전 gitlab 정보 확인
gitlab-rake gitlab:env:info 명령을 통해 확인 하거나
gitlab 에 접속 해서 직접 설치 정보를 확인 하는 방법이 있습니다.
gitlab-rake gitlab:env:info
$ gitlab-rake gitlab:env:info
System information System: Current User: git Using RVM: no Ruby Version: 2.7.5p203 Gem Version: 3.1.4 Bundler Version:2.3.15 Rake Version: 13.0.6 Redis Version: 6.2.7 Sidekiq Version:6.4.0 Go Version: unknown
GitLab information Version: 15.1.2 Revision: ea7455c8292 Directory: /opt/gitlab/embedded/service/gitlab-rails DB Adapter: PostgreSQL DB Version: 13.6 URL: http://192.112.1.62:6060 HTTP Clone URL: http://1 192.112.1.62 :6060/some-group/some-project.git SSH Clone URL: git@1 192.112.1.62:some-group/some-project.git Using LDAP: no Using Omniauth: yes Omniauth Providers:
15.1.x -> 15.4.6 -> 15.11.13 -> 16.0.8 -> 16.3.7 -> 16.7.x -> 최신 16.x -0 ->17.x ->18.x 버전으로 단계적으로 업그레이드 단계를 수행 합니다.
GitLab 백업 하기
업그레이드가 예기치 않은 이유로 실패 할수 있기때문에 버전을 업그레이드 하기 위해서는 반드시 백업을 수행 해야 합니다.
gitlab-backup create 수행 하면 /var/opt/gitlab/backups/ 디레톡리에 1753833159_2025_07_30_15.1.2_gitlab_backup.tar 형식의 압축 파일이 생성 됩니다.
백업 이후 설정 파일도 백업합니다.
# GitLab 전체 백업 명령어 실행
sudo gitlab-backup create
sudo cp /etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb.bak
sudo cp /etc/gitlab/gitlab-secrets.json /etc/gitlab/gitlab-secrets.json.bak
$ gitlab-backup create 2025-07-30 08:52:39 +0900 -- Dumping database ... Dumping PostgreSQL database gitlabhq_production ... [DONE] 2025-07-30 08:52:54 +0900 -- Dumping database ... done 2025-07-30 08:52:54 +0900 -- Dumping repositories ... ................................. ................. 2025-07-30 08:54:53 +0900 -- Warning: Your gitlab.rb and gitlab-secrets.json files contain sensitive data and are not included in this backup. You will need these files to restore a backup. Please back them up manually. 2025-07-30 08:54:53 +0900 -- Backup 1753833159_2025_07_30_15.1.2 is done.
보다 높은 최신 버전으로 업그레이드 하기 위해서는 단계적으로 상위 버전 gitlab 버전을 설치하는 단계를 반복 합니다.
버전 업그레이드 정리
#Gitlab 설치 버전 정보 확인
yum --showduplicates list gitlab-ce
#설정 적용
gitlab-ctl reconfigure
#Gitlab 재시작
gitlab-ctl restart
#Gitlab 상태 확인
gitlab-ctl status
#gitlab 업그레이드 버전 정보 확인
gitlab-rake gitlab:env:info
업그레이드 패스 확인 하기 (참고)
아래 URL 에 접속 하면 버전 업그레이드시 확인해야 할 내용에 대해 세부적으로 자세히 내용을 들여다 볼수 있습니다.