DanLevy.net

Configurazione del serverDocker

Avvia i server di database con un singolo comando

Hero image for Configurazione del serverDocker

Docker Server Setup

Nota storica: questo è un riferimento di sviluppo locale del 2015. È utile per comprendere il vecchio flusso di lavoro, ma non trattare questi snippet come consigli attuali per la produzione. Oggi i file Docker Compose moderni, le reti personalizzate, le versioni di immagine fissate, l’autenticazione, i segreti e l’automazione degli aggiornamenti revisionata sono impostazioni di default più sicure.

A chi è destinata questa guida?

Non lasciare che questi motivi ti ostacolino di nuovo!

Collegamenti rapidi ai 1‑liner

Questo articolo presenta comandi a una riga per avviare alcuni dei database più popolari, tra cui:

PostgreSQL icon Postgres

MongoDB icon MongoDB

MySQL icon MySQL

Elastic icon ElasticSearch

Nota: questi comandi sono stati scritti come scorciatoie per lo sviluppo locale. Se li adatti a un ambiente di produzione, aggiungi prima autenticazione, gestione dei segreti, backup, policy di rete, immagini fissate e un piano di aggiornamento.

Utenti Docker avanzati: se sei pratico di docker-compose, potresti voler convertire i comandi shell qui sotto per usarli nei tuoi file docker-compose.yml.

Server Postgres

Avvia un container, chiamandolo pg-localhost

Terminal window
# Store db files on a local path, outside the container
mkdir -p $HOME/.postgres-data
docker run \
--name pg-localhost \
-p 127.0.0.1:5432:5432 \
-e POSTGRES_PASSWORD=password \
--restart unless-stopped \
-it \
--shm-size=256mb \
postgres:16-alpine \
postgres -c 'listen_addresses=*' \
-c 'password_encryption=scram-sha-256' \
-c 'shared_memory_type=sysv' \
-c 'shared_buffers=256MB' \
-c 'max_connections=200'

Regola le opzioni della riga di comando secondo necessità. (Gli argomenti del demone postgres iniziano subito dopo il nome dell’immagine Docker postgres:16-alpine. Vedi postgres -c 'listen_addresses=*'...)

Accedi al prompt psql come utente postgres

Terminal window
docker exec --user postgres -it pg-localhost psql

Accedi alla shell del container come root

Terminal window
docker exec -it pg-localhost bash

Nota: Il comando sopra utilizza le immagini di base ufficiali Alpine Linux. Non è il tipico ambiente Debian.

Per usare l’immagine di base debian/ubuntu, sostituisci postgres:12-alpine con postgres:12.

Server MongoDB

Terminal window
mkdir -p $HOME/.mongodb/data
docker run -d \
--name mongodb \
--restart on-failure:5 \
-p 127.0.0.1:27017:27017 \
-v $HOME/.mongodb:/data \
mongo:7 \
bash -c 'mongod --bind_ip 0.0.0.0'

Ora che il server è avviato, verifica che i dati siano in $HOME/.mongodb con:

Terminal window
ls -lach $HOME/.mongodb

Colleghiamoci al server usando lo strumento da riga di comando mongosh. (Se non lo hai installato, vedi sotto.)

Terminal window
#> Usa gli argomenti predefiniti:
mongosh

E dovresti vedere qualcosa di simile:

Preview of mongo shell output

Configurazione degli strumenti CLI di Mongo

Uso di brew su macOS
Terminal window
brew tap mongodb/brew
brew install mongodb-community-shell

Server MySQL

AVVERTENZA: MODIFICA LA PASSWORD NELLA VARIABILE MYSQL_ROOT_PASSWORD QUI SOTTO.

Terminal window
mkdir -p $HOME/.mysql
docker run -d \
-v $HOME/.mysql:/var/lib/mysql \
-p 127.0.0.1:3306:3306 \
--name mysql-$USER \
-e MYSQL_DATABASE=$USER \
-e MYSQL_ROOT_HOST='172.*.*.*' \
-e MYSQL_ROOT_PASSWORD='p@ssw0rd' \
mysql/mysql-server:8

Server ElasticSearch

Terminal window
mkdir -p $HOME/.elastic
docker run -d \
--name elastic \
-p 127.0.0.1:9200:9200 \
-p 127.0.0.1:9300:9300 \
-v $HOME/.elastic:/data \
docker.elastic.co/elasticsearch/elasticsearch:8.15.5 bash -c 'elasticsearch --cluster.name elastic_cluster --node.name elastic01 --path.data /data/elastic-data --path.logs /data/elastic-logs '
Note di sicurezza

NOTA: l’opzione di porta -p 127.0.0.1:27017:27017 impedisce l’accesso alla tua istanza se non dal network localhost del server Docker.
Per “pubblicare” le porte esposte, rimuovi il prefisso IP locale per consentire l’accesso esterno: -p 27017:27017. Assicurati di aver adottato le precauzioni di sicurezza necessarie.

Consigliato: Usa sempre uno strumento di scansione delle porte (come nmap o masscan) per verificare la configurazione di rete (da un sistema separato su un’altra rete).

Ora che hai i comandi per avviare i tuoi server di database, il passo successivo è impacchettare la tua applicazione come immagine Docker. Parte 2 continua qui sotto:

Impacchettare un’app Web NodeJS

  1. Aggiungi un file vuoto chiamato Dockerfile nella radice del progetto.
  2. (Opzionale, consigliato) Aggiungi un .dockerignore usando le regole di .gitignore per escludere percorsi non essenziali e di grandi dimensioni. Per impostazione predefinita vengono inclusi tutti i file del progetto.

Crea un Dockerfile nella radice delle tue app

# Example for NodeJS
FROM node:22
EXPOSE 3000
COPY . /app/
WORKDIR /app
RUN apt-get update && apt-get dist-upgrade -yqq
RUN ["npm", "install"]
# Overridable Command
CMD ["npm", "start"]

È più semplice mostrare come avviare il Dockerfile e dimostrare i risultati tramite console (vedi i comandi sotto).

Nel terminale, cd nella cartella del progetto ed esegui il comando build ogni volta che distribuisci modifiche — o desideri cambiare/aggiornare il SO o la configurazione dell’ambiente.

Terminal window
docker build -t app-name-here .

Riferimento ai Comandi Chiave di Docker

Costruire l’Immagine Docker

Terminal window
docker build -t app-name-here .

Creare/Eseguire l’Applicazione Web con Collegamenti ai Server DB

Terminal window
docker network create app-local
docker network connect app-local mongodb
docker network connect app-local elastic
docker run -d --name webapp01 --network app-local -p 3000:3000 app-name-here

Eseguire in Modalità Interattiva (non daemon, nel terminale)

Terminal window
docker run -it --name webapp01 --network app-local -p 3000:3000 app-name-here bash

Eliminare Istanza del Container o Immagine

Importante: tutti i dati non salvati su un percorso di volume montato verranno persi!!

Terminal window
# Eliminare Immagine
docker rmi -f app-name-here
docker rm -f webapp01
# ora riesegui il tuo `docker run...` dal punto ^^^
# Per esempio, per terminare le istanze DB sopra, esegui: (inizia con qualcosa tipo `docker stop {mongo,elastic}`)
docker rm -f mongo elastic