본문 바로가기
Web 개발/FAST API (인프런 강의 내용)

2 실습1 MySQL 컨테이너 실행 (docker)

by yororing 2024. 4. 24.

00 개요

  • 목적: 프로젝트에서 데이터베이스를 사용하기 위해 Docker를 이용해 MySQL 데이터베이스를 동작시켜주는 실습 진행

01 docker 사용하기

1. docker 버전 확인

$ docker -v
Docker version 25.0.3, build 4debf41    # docker 버전
  • docker 버전이 출력되지 않거나 실행 중이지 않다고 뜨면 앞서 설치했던 docker desktop 프로그램이 정상적으로 동작 중인지 확인 필요

2. docker 컨테이너 동작시키기

$ docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=todos -e MYSQL_DATABASE=todos -d 
-v todos:/db --name todos mysql:8.0

1) 옵션 설명

  • -p 로컬호스트port번호:docker컨테이너port번호
    • : 포트를 매핑해주는 옵션
    • MySQL은 기본적으로 3306번 포트 사용
    • -p 옵션으로 3306:3306을 매핑 해주면 로컬 호스트의 3306번 포트와 docker 컨테이너 안의 3306번 포트가 연결이 됨
    • 그래서 우리가 3306번 포트로 어떤 데이터베이스 명령을 요청하게 되면 그게 docker 안까지 전달이 되어 MySQL에  적용됨
  • -e 환경배수=환경배수명
    • : 환경배수 옵션
    • MYSQL_ROOT_PASSWORD=todos
      • 우리는 실습에서 새 계정을 생성하지 않고 기본으로 있는 root 계정으로 사용할 것
      • 그러므로 mysql root 계정의 비밀번호 환경배수를 todos라고 지정해달라는 옵션
      • 그래서 우리가 root 계정을 통해 이후에 로그인 시 이때 적용한 todos를 비밀번호로 입력하면 됨
    • MYSQL_DATABASE=todos
      • mysql 데이터베이스 환경배수를 todos로 지정해달라는 옵션
      • docker 컨테이너 동작 시 우리가 todos라는 이름의 데이터베이스를 하나 생성해달라는 명령어
  • -d
    • : 'detatch'
    • 컨테이너가 백그라운드에서 동작하게 하도록 하는 옵션
  • -v volume명:/db
    • : 'volume'
    • 일반적으로 docker 컨테이너는 컨테이너 종료 시 데이터가 모두 삭제됨
    • 그러나 실습을 진행하는 동안 컨테이너를 내렸다 올렸다 할 것이기에 데이터가 삭제되는 것을 막기 위해 todos라는 volume을 생성하여 로컬 디바이스에 그 데이터를 남길 것
  • --name docker컨테이너명
    • : 동작시킬 docker 컨테이너의 이름을 지정해주는 옵션
    • 동작시킬 docker 컨테이너의 이름을 todos라고 지정
  • mysql:8.0
    • : 컨테이너를 동작시킬 때 사용할 docker 이미지 지정해주는 옵션
    • mysql의 8.0 공식 이미지를 사용한다는 명령어

2) 명령어 실행 시 설명

  • 위의 명령어 실행 시 현재 MySQL 8.0 이미지가 없기에 우선 docker hub에서 이미지를 다운로드함
$ docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=todos -e MYSQL_DATABASE=todos -d -v todos:/db --name todos mysql:8.0
Unable to find image 'mysql:8.0' locally
8.0: Pulling from library/mysql
bd37f6d99203: Pull complete
d2433cba0951: Pull complete
13702d9fe3c3: Pull complete
83bcc87284a1: Pull complete
c38d8660e1fa: Pull complete
7e1bc321f421: Pull complete
bddd54b9c549: Pull complete
4eaae1e844ac: Pull complete
5196e1e87d8f: Pull complete
6586d096303c: Pull complete
cf55ff1c80af: Pull complete
Digest: sha256:a532724022429812ec797c285c1b540a644c15e248579c6bfdf12a8fbaab4964
Status: Downloaded newer image for mysql:8.0
0c3283e9729292bed0704cabb953f82f6ba011578bd5c48144f1803658316ace
  • 이미지 다운로드 완료 시 방금 만든 todos 라는 docker 컨테이너를 동작시킴
  • 마지막으로 출력되는 id (여기선 '0c3283e9729292bed0704cabb953f82f6ba011578bd5c48144f1803658316ace') 가 로컬 컴퓨터에서 동작하는 docker 컨테이너의 id임

3. docker 컨테이너 상태/정보 확인

1) 컨테이너 정보 확인

# 문법
$ docker container ls [OPTIONS]

# Aliases
$ docker container list
$ docker container ps
$ docker ps
$ docker ps
CONTAINER ID   IMAGE       COMMAND                   CREATED         STATUS         PORTS                               NAMES
0c3283e97292   mysql:8.0   "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes   0.0.0.0:3306->3306/tcp, 33060/tcp   todos
  • docker ps 입력 시 0c32로 시작하는 컨테이너가 mysql:8.0 이미지를 이용하여 NAME=todos라는 이름으로 동작 중임을 확인

2) 컨테이너 로그 확인

# 문법
$ docker container logs [OPTIONS] CONTAINER

# Aliases
$ docker logs
  • docker logs todos 입력 시 todos 컨테이너의 로그 확인 가능
$ docker logs todos
2024-04-24 00:28:58+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.36-1.el8 started.
2024-04-24 00:28:58+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2024-04-24 00:28:58+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.36-1.el8 started.
2024-04-24 00:28:58+00:00 [Note] [Entrypoint]: Initializing database files
2024-04-24T00:28:58.328813Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
2024-04-24T00:28:58.328882Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.36) initializing of server in progress as process 80
2024-04-24T00:28:58.339508Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 
2024-04-24T00:28:59.498663Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.   
2024-04-24T00:29:02.778186Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
2024-04-24 00:29:10+00:00 [Note] [Entrypoint]: Database files initialized
2024-04-24 00:29:10+00:00 [Note] [Entrypoint]: Starting temporary server
2024-04-24T00:29:10.680645Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
2024-04-24T00:29:10.681327Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.36) starting as process 124
2024-04-24T00:29:10.696003Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 
2024-04-24T00:29:10.886563Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.   
2024-04-24T00:29:11.271526Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2024-04-24T00:29:11.271585Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2024-04-24T00:29:11.281436Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
2024-04-24T00:29:11.301566Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: /var/run/mysqld/mysqlx.sock
2024-04-24T00:29:11.302563Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.36'  socket: '/var/run/mysqld/mysqld.sock'  port: 0  MySQL Community Server - GPL.
2024-04-24 00:29:11+00:00 [Note] [Entrypoint]: Temporary server started.
'/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock'
Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it.     
Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
2024-04-24 00:29:14+00:00 [Note] [Entrypoint]: Creating database todos

2024-04-24 00:29:14+00:00 [Note] [Entrypoint]: Stopping temporary server
2024-04-24T00:29:14.396456Z 11 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.36).
2024-04-24T00:29:17.171885Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.36)  MySQL Community Server - GPL.
2024-04-24 00:29:17+00:00 [Note] [Entrypoint]: Temporary server stopped

2024-04-24 00:29:17+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up.    

2024-04-24T00:29:17.594963Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
2024-04-24T00:29:17.595848Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.36) starting as process 1
2024-04-24T00:29:17.604423Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 
2024-04-24T00:29:17.783473Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.   
2024-04-24T00:29:18.147717Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2024-04-24T00:29:18.147837Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2024-04-24T00:29:18.157214Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
2024-04-24T00:29:18.245266Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
2024-04-24T00:29:18.245517Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.36'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - GPL.
  • 지금 MySQL이 동작이 가능한 상태로 잘 컨테이너가 동작한 것 확인

3) 컨테이너 volume 확인

# 문법
$ docker volume ls [OPTIONS]

# Aliases
$ docker volume list
  • docker volume ls 입력 시 앞서 생성한 docker volume이 로컬 디바이스에 이런 식으로 생성이 됐다는 것 확인
$ docker volume ls
DRIVER    VOLUME NAME
local     1de8517dc991a6313224f17785e80f09fcf6bc400cecc135a7ce63abb298d262
local     todos

현재 상황:

  • MySQL이 지금 docker를 통해 동작 중
  • 이 MySQL을 프로젝트에 적용할 것

 

참조

  1. 인프런 강의
  2. docker 컨테이너 상태/정보 확인 https://docs.docker.com/reference/cli/docker/
  3.  

'Web 개발 > FAST API (인프런 강의 내용)' 카테고리의 다른 글

2 실습3 데이터베이스 연결  (0) 2024.04.25
2 실습2 MySQL 접속 및 사용  (0) 2024.04.25
2 데이터베이스  (0) 2024.04.24
1 실습6 ERROR 처리  (0) 2024.04.18
1 실습5 DELETE API todo 삭제  (0) 2024.04.17