質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

ORM

ORM(オブジェクト関係マッピング)はオブジェクト指向のシステムとリレーショナルデータベースの間でマッピングを行う技術です。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

解決済

Dockerに立てたコンテナ内のMySQLに、ホストのMySQLのインストール有無に依存せず接続する方法が知りたい

akira_kano1101
akira_kano1101

総合スコア16

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

ORM

ORM(オブジェクト関係マッピング)はオブジェクト指向のシステムとリレーショナルデータベースの間でマッピングを行う技術です。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

2回答

0評価

1クリップ

339閲覧

投稿2022/05/27 14:28

編集2022/06/01 20:19

こんにちは。

Dockerに立てたMySQLコンテナに対して、ホストからORマッパーを使いデータベースにアクセスしデータの永続化を実現する機能を持ったソフトウェアを作ろうとしています。

使っている言語はRustです。

console

$ sw_vers ProductName: macOS ProductVersion: 12.4 BuildVersion: 21F79 $ cargo --version cargo 1.61.0 (a028ae42f 2022-04-29)

実現したいこと

問題は、クライアントのホストPCにmysqlのインストールを強いるような実装は控えたい、しかしORマッパー(diesel)を使ってDockerコンテナのmysqlへ接続がしたいというときのコードの書き方がわからないということです。

ホストPCにMySQLがインストールされていれば、下記の要領で問題なくコンテナ内のMySQLにもアクセスできることはわかっています。

console

$ docker-compose up -d mysql_container is up-to-date $ mysqladmin ping -h127.0.0.1 -P3316 -uroot -prootpass mysqladmin: [Warning] Using a password on the command line interface can be insecure. mysqld is alive

ユーザが使うローカルPCにはWindowsやMacといったOSなど実行環境に依存させない(インストーラを環境別に作ることを防ぎたい)ためにMySQLをインストールしたくありません。
※わかりにくい表現だったので訂正します。

今回はそうではありません。

DockerだけでMySQLを完結させたいです。

なお、実装に際し部分的にこちらのサイトも参考にしています。

docker-compose.yml

yml

version: "3" services: mysql: image: mysql/mysql-server:5.7.28 container_name: mysql_container command: --default-authentication-plugin=mysql_native_password environment: MYSQL_ROOT_PASSWORD: rootpass MYSQL_DATABASE: sakila TZ: "Asia/Tokyo" volumes: - ./my.cnf:/etc/mysql/conf.d/my.cnf - ./init:/docker-entrypoint-initdb.d ports: - "3316:3306"

実行したコマンド

ローカルにMySQLがインストールされていない状況を再現するためbrew uninstallでMySQLをアンインストールしました。

console

$ brew list -l | grep mysql drwxr-xr-x 3 a.kano admin 96 May 27 21:48 mysql drwxr-xr-x 3 a.kano admin 96 May 27 21:48 mysql-client $ mysql.server restart Shutting down MySQL . SUCCESS! Starting MySQL . SUCCESS! $ brew uninstall mysql Uninstalling /opt/homebrew/Cellar/mysql/8.0.29... (311 files, 295MB) $ brew uninstall mysql-client Uninstalling /opt/homebrew/Cellar/mysql-client/8.0.29... (129 files, 149.0MB)

次に、docker-compose up -dを実行してMySQLのコンテナを立てます。

console

docker-compose up -d Starting mysql_container ... done

コンテナに入り、MySQLが生きているか確認します。

console

$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9db1d950c858 mysql/mysql-server:5.7.28 "docker-entrypoint.s…" About a minute ago Up 11 seconds 33060/tcp, 0.0.0.0:3316->3306/tcp, :::3316->3306/tcp mysql_container $ docker exec -it 9db1d950c858 bash root@9db1d950c858:/# mysqladmin ping -uroot -prootpass mysqladmin: [Warning] Using a password on the command line interface can be insecure. mysqld is alive

生きていることが確認できました。

しかし、ここへRustのORマッパー(dieselを使用)からアクセスする方法がわかりません。

未完成のソースコード

RustでMySQLへのコネクションを確立するコードは現状以下のように書いています。

rust

// mysql.rs pub use diesel::prelude::*; pub use diesel::MysqlConnection; use dotenv::dotenv; use std::env; pub fn establish_connection() -> MysqlConnection { dotenv().ok(); let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set"); MysqlConnection::establish(&database_url) .expect(&format!("Error connecting to {}", database_url)) }

rust

// main.rs mod mysql; use crate::mysql::establish_connection; fn main() { establish_connection(); }

toml

[package] name = "mysql-docker" version = "0.1.0" edition = "2021" [dependencies] dotenv = "0.15.0" diesel = { version = "1.4.8", features = ["mysql"] }

上記dotenvで読み込む環境変数DATABASE_URLは.envに次のように設定しています。

DATABASE_URL=mysql://root:rootpass@127.0.0.1:3316/sakila

そして実行します。

console

$ cargo run Finished dev [unoptimized + debuginfo] target(s) in 0.03s Running `target/debug/mysql-docker` dyld[43490]: Library not loaded: /opt/homebrew/opt/mysql/lib/libmysqlclient.21.dylib Referenced from: /Users/a.kano/development/mysql-docker/target/debug/mysql-docker Reason: tried: '/opt/homebrew/opt/mysql/lib/libmysqlclient.21.dylib' (no such file), '/Users/a.kano/development/mysql-docker/target/debug/deps/libmysqlclient.21.dylib' (no such file), '/Users/a.kano/development/mysql-docker/target/debug/libmysqlclient.21.dylib' (no such file), '/Users/a.kano/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libmysqlclient.21.dylib' (no such file), '/Users/a.kano/.rustup/toolchains/stable-aarch64-apple-darwin/lib/libmysqlclient.21.dylib' (no such file), '/Users/a.kano/lib/libmysqlclient.21.dylib' (no such file), '/usr/local/lib/libmysqlclient.21.dylib' (no such file), '/usr/lib/libmysqlclient.21.dylib' (no such file) zsh: abort cargo run

このエラーもホストPCにmysqlがインストールされていれば正常終了することは試してわかっているのですが、やはりホストPCにmysqlはインストールしないと実行できないというのでは意味がないと思います。

解決策はありますか?

もし解決策がないなら、繰り返しになりますがユーザのPCに余計にMySQLのインストールをしなければならない制約を課すことになるため、Docker本来の仮想環境の利点が活かされず、Dockerをわざわざ使う意味がありません。インストールに要するコマンドが増えるなど仕様もわかりにくくなります。正しい解決方法が存在していて、私が見つけられていないだけでしょうか?

Sequel AceなどのようなアプリケーションでもコンテナMySQLの接続にホストにmysqlがインストールされている必要があるか試してみたのですが、予想通りMySQLがホストにインストールされていないと接続できないようでした。

至らない内容で恐縮ですが、ご存知の方、いらっしゃいますでしょうか。

ご教示いただけると助かります。

よろしくお願いします。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

akira_kano1101

2022/05/28 02:59

hoshi-takanori様 ご提案ありがとうございます。 ちょっと調べてみようかと思います。
hoshi-takanori

2022/05/28 03:07

> ユーザが使うローカルPCにはWindowsやMacといったOSなど実行環境に依存させない(インストーラを環境別に作ることを防ぎたい) ユーザーに docker を入れてもらうと言う想定な時点で、だいぶ無理がある気が…。
akira_kano1101

2022/05/28 03:55

> ユーザーに docker を入れてもらうと言う想定な時点で、だいぶ無理がある気が…。 実は、確かに私もそんな気はしています。 今回はこのシステムの対象ユーザが身内だけですのでそこは私自身立ち会えば良いと考えていたので問題に思っていませんでしたが、そうですよね。 もしDockerを使わないでも済むようなベストプラクティスがあるなら教えてほしいです。 ただ単にローカルにmysqlをインストールしていただくようにする方が実際簡単に済むものなのでしょうか。
hoshi-takanori

2022/05/28 10:21

身内と言っても、ご家族なのか会社や学校や研究室の人なのかで変わってきますね。また、パソコンの所有者や管理形態、ユーザーの PC スキル、当該システムの利用目的などによっても。 いちばん簡単なのは Web アプリにする (ユーザーはブラウザさえあればいい) ってことかと。
akira_kano1101

2022/05/28 11:16 編集

兄弟のお店で使うシステムです。Windowsなのですが、Dockerも私が直接出向いてWSL2と共にインストールする予定でいます。このシステム、元々はExcelで作ったものでしたが使っていくうちにデータが多くなってきて動作が遅くなり(マクロや関数を多用するつくりな上、PCも低スペックだから)、改善を求められたのがことの始まりです。 Webアプリもその次に試していて、herokuを利用する形でRailsで少し作ってみたことはあるのですが、ブラウザ上でだと動作がデータの更新のたび少しですが待ちが生じたので、それならいっそネイティブにしようかとなりRustを選定をしました。今はWASMが気にはなっていますが手を出せないままにいます。 いまだにExcelで工夫して使ってもらっているので改善してあげたいです。 色々とご助言ありがとうございます。
hoshi-takanori

2022/05/28 11:27 編集

なるほど。それならインストールや管理は全手動で構いませんね。PC が低スペック (どのくらい低スペックかによりますが、もしかして 32bit OS だったりしますか?) だと docker は辛いと思うので、Windows 上で mysql を直接動かせば良いのでは…。
akira_kano1101

2022/05/28 12:29

ちょっと失念しましたが数年前に3万円台で購入したCHUWI製のノートPCで、そんなに昔のものではないので64bit OSであることは間違いないと思います。 どこまで低スペックだったかは、また確認してみますが、Dockerが辛ければやっぱりWindowsにMySQLを入れるのが最善の手になりそうでしょうかね?Dockerはある程度軽量だと認識していたのでそうなると残念ですが…。
hoshi-takanori

2022/05/28 13:07

ちょっと調べたら数万円で Celeron 4 コア、メモリ 8GB なんてのが手に入るんですね。私の「低スペック PC」に関する認識が古かったかも…。
akira_kano1101

2022/05/29 02:48 編集

10万円以内で整備済M1 Macbook Airも買えるので、時代も変わってきていますよね。 今後の方針として、アプリはインメモリで動かしデータの保存にクラウドを利用するというような仕組みで作ろうと考えているので結局AWSかherokuは利用する予定で、そこにDockerも必要になるだろうなと思っています。最終的にホストPCにはDockerは入れないで済むようにし、身内に限らず裾野を広げて一般ユーザにも簡単に使えるよう改善したいという考えですので、そのうちWebアプリに近い仕組みもまた用意することにはなりそうです。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

ORM

ORM(オブジェクト関係マッピング)はオブジェクト指向のシステムとリレーショナルデータベースの間でマッピングを行う技術です。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです