Tämä esimerkki näyttää, kuinka PostgreSQL-palvelinta ajetaan kontin sisällä.
Tässä tapauksessa sinun ei tarvitse luoda omaa Dockerfilea, koska virallinen postgres-image on jo saatavilla Docker Hubissa.
Imagen ylläpitää PostgreSQL-yhteisö, ja se sisältää kaiken esikonfiguroidun PostgreSQL-palvelimen ajamiseksi.
docker pull postgres:16
docker run --name docker_postgres -e POSTGRES_PASSWORD=root -p 5432:5432 -d postgres:16
docker exec -it docker_postgres psql -U postgres
Tämä esimerkki näyttää, kuinka MySQL-palvelinta ajetaan kontin sisällä.
Tässä tapauksessa sinun ei tarvitse luoda omaa Dockerfilea, koska virallinen mysql-image on jo saatavilla Docker Hubissa.
Imagen ylläpitää MySQL-tiimi ja se sisältää kaiken esikonfiguroidun MySQL-palvelimen ajamiseksi.
Voit ladata MySQL-imagen Docker Hubista ja käynnistää kontin alla olevilla komennoilla
docker pull mysql:8.1 docker run --name docker_mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:8.1Sitten voit yhdistää MySQL:ään alla olevalla komennolla
docker exec -it docker_mysql mysql -u root -p
Tässä esimerkissä luodaan Composen avulla PostgreSQL palvelin ja siihen tietokanta nimeltään netdb.
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
INSERT INTO users (name) VALUES ('Testikäyttäjä');
services:
db:
image: postgres:16
container_name: docker_postgres
restart: unless-stopped
environment:
POSTGRES_USER: netuser
POSTGRES_PASSWORD: netpass
POSTGRES_DB: netdb
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
- ./api/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
volumes:
postgres_data:
docker compose down -vVolyymin voi poistaa myös erikseen Dockerin volume-komennoilla tai Docker Desktopissa. Huomaa, että volyymin poistaminen hävittää tietokannan tiedot pysyvästi.
docker compose down -v docker compose up -dUusi volyymi luodaan ja päivitetty init.sql suoritetaan automaattisesti. Kaikki vanha tietokantadata menetetään.
docker exec -it docker_postgres psql -U netuser -d netdb -f /docker-entrypoint-initdb.d/init.sqlTällöin PostgreSQL ei kuitenkaan suorita tiedostoa alustusskriptinä, vaan tavallisena SQL-skriptinä olemassa olevaan tietokantaan.
docker-compose up -d
docker exec -it docker_postgres psql -U netuser -d netdb
MySQL-konttia luotaessa Docker Composea käytetään usein, koska se helpottaa asetuksia ja hallintaa. Sen sijaan, että kirjoittaisit pitkiä docker run -komentoja monilla vaihtoehdoilla (kuten portit, volyymit ja ympäristömuuttujat), Compose antaa sinun määrittää kaiken yksinkertaisessa docker-compose.yml-tiedostossa. Tämä tekee konfiguraatiosta selkeän, uudelleenkäytettävän ja helposti jaettavan. Se myös mahdollistaa MySQL:n (ja muiden liittyvien palveluiden, kuten sovelluskontin) käynnistämisen, pysäyttämisen ja hallinnan yhdellä komennolla.
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
INSERT INTO users (name) VALUES ('Testikäyttäjä');
services:
db:
image: mysql:latest # Käytä uusinta virallista MySQL-imagea Docker Hubista
container_name: docker_mysql # Kontin nimi helpompaa viittaamista varten
restart: always # Varmistaa, että kontti käynnistyy automaattisesti, jos se pysähtyy
environment:
MYSQL_DATABASE: netdb # Luo tietokannan nimeltä "netdb" kontin käynnistyessä
MYSQL_ROOT_PASSWORD: root # Asettaa root-salasanan MySQL:lle (pitäisi olla vahvempi tuotannossa)
ports:
- "3306:3306" # Yhdistää isäntäkoneen portin 3306 kontin porttiin 3306 (MySQL:n oletusportti)
volumes:
- my-db:/var/lib/mysql # Säilyttää tietokannan datan isäntäkoneella nimetyn volyymin kautta
- ./api/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
volumes:
my-db: # Määrittää nimetyn volyymin "my-db", jota käytetään pysyvään tallennukseen
docker compose down -v docker compose up -dTämä poistaa volyymin ja kaiken vanhan tietokantadatan. Jos data halutaan säilyttää, tee muutoksista erillinen migraatio tai varmista, että SQL-komennot voidaan suorittaa turvallisesti useita kertoja. Päivitetyn tiedoston voi suorittaa olemassa olevaan tietokantaan komennolla
docker exec -it docker_mysql mysql -u root -p netdb -e "source /docker-entrypoint-initdb.d/init.sql"
docker compose up --build
docker exec -it docker_mysql mysql -u root -D netdb -pRoot-salasana on root (tarkista yml-tiedosto)
mysql -h 127.0.0.1 -P 3306 -u root -p
Tämä esimerkki näyttää, kuinka luodaan Dockerfile ja ajetaan Express.js-sovellusta ja MySQL-palvelinta Docker-konteissa.
Esimerkissä tarvitaan sekä Dockerfile että Docker Compose, koska niillä on eri tehtävät:
Compose-tiedoston sovelluspalvelun build: . pyytää Composea rakentamaan sovellusimagen nykyisen kansion Dockerfilen avulla. MySQL-palvelulle omaa Dockerfilea ei tarvita, koska Compose lataa sille valmiin virallisen mysql-imagen. Molemmat palvelut voidaan sen jälkeen rakentaa ja käynnistää yhdellä Compose-komennolla.
npm init npm install express
const express = require('express');
const PORT = 3000;
const HOST = '0.0.0.0';
const app = express();
app.get('/', function(req, res) {
res.send('Server is running!');
});
app.get('/:fname', function(req, res){
res.send('Hello '+req.params.fname);
});
app.listen(PORT, HOST, function() {
console.log(`Running on http://${HOST}:${PORT}`);
});
{
"name": "express",
"version": "1.0.0",
"description": "",
"license": "ISC",
"author": "",
"type": "commonjs",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"express": "^5.1.0",
"mysql2": "^3.3.2",
"dotenv": "^16.3.1"
}
}
FROM node:20 # Aseta työskentelyhakemisto kontin sisälle WORKDIR /usr/src/app # Kopioi ensin vain package.json ja package-lock.json COPY package*.json ./ # Asenna projektin riippuvuudet RUN npm install # Kopioi loput sovelluksen koodista COPY . . # Paljasta portti, jolla sovellus toimii EXPOSE 3000 # Oletuskomento tuotantoon CMD ["npm", "start"]
node_modules/ npm-debug.log
Luo tiedosto nimeltä docker-compose.yml alla olevalla koodilla
services:
app:
build: .
container_name: express_app
ports:
- "3000:3000"
restart: always
environment:
NODE_ENV: production
db:
image: mysql:latest # Käytä uusinta virallista MySQL-imagea Docker Hubista
container_name: docker_mysql # Kontin nimi helpompaa viittaamista varten
restart: always # Varmistaa, että kontti käynnistyy automaattisesti, jos se pysähtyy
environment:
MYSQL_DATABASE: netdb # Luo tietokannan nimeltä "netdb" kontin käynnistyessä
MYSQL_ROOT_PASSWORD: root # Asettaa root-salasanan MySQL:lle (pitäisi olla vahvempi tuotannossa)
MYSQL_ROOT_HOST: "%" # ➜ Sallii root-kirjautumisen mistä tahansa hostista
ports:
- "3306:3306" # Yhdistää isäntäkoneen portin 3306 kontin porttiin 3306 (MySQL:n oletusportti)
volumes:
- my-db:/var/lib/mysql # Tietokantadata säilytetään konttien ulkopuolella Dockerin luomassa nimetyssä volyymissä
volumes:
my-db: # Määrittää nimetyn volyymin "my-db", jota käytetään pysyvään tallennukseen
docker-compose up --build
Kehitystyössä voit käyttää Compose Watchia: Compose tarkkailee paikallisia tiedostoja, kopioi koodimuutokset konttiin ja käynnistää kontin uudelleen. Tavalliset koodimuutokset eivät vaadi imagen rakentamista tai poistamista. Riippuvuuksien tai Dockerfilen muuttuessa Compose rakentaa imagen uudelleen ja luo sovelluskontin uudelleen.
Tässä käytetty sync+restart-toiminto edellyttää Docker Compose -versiota 2.23.0 tai uudempaa. Tarkista versio komennolla docker compose version. Pelkkä sync kopioisi tiedostot konttiin, mutta ei käynnistäisi tätä Express-sovellusta uudelleen.
npm start.
services:
app:
environment:
NODE_ENV: development
develop:
watch:
- action: sync+restart
path: .
target: /usr/src/app
ignore:
- node_modules/
- package.json
- package-lock.json
- Dockerfile
- .dockerignore
- docker-compose*.yml
- action: rebuild
path: package.json
- action: rebuild
path: package-lock.json
- action: rebuild
path: Dockerfile
- action: rebuild
path: .dockerignore
docker compose up --build --watch
node_modules-hakemistoa ei kopioida paikalliselta koneelta konttiin, vaan riippuvuudet asennetaan Dockerfilen avulla. Kun package.json tai package-lock.json muuttuu, rebuild-sääntö varmistaa, että riippuvuudet asennetaan uudelleen. Jos muutat Compose-tiedostoja, lopeta tarkkailu painamalla Ctrl+C ja suorita käynnistyskomento uudelleen.
Tätä työnkulkua varten ei tarvitse suorittaa docker compose down -v -komentoa. Sen -v-valitsin poistaisi myös esimerkin MySQL-tietokannan nimetyn datavolyymin.
Tuotannossa käynnistä sovellus komennolla
docker compose -f docker-compose.yml up --buildValitsimella -f docker-compose.yml varmistetaan, ettei Compose lataa kehityskäyttöön tarkoitettua docker-compose.override.yml-tiedostoa automaattisesti. Tuotannossa NODE_ENV säilyy arvossa production, tiedostoja ei tarkkailla ja sovellus käyttää imageen rakentamisen aikana kopioitua koodia.
Nodemon on vaihtoehto, jos haluat käynnistää uudelleen vain Node.js-prosessin kontin sisällä tai käyttää samaa kehitystapaa myös ilman Dockeria. Tässä esimerkissä Compose Watch hoitaa tiedostojen tarkkailun ja kontin uudelleenkäynnistyksen, joten Nodemonia ei tarvita. Lisätietoja: Dockerin Compose Watch -ohje.