이재홍의 언제나 최신 Docker - Unit 8. Docker Compose 사용하기

저작권 안내
  • 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
  • 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.

Docker Compose 사용하기

이재홍 http://www.pyrasis.com

지금까지 Dockerfile로 이미지를 생성해보았습니다. Docker에서는 여러 컨테이너를 손쉽게 생성할 수 있도록 Docker Compose라는 기능을 제공합니다.

예를 들어 다음과 같이 app 컨테이너와 MySQL 컨테이너 두 개를 생성하고, app 컨테이너에서 MySQL 데이터베이스에 접속하도록 구성할 수 있습니다.

그림 8-1 Docker Compose로 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
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

저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

2022-10-03