- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
Docker Compose 사용하기
지금까지 Dockerfile로 이미지를 생성해보았습니다. Docker에서는 여러 컨테이너를 손쉽게 생성할 수 있도록 Docker Compose라는 기능을 제공합니다.
예를 들어 다음과 같이 app 컨테이너와 MySQL 컨테이너 두 개를 생성하고, app 컨테이너에서 MySQL 데이터베이스에 접속하도록 구성할 수 있습니다.
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>
다음과 같은 에러가 표시된다면 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
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')
})
{
"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
저작권 안내
이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.- 블로그, 게시판 등에 퍼가는 것을 금지합니다.
- 비공개 포스트에 퍼가는 것을 금지합니다.
- 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
- 링크 및 SNS 공유는 허용합니다.