ipTIME NAS200을 Web server로 사용하기. 리눅스 SSH를 이용한다.
Docker review -
+++ 시작에 앞서
내 서버의 Docker가 192.168.0.***의 호스트에 설치된 상황에서,
Docker 컨테이너가 172.20.0.0/16 대역의 IP 주소를 사용하는 이유는 Docker의 네트워크 구조 때문이다.
Docker는 기본적으로 각 컨테이너에 별도의 가상 네트워크를 할당하여 격리된 환경을 제공하기에
localhost의 DB_server를 같은 네트워크 세그먼트로 인식하지 않기에,
컨테이너가 별도의 IP 주소를 가지면서도 로컬호스트와 같은 네트워크에 있는 것처럼
동작하게 하기 위한 설정을 하기위해 많은 시행착오를 하였기에 이 리뷰를 작성한다.
Bridge 네트워크: 기본적으로 Docker는 'bridge' 네트워크를 사용하여 컨테이너를 격리합니다. 이는 호스트의 네트워크와는 별개로 동작하며, 기본적으로 172.17.0.0/16, 172.18.0.0/16, 172.19.0.0/16, 172.20.0.0/16 등의 IP 대역을 사용합니다. 이 때문에 컨테이너 내부에서 확인되는 IP 주소는 호스트의 IP 주소와 다릅니다.
Host 네트워크: --network host 옵션을 사용하면 컨테이너가 호스트의 네트워크와 동일한 네트워크 스택을 공유합니다. 이 경우 컨테이너는 호스트의 IP 주소를 직접 사용하게 됩니다.
Custom 네트워크: 사용자가 직접 네트워크를 정의할 수도 있습니다. 이를 통해 특정 IP 대역을 지정하여 사용하거나, 필요한 네트워크 설정을 커스터마이징할 수 있습니다.
Bridge 네트워크 사용 시: 컨테이너는 각기 다른 IP 주소를 부여받고, 172.20.0.0/16과 같은 대역을 사용합니다. 호스트와는 NAT(Network Address Translation)를 통해 통신합니다. 따라서 외부에서 호스트의 IP 주소로 접근할 때는 포트 포워딩 설정이 필요합니다.
컨테이너 내부 통신: 컨테이너끼리는 Docker 네트워크를 통해 통신할 수 있으며, 컨테이너 이름을 통해 서로를 참조할 수 있습니다. 이는 Docker의 내부 DNS 서비스를 통해 가능합니다.
외부 통신: 컨테이너에서 외부 네트워크로 통신할 때는 호스트의 IP 주소를 통해 NAT를 거쳐 나가게 됩니다. 이는 마치 가정용 라우터에서 내부 네트워크 기기들이 외부로 나갈 때 라우터의 공인 IP를 통해 나가는 것과 비슷합니다.
!. /mnt/VOL1/usr/docker 디렉터리를 먼저 생성한 후 이동-
sudo mkdir -p /mnt/VOL1/usr/docker
!.Docker 데몬 설정 파일(/etc/docker/daemon.json)을 수정하여 새로운 데이터 디렉터리를 지정합니다.
sudo vi /etc/docker/daemon.json
아래 내용을 추가합니다
{ "data-root": "/mnt/VOL1/docker" }
root 사용자의 home 폴더의 .bashrc 파일에 -
export PATH=$PATH:/mnt/VOL1/Docker
- 를 추가합니다.
sudo systemctl start docker
다음은 도커 컨테이너 3개를 만들어 브라우저에서 phpmyadmin를 실행하여
mariaDB를 관리하는 폴더 구조 예시입니다.(glitter_home 커테이너는 그누보드6 설치)
그누보드6 소스 파일은 glitter_home에 압축을 풀어줍니다.
/mnt/VOL1/Docker/
│
├── db_tools/ ( phpmyadmin 5.2.1 )
│ ├── docker-compose.yml
│ └── config/
│ └── config.inc.php
│
├── maria_db/ ( MariaDB 10.6.4 )
│ ├── docker-compose.yml
│ └── data/ (데이터베이스 데이터 볼륨)
│
└── w_glitter/ (FastAPI 애플리케이션:그누보드6.0.7 실행)
├── .env (환경설정 파일)
├── api/
│ ├── v1
│ │ ├── models (API용 Pydantic 모델 정의)
│ │ └── routers (라우터 파일 경로)
│ └── settings.py (설정 파일)
├── docker-compose.yml
├── core/
│ ├── models.Py
│ ├── routers.py
│ └── database.py
├── Dockerfile
├── example.env
├── main.py
├── plugin/
│ └── __init__.py
├── requirements.txt
├── service
└── templates/
└── basic/
├── base.html
├── base_sub.html
└── index.html
!. db_tools/config/config.inc.php의 내용 - ===
<?php
$cfg['blowfish_secret'] = 'supersecret'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
$i = 0;
$i++;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['host'] = 'db';
$cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['AllowNoPassword'] = false;
?>
!. db_tools/docker-compose.yml의 내용 - ===
version: '3.8'
services:
phpmyadmin:
image: phpmyadmin/phpmyadmin:5.2.1
container_name: phpmyadmin
environment:
PMA_HOST: db
MYSQL_ROOT_PASSWORD: ********
ports:
- "8080:80" #사용자가 자신의 서버상황에 맞추어 설정, localhost:docker
networks:
- glitter_network
restart: unless-stopped
volumes:
- /mnt/VOL1/Docker/db_tools/config:/var/www/html/config
networks:
glitter_network:
external: true
!. maria_db/docker-compose.yml의 내용 - ===
version: '3.8'
services:
db:
image: mariadb:10.6.4
container_name: mariadb
environment:
MYSQL_ROOT_PASSWORD: ******** root 사용자 비번
MYSQL_DATABASE: 최초생성 db
MYSQL_USER: 최초생성 db 사용자
MYSQL_PASSWORD: 최초생성 사용자 비번
ports:
- "3307:3306" #사용자가 자신의 서버상황에 맞추어 설정, localhost:docker
volumes:
- /mnt/VOL1/Docker/maria_db/data:/var/lib/mysql
networks:
- glitter_network
restart: unless-stopped
networks:
glitter_network:
external: true
!. ../w_glitter/alembic 폴더를 만든다. ===
sudo mkdir alembic
!. w_glitter/alembic.ini 의 내용 - ===
[alembic]
script_location = alembic
sqlalchemy.url = mysql+pymysql://db사용자:비번@mariadb:3306/사용자 db
[loggers]
keys = root,sqlalchemy,alembic
[handlers]
keys = console
[formatters]
keys = generic
[logger_root]
level = WARN
handlers = console
qualname =
[logger_sqlalchemy]
level = WARN
handlers = console
qualname = sqlalchemy.engine
[logger_alembic]
level = INFO
handlers = console
qualname = alembic
[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic
[formatter_generic]
format = %(asctime)s %(levelname)-5.5s [%(name)s] %(message)s
[post_run]
command = export PYTHONPATH=.
[pre_run]
command = export PYTHONPATH=.
!. w_glitter/docker-compose.yml의 내용 - ===
version: '3.8'
services:
w_glitter:
container_name: con_w_glitter
build:
context: .
environment:
- DATABASE_URL=mysql+pymysql://glitterkr:glitterkr@localhost:3306/glitterkr
network_mode: host # 호스트 네트워크 모드 사용
volumes:
- /mnt/VOL1/Docker/w_glitter:/var/w_glitter
!. w_glitter/Dockerfile 의내용 - ===
# Use Python base image
FROM python:3.12.4
# Set the working directory
WORKDIR /var/w_glitter
# Copy the requirements file into the container
COPY requirements.txt .
# Install dependencies
RUN apt-get update && \
apt-get install -y gcc build-essential libpython3-dev libssl-dev && \
pip install --no-cache-dir -r requirements.txt && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Copy the rest of the application code into the container
COPY . .
# Expose the port the app runs on
EXPOSE 8000
# Command to run the application
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
!. 다음의 명령을 각각의 폴더에서 수행 - ===
cd ../Docker/db_tools
docker-compose up -d
cd ../Docker/maria_db
docker-compose up -d
cd ../Docker/w_glitter
docker-compose up -d
!!!!! . =====
각 서비스가 올바르게 실행되는지 테스트합니다.
phpMyAdmin:
MariaDB:
FastAPI 애플리케이션:
!. 저는 DNS를 사용했습니다.
== apache 리버스 프록시 사용 -
<VirtualHost *:80>
ServerAdmin humanpc@kakao.com
ServerName pma.glitter.kr
CustomLog "|/usr/sbin/rotatelogs _logs/pma.glitter.kr_access_log.%Y%m%d 86400 +540" common
ErrorLog "|/usr/sbin/rotatelogs _logs/pma.glitter.kr_error_log.%Y%m%d 86400 +540"
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
RequestHeader set X-Forwarded-For expr=%{REMOTE_ADDR}
RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
</VirtualHost>
<VirtualHost *:80>
ServerAdmin humanpc@kakao.com
ServerName w.glitter.kr
CustomLog "|/usr/sbin/rotatelogs _logs/w.glitter.kr_access_log.%Y%m%d 86400 +540" common
ErrorLog "|/usr/sbin/rotatelogs _logs/w.glitter.kr_error_log.%Y%m%d 86400 +540"
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8000/
ProxyPassReverse / http://127.0.0.1:8000/
RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
RequestHeader set X-Forwarded-For expr=%{REMOTE_ADDR}
RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
</VirtualHost>
!. 다음은 phpmyadmin과 그누보드6의 컨테이너에 DNS를 이용한 링크입니다.
>> phpmyadmin5.2.1 ( http://pma.glitter.kr/ )
>> 그누보드6.0.7 ( http://w.glitter.kr/ )
!!!!!!. 추가로 -
Docker 시스템에서 사용하지 않는 모든 이미지, 컨테이너, 네트워크, 볼륨을 삭제합니다.
docker system prune -a -f
sudo find /var/log -type f -name "*.log" -delete
---
!. 추가 팁
. MariaDB 접근 확인
먼저 MariaDB 컨테이너 내부에 접속하여 MySQL 클라이언트를 사용하여 직접 MariaDB에 접근해 봅니다. 이를 통해 MariaDB가 정상적으로 작동하는지 확인할 수 있습니다.
sudo docker exec -it mariadb mysql -u root -p
phpMyAdmin 컨테이너의 환경 변수가 올바르게 설정되어 있는지 확인합니다. 특히 PMA_HOST와 MYSQL_ROOT_PASSWORD 값이 MariaDB 설정과 일치해야 합니다.
sudo docker exec -it phpmyadmin env
-
※※※ 도커 상태 확인 ※※※ - 사용자: root ; - 컨테이너: con_p_glitter
!. 작동 --
systemctl daemon-reload
systemctl status docker
!. log --
docker logs con_p_glitter
!. port --
docker inspect con_p_glitter
!. used source --
docker stats
댓글목록
등록된 댓글이 없습니다.