본문 바로가기

카테고리 없음

[Ubuntu] 서버 구동 시 도커 컨테이너 자동 실행되게 설정하기

 

 

1. systemd란? 

  • 리눅스 시스템에서 부팅 프로세스와 서비스 관리를 담당하는 시스템 및 서비스 관리자
  • 대부분의 최신 리눅스 배포판에서 사용됨
  • 부팅 및 서비스 관리, 로깅, 디바이스 관리, 유저 로그인, 네트워크 관리 등 다양한 시스템 및 서비스 관리 기능 제공

 

 

2. 도커 자동 실행

더보기

도커를 systemd 서비스로 등록하여 부팅 시 실행되게 해보자

 

1) 도커 서비스 파일 생성

sudo nano /etc/systemd/system/docker.service

 

2) docker.service 파일에 아래 내용 추가

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com

[Service]
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Restart=always
StartLimitInterval=0
RestartSec=3
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
TasksAccounting=false

[Install]
WantedBy=default.target

 

 

 

3) systemd에 등록하고 부팅 시 자동 시작 설정

sudo systemctl enable docker

 

 

 

 

설정을 했는데...

설정을 하고 보니 도커를 실행하지 않아도 서버를 키면 도커가 active 상태라는 걸 인지하게 되었음

그래서 혹시 자동 실행되는게 기본값인가 했는데... 도커 설치하면 systemd를 사용하여 도커를 자동으로 시작하는 설정이 기본값이라고 함 ...ㅎ

만들었던 docker.service 파일 삭제...!

sudo rm /etc/systemd/system/docker.service

 

 

 

 

3. 컨테이너 자동 실행

서버를 재부팅해봤는데 도커는 자동 실행되는데 컨테이너는 자동 실행되지 않음

도커가 실행되면 컨테이너가 자동 실행되게 설정해보기! 

이것도 systemd의 서비스 파일로 만들어서 구현할 수 있음

 

1) service 파일 생성하기

여기서는 파일 제목이 docker-container.service

sudo nano /etc/systemd/system/docker-container.service

 

2) service 파일 내용 작성

[Unit]
Description=Docker Container Service for hungry_goldstine
Requires=docker.service
After=docker.service

[Service]
Restart=always
ExecStart=/usr/bin/docker start -a {컨테이너명}

[Install]
WantedBy=default.target

 

3) systemd에 서비스 등록

enable 명령어: 해당 서비스를 부팅시 활성화되도록 설정(부팅시 자동 실행)

sudo systemctl enable docker-container.service

 

4) systemd 서비스 시작

service 파일에 정의된 프로세스가 시작되고 해당 서비스 활성화

sudo systemctl start docker-container.service

 

5) 로그 확인하기

해당 서비스에 대한 로그 및 상태정보 확인

sudo systemctl status docker-container.service

 

6) 서비스 정지

sudo systemctl stop

 

 

🧐 시행착오

더보기

 

1) docker-container.service 파일 생성

sudo nano /etc/systemd/system/docker-container.service

 

2) docker-container.service 파일에 아래 내용 추가

[Unit]
Description=Docker Container Service
Requires=docker.service
After=docker.service

[Service]
Restart=always

# 첫 번째 컨테이너
ExecStart=/usr/bin/docker start -a hungry_goldstine
ExecStartPost=/bin/sleep 5

# 두 번째 컨테이너
ExecStartPost=/usr/bin/docker start -a gpu1
ExecStartPost=/bin/sleep 5

# 세 번째 컨테이너
ExecStartPost=/usr/bin/docker start -a gpu2
ExecStartPost=/bin/sleep 5

# 네 번째 컨테이너
ExecStartPost=/usr/bin/docker start -a gpu3
ExecStartPost=/bin/sleep 5

# 다섯 번째 컨테이너
ExecStartPost=/usr/bin/docker start -a gpu4
ExecStartPost=/bin/sleep 5

[Install]
WantedBy=default.target

 

동시에 많은 컨테이너를 시작할 때는 호스트 시스템의 자원(메모리, CPU 등)을 고려해야함

동시에 많은 리소스를 사용하는 작업을 수행하면서 시스템의 안정성에 영향을 줄 수 있음

따라서 시스템 자원과 균형을 고려하여 컨테이너가 시작되고 5초 후에 컨테이너가 시작되도록 작성

 

 

3) systemd에 등록하고 부팅 시 자동 시작 설정

sudo systemctl enable docker-container.service

 

 

4) systemd 서비스 시작

sudo systemctl start docker-container.service

 

 

재부팅 결과

첫 번째 컨테이너(hungry_goldstine) 실행하고 5초 뒤에 두 번째 컨테이너(gpu1)이  자동 실행 되는 것을 확인 할 수 있었음

근데 gpu2, gpu3, gpu4 컨테이너는 실행되지 않음..

각각 컨테이너마다 service 파일이 필요한걸까? 

 

service 파일에서 [Service] 섹션에 ExecStartPost는 ExecStart가 완료된 후 추가로 실행되는 명령어이기 때문에 여러 컨테이너가 시작되지 않고, 첫 번째 컨테이너만 시작될 수 있다는 생각이 들었음

근데 왜 5초뒤 수행되고 두번째 컨테이너 실행까지되는건지는...;; 모르겠넹

아무튼 각 컨테이너마다 service파일을 만들어 서버 구동 시 자동실행 되도록 설정하는 것이 맞다는 판단을 내렸음

 

⭐️ systemd를 이용한 방법보다 더 간단하고 좋은 방법은 도커 컨테이너 실행 시 --restart 옵션을 always로 두는 방법

아래는 redis를 항상 시작되도록 설정하고 실행한 명령

docker run -d --restart always --name redis-server -p 6379:6379 redis

 

🗓️ 결론

서버에 올릴 때 보통 우분투에서 작업하는데 우분투에서는 도커가 자동 실행되므로 컨테이너 실행 설정만 추가하면 서버가 재부팅되는 상황이 발생해도 도커와 도커 컨테이너 모두 자동으로 재실행됨