Docker Compose 로 올린 Harbor 가 서버 재부팅 뒤에도 자동으로 올라오게 하는 두 가지 방법이다. 대부분 첫 번째로 충분하고, docker compose down 으로 내려둔 상태에서 재부팅되는 경우까지 다루려면 systemd 유닛을 둔다.
Harbor 의 docker-compose.yml 은 모든 서비스에 restart: always 가 걸려 있으므로 docker.service 만 부팅 시 활성화되면 데몬이 컨테이너를 다시 띄운다.
systemctl enable docker
systemctl is-enabled docker
docker inspect harbor-core --format '{{.HostConfig.RestartPolicy.Name}}' # always 또는 unless-stopped
WorkingDirectory 는 docker-compose.yml 이 실제로 있는 곳이어야 한다. /data/harbor 는 보통 데이터 볼륨이고 compose 파일은 설치 스크립트를 푼 위치(예: /opt/harbor)에 있다.
docker inspect harbor-core --format '{{index .Config.Labels "com.docker.compose.project.working_dir"}}'
[Unit]
Description=Harbor Registry
After=docker.service network-online.target
Requires=docker.service
Wants=network-online.target
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/harbor
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
TimeoutStartSec=0
Restart=no
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now harbor.service
systemctl status harbor.service
TimeoutStartSec=0 은 컨테이너가 많아 기동이 길어질 때 oneshot 기본 타임아웃(90초)에 걸리는 것을 막는다.
reboot
systemctl status harbor
docker compose -f /opt/harbor/docker-compose.yml ps
curl -I http://localhost/api/v2.0/ping
docker ps 에서 harbor 컨테이너가 모두 (healthy) 면 정상이다.
두 방법을 같이 쓰면 부팅 시 Docker 가 먼저 컨테이너를 띄우고 systemd 가 up -d 를 한 번 더 실행하지만 멱등이라 충돌은 없다. 로그가 헷갈리면 systemd 로 관리하기로 한 뒤 compose 의 restart 값을 on-failure 로 낮춘다.