CS이론

[CS 공부 #00] 회사 컴퓨터에 리눅스를 설치했다

suru 2026. 10. 16. 11:08

현장실습을 하다 보면 막히는 지점이 분명 생긴다. 

 

나도 그런적이 많은데

 

회사에서 사용하는 웹사이트가 쇼핑몰 형식에서 회사 내부 개발 형식으로 바뀌면서 많은 것들이 필요해졌다.

 

원래 구)사이트에서 사용하던 사이트는 독립형 쇼핑몰 사이트형으로 백엔등 등 모두 업체가 관리해주는 사이트 였다보니 굳이 백엔드나 어드민 페이지가 따로 없었는데 이전을 하면서 사이트를 직접 관리를 해야하니 백엔드/ 관리자 페이지등이 필요해진 것이었다.

 

어쩌다보니 딱 사이트 이전시점과 내가 들어온 시점이 겹치면서 백엔드 구축과 관리자 사이트를 구현하게 되었다.

 

개발을 하고 배포를 하면서 다양한 문제를 경험하게 되었는데 오늘은 그거에 관련된 이야기와 느낀점을 나누려고 한다.

 

도커 포트 범위 실수로 인한 포트 충돌

배포는 대부분 Develop으로 머지해서 자동배포를 하기 때문에, 사수분께서 진행하시는데 배포중에 포트 충돌에러가 난거다.

 

포트는 1번부터 65535번까지 있고, 우리가 쓰는 건 몇 개 안 되는데 부족하다는 게 말이 안 됐다.

 

AI가 이상하게 도커 포트 범위를 잘라버린 것이다.

 

도커는 컨테이너들끼리 통신하라고 자체 네트워크를 만든다. 이때 그 네트워크가 쓸 주소 범위를 정하는데, 그게 172.17.0.0/16 같은 형태로 적혀 있다. 여기서 /16이나 /24가 바로 학교 네트워크 수업에서 배운 또는 정처기에도 나오는 서브넷 마스크다.

 

도커는 컨테이너들끼리 통신하라고 자체 네트워크를 만든다. 이때 그 네트워크가 쓸 주소 범위를 정하는데, 그게 172.17.0.0/16 같은 형태로 적혀 있다. 여기서 /16이나 /24가 바로 학교 네트워크 수업에서 배운 그거였다.

 

IP는 32비트이고 슬래시 뒤 숫자는 앞에서 몇 비트를 고정할지를 뜻한다. /24면 앞 24비트가 고정이고 뒤 8비트가 남는다. 2의 8승이니까 256개. 거기서 네트워크 주소와 브로드캐스트 주소를 빼면 실제로 쓸 수 있는 건 254개다.

 

/16이면 뒤에 16비트가 남으니까 65,536개가 된다.

 

그런데 숫자를 잘못 써서 /28 같은 걸로 잡으면 뒤에 4비트만 남는다. 컨테이너 몇 개만 띄워도 바로 바닥난다.

 

수업에서 계산 문제로 풀 때는 그냥 외워야 하는 공식 같았는데, 배포가 안 되는 걸 앞에 두고 보니까 전혀 다르게 보였다. 

 

해결 방법은 그렇게 어렵진 않았다. 도커 네트워크 설정에서 그 범위를 다시 넓히는 것이었다.

 

docker network ls 

로 어떤 네트워크가 있는지 보고, 

 

docker network inspect

로 각 네트워크가 실제로 어떤 범위를 쓰고 있는지 확인하는 것이었다

 

그 다음엔 해당 네트워크를 지우고 제대로 된 범위로 다시 만들었다.

 

처음부터 이런 포트 관리를 철저하는 것이 중요하다는 것을 느꼈다.

 

서로 다른 프로젝트의 포트 충돌

그리고 이런 일도 있었다.

 

백엔드와 관리자페이지를 작업하고 PR은 보낸 상태였다.

 

'수루님 에러가 나네요 일단 에러 내용 보내놓을게요. 내일 배포합시다'

 

그리고 아침에 와서 보니 이런 에러가 나고 있었다.

Bind for 0.0.0.0:22410 failed: port is already allocated

 

포트 충돌 에러가 났다.

 

분명 빌드도 성공했고, 이미지 전송도 되었고, 이미지 로드까지 성공했는데 컨테이너를 띄우는데 마지막 단계에서만 실패한게 이상했다.

 

심지어 새로운 포트를 할당해준 것도 아니고 각 프로젝트마다 이미 있는 포트를 확인해서 구버전 삭제후 재실행만 하면 되는데 포트 충돌이 난 이유가 뭘까하며 원인을 따라가 보니 도커 문제가 아니었다.

 

관리자, 프론트, 백엔드 프로젝트 3개가 설정 파일을 서버의 같은 경로로 전송하고 있었다. 각자 다른 파일인데 이름이 같아서 나중에 보낸 쪽이 먼저 보낸 쪽을 덮어쓰는 구조였던거다.

 

평소엔 배포를 하나씩 해서 티가 안났는데, 그날 백엔드와 어드민을 같이 수정하면서 두 배포가 연달아 돌다보니 백엔드가 자기 파일을 보내놓고 이미지를 올리는 동안 어드민이 그 파일을 덮어썼고, 백엔드는 어드민 설정을 읽고 컨테이너를 띄울려고 했었던거다.

 

도커 컴포즈는 프로젝트명과 서비스명으로 기존 컨테이너를 찾아서 교체한다. 그런데 서비스명이 바뀌어버리니 기존 걸 교체하지 않고 새로 하나 더 띄우려고 했고, 그래서 이미 쓰고 있던 포트와 부딪힌 것이었다.

 

그래서 프로젝트 폴더명은 backend인데 서비스는 frontend 서비스라는 엉뚱한 컨테이너가 포트를 계속 잡고 있었던 것이었다.

 

고아 프로세스 삭제로 잘못 생성된 컨테이너를 자동 정리하는 옵션을 추가 할까 했지만 혹시나 모를 자동삭제 사고를 방지하기 위해 그냥 각 프로젝트별 시간차를 놓고 배포하기로 했다 ㅎㅎ


 

실무에서 막히는 것은 당연하다. 그리고 코드분의 많은 부분은 AI가 어느정도 해결해주기도 한다. 

 

위와 같이 짠 코드는 멀쩡한데 코드가 올라가 있는 바닥에서 문제가 날때가 있다. 코드에서 에러 메시지만 보고 거기만 파고 있었는데 문제는 더 깊숙한 곳에 있을때다. 한 단계 아래에 뭐가 있는지를 모르니 자꾸 위에서만 멤돌게 될때가 있다.

 

그래서 CS 공부를 해야겠다고 생각했다. 운영체제, 네트워크, 자료구조, 알고리즘, 데이터베이스 전부 개발자로서 필수 역량이다.

 

어디서부터 시작할까 하다 막힌 지점에서 거꾸로 올라가니 실제로 필요한 부분은 운영체제와 네트워크로 느꼈다.

 

그리고 그 운영체제는 리눅스였다.

 

회사 컴퓨터에 리눅스를 설치하다 

서버가 리눅스고, 도커 컨테이너 안도 리눅스다.

 

내가 만든 코드가 돌아가는 곳이 전부 리눅스인데, 나한테 리눅수는 막힐 때만 SSH로 들어가서 검색한 명령어를 붙여넣고 나오는 곳 뿐이었던거 같다.

 

리눅스를 알자. 운영체제를 이해하자. 하며 우선 리눅스 설치를 하기로 했다.

 

마침 개발팀내 리눅스 마스터 ( 꽤 유명한 리눅스 블로그 운영중 이신 분) 분이 계신데, 지나가는 말로 리눅스 설치해서 깔아봐요. 운영체제 과목이 중요하답니다. 하신 말이 생각이 났다.

 

매주하는 정기 회의날, 저번주에 이런 업무들을 했었고, 업무를 하면서 이런 필요성이 느껴졌다 그래서 이번주에는 회사 컴퓨터에 페도라를 설치를 하고 싶은데 해도 되냐하며 허락을 구하니 흔쾌히 허락해주셨다.

 

평소 작업을 리눅스 환경으로 구축해나가면서 조금 더 컴퓨터랑 친한 개발자가 되고 싶다.