ABOUT ME

Today
Yesterday
Total
  • [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 자동 배포 구성해보고 삽질하고 돌아올게요.

     

Designed by Tistory.