Parametri Docker: i migliori parametri!

Se sei un amministratore di sistema esperto, potresti averne sentito parlare "Docker" sentito e so già di cosa si tratta. Per chi non lo sapesse, Docker è una tecnologia open source che consente l'esecuzione delle applicazioni in contenitori isolati.

Cos'è un parametro Docker?

Un parametro Docker è un valore che viene passato a un comando Docker. Questo valore può essere specificato sotto forma di variabile d'ambiente o direttamente nel comando stesso.

I diversi tipi di parametri Docker

Il comando docker run ha molte opzioni e parametri diversi che puoi personalizzare in base alle tue esigenze. In questo articolo Ci concentreremo sui diversi tipi di parametri Docker.

Esistono quattro tipi principali di parametri Docker: variabili di ambiente, comandi singoli, combinazioni di comandi e file. Ogni tipo ha il suo Vantaggi e svantaggiche devono essere presi in considerazione.

Le variabili d'ambiente sono facili da usare e ti consentono di personalizzare alcune parti del tuo ambiente senza dover modificare il codice. Tuttavia, sono in grado di memorizzare solo tipi di dati semplici, quindi non sono adatti per configurazioni applicative più complesse.

I comandi singoli consentono di eseguire semplicemente un comando senza dover creare un file. Ciò può essere utile se desideri solo eseguire un'azione specifica senza creare un'applicazione completa. Tuttavia, i singoli comandi non sono scalabili e potrebbero quindi non essere adatti per applicazioni più grandi.

Le combinazioni di comandi consentono di salvare più comandi in un file e quindi eseguirli. Ciò è utile quando desideri eseguire più azioni senza dover modificare il codice ogni volta. Tuttavia, le combinazioni di comandi creano spesso confusione e sono difficili da eseguire il debug.

I file rappresentano il modo più flessibile per archiviare ed eseguire il codice. I file possono essere facilmente creati e modificati, il che significa che sono adatti a tutti i tipi di applicazioni. Tuttavia, i file sono spesso confusi e difficili da eseguire il debug.

I migliori parametri Docker

I migliori parametri Docker

Se utilizzi Docker, puoi specificare una varietà di opzioni per controllare il comportamento del contenitore. Questo articolo spiega i parametri Docker migliori e più comunemente utilizzati.

–name: questo parametro assegna un nome al contenitore. Se non specifichi un nome, verrà generato un nome casuale. Il nome deve essere univoco in modo da poter identificare facilmente il contenitore.

–detach / -d: questo parametro esegue il contenitore in background. Per impostazione predefinita, il contenitore viene eseguito in primo piano e la riga di comando rimane bloccata finché il contenitore non esce o viene annullato con Ctrl+C. Se desideri eseguire il contenitore in background, devi specificare il parametro –detach.

–publish / -p: questo parametro stabilisce una connessione tra una porta del contenitore e una porta dell'host. Se non ti connetti non potrai raggiungere il porto del container dall'esterno. Se desideri pubblicare più porte, puoi specificare il parametro –publish più volte.

–interactive / -i: questo parametro garantisce che il contenitore venga eseguito in primo piano e che la riga di comando non venga bloccata finché il contenitore non esce o viene interrotto con Ctrl + C.

–tty / -t: questo parametro simula un terminale nel contenitore. Specificando questo parametro è possibile digitare nel contenitore ed eseguire comandi. Se questo parametro non viene specificato non sarà possibile digitare nel contenitore o eseguire comandi.

–rm: questo parametro elimina il contenitore dopo la sua chiusura. Se non si specifica questo parametro, il contenitore rimarrà intatto e potrà essere ripristinato in seguito.

–volume / -v: questo parametro crea una connessione tra una cartella host e una cartella contenitore. Quando ti connetti, puoi copiare file dalla cartella host al contenitore e viceversa.

–workdir / -w: questo parametro imposta la directory di lavoro nel contenitore. Per impostazione predefinita la directory di lavoro è impostata su /root.

–user / -u: questo parametro imposta l'utente nel contenitore. Per impostazione predefinita viene utilizzato l'utente root.
Questi sono solo alcuni dei tanti parametri Docker disponibili. Per ulteriori informazioni, consultare la documentazione di Docker.

–restart: questo parametro specifica come Docker deve riavviare un contenitore se si chiude o si arresta in modo anomalo. Sono disponibili diverse opzioni per questo parametro: no, in caso di guasto, sempre e a meno che non venga interrotto. Il valore predefinito è "no", il che significa che il contenitore non verrà riavviato. Se specifichi "on-failure", il contenitore verrà riavviato se è in esecuzione con a Errore viene interrotto (ad esempio a causa di un incidente). "Sempre" significa che il contenitore verrà sempre riavviato, anche se è stato spento in modo pulito. “Unless-stopped” è simile a “always”, ma qui il contenitore non viene lasciato in funzione incustodito; Una volta eseguito il comando "docker stop" per arrestare il contenitore, non si riavvierà più.

–hostname: come suggerisce il nome, questo parametro imposta il nome host del contenitore. Il valore predefinito è il nome del contenitore o un nome casuale se non viene specificato –name.

–interactive o -i: questo parametro consente di accedere e interagire con un contenitore in esecuzione. Ad esempio, puoi avviare un terminale nel contenitore ed eseguire comandi. Se non specifichi questo parametro, non sarai in grado di accedere e interagire con il contenitore.

–volume o -v: questo parametro crea una connessione tra una cartella host e una cartella contenitore. Quando ti connetti, puoi copiare file dalla cartella host al contenitore e viceversa.

Vantaggi e svantaggi di un parametro Docker

Probabilmente il vantaggio più importante di un parametro Docker è che aumenta la flessibilità e l'adattabilità di un'applicazione. Ad esempio, variabili di ambiente specifiche possono essere passate a un'applicazione specifica. L'accesso alle risorse del sistema host può essere controllato anche tramite il parametro.

Un altro vantaggio è che determinate funzioni di sicurezza possono anche essere vincolate ad un'applicazione tramite parametri Docker. È ad esempio possibile garantire che solo gli utenti autorizzati possano accedere a un'applicazione.

Uno svantaggio dei parametri Docker è che in genere sono disponibili solo per sviluppatori e amministratori di sistema. Di solito non sono visibili o comprensibili agli utenti normali. Pertanto può essere difficile personalizzare un'applicazione se non si conoscono i parametri Docker.

Riferimento all'esecuzione Docker

La maggior parte dei comandi Docker iniziano con il comando "docker" seguito da un sottocomando. docker run è un tipico sottocomando e viene utilizzato per eseguire un nuovo contenitore.

Il comando docker run dispone di molte opzioni e parametri diversi che puoi specificare per creare e configurare il contenitore che desideri eseguire. In questo articolo esamineremo i parametri migliori per il comando docker run.

Opzioni esclusive per l'operatore

La maggior parte delle opzioni dell'operatore non sono esclusive degli operatori, ma sono disponibili anche per altri utenti. Tuttavia, ci sono alcune opzioni destinate esclusivamente agli operatori. Questi includono:

–log-level: imposta il livello di registrazione. Solo gli operatori hanno accesso a questa opzione per personalizzare la registrazione per la loro installazione.

–storage-opt: consente all'operatore di configurare opzioni di archiviazione aggiuntive per la propria installazione. Ciò è utile quando l'operatore utilizza un backend di archiviazione specifico non supportato da Docker.

–format: consente all'operatore di personalizzare il formato dell'output delle informazioni della finestra mobile. Ciò è utile se l'operatore desidera elaborare ulteriormente le informazioni in un modulo specifico.

Staccato vs primo piano

Quando esegui un contenitore con il comando docker run, viene sempre eseguito in primo piano. Ciò significa che il contenitore ha il file Console del sistema host e non è possibile uscire dal comando senza arrestare il contenitore.

Se vuoi eseguire un contenitore in background (separato), puoi farlo con il parametro "-d". Il contenitore viene quindi eseguito nel proprio processo e il controllo della console viene restituito all'host.

Identificazione del contenitore

L'ID del contenitore è un identificatore univoco per un contenitore Docker. Può essere visualizzato utilizzando il comando docker ps e in genere è lungo otto caratteri. I primi tre caratteri dell'ID contenitore sono l'ID dell'immagine che ha creato il contenitore.

Impostazioni UTS (–uts)

La modalità UTS specifica come un contenitore dovrebbe gestire la propria identità. In genere, ogni contenitore ottiene il proprio UID e GID. Tuttavia, questa modalità non ha sempre senso, soprattutto quando più contenitori accedono allo stesso banca dati o necessità di accedere ad altre risorse. In questo caso, puoi disabilitare la modalità UTS in modo che tutti i contenitori abbiano lo stesso UID e GID.

Impostazioni IPC (–ipc)

L'impostazione IPC (–ipc) consente di utilizzare un'area comune per la comunicazione tra contenitori. Ciò consente a due o più contenitori di accedere agli stessi file e socket. Se non specifichi un'impostazione IPC, Docker imposterà un intervallo predefinito per la comunicazione.

Impostazioni di rete

Ci sono alcuni parametri utili in Docker che dovresti conoscere. Uno di questi parametri è –net. Questo parametro determina la modalità di configurazione della rete per un'applicazione specifica.

–net=host – Questa opzione consente a un contenitore di accedere direttamente alla rete dell'host. Ciò significa che il contenitore ha accesso a tutti i servizi di rete (DNS, HTTP, ecc.) forniti dall'host.

–net=bridge – Questa opzione crea un contenitore bridge di rete interno che consente al contenitore specificato di comunicare con altri contenitori e con l'host. Questa è l'opzione predefinita per –net.

–net=container: – Questa opzione consente a un contenitore di essere connesso a un altro contenitore che utilizza la stessa opzione di rete. Ad esempio, è possibile connettere due contenitori con la stessa opzione –net=bridge per collegarli insieme.

–net=none – Questa opzione disabilita la rete per un contenitore. Un contenitore che utilizza questa opzione non ha accesso alla rete e pertanto non può utilizzare i servizi di rete.

Per consentire a due contenitori di comunicare tra loro, puoi utilizzare il comando docker network create:

La rete $ docker crea la mia rete

Questo comando crea una nuova rete denominata my-network. Per connettere un contenitore a questa rete, è possibile utilizzare il comando docker run con l'opzione –net:
$ docker run –net=mia-rete…

Per rimuovere un contenitore puoi usare il comando docker rm:

$ docker rm il mio contenitore

Questo comando rimuove il contenitore my-container. Per rimuovere una rete puoi usare il comando docker network rm:
$ rete docker rm mia-rete

Questo comando rimuove la rete denominata my-network.

Politiche di riavvio (–restart)

La policy di riavvio di Docker specifica come un contenitore si riavvia dopo un Errore dovrebbe essere riavviato. Le opzioni di riavvio sono:

–restart=no: il contenitore non verrà riavviato.
–restart=always: il contenitore viene sempre riavviato, anche se è stato chiuso correttamente.
–restart=on-failure: il contenitore verrà riavviato se è in esecuzione con a Errore era finito.
–restart=unless-stopped: il contenitore viene sempre riavviato a meno che non sia stato arrestato manualmente con il comando docker stop.

Stato di uscita

Lo stato di uscita è un valore restituito da un comando o da una funzione per indicare se il comando o la funzione sono stati completati correttamente.

Se un comando viene completato con uno stato di uscita pari a 0, in genere significa che il comando ha avuto successo. Uno stato di uscita diverso solitamente significa che il comando non è riuscito.

Gli stati di uscita possono essere utilizzati anche per generare codici di errore specifici. Questo può essere utile se hai un file specifico Trova e correggi gli errori Volere. Ad esempio, l'uscita 1 può essere utilizzata per visualizzare un errore "File non trovato".

Pulisci (–rm)

La maggior parte dei comandi Docker accetta uno o più parametri. Uno dei più importanti è “–rm”. Questo comando garantisce che tutti gli oggetti temporanei creati da Docker vengano eliminati al termine del comando. Ciò garantisce che nessun oggetto indesiderato rimanga nel tuo ambiente.

Configurazione di sicurezza

La configurazione della sicurezza è un aspetto molto importante quando si lavora con Docker. Questa sezione elenca alcuni dei parametri più importanti per Sicurezza presentato da Docker.

Prima di tutto, dovresti sempre essere consapevole che i contenitori Docker sono sigillati, ma non isolati. Ciò significa che se un utente malintenzionato entra in un container, può accedere a tutti gli altri container e al sistema host. Pertanto, è molto importante configurare e proteggere correttamente i contenitori.

Uno dei parametri più importanti per la sicurezza di Docker è “–cap-add”. Questo parametro consente di trasferire determinate capacità del kernel al contenitore. Ciò consente di controllare l'accesso a determinate funzionalità del sistema host, aumentando così la sicurezza. Ad esempio, puoi utilizzare "–cap-add=NET_RAW" per garantire che un contenitore non possa sniffare i pacchetti di rete.

Un altro parametro importante è “–security-opt”. Questo parametro consente di limitare l'accesso a determinate funzionalità del sistema host. Ad esempio, puoi utilizzare "–security-opt=apparmor:unconfined" per garantire che AppArmor non venga applicato al contenitore. Ciò offre agli aggressori un enorme vantaggio poiché non sono più limitati da AppArmor.

Un altro parametro molto importante è il parametro “–label” di SELinux. Questo parametro consente di controllare l'accesso a determinate funzionalità del sistema host. Ad esempio, con “–label=tipo:
container_runtime_t" assicurano che Docker non applichi SELinux al contenitore. Ciò offre agli aggressori un grande vantaggio perché non sono più limitati da SELinux.

L'ultimo parametro importante è “–privilegiato”. Questo parametro consente di accedere a tutte le funzioni del sistema host. Questo è molto pericoloso e dovrebbe essere usato solo quando assolutamente necessario.

Per oggi è tutto! Speriamo che questo articolo ti abbia aiutato Nozioni di base per comprendere Docker.

Specificare un processo di inizializzazione

Il demone Docker accetta un processo init specificato come argomento. Questo processo è il primo processo da eseguire nel contenitore. Se non viene specificato alcun processo di inizializzazione, viene utilizzato il processo di inizializzazione predefinito init.

Il processo di inizializzazione specificato dovrebbe garantire che nel contenitore sia in esecuzione un solo processo. Quando sono in esecuzione più processi, potrebbero verificarsi errori imprevedibili. Il processo di inizializzazione specificato deve inoltre garantire che il contenitore si chiuda correttamente quando esce.

Specificare cgroup personalizzati

Se desideri impostare un limite di memoria cgroup personalizzato per la tua applicazione, puoi farlo con il flag –cgroup-memory. Ad esempio, se desideri impostare il limite su 512 MB:

–cgroup-memory="512m"

Come faccio a configurare un custom DNS server per i miei contenitori?

Se hai un DNS personalizzato server, puoi impostarlo nel file delle specifiche dell'applicazione o nel comando di aggiunta dell'app dcos marathon. Questo esempio mostra come impostare un DNS server utilizzando il file delle specifiche dell'applicazione:

{ “id”: “/mio-servizio”, “DNS”: { “server dei nomi”: [ “10.0.0.1” ] } }

Questo esempio mostra come impostare un DNS server utilizzando il comando add dell'app dcos marathon:
$ app maratona dcos aggiungi { “id”: “/my-service”, “DNS”: { “server dei nomi”: [ “10.0.0.1” ] } }

Per ulteriori informazioni su DNS, vedere Impostazioni DNS nella documentazione di Marathon.

Come faccio a configurare un custom seaRCH dominio per i miei contenitori?

Se hai un'abitudine seaRCH dominio, puoi impostarlo nel file delle specifiche dell'applicazione o nel comando di aggiunta dell'app dcos marathon. Questo esempio mostra come impostare a seadominio rch utilizzando il file delle specifiche dell'applicazione:

{ “id”: “/mio-servizio”, “DNS”: {"search”: [ “.esempio.com” ] } }

Questo esempio mostra come impostare a seadominio rch utilizzando l'app dcos marathon add command:$ dcos marathon app add { “id”: “/my-service”, “dns”: { “search”: [ “.esempio.com” ] } }

Per ulteriori informazioni sul DNS, consulta Impostazioni DNS nella documentazione di Marathon.

Come posso configurare una rete personalizzata per i miei contenitori?

Se disponi di una rete personalizzata, puoi impostarla nel file delle specifiche dell'applicazione o nel comando di aggiunta dell'app dcos marathon. Questo esempio mostra come impostare una rete utilizzando il file delle specifiche dell'applicazione:

{ “id”: “/my-service”, “networks”: [ { “mode”: “container/bridge” } ] }

Questo esempio mostra come impostare una rete utilizzando il comando add dell'app dcos marathon:
$ app maratona dcos add { “id”: “/my-service”, “networks”: [ { “mode”: “container/bridge” } ] }
Per ulteriori informazioni sulle reti, vedere Reti nella documentazione di Marathon.

Vincoli di runtime sulle risorse

"Vincoli di runtime sulle risorse" è un parametro Docker che controlla la gestione delle risorse per un contenitore in esecuzione. Questo parametro consente di limitare l'utilizzo della CPU, l'impronta della memoria e il file system per un contenitore.

Vincoli di memoria utente

La maggior parte dei parametri Docker sono dedicati alla gestione della memoria principale. Viene utilizzato principalmente per l'esecuzione di contenitori e immagini. Ci sono anche alcuni altri parametri per la configurazione della rete e altri Risorse verontwortlich sind.

La memoria principale di Docker è molto limitata. Quindi, se vuoi creare un contenitore o un'immagine, devi specificare questi parametri. In caso contrario, potresti riscontrare problemi di prestazioni o errori di download delle immagini.

Se desideri aumentare lo spazio di archiviazione di un contenitore, puoi eseguire il seguente comando:

docker esegui -it –memory=”4g” ubuntu /bin/bash

Questo comando crea un nuovo contenitore con 4 GB di RAM. Se hai bisogno di più memoria, puoi aumentare il valore di conseguenza.

In alternativa, puoi eseguire il comando seguente per creare un'immagine con più memoria:

docker build –memory="4g" -t mia_immagine .

Questo comando crea una nuova immagine con 4 GB di RAM. Se hai bisogno di più memoria, puoi aumentare il valore di conseguenza.

Vincoli di memoria del kernel

I vincoli di memoria del kernel sono un parametro importante per Docker. Determinano la quantità di memoria del kernel che un contenitore può utilizzare. Se non si specifica il valore di questo parametro, verrà utilizzato il valore predefinito.

Se vuoi modificare il valore del parametro della memoria del kernel, devi prima trovare il valore corrente. Questo può essere fatto usando il comando “docker info”. È quindi possibile specificare il nuovo valore desiderato.

Tieni presente che la modifica di questo parametro potrebbe richiedere il riavvio del contenitore.

Vincolo di Swapiness

L'impostazione swappiness è un valore compreso tra 0 e 100 che determina la frequenza con cui il sistema scrive il contenuto della memoria nello spazio di swap. Un valore elevato di swappiness significa che lo scambio avviene più frequentemente e viceversa. Il valore predefinito è 60. Per banche dati In genere si consiglia una swappiness inferiore per garantire che la memoria rimanga in memoria il più a lungo possibile.

Vincolo di condivisione della CPU

La condivisione dell'utilizzo della CPU è un costrutto integrato nel kernel Linux che Docker utilizza per garantire che un contenitore non utilizzi un numero di core superiore a quello specificato. Ciò è importante per l'isolamento tra i contenitori e l'host, nonché per l'affidabilità dell'intero sistema.

Vincolo CPUset

Un vincolo CPUset pone un limite al numero di CPU che un contenitore può utilizzare. Ciò è utile per garantire che un contenitore non interferisca con altri contenitori sul sistema host.

Vincolo di quota CPU

La limitazione della quota della CPU (cgroup_cpu_shares) è una funzionalità del kernel Linux che consente di limitare l'utilizzo della CPU tra diversi processi. Questo parametro può essere specificato in Docker utilizzando il comando “–cpu-shares”.

Ad esempio, se si specifica un valore pari a 512, il contenitore riceverà il doppio del tempo CPU rispetto a un contenitore con un valore pari a 256. Pertanto, specificare un valore elevato non significa necessariamente che il contenitore riceverà più tempo CPU, ma solo in relazione a altri contenitori con valori inferiori.

Blocca il vincolo della larghezza di banda IO (Blkio).

La limitazione della larghezza di banda di I/O bloccata è uno strumento che consente di limitare la larghezza di banda della velocità effettiva di I/O per un contenitore. Ciò è utile per garantire che un contenitore non sovraccarichi altri contenitori sull'host. La larghezza di banda del blocco IO viene misurata in byte al secondo e può essere impostata per tutti i dispositivi o per un dispositivo specifico.

–blkio-peso

Il peso blkio indica la quantità di larghezza di banda I/O che un contenitore riceve dall'intero sistema. Ad esempio, se specifichi un valore pari a 100, il contenitore riceverà il doppio della larghezza di banda I/O rispetto a un altro contenitore con il valore predefinito di 50. Questo parametro è utile se desideri garantire che un particolare contenitore raggiunga prestazioni ottimali.

Gruppi aggiuntivi

Se desideri eseguire più servizi in un singolo contenitore, puoi creare gruppi aggiuntivi. Ciò è utile se, ad esempio, si desidera eseguire un server Web e un server database in un unico contenitore. Per creare un gruppo aggiuntivo, aggiungi il seguente comando al comando docker run: –group-add .

Privilegi di runtime e funzionalità Linux

Il "privilegio di runtime" è una funzione principale di Linux che consente di modificare determinate autorizzazioni durante il runtime. Ciò è particolarmente utile quando un'applicazione richiede autorizzazioni diverse per l'avvio o l'esecuzione.

Puoi utilizzare questa funzione con il comando “sudo”. Ad esempio: sudo chmod 777 /percorso/del/file. Questo comando fornisce a tutti gli utenti l'accesso completo al file specificato.
Tuttavia, ci sono alcune limitazioni riguardanti la funzione sudo. Ad esempio, gli utenti non possono modificare le autorizzazioni di cui non dispongono già. Si tratta di una precauzione di sicurezza per impedire agli utenti di assumere autorizzazioni che non dovrebbero avere.

Un altro svantaggio della funzione sudo è che deve essere eseguita nuovamente per ogni comando. Se un utente deve eseguire spesso comandi con permessi diversi, ciò può essere molto fastidioso.

Linux Capabilities è un'estensione del kernel Linux che consente di impostare autorizzazioni specifiche Programma e domande da assegnare. Ciò consente agli utenti di impostare le autorizzazioni per un programma o un'applicazione e modificare tali autorizzazioni se necessario.

Molto più flessibile della funzione sudo, Linux Capabilities consente agli utenti di ottimizzare le autorizzazioni su un programma o un'applicazione. Ad esempio, un utente con funzionalità Linux può impostare le autorizzazioni in modo che un programma possa accedere solo ai file in lettura. Ciò è molto utile per garantire che un programma non apporti modifiche ai file che non dovrebbe.

Linux Capabilities è anche molto più user-friendly rispetto alla funzione sudo. Con Funzionalità Linux non è necessario impostare le autorizzazioni per ogni comando. È possibile semplicemente installare un programma o un'applicazione e quindi impostare le autorizzazioni per quel programma o applicazione.

Driver di registrazione (–log-driver)

Quando crei un'immagine Docker, puoi specificare quale driver di registrazione utilizzare. Il driver di registrazione predefinito è "json-file". Tuttavia, ci sono molte altre opzioni. Alcuni esempi sono syslog, journald e fluente.

È possibile specificare il driver di registrazione con il parametro “–log-driver”. Ad esempio, se desideri utilizzare il driver di registrazione syslog, puoi farlo in questo modo:

esegui la finestra mobile –log-driver=syslog…

Questo parametro è molto utile se desideri archiviare i log dei tuoi contenitori in un sistema di logging centralizzato.

Sostituire le impostazioni predefinite dell'immagine Dockerfile

Quando crei una nuova immagine Docker, puoi sovrascrivere le impostazioni predefinite per quell'immagine. Ciò è utile se desideri modificare impostazioni specifiche senza ricostruire l'intera immagine. Ad esempio, puoi modificare il nome utente predefinito per una nuova immagine senza ricostruire l'intera immagine.

Per modificare i valori predefiniti per una nuova immagine Docker, devi prima creare un file chiamato “.dockerignore” nella directory del tuo progetto. In questo file dovresti specificare tutte le directory e i file che dovrebbero essere ignorati durante la creazione dell'immagine. Dopo aver creato questo file, puoi eseguire i seguenti comandi per creare la tua immagine:

docker build -t tuo_nome_immagine .
Questo comando crea una nuova immagine Docker denominata "your_image_name" e sovrascrive eventuali valori definiti predefiniti.

Conclusione

I migliori parametri Docker dipendono in gran parte dalle tue esigenze. In questo articolo abbiamo introdotto alcuni dei parametri più importanti rilevanti per la maggior parte dei casi d'uso. Naturalmente, ci sono molte altre fantastiche opzioni non menzionate in questo articolo. Prenditi il ​​tempo necessario per ricercare tutte le opzioni e vedere quali funzionano meglio per te!

Hinweis..è importante!

Tutti i siti esterni collegati a questo sito Web sono fonti indipendenti. 
Questi collegamenti non sono sponsorizzati e non è stato ricevuto alcun contributo finanziario per la loro inclusione. 
Tutte le informazioni su questo sito Web sono fornite senza garanzia.
Questo sito è un progetto privato di Jan Domke e riflette esclusivamente opinioni ed esperienze personali.

Jan Domke

Ingegnere rapido | Responsabile dei social media | Responsabile dell'hosting | Amministratore web

Gestisco privatamente la rivista online dalla fine del 2021 SEO4Business e così ho trasformato il mio lavoro in un hobby.
Lavoro come assistente dal 2019 Senior Hosting Manager, in una delle più grandi agenzie Internet e di marketing in Germania e espando costantemente i miei orizzonti.

Jan Domke