【Node.js】 Docker를 사용하여 Node.js Express MySQL의 환경을 구축하기까지의 길

본 기사에서 만든 dockerfile을 정리한 것을 정리한 기사는 ⬇️
htps : // 이 m/쇼_우/있어 ms/52에221877아271146세84

완성된 이미지 구성
nodoDocker (루트 디렉토리)


Dockerfile:



애플리케이션 용 (node.js) 컨테이너를 만들기위한 파일

app.env:



mysql과의 연결 설정을 설명하는 파일

docker-compose.yml:



node.js 컨테이너와 mysql 컨테이너를 관리하는 yml

src:



애플리케이션 본체

애플리케이션용 컨테이너 만들기



먼저 응용 프로그램 용 임시 컨테이너를 만들고 응용 프로그램의 병아리를 만듭니다. 그 앱의 병아리는 호스트 측에 마운트 해 놓고, 그 병아리를 이용하여 docker-compose를 작성해 간다.

nodeDocker 아래에
docker-compose.yml 만들기

docker-compose.yml
version: '3'
services:
  app:
    # dockerimageのファイルを指定
    build: .

    # コンテナ名
    container_name: node_docker_app

    # 環境変数を設定
    environment:
      - DEBUG=app:*

    tty: true

    # ホスト側のポート:コンテナのポート
    ports:
      - '3000:3000'

    # ソースコードを格納するフォルダをマウント
    #(ホスト側の./srcをコンテナの/appにマウント)
    volumes:
      - ./src:/app

    # 起動時のカレントフォルダを指定
    working_dir: /app

    # 起動後に実行するコマンドを指定(起動確認用)
    command: npm start



node를 끌어옵니다.

dockrefile.
FROM node:12

호스트.
#コンテナを一時的に起動(--rmで停止後削除する。コンテナ起動後、bashに入る)
docker-compose run --rm app /bin/bash

컨테이너.
# express-generatorでアプリケーションのひな形を生成
npx express-generator

# 依存パッケージをインストール
npm install

#コンテナを抜ける(この仮コンテナは削除される)
exit

※이때 컨테이너는 삭제되지만

docker-compose.yml
    volumes:
      - ./src:/app

이 기술에 의해,.

컨테이너 시작

host.
docker-compose up

docker-compose.yml
    command: npm start

설명에 따라 컨테이너 시작 후 Express.js 응용 프로그램이 자동으로 시작됩니다.
http://localhost:3000/
에서 확인.

컨테이너 중지

host.
#再度コンテナを一時的に起動
docker-compose run --rm app /bin/bash

#ソースコードの変更を検知して必要な時にアプリケーションを再起動してくれる、「nodemon」というツールをインストール。
#変更のたびにコンテナの停止・再起動することしなくてよくする。
npm install -D nodemon

package.json 수정

src/package.json
"scripts": {
  "dev": "nodemon ./bin/www",
  "start": "node ./bin/www"
},

docker-compose.yml 파일 편집

docker-compose.yml
(変更前)
command: npm start

(変更後)
command: npm run dev

MySQL 용 컨테이너 추가



docker-compose.yml에 mysql 설정 추가

docker-compose.yml
version: '3'
services:
  mysql:
    image: mysql:5.7
    env_file: ./mysql/mysql.env
    #環境変数設定。タイムゾーンを日本時間に設定。
    environment:
      - TZ=Asia/Tokyo
    ports:
      - '3306:3306'
    volumes:
      #mysqlのデフォルト設定ファイルを上書き。:roでコンテナ側からは読み取り専用設定。
      - ./mysql/conf:/etc/mysql/conf.d/:ro
      #mysqldataにマウントすることで、コンテナを削除してもデーターは残るように設定。
      - mysqldata:/var/lib/mysql
    networks:
      - backend

  app:
    image: node:12
    env_file: ./app.env
    #環境変数設定。タイムゾーンを日本時間に設定。
    environment:
      - TZ=Asia/Tokyo
      - DEBUG=app:*
    tty: true
    ports:
      - '3000:3000'
    volumes:
      - ./src:/app
    working_dir: /app
    command: npm run dev
    networks:
      - backend
    #mysqlに依存しているので、mysqlコンテナ作成後、appコンテナが作られる。
    depends_on:
      - mysql

networks:
  backend:

volumes:
  mysqldata:

my.conf를 작성 (컨테이너 측의/etc/mysql/conf.d/에 배치된다.)

mysql/conf/my.conf
[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqldump]
default-character-set=utf8mb4

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_bin
lower_case_table_names=1

# Enable access from the host machine.
bind-address=0.0.0.0

mysql 폴더에 mysql.env 파일을 만듭니다. (env_file : ./mysql/mysql.env의 설명에 따라 내용이 컨테이너 측의 mysql 환경 변수로 설정됩니다)

mysql/mysql.env
MYSQL_ROOT_HOST=%
MYSQL_ROOT_PASSWORD=(ルートパスワード)
MYSQL_USER=(ユーザー名)
MYSQL_PASSWORD=(パスワード)
MYSQL_DATABASE=todo

app.env 파일 만들기 (응용 프로그램 컨테이너의 환경 변수 설정)

app.env
MYSQL_SERVER=mysql
MYSQL_USER=(ユーザー名)
MYSQL_PASSWORD=(パスワード)
MYSQL_DATABASE=todo

docker-compose.yml
version: '3'
services:
  mysql:
    image: mysql:5.7
    container_name: node_docker_db
    env_file: ./mysql/mysql.env
    environment:
      - TZ=Asia/Tokyo
    ports:
      - '3306:3306'
    volumes:
      - ./mysql/conf:/etc/mysql/conf.d/:ro
      - mysqldata:/var/lib/mysql
    networks:
      - backend

  app:
    image: node:12
    container_name: node_docker_app
    env_file: ./app.env
    environment:
      - TZ=Asia/Tokyo
      - DEBUG=app:*
    tty: true
    ports:
      - '3000:3000'
    volumes:
      - ./src:/app
    working_dir: /app
    command: npm run dev
    networks:
      - backend
    depends_on:
      - mysql

#使用するネットワークを作成。docker-composeの場合service以下の名前を使って名前解決されるため、appとmysqlが自動的に接続される。
networks:
  backend:

volumes:
  mysqldata:

mysql에 로그인

host.
docker-compose exec mysql mysql -uroot -p

할 수 없다,,,
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

여러가지 시도한 결과

host.
docker-compose down --volumes

volume을 삭제하면 로그인할 수 있었다. 원인은 불명.

ejs를 템플릿 엔진에 사용하기 위해 설치를 기재한 dockerfile을 루트 바로 아래에 배치.
#node.jsのイメージをプル。
FROM node:12
#作業ディレクトリをアプリケーションディレクトリにする。
WORKDIR /app
ejsをインストール。
RUN npm install ejs

어플 리케이션 컨테이너가 Dockerfile로 빌드하도록 했기 때문에

docker-compose.yml
(変更前)
image: node:12

(変更後)
build: .

일단 완료.

좋은 웹페이지 즐겨찾기