[Docker] docker service start 안됨 문제 해결

Bulgogi-Pizza·2025년 1월 26일

웹 서버 구축

목록 보기
14/16

문제 발생 배경

자취방에서 본가로 이사를 오게 되면서 다시 서버를 가동시키는 과정에서 오류가 식별되었다. 문제 해결을 위해 변경된 사항들을 정리해보고, 원인을 찾은 뒤 해결하는 과정까지 진행해보도록 하겠다.

변경 사항들

  • 네트워크
    • 자취방 네트워크에서 본가 네트워크로 변경되었다.
    • IP가 바뀌었으며, 모뎀과 공유기의 구조는 유사하다.
  • 시간
    • 이사 준비 과정을 가지면서 약 5일간 서버를 건들지 못했다.
  • 비정상 종료
    • 이삿짐을 싸는 과정에서 모니터를 미리 정리해서, 전원 버튼을 짧게 눌러 종료를 시도했으나 종료가 되지 않아 전원 버튼을 길게 눌러 강제 종료를 진행했다.

위 변경 사항 내에 원인이 있으면 좋겠다.

문제 마주하기

문제 발생 구간

# docker 서비스 시작
sudo systemctl start docker
Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.

문제의 원인이 너무 간단하게 나와있다. 오류 분석을 위한 다음 스텝은 친절하게 나와있다. 따라서 진행해보자.

로그 분석

1. systemctl status docker.service

● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Sun 2025-01-26 15:21:47 KST; 2min 53s ago
     Docs: https://docs.docker.com
  Process: 87943 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=1/FAILURE)
 Main PID: 87943 (code=exited, status=1/FAILURE)
 1월  26 15:21:47 ******** systemd[1]: docker.service: Service RestartSec=2s expired, scheduling restart.
 1월  26 15:21:47 ******** systemd[1]: docker.service: Scheduled restart job, restart counter is at 3.
 1월  26 15:21:47 ******** systemd[1]: Stopped Docker Application Container Engine.
 1월  26 15:21:47 ******** systemd[1]: docker.service: Start request repeated too quickly.
 1월  26 15:21:47 ******** systemd[1]: docker.service: Failed with result 'exit-code'.
 1월  26 15:21:47 ******** systemd[1]: Failed to start Docker Application Container Engine.

불길한 빨간 딱지과 함께 failed status를 확인할 수 있었다. 뚜렷한 원인은 보이지 않고, 서비스 시작 중 갑자기 컨테이너 엔진을 멈추고 오류를 출력했다는 것을 볼 수 있다. 아직 충분하지가 않다. 다음 로그를 확인해보자

2. journalctl -xe

1월  26 15:34:45 ******** xrdp[89531]: [ERROR] Sending [ITU T.125] DisconnectProviderUltimatum failed
1월  26 15:34:48 ******** xrdp[1364]: [INFO ] Socket 14: connection accepted from [********]:********
1월  26 15:34:48 ******** xrdp[89535]: [INFO ] Using default X.509 certificate: /********
1월  26 15:34:48 ******** xrdp[89535]: [INFO ] Using default X.509 key file: /********
1월  26 15:34:48 ******** xrdp[89535]: [INFO ] Security protocol: configured [SSL|RDP], requested [SSL|HYBRID|RDP], selected [SSL]
1월  26 15:34:49 ******** xrdp[89535]: [ERROR] SSL_accept: I/O error
1월  26 15:34:49 ******** xrdp[89535]: [ERROR] trans_set_tls_mode: ssl_tls_accept failed
1월  26 15:34:49 ******** xrdp[89535]: [ERROR] xrdp_sec_incoming: trans_set_tls_mode failed
1월  26 15:34:49 ******** xrdp[89535]: [ERROR] xrdp_rdp_incoming: xrdp_sec_incoming failed
1월  26 15:34:49 ******** xrdp[89535]: [ERROR] xrdp_process_main_loop: libxrdp_process_incoming failed
1월  26 15:34:49 ******** xrdp[89535]: [ERROR] xrdp_iso_send: trans_write_copy_s failed
1월  26 15:34:49 ******** xrdp[89535]: [ERROR] Sending [ITU T.125] DisconnectProviderUltimatum failed
1월  26 15:34:50 ******** sudo[89537]: ******** : ******** ; ******** ; ******** ; COMMAND=/bin/journalctl -xe
1월  26 15:34:50 ******** sudo[89537]: pam_unix(sudo:session): session opened for ****************

SSL 연결 실패에 관한 오류가 식별된다.
xrdp가 클라이언트와 SSL 연결을 설정하려고 시도했지만 실패한 것으로 보인다.
챗 GPT에게 물어보니, 다음 세 가지 원인을 후보로 꼽았다.

  • 잘못된 인증서/키 파일: X.509 인증서와 키 파일이 유효하지 않거나 경로가 잘못 설정됨
  • 클라이언트 호환성 문제: 클라이언트가 지원하지 않는 암호화 프로토콜을 사용하려고 시도
  • 네트워크 문제: 클라이언트와 서버 간 데이터 전송이 차단됨

3. dockerd --debug

dockerd --debug는 docker 데몬을 직접 실행하되, 디버그 모드로 실행하는 명령어이다. 해당 명령어를 사용하면, 상세한 에러 메시지를 확인할 수 있다.

sudo dockerd --debug
failed to start daemon: Error initializing network controller: error creating default "bridge" network: cannot create network ******* (*******): conflicts with network ******* (*******): networks have same bridge name

로그를 확인해보니, 브릿지 네트워크를 생성하던 중, 특정 네트워크와 충돌이 일어난 것을 확인할 수 있었다. 이미 똑같은 이름을 가진 네트워크가 존재한다는 것으로 보인다.

식별된 원인 규명

1. SSL 연결 실패 - 인증서 파일 관리

xrdp 설정 파일에서 인증서와 키 파일 경로를 확인해보자.

sudo nano /etc/xrdp/xrdp.ini

지정된 인증서와 키의 유효성을 검사해보자.

# 인증서 유효성 검사
sudo openssl x509 -in [path to certificate] -text -noout

# 키 유효성 검사
sudo openssl rsa -in [path to key] -check

검사해보니, 인증서 파일의 유효기간도 잘 남아있고 키도 아직 유효한 것을 확인할 수 있었다.

2. SSL 연결 실패 - 네트워크 설정 문제

연결 요청 시 사용하는 프로토콜을 확인해본다.

sudo cat /etc/xrdp/xrdp.ini | grep security_layer

아래 중 원하는 프로토콜의 연결로 설정이 잘 되어있는지 확인하면 된다.

  • security_layer=negotiate (자동 협상)
  • security_layer=rdp (RDP만 사용)
  • security_layer=ssl (SSL만 사용)

이제 방화벽 설정을 확인해보자. xrdp에 필요한 포트가 열려있는지 확인하면 된다. (3389가 기본 포트이다.)

sudo firewall-cmd --list-all

확인해보니, 의도한 포트가 잘 열려있는 것을 확인할 수 있었다. 챗 GPT가 제안한 문제들이 아닌 것으로 생각된다. 다른 로그를 확인해보자.

3. 브릿지 네트워크 생성 오류 - Firewalld와 docker0의 충돌

Chat GPT에게 물어보니 docker0 브릿지 네트워크와 Firewalld의 충돌이 문제인 것 같다며 다음 차례를 제안했다. 다음 차례를 따라보자.

# Firewalld 중지
sudo systemctl stop firewalld

# Docker 재시작
sudo systemctl start docker

# Docker 상태 확인
sudo systemctl status docker

해결이 되지 않았다. 다음 차례를 따라보자.

아 가기 전에 firewall을 다시 활성화시키고 가자

# Firewalld 시작
sudo systemctl start firewalld

4. 브릿지 네트워크 생성 오류 - docker0와 같은 이름의 네트워크 제거

# 네트워크 목록에서 docker0와 같은 이름의 네트워크가 존재하는지 확인
sudo ip link show

해당 목록에 docker0라는 이름의 네트워크가 존재한다면 네트워크 비활성화 후 네트워크를 삭제하고 다시 시작해보자.

# docker0 네트워크 인터페이스 비활성화
sudo ip link set docker0 down

# docker0 네트워크 인터페이스 삭제
sudo ip link delete docker0

# docker 재시작
sudo systemctl restart docker

해결이 되었다!!

사실 Chat GPT가 자꾸

sudo ip link delete docker0
sudo systemctl restart docker

만 시켜서 해결이 안되길래, 이게 아닌가 싶었는데, 구글링해보니 다른 해결 방법을 얻을 수 있었다.
네트워크 인터페이스를 삭제하려면 먼저 인터페이스를 비활성화해야 하는 경우가 있다고 한다. 예를 들어, 윈도우에서 파일이 사용중이면 삭제가 안되듯이, docker를 참조중인 프로세스가 존재하는 상황에서 네트워크 인터페이스를 삭제하려고 하니 제대로 삭제가 되지 않았던 것이다.(방화벽이나 NAT 테이블 등에서 사용중일 확률이 높음) 그래서 ip link set docker0 down 으로 먼저 인터페이스를 비활성화하고 삭제하면 제대로 삭제가 되는 것이다.

profile
궁금증은 못참는 편, 궁금한 개발자

0개의 댓글