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