Immagina questo scenario. Ospiti alcuni servizi Web in esecuzione in contenitori Docker. Quando il servizio Web ha una nuova versione, prendi l'immagine Docker e aggiorni i contenitori per aggiornare il servizio.
In precedenza ho discusso dell'aggiornamento dei contenitori Docker senza tempi di inattività, ma questo articolo non riguarda l'aggiornamento delle app Web. Questo riguarda l'aggiornamento dei contenitori del sistema operativo stessi.
L'aggiornamento manuale del sistema operativo in esecuzione nel container può essere un compito arduo di tanto in tanto. È necessario eseguire separatamente i comandi di aggiornamento pertinenti su un container in esecuzione affinché ciò avvenga.
Che ne dici di eliminare questo passaggio aggiuntivo e combinare l'aggiornamento del sistema operativo con l'aggiornamento del servizio?
Questo è un trucco di automazione che utilizzo quando aggiorno un servizio Web distribuito con Docker Compose.
Useremo Ghost CMS come esempio del mondo reale basato su questa distribuzione.
DigitalOcean – Il cloud per sviluppatori Aiuta milioni di sviluppatori a creare, testare, gestire e ridimensionare facilmente applicazioni di qualsiasi dimensione, più velocemente che mai.DigitalOcean logoRoxana Ciobanu, CTOAggiornamento automatico dei container OS durante l'aggiornamento del servizio web
Puoi semplicemente leggere questo articolo per capire cosa sto facendo. Ma se vuoi seguirlo, puoi farlo anche tu.
Mostrerò due diversi esempi:
- Per i contenitori Docker basati su Debian
- Per container Docker con base alpina
Aggiornamento automatico dei contenitori Debian
La procedura richiede che tu ti occupi di due passaggi:
Passaggio 1:prendi nota delle istruzioni CMD
Prendere nota dell'istruzione CMD specificata infine all'interno del Dockerfile di WebApp.
Per fare ciò è necessario controllare il Dockerfile con cui è stata creata l'immagine (Ghost per questo esempio):
Pertanto, il comando effettivo qui è node current/index.js
.
Passaggio 2:aggiungi l'impostazione "Aggiornamento automatico"
Aggiungi i comandi di aggiornamento e la nota istruzione CMD all'interno della sezione del servizio Ghost del file Docker Compose:
command: sh -c "apt update && apt -y upgrade && node current/index.js"
Vediamo come sarebbe finalmente. Supponiamo, ad esempio, di considerare le voci Docker Compose per il servizio Ghost dalla guida sopra citata. Una versione aggiornata basata sul nostro tutorial sarebbe:
ghost:
image: ghost:4.20.4
volumes:
- ghost:/var/lib/ghost/content
- ./config.json:/var/lib/ghost/config.production.json
command: sh -c "apt update && apt -y upgrade && node current/index.js"
env_file:
- ./ghost-mariadb.env
restart: on-failure
depends_on:
- ghostdb
networks:
- net
- ghost
Qui, ho specificato il comando subito dopo i volumes
sezione.
Aggiornamento automatico dei container alpini
Questa procedura richiede ancora una volta che tu ti occupi di due passaggi simili:
Passaggio 1:prendi nota delle istruzioni CMD
Prendere nota dell'istruzione CMD specificata infine all'interno del Dockerfile di WebApp.
Per fare ciò è necessario controllare il Dockerfile (Ghost Alpine per questo esempio):
Apparentemente, il comando qui è lo stesso visto per la versione Debian precedente:node current/index.js
.
Passaggio 2:aggiungi l'impostazione "Aggiornamento automatico"
Aggiungi i comandi di aggiornamento e la nota istruzione CMD all'interno della sezione del servizio Ghost del file Docker Compose:
command: sh -c "apk update && apk add --upgrade apk-tools && apk upgrade --available && node current/index.js"
Riferimento per l'aggiornamento alpino.
Vediamo come sarebbe finalmente (nota che questa volta userò l'immagine alpine per Ghost). Supponiamo, ad esempio, di considerare le voci Docker Compose per il servizio Ghost dalla guida sopra citata. Una versione aggiornata basata sul nostro tutorial sarebbe:
ghost:
image: ghost:4.20.4-alpine
volumes:
- ghost:/var/lib/ghost/content
- ./config.json:/var/lib/ghost/config.production.json
command: sh -c "apk update && apk add --upgrade apk-tools && apk upgrade --available && node current/index.js"
env_file:
- ./ghost-mariadb.env
restart: on-failure
depends_on:
- ghostdb
networks:
- net
- ghost
Questo è tutto allora. Da questo momento in poi, ogni volta che aggiorni le tue app Web senza tempi di inattività, i comandi di aggiornamento del contenitore verranno automaticamente richiamati e quindi le tue app Web verranno eseguite.
Nota:quando si aggiorna un'app modificando il numero di versione dell'immagine nel file di composizione della finestra mobile, è necessario disabilitare temporaneamente l'opzione di comando discussa qui con un hashtag. Al termine dell'aggiornamento per l'app Web, riattivare la stessa riga per aggiornare il contenitore stesso. Entrambi questi passaggi (aggiornamento dell'app e del contenitore) sono realizzabili senza tempi di inattività grazie al ridimensionamento.
Suggerimenti bonus
Ecco un elenco di comandi per altre app popolari come Nextcloud e Rocket.Chat. Ricorda, questi devono essere aggiunti proprio come hai visto per l'esempio Ghost.
Nextcloud
Per Debian:
command: sh -c "apt update && apt -y upgrade && apache2-foreground"
Per l'alpino:
command: sh -c "apk update && apk add --upgrade apk-tools && apk upgrade --available && apache2-foreground"
Rocket.Chat
command: sh -c "apt update && apt -y upgrade && node main.js"
Spero che questo articolo ti aiuti nelle tue attività quotidiane di amministratore di sistema. Se hai domande, feedback o suggerimenti, lascia i tuoi pensieri nella sezione commenti qui sotto.