-
[CI/CD] docker에 postgresql을 설치하고 django랑 연동해보자 [4]IT 2025. 2. 20. 10:28
삽질을 하고 돌아왔습니다.
시작해봅시다.
1. Docker에 postgresql 설정
일단 nas 서버 내에 postgresql 데이터를 저장하기 위한 특정 폴더를 만들건데요.
아래와 같이 nas 서버에 데이터 저장 폴더를 생성합니다.
mkdir -p /mnt/nas/postgres_data chmod 777 /mnt/nas/postgres_data
그 후, docker container를 만들어줍니다.
sudo docker run -d \ --name dev-postgres \ -e POSTGRES_USER=<user> \ -e POSTGRES_PASSWORD=<password> \ -e POSTGRES_DB=dev_postgres \ -p 5433:5432 \ -v /mnt/nas/postgres_data:/var/lib/postgresql/data \ postgres
-v 와 같이 해놓으면 nas 서버의 특정 위치에 db 값이 저장되고, 해당 이미지가 삭제되더라도 DB 값은 날라가진 않습니다
하지만 delete나 drop을 할 경우 실시간 반영이 되기 때문에 웬만하면 delete나 drop은 사용하지 않는 것이 좋습니다.
만든 디렉터리가 잘 있고. 권한을 확인해봅니다.
sudo ls -ld /mnt/nas/postsgres_data
그리고 권한을 변경하려면, 아래와 같이 입력하면 됩니다.
sudo chmod -R 700 /mnt/nas/postgres_data sudo chmod -R 777 /mnt/nas/postgres_data
postgres bash에 접속해서 데이터베이스에 진입합니다
sudo docker exec -it dev-postgres bash psql -U <사용자명> -d <데이터베이스명>
DB에 데이터들이 잘 들어간 것을 확인할 수 있습니다.
데이터가 잘 유지되는지 container는 지웠다가 다시 설치해볼게요.
sudo docker stop dev-postgres sudo docker rm dev-postgres <위에서 봤던 container 생성 후 실행 코드> sudo docker ps sudo docker exec -it dev-postgres bash psql -U <사용자명> -d dev_postgres
지금 오후 6시 4~5분 경에 데이터를 넣엇는데 create_at을 보면 시간이 다릅니다 그래서 이것을 맞춰주는 작업을 하겠습니다.
dev-postgres container에서
apt update apt install nano -y 하고 그 postgresql.conf 파일 디렉토리로 이동 후 nano postgresql.conf 그 다음 timezone = 'Asia/Seoul' log_timezone = 'Asia/Seoul' 로 수정
그 후, dev-postgres container를 재시작 합니다. sudo docker restart dev-postgres
그 다음 접속해서 데이터를 새로 추가하면 현재 시간이 반영됩니다.!!
2. pgAdmin에서 PostgreSQL 연결
pgAdmin을 다운로드 받고 접속하면, Servers가 나옵니다 거기서 우클릭 후 Register-Server로 들어가줍니다.
그럼 General에 Name이 나오는데 거기에 Database이름 적고
Connection에서
Host name/address에 nas ip주소를 적거나 아니면 외부 ip 적으시면 됩니다.
port적고 maintenance database, username 맞게 수정하고, password 입력하면 끝.!
username하고 password는 Postgresql container 만들때 적은거 넣으시면 되여.
설명대로 각각에 맞게 넣으면 됩니다. 생성한 후에 확인해보면 nas에서 만든 것들이 다 나옵니다.
pgadmin에서 추가하면 nas에 있는거에 연동이 되는지 확인해보겠습니다.
pgAdmin에서 이후 추가라는 데이터를 만들었습니다.
이제 nas에서 확인해보죠
반영이 잘된 것을 확인했습니다.
이제 굳이 번거롭게 ssh로 접속하지 않고, pgAdmin으로 접속하면 될 것 같네요.
3. Django 프로젝트에서 PostgreSQL 연결 (Local)
이제 local에 깔려 있는 vs code로 가서 django project를 열어줍니다.
settings.py로 이동해서 DATABASES 코드 쪽으로 이동합니다.
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': <데이터베이스 이름>, 'USER': <POSTGRES USER>, 'PASSWORD': <POSTGRES PASSWORD>, 'HOST': <서버 IP OR 외부 접속 주소>, 'PORT': <포트>, } }
이렇게 하고, python manage.py dbshell을 치면 접속이 되고, 확인이 가능할겁니다.
아, pip로 postgresql 관련 라이브러리 다운로드 받아야 에러가 안납니다.
이후 python manage.py dbshell 해보면, 잘 접속할 수 있는 것을 확인할 수 있습니다.
4. Django 프로젝트에서 PostgreSQL 연결 (Nas 서버의 Django Docker container)
일단, django와 postgresql container를 서로 연결하여 통신시켜주기 위해서는 network가 필요합니다.
그래서.! 두둥.!
sudo docker network create backend_network - 네트워크 이름: backend network (원하는 이름으로 변경 가능)
해주시면 됩니다.
이 네트워크에 django와 postgresql container를 연결해줍니다.
sudo docker network connect backend_network <postgresql container name> sudo docker network connect backend_network <django project container name>
하고 나서 과연 제대로 연결됐을 것인가 확인하고 싶기 때에
sudo docker inspect backend_network
그러면 이제 Json 형식의 파일이 나오는데,
Name에 제가 지정한 backend_network로 되어있는 것을 확인할 수 있고,
아래로 내리면 Containers에 두 개의 container 모두 연결된 것을 확인할 수 있습니다.
이제 django container 안에 접속해서 확인해보겠습니다.
sudo docker exec -it <django container name> bash apt update apt install -y postgresql-client
django container 안에서 postgresql-client를 설치해줍니다 안해주면 막 psql 어쩌고 하면서 에러가 납니다.
이후 local 과 마찬가지로,
python manage.py dbshell 또는 psql -U <사용자> -h <postgresql container name> -d <database name>
둘 중 하나로 해서 접속하면 dev_postgres로 접속한 것을 확인할 수 있고, select * from <테이블>; 이랑 \dt로 기존에 해놨던 거 다 유지되는 거 확인할 수 있습니다.
이로써 종료입니다.~~~~~~~
라고 하지만 아직 해야할 것이 있습니다.
django container가 종료가 되면 backend_network와의 연결이 끊어지고, postgresql-client 라이브러리도 매번 설치해줘야합니다 귀찮죠. 상당히 그래서
연동은 했지만 django 코드가 update 될때 마다 jenkins에서 이미지 지우고 다시만들고 빌드하고 할텐데, 그때마다 자동적으로 backend_network랑 연결하고 postgresql-client도 깔게 해서 우리의 귀찮음을 줄여버립시다.
바로 Jenkinsfile을 수정해서요.
저는 아래와 같이 진행했는데, 참고하시면 될듯여.
stage('7. Configure Container') { when { expression { env.BRANCH_NAME == 'develop' } } steps { script { def containerName = '컨테이너 이름' // develop 브랜치에서만 실행되므로 바로 지정 echo "Configuring Docker container: ${containerName}" sh """ docker network connect backend_network ${containerName} docker exec -i ${containerName} bash -c ' apt update && apt install -y postgresql-client ' """ } } }
일단을 이렇게 구성하고 추후에 develop branch 뿐만 아니라 main branch도 실행됐을 때 구분되서 할 수 있게 해봅시다.
이 두 부분에서 구분되서 실행되도록.. ~.~
이렇게해서 무사히 셋업 - 테스트 - 도커 이미지 빌드 - 도커 배포 - 도커 컨테이너 구성(postgresql network와의 연결)을 자동화 했습니다.
지금은 develop을 했지만 main도 포함해서 할거고,
다시 한번 flutter 자동 배포 구성해보고 삽질하고 돌아올게요.
'IT' 카테고리의 다른 글
[NAS] Docker Container 환경변수 파일로 전달하기. (0) 2025.02.27 [GIT] revert와 reset (w/GPT형님) (0) 2025.02.20 [CI/CD] jenkins에서 django에 대한 자동화 [3] (0) 2025.02.05 [CI/CD] GitHub Webhook을 연결하기 위한 IP 변환하기 [2] (0) 2025.01.21 [CI/CD] Synology Nas에 Jenkins를 설치하고, GitHub을 연동하자 [1] (0) 2025.01.21