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
Jos haluat muokata koodiasi ja nähdä muutokset, sinun täytyy poistaa image ja kontti. Joten se on hyvin hidasta. Joten voit käyttää nodemonia node.js-sovelluksen käynnistämiseen. Nodemon tarkkailee js-tiedostoja, ja jos ne muuttuvat, sovellus käynnistyy uudelleen.
docker-compose down -v
{
"name": "express",
"version": "1.0.0",
"description": "",
"license": "ISC",
"author": "",
"type": "commonjs",
"main": "app.js",
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js"
},
"dependencies": {
"express": "^5.1.0",
"mysql2": "^3.3.2",
"dotenv": "^16.3.1"
},
"devDependencies": {
"nodemon": "^2.0.22"
}
}
RUN npm install && npm install nodemon -g
services:
app:
command: npm run dev # tai index.js — käytä projektisi entrypointia
environment:
NODE_ENV: development # override: dev-tila
volumes:
- .:/usr/src/app # mounttaa projektin konttiin
- /usr/src/app/node_modules # estää node_modulesin ylikirjoituksen
{
"watch": ["."],
"ext": "js,json",
"ignore": ["node_modules"],
"legacyWatch": true,
"verbose": true
}
Nyt kehityksessä voit käynnistää kontin alla olevalla komennolla
docker-compose up --buildJa tuotannossa voit käynnistää kontin alla olevalla komennolla
docker compose -f docker-compose.yml up --buildTuotannossa docker-compose.override.yml-tiedostoa ei oteta käyttöön, koska se sisältää vain kehitystä varten tarkoitetut asetukset. Se käynnistää sovelluksen Nodemonilla, asettaa NODE_ENV-arvoksi development ja liittää paikallisen lähdekoodin konttiin bind mountina. Tuotannossa sovellus käynnistetään sen sijaan Dockerfileen määritetyllä tuotantokomennolla, ja käytössä on imageen rakentamisen aikana kopioitu, muuttumaton sovelluskoodi. Tämä tekee tuotantoympäristöstä ennakoitavamman ja vähentää kehitysasetuksista aiheutuvia tietoturvariskejä. Valitsimella -f docker-compose.yml varmistetaan, ettei Compose lataa override-tiedostoa automaattisesti.