๊ธฐ๋ณธ ๊ฐœ๋…

Systemd

  • Linux์˜ ๊ธฐ๋ณธ Init ์‹œ์Šคํ…œ์ด์ž ์„œ๋น„์Šค ๊ด€๋ฆฌ์ž
  • PID 1๋กœ ์‹คํ–‰๋˜๋Š” ์‹œ์Šคํ…œ ์ˆ˜์ค€์˜ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ์ž
  • ์‹œ์Šคํ…œ ๋ถ€ํŒ…๋ถ€ํ„ฐ ์„œ๋น„์Šค ๊ด€๋ฆฌ๊นŒ์ง€ ์ „๋ฐ˜์ ์ธ ์‹œ์Šคํ…œ ๊ด€๋ฆฌ ๋‹ด๋‹น

Supervisor

  • ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ ๋„๊ตฌ
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜์ค€์˜ ํ”„๋กœ์„ธ์Šค ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ์ œ์–ด
  • ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์ง€์› ๋ฐ ์›น ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต

ํ™˜๊ฒฝ๋ณ„ ์‚ฌ์šฉ ์ฐจ์ด

์ผ๋ฐ˜ Linux ํ™˜๊ฒฝ

Systemd ์„ค์ •

# /etc/systemd/system/myapp.service
[Unit]
Description="My Application"
After=network.target
 
[Service]
User=myapp
Group=myapp
Environment=LANG=en_US.UTF-8
ExecStart=/home/myapp/bin/start_app
Restart=always
 
[Install]
WantedBy=multi-user.target

Supervisor ์„ค์ •

# /etc/supervisor/conf.d/myapp.conf
[program:myapp]
command=/home/myapp/bin/start_app
user=myapp
environment=LANG=en_US.UTF-8
autostart=true
autorestart=true

Docker ํ™˜๊ฒฝ

graph TD
    A[Docker ์ปจํ…Œ์ด๋„ˆ] --> B{ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ}
    B -->|๊ธฐ๋ณธ ์„ค์ •| C[Supervisor]
    B -->|ํŠน๋ณ„ ์„ค์ • ํ•„์š”| D[Systemd]
    C -->|์ผ๋ฐ˜์  ์‚ฌ์šฉ| E[๋‹จ์ผ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ]
    D -->|๋ณต์žกํ•œ ์„ค์ • ํ•„์š”| F[์‹œ์Šคํ…œ ์ˆ˜์ค€ ๊ด€๋ฆฌ]

Docker์—์„œ Systemd ์‚ฌ์šฉ ์‹œ ํ•„์š” ์‚ฌํ•ญ:

# Systemd ํ™œ์„ฑํ™”๋ฅผ ์œ„ํ•œ Docker ์‹คํ–‰ ๋ช…๋ น
docker run -d \
  --cap-add SYS_ADMIN \
  -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
  --name systemd_container \
  image_name:tag \
  /sbin/init

Docker์—์„œ Supervisor ์‚ฌ์šฉ:

# Dockerfile
FROM python:3.9
RUN apt-get update && apt-get install -y supervisor
COPY supervisord.conf /etc/supervisor/conf.d/
CMD ["/usr/bin/supervisord"]

์ฃผ์š” ์ฐจ์ด์ 

1. ์‹œ์Šคํ…œ ํ†ตํ•ฉ

  • Systemd: OS ์ˆ˜์ค€ ํ†ตํ•ฉ, ์‹œ์Šคํ…œ ์ „๋ฐ˜ ๊ด€๋ฆฌ
  • Supervisor: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜์ค€ ๊ด€๋ฆฌ

2. ๊ธฐ๋Šฅ ๋ฒ”์œ„

  • Systemd: ๋ถ€ํŒ…, ๋กœ๊น…, ๋„คํŠธ์›Œํฌ, ์„œ๋น„์Šค ๊ด€๋ฆฌ
  • Supervisor: ํ”„๋กœ์„ธ์Šค ๋ชจ๋‹ˆํ„ฐ๋ง, ์žฌ์‹œ์ž‘, ๋กœ๊น…

3. ์„ค์ • ๋ณต์žก๋„

  • Systemd: ๋ณต์žกํ•˜์ง€๋งŒ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ
  • Supervisor: ๋‹จ์ˆœํ•˜๊ณ  ์ง๊ด€์ ์ธ ์„ค์ •

์‚ฌ์šฉ ์‚ฌ๋ก€๋ณ„ ๋น„๊ต

1. ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰

Systemd ์‚ฌ์šฉ

[Unit]
Description=Web Application
After=network.target
 
[Service]
Type=simple
User=webuser
WorkingDirectory=/opt/webapp
ExecStart=/usr/local/bin/gunicorn app:app
Restart=always

Supervisor ์‚ฌ์šฉ

[program:webapp]
command=/usr/local/bin/gunicorn app:app
directory=/opt/webapp
user=webuser
autostart=true
autorestart=true

2. ์›Œ์ปค ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ

Systemd ์‚ฌ์šฉ

[Unit]
Description=Worker Processes
After=network.target
 
[Service]
Type=simple
ExecStart=/usr/bin/worker
Restart=always
StartLimitInterval=0

Supervisor ์‚ฌ์šฉ

[program:worker]
command=/usr/bin/worker
numprocs=4
process_name=%(program_name)s_%(process_num)02d
autostart=true
autorestart=true

์„ ํƒ ๊ฐ€์ด๋“œ

Systemd ์„ ํƒ ์‹œ๊ธฐ

  1. Linux ์‹œ์Šคํ…œ ์ „๋ฐ˜์ ์ธ ๊ด€๋ฆฌ ํ•„์š”
  2. ์‹œ์Šคํ…œ ์„œ๋น„์Šค๋กœ ์‹คํ–‰ ํ•„์š”
  3. ๋ณต์žกํ•œ ์˜์กด์„ฑ ๊ด€๋ฆฌ ํ•„์š”

Supervisor ์„ ํƒ ์‹œ๊ธฐ

  1. ๋‹จ์ˆœํ•œ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ๋งŒ ํ•„์š”
  2. Docker ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ
  3. ์›น ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•„์š”
  4. ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์ง€์› ํ•„์š”

๊ฒฐ๋ก 

  1. ํ™˜๊ฒฝ์— ๋”ฐ๋ฅธ ์„ ํƒ

    • ์ผ๋ฐ˜ Linux ์„œ๋ฒ„: Systemd ๊ถŒ์žฅ
    • Docker ์ปจํ…Œ์ด๋„ˆ: Supervisor ๊ถŒ์žฅ
    • ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ํ™˜๊ฒฝ: ๋ชฉ์ ์— ๋”ฐ๋ผ ํ˜ผ์šฉ
  2. ๋ณต์žก๋„์™€ ๊ธฐ๋Šฅ

    • ๋‹จ์ˆœ ๊ด€๋ฆฌ: Supervisor
    • ๋ณต์žกํ•œ ์‹œ์Šคํ…œ: Systemd
  3. ์šด์˜ ๊ด€์ 

    • ์‹œ์Šคํ…œ ์ˆ˜์ค€ ๊ด€๋ฆฌ: Systemd
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ด€๋ฆฌ: Supervisor

์ด๋Ÿฌํ•œ ํŠน์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ์šด์˜ ํ™˜๊ฒฝ์— ๋งž๋Š” ๋„๊ตฌ๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.