Julkaise sovellus Docker Composella VPS:llä näin: asenna Docker Engine ja Compose-laajennus, sijoita compose.yaml- ja .env-tiedostot projektihakemistoon, aja docker compose up -d ja aseta eteen käänteinen välityspalvelin, kuten Caddy, HTTPS:ää varten. Päivitykset hoituvat sen jälkeen komennolla docker compose pull && docker compose up -d.
Tässä oppaassa rakennetaan pieni mutta realistinen kokonaisuus: verkkosovellus, Postgres-tietokanta ja Caddy automaattista HTTPS:ää varten, Ubuntu 24.04:llä tai Debian 12:lla.
1. Valmistele palvelin
Aloita palvelimella, jolle on tehty ensimmäiset askeleet: päivitykset, sudo-käyttäjä, SSH-avaimet ja palomuuri. Tälle kokonaisuudelle 2 GB muistia on järkevä vähimmäismäärä.
Osoita DNS-tietue palvelimeen ennen aloittamista, jotta HTTPS toimii heti ensimmäisellä yrityksellä:
app.example.com. A 203.0.113.10 ; esimerkkiosoite
app.example.com. AAAA 2001:db8::10 ; esimerkkiosoite
2. Asenna Docker Engine ja Compose
Käytä Dockerin omaa pakettivarastoa; jakeluiden paketit ovat usein vanhempia.
sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
. /etc/os-release
sudo curl -fsSL "https://download.docker.com/linux/$ID/gpg" -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
https://download.docker.com/linux/$ID $VERSION_CODENAME stable" | \
sudo tee /etc/apt/sources.list.d/docker.list >/dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
$ID on ubuntu tai debian, joten samat rivit toimivat molemmissa. Tarkista:
sudo docker run --rm hello-world
docker compose version
Anna käyttäjällesi oikeus ajaa Dockeria ilman sudoa (kirjaudu sen jälkeen ulos ja takaisin sisään):
sudo usermod -aG docker $USER
Jäsenyys docker-ryhmässä vastaa käytännössä root-oikeuksia. Lisää ryhmään vain luotettuja käyttäjiä.
Oikotie: Wolkran Docker-sovellus yhdellä klikkauksella asentaa Docker CE:n ja Composen puolestasi.
3. Järjestä projekti
mkdir -p ~/apps/myapp && cd ~/apps/myapp
Selkeä rakenne tekee palvelimesta helposti ymmärrettävän vielä kuukausien päästä:
~/apps/myapp/
├── compose.yaml
├── .env # salaisuudet, ei gitiin
└── Caddyfile
4. Kirjoita compose.yaml
services:
app:
image: ghcr.io/example/myapp:1.4.2
restart: unless-stopped
env_file: .env
environment:
DATABASE_URL: postgres://myapp:${POSTGRES_PASSWORD}@db:5432/myapp
depends_on:
db:
condition: service_healthy
expose:
- "3000"
db:
image: postgres:16
restart: unless-stopped
environment:
POSTGRES_USER: myapp
POSTGRES_DB: myapp
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- db-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U myapp"]
interval: 10s
retries: 5
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy-data:/data
- caddy-config:/config
volumes:
db-data:
caddy-data:
caddy-config:
Huomionarvoista:
- Lukitse levykuvien versiot (
1.4.2,16), jotta uudelleenkäynnistys ei koskaan hae yllättävää pääversiopäivitystä. expose, eiports, sovellukselle ja tietokannalle. Ne ovat tavoitettavissa vain Compose-verkon sisällä. Vain Caddy julkaisee portteja.- Nimetyt volyymit säilyttävät datan, kun kontit luodaan uudelleen.
depends_onterveystarkistuksella odottaa, että Postgres ottaa yhteyksiä vastaan.
Korvaa ghcr.io/example/myapp omalla levykuvallasi ja portillasi.
5. Tallenna salaisuudet .env-tiedostoon
cat > .env <<EOF
POSTGRES_PASSWORD=$(openssl rand -hex 24)
APP_SECRET=$(openssl rand -hex 32)
EOF
chmod 600 .env
Compose lukee projektihakemiston .env-tiedoston ${...}-korvauksia varten, ja env_file välittää sen sovellukselle. Lisää .env tiedostoon .gitignore, jos hakemisto on git-työkopio.
6. Lisää HTTPS Caddylla
Luo Caddyfile:
app.example.com {
encode zstd gzip
reverse_proxy app:3000
}
Caddy hakee ja uusii varmenteen automaattisesti heti, kun DNS osoittaa palvelimeen ja portit 80 ja 443 ovat auki. Lisää vaihtoehtoja löydät Caddy-välityspalvelinoppaasta.
7. Käynnistä kokonaisuus
docker compose up -d
docker compose ps
docker compose logs -f caddy
Kun Caddy kirjaa lokiin certificate obtained successfully, avaa https://app.example.com.
8. Muista palomuuri
Docker lisää iptables-sääntöjä, jotka käsitellään ennen UFW:tä. Portti, joka on julkaistu ports:-määrityksellä, on tavoitettavissa internetistä, vaikka UFW väittäisi sen olevan estetty. Kolme tapaa pysyä turvassa:
- Julkaise vain käänteinen välityspalvelin (kuten yllä).
- Sido kaikki muu localhostiin:
"127.0.0.1:5432:5432". - Suodata palvelimen edessä pilvipalomuurilla, jota Docker ei voi ohittaa. Salli portit 80 ja 443 kaikkialta ja portti 22 vain omasta osoitteestasi.
9. Päivitä ilman draamaa
Vaihda levykuvan tagi tiedostossa compose.yaml ja aja sitten:
docker compose pull
docker compose up -d
docker image prune -f
Compose luo uudelleen vain ne palvelut, joiden levykuva tai määritys on muuttunut. Palataksesi edelliseen versioon aseta vanha tagi ja aja up -d uudelleen. Ota tilannevedos ennen suuria päivityksiä, kuten Postgresin uutta pääversiota, joka vaatii vedoksen ja palautuksen.
10. Varmuuskopioi data
Volyymit sijaitsevat hakemistossa /var/lib/docker/volumes. Tietokannalle looginen vedos on turvallisempi kuin tiedostojen kopioiminen:
docker compose exec -T db pg_dump -U myapp myapp | gzip > ~/backups/myapp-$(date +%F).sql.gz
Aja tämä cronista joka yö ja kopioi tiedostot pois palvelimelta. Palvelintason varmuuskopiot auttavat myös: Wolkrassa päivittäiset varmuuskopiot maksavat 20 % palvelimen hinnasta ja säilyttävät 7 palautuspistettä. Varmuuskopiointistrategiaopas kokoaa kaiken yhteen.
11. Lokit ja rajat
Dockerin oletuslokit kasvavat rajatta. Rajoita ne yleisesti tiedostossa /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" }
}
Aja sitten sudo systemctl restart docker. Voit myös rajoittaa palvelukohtaista muistia asetuksella mem_limit: 512m, jotta yksi kontti ei voi viedä muilta kaikkea muistia.
12. Käynnistys koneen käynnistyessä
restart: unless-stopped yhdessä käytössä olevan Docker-palvelun kanssa tarkoittaa, että kokonaisuus palaa uudelleenkäynnistyksen jälkeen. Testaa se kerran:
sudo reboot
# kirjaudu uudelleen sisään
docker compose -f ~/apps/myapp/compose.yaml ps
13. Julkaise CI:stä
Kun kokonaisuus toimii, julkaisut voivat olla automaattisia. CI-työ kääntää ja lähettää levykuvan uudella tagilla, yhdistää sitten palvelimeen SSH:lla ja ajaa:
cd ~/apps/myapp
sed -i 's|myapp:.*|myapp:1.4.3|' compose.yaml
docker compose pull app
docker compose up -d app
Anna CI-työlle oma SSH-avain, joka on rajattu tähän palvelimeen, kuten SSH-avainoppaassa kuvataan.
Milloin kasvaa yhtä palvelinta suuremmaksi
Compose yhdellä palvelimella vie pitkälle. Kun tarvitset enemmän, tavalliset seuraavat askeleet ovat:
- siirrä tietokanta omalle palvelimelleen yksityisverkkoon;
- aja kahta sovelluspalvelinta kuormantasaajan takana;
- säilytä data lohkotallennuslevyllä, jonka voit siirtää palvelimelta toiselle.
Jos haluat hallita monia sovelluksia verkkokäyttöliittymän kautta, Coolify-sovellus yhdellä klikkauksella rakentuu samalle Docker-pohjalle. Lisää ideoita löydät sivulta Docker-hosting.
Usein kysytyt kysymykset
Riittääkö Docker Compose tuotantokäyttöön?
Yhdellä palvelimella kyllä. Monet pienet ja keskisuuret sovellukset pyörivät Composella vuosia. Siirry orkestrointityökaluun vasta, kun tarvitset useita palvelimia, automaattista vikasietoisuutta tai porrastettuja päivityksiä usean koneen yli.
Kuinka ison VPS:n tarvitsen Docker Composelle?
Laske yhteen, mitä kukin kontti käyttää. Verkkosovellus, Postgres ja Redis toimivat mukavasti 2–4 GB:n muistilla; jätä tilaa levykuvien käännöksille, jos käännät palvelimella.
Miksi UFW ei estä konttieni portteja?
Docker lisää omat iptables-sääntönsä, jotka käsitellään ennen UFW:tä. Julkaise portit osoitteeseen 127.0.0.1 ja aseta käänteinen välityspalvelin eteen, tai suodata liikenne pilvipalomuurilla.
Pitäisikö levykuvat kääntää palvelimella?
Pienissä projekteissa se toimii. Toistettavia julkaisuja varten käännä CI:ssä, lähetä levykuva rekisteriin ja hae se palvelimelle pelkällä pullilla.
Voinko jättää Dockerin asentamisen väliin?
Kyllä. Valitse Wolkrassa palvelinta luodessasi Docker CE -sovellus yhdellä klikkauksella; siinä Docker ja Compose-laajennus ovat valmiiksi asennettuina.