Skip to main content

08A. docker run으로 컨테이너 생성하기

About 2 minDevOpsDockercrashcoursepyrasis.comdockerdevops

08A. docker run으로 컨테이너 생성하기 관련

목차

언제나 최신 Docker

08. Docker Compose 사용하기
언제나 최신 Docker

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.jspackage.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

이찬희 (MarkiiimarK)
Never Stop Learning.