go

Go言語でのAPI開発 | 実践的な学習から実装まで①【docker準備】

たけのこ

こんにちは!たけのこです。

今回から、Go言語を使用したAPI実装についてまとめていこうと思います。

APIの実装について1つの記事に全て記載してしまうと、かなり長くなってしまい読みにくくなってしまうので、いくつかの記事に分けて順序を踏んで解説していこうと思います。

本記事では、主にdockerを使用したAPI開発の準備についてまとめています。

では、早速行きましょう!

スポンサーリンク

Step 1: Dockerの基本


まずは、Dockerについて紹介します。Dockerとは、アプリケーションをコンテナという隔離された環境で動かすためのツールです。

わかりやすく例えると、パソコンの中にもう一つ仮想的なパソコンを作成するようなイメージですね~

これにより、OSなどの環境依存の問題を解消することができます。

またこれだけでなく、何か問題が起こった場合はコンテナを再ビルドすることで、簡単に元の状態に戻すことができます!

[chat face=”cropped-24a6ce9ea80cd88a9664fbd22d097884.png” name=”たけのこ” align=”left” border=”green” bg=”none” style=”maru”] 実際のDBと違って、間違えてテーブルを全削除しても、事前に用意していたdockerファイルからすぐに元に戻せるから、すごく便利なツールなんです!!(ちょっと難しいけど…) [/chat]

本記事では、DockerDesktopを使用していますので、まだインストールしていない方は、公式サイトからダウンロードして触ってみてください。

Step 2: Dockerfileの作成

Docker環境を構築するためには、Dockerfileを作成します。このファイルはコンテナの設定を記述するものです。

今回はMySQLのDBを作成したいので、下記のように記述しています。

# 使用するDockerイメージ
FROM mysql:latest

# 環境変数の設定
ENV MYSQL_DATABASE=apidb
ENV MYSQL_USER=apiuser
ENV MYSQL_PASSWORD=apipassword
ENV MYSQL_ROOT_PASSWORD=rootpassword

このDockerfileでは、データベース名、ユーザー名、パスワード、rootユーザーのパスワードを設定しています。

Step 3: docker-compose.ymlの作成


次に、docker-compose.ymlファイルを作ります。このファイルには、複数のコンテナを管理する設定を記述します。今回は以下の通り記述しています。

version: '3.8'
services:
db:
container_name: apidb_container
build: .
ports:
- "3306:3306"
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: apidb
MYSQL_USER: apiuser
MYSQL_PASSWORD: apipassword


ここでは、ポート3306を開け、環境変数の設定やinit.sql(後で作成します)をコンテナ内にコピーする記述を行なっています。

[chat face=”cropped-24a6ce9ea80cd88a9664fbd22d097884.png” name=”たけのこ” align=”left” border=”green” bg=”none” style=”maru”] 「Dockerfile」と「yml」の内容は似ているけど、Dockerfileは単独のイメージを作成するためのファイル、ymlファイルは複数のDockerイメージを組み合わせることでアプリを実行するための設定ファイルという違いがあります。 [/chat]

Step 4: 初期化SQLの作成


次に、init.sqlを準備します。このファイルには、Dockerコンテナを起動した際に自動で流してくれるSQLを記載します。

このファイルがあるおかげで、コンテナを作成した際に初期データを登録しておいてくれるようになります。

今回は下記のように記述しています。

CREATE TABLE Users (
    user_id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100),
    password VARCHAR(100)
);

CREATE TABLE Products (
    product_id INT PRIMARY KEY,
    name VARCHAR(100),
    description TEXT,
    price DECIMAL(10, 2)
);

CREATE TABLE Orders (
    order_id INT PRIMARY KEY,
    user_id INT,
    product_id INT,
    quantity INT,
    order_date DATE,
    FOREIGN KEY (user_id) REFERENCES Users(user_id),
    FOREIGN KEY (product_id) REFERENCES Products(product_id)
);

INSERT INTO Users (user_id, name, email, password) VALUES
(1, '山田太郎', 'taro@example.com', 'password123'),
(2, '鈴木花子', 'hanako@example.com', 'password456');

INSERT INTO Products (product_id, name, description, price) VALUES
(1, '商品A', '商品Aの説明', 1000),
(2, '商品B', '商品Bの説明', 1500);

INSERT INTO Orders (order_id, user_id, product_id, quantity, order_date) VALUES
(1, 1, 1, 2, '2024-02-01'),
(2, 2, 2, 1, '2024-02-02');

今回はザックリとリレーションが張られている3テーブルを準備するように記述しています。

Step 5: Dockerコンテナのビルドと起動


すべての設定ファイルが用意できたら、Dockerコンテナをビルドし、起動してみましょう!

Docker Desktopを起動した状態で、VSCodeなどのターミナルで以下のコマンドを実行してみてください!

docker-compose up --build


このコマンドで、Dockerfileとdocker-compose.ymlに基づいてコンテナをビルドし、起動します。初回は少し時間がかかりますが、気長に待ちましょう~

Step 6: DockerコンテナのDBからデータを取得してみる

dockerが起動したら、実際に想定して板通りにdockerのコンテナが作成されているか確認してみましょう!

まずはコンテナに接続するためにdockerが起動されている状態で下記コマンドを別ターミナルに打ち込みます。

docker exec -it apidb_container mysql -u apiuser -p

上記コマンドを入力するとパスワードを聞かれるので、コンテナ作成時に設定しておいたパスワード「apipassword」を入力します。

ターミナル上でパスワードを打ち込んでも入力した内容は表示されませんが、入力自体はされているので、パスワードを打ち込んだらそのままEnterでOKです!

コンテナに接続したら、次にデータベースの指定を下記コマンドで行ないます。

USE apidb;

データベースを指定したら、あとはSQL文を入力してテーブルの内容を確認することができます。

今回は試しに、Usersテーブルのデータを参照してみます。

SELECT * FROM Users;

 

 

 

 

上記の通り、事前に登録しておいた2つのデータが取得できましたね!

まとめ

今回はDockerを使用したAPI開発の準備を行なってきました。

紹介したDockerというツールを使うことで、開発環境の違いに左右されず、集中してコーディングに取り組むことができます。

これで、Go言語のAPI開発のためのMySQLデータベース環境がDocker上に構築できました。これからは、この環境を使って、APIの開発を進めていけますね~

また、次回からは実際にAPI開発について順序を踏んで解説していきます。

当シリーズの記事がgo言語を使ったAPI開発の一助となれば幸いです。

ということで、今回はこの辺で!

ありがとうございました!

スポンサーリンク
ABOUT ME
たけのこ
たけのこ
自由奔放エンジニア
現役でエンジニアをやっています! 開発現場で経験したコーディング実装例、実装アーキテクチャの解説などを記事に書き起こしています!
記事URLをコピーしました