08A. docker run์ผ๋ก ์ปจํ ์ด๋ ์์ฑํ๊ธฐ
08A. docker run์ผ๋ก ์ปจํ ์ด๋ ์์ฑํ๊ธฐ ๊ด๋ จ
Docker Compose๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ๋จผ์ docker run
๋ช
๋ น์ผ๋ก MySQL ์ปจํ
์ด๋๋ฅผ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค. ์ฌ๊ธฐ์๋ --link
์ต์
๋์ docker network create
๋ช
๋ น์ผ๋ก ๋คํธ์ํฌ๋ฅผ ์์ฑํ์ฌ app
์ปจํ
์ด๋๊ฐ MySQL ์ปจํ
์ด๋์ ์ ๊ทผํ ์ ์๋๋ก ํ๊ฒ ์ต๋๋ค.
sudo docker network create example-network
sudo docker run -d --name mysql --network example-network -v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=examplepassword \
-e MYSQL_DATABASE=db \
mysql:5.7
์ด์ mysql
๋ช
๋ น์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํด๋ณด๊ฒ ์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด docker exec
๋ช
๋ น์ ์ฌ์ฉํ์ฌ mysql ์ปจํ
์ด๋ ์์ mysql
๋ช
๋ น์ ์คํํฉ๋๋ค. Enter password:
๊ฐ ํ์๋๋ฉด examplepassword
๋ฅผ ์
๋ ฅํฉ๋๋ค.
sudo docker exec -it mysql mysql -u root -p
#
# Enter password:
# Welcome to the MySQL monitor. Commands end with ; or \g.
# Your MySQL connection id is 2
# Server version: 5.7.39 MySQL Community Server (GPL)
#
# Copyright (c) 2000, 2022, Oracle and/or its affiliates.
#
# Oracle is a registered trademark of Oracle Corporation and/or its
# affiliates. Other names may be trademarks of their respective
# owners.
#
# Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
#
# mysql>
Note
๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ํ์๋๋ค๋ฉด MySQL์ด ์์ ํ ์คํ๋์ง ์์ ๊ฒ์ด๋ ์ ์ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ค์ ์๋ํด๋ณด์ธ์.
# ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
mysql>
ํ๋กฌํํธ๊ฐ ํ์๋๋ฉด ๋ค์ SQL ์ฟผ๋ฆฌ๋ฅผ ์
๋ ฅํ์ฌ Users
ํ
์ด๋ธ์ ์์ฑํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ exit
๋ฅผ ์
๋ ฅํ์ฌ ํ๋กฌํํธ์์ ๋น ์ ธ๋์ต๋๋ค.
mysql> USE db;
#
# Database changed
mysql> CREATE TABLE Users (id VARCHAR(100) NOT NULL, password VARCHAR(100) NOT NULL, PRIMARY KEY (id));
#
# Query OK, 0 rows affected (0.76 sec)
mysql> exit
#
# Bye
๊ทธ๋ฆฌ๊ณ app
์ปจํ
์ด๋๋ฅผ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค. app
๋๋ ํฐ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ๋ค์ ๋ด์ฉ์ app.js
์ package.json
ํ์ผ๋ก ์ ์ฅํฉ๋๋ค.
mkdir app
cd app
.
app/
app.js
const express = require('express')
const mysql = require('mysql')
const app = express()
const connection = mysql.createConnection({
host: process.env.MYSQL_HOST,
user: process.env.MYSQL_USER,
password: process.env.MYSQL_PASSWORD,
database: process.env.MYSQL_DB
})
app.get('/', (req, res) => {
connection.query("INSERT INTO Users (id, password) VALUES ('hellouser', 'examplepassword');", (error, rows, fields) => {
connection.query('SELECT * from Users;', (error, rows, fields) => {
console.log(rows)
res.send(rows[0])
})
})
})
app.listen(8080, () => {
console.log('Express server listening on port 8080')
})
.
app/
package.json
{
"name": "app",
"version": "1.0.0",
"dependencies": {
"express": "^4.18.1",
"mysql": "^2.18.1"
}
}
์ด์ node:16-alpine
์ด๋ฏธ์ง๋ก app.js
ํ์ผ์ ์คํํด๋ณด๊ฒ ์ต๋๋ค.
sudo docker run -it --name app -p 8080:8080 -w /app -v ~/app:/app --network example-network \
-e MYSQL_HOST=mysql \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=examplepassword \
-e MYSQL_DB=db \
node:16-alpine sh -c "npm install && node app.js"
์น ๋ธ๋ผ์ฐ์ ์์ http://<์ปจํ
์ด๋ IP ์ฃผ์ ๋๋ ๋๋ฉ์ธ>:8080
์ผ๋ก ์ ์ํด๋ด
๋๋ค(Docker Desktop์์ ์คํํ๋ค๋ฉด http://127.0.0.1:8080
์
๋๋ค).
๋ค์๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ํ์๋๋ฉด MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ณ ์ฝ์ด์จ ๊ฒ์ ๋๋ค.
{"id":"hellouser","password":"examplepassword"}
์ ์ปจํ
์ด๋๋ Ctrl+C๋ก ์ ์ง๋์ง ์์ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ Ctrl+P, Ctrl+Q๋ฅผ ์ฐจ๋ก๋๋ก ์
๋ ฅํ์ฌ ์ปจํ
์ด๋์์ ๋น ์ ธ๋์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ app
, mysql
์ปจํ
์ด๋๋ฅผ ์ญ์ ํฉ๋๋ค.
sudo docker rm -f app
sudo docker rm -f mysql