- 投稿日:2021-01-17T19:33:54+09:00
Dockerでapache7.4+mysql8環境構築(初期データ入り)
今更ですが、Macで表題の環境を作らなくてはいけなくなったので、構築してみました。
備忘録として書いておきます。環境
マシン macOS Catalina 10.15.7
構成
ファイル、ディレクトリの構成はざっくりと以下のようにします。
任意のディレクトリ │ ├── docker-compose.yml │ ├── html/ │ └── index.html │ ├── mysql/ │ ├── Dockerfile │ ├── data/ │ ├── init/ │ │ └── init.sql │ └── my.cnf │ ├── php-apahce/ ├── Dockerfile └── php.iniこの構築の重要な部分
docker-compose.ymlとDockerfileがこの構築の重要な部分になります。
ファイル名 説明 docker-compose.yml コンテナの構成を定義するもの。コンテナ間通信の定義もできる。 Dockerfile dockerのイメージに対する定義。 docker-compose.ymlの要素
調べて自分が認識している限りだと以下の通り
名称 意味 build Dockerfileがある位置を指定 volumus ローカル内のマウントされる場所:コンテナ内のマウントする場所 ports ポートフォワード container_name コンテナの名前 docker container lsのname environment 環境変数?変数名で何を意味するかがなんとなくわかる Dockerfileの要素
調べて自分が認識している限りだと以下の通り
名称 意味 FROM 何をどのバージョンで EXPOSE どのポートを使用するか ADD ローカルファイルをコンテナ内ファイルに追記 CMD コンテナ起動時に実行されるやつ COPY ローカルファイルをコンテナ内ディレクトリにコピーする RUN イメージ作成時に呼ばれるやつ。なのでパッケージのインストール等を書く。 構築
本編はここからです。
確認
まずコンテナの状態確認
ksk@ksknoMacBook-Pro work % docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES何もいません
./docker-compose.yml
docker-compose.ymlとは、コンテナの構成を定義するファイル
docker-compose.ymlversion: '3' services: php-apache: build: ./php-apache/ volumes: - ./html:/var/www/html ports: - 8080:80 container_name: web mysql: build: ./mysql/ volumes: - "./mysql/data:/var/lib/mysql" - "./mysql/init:/docker-entrypoint-initdb.d" environment: - MYSQL_ROOT_PASSWORD=docker - MYSQL_DATABASE=mydb - MYSQL_USER=appuser - MYSQL_PASSWORD=appuser1 container_name: db ports: - 3306:3306ymlに書いている属性?で、自分が理解していることを以下の表に書いてみる
(間違っているところを指摘してくれる優しい人いたら教えてください)./html/index.php
動作確認するために使用。
とりあえず、DBのデータを表示できれば良しとする。
volumesの定義により、htmlがドキュメントルートとなる。index.php<?php try { $db = sprintf('mysql:host=%s:3306;dbname=%s', 'mysql', 'mydb'); $dbh = new PDO($db, 'appuser', 'appuser1'); foreach($dbh->query('select * from users') as $row) { echo $row['name'] . '<br>'; } $dbh = null; } catch (PDOException $e) { echo $e; die(); } $dbh = null;hostの指定で「'mysql'」としていますが、これはdocker-compose.ymlのservice名と理解しています。
docker-compose.ymlmysql: ←これ!!! build: ./mysql/ volumes:./mysql/Dockerfile
mysql側のDockerfile
DockerfileとはDockerイメージの定義を書くファイルです。FROM mysql:8.0 EXPOSE 3306 ADD ./my.cnf /etc/mysql/conf.d/my.cnf CMD ["mysqld"]./mysql/init/init.sql
適当なテーブルとデータを詰め込むような記述にしておく
use mydb; CREATE TABLE users ( id int(10) unsigned not null auto_increment, name varchar(255) not null, primary key (id) ); insert into users(name) values('hogeo'); insert into users(name) values('fugao');./mysql/my.cnf
my.cnf[mysqld] character-set-server=utf8 default_authentication_plugin=mysql_native_password [mysql] default-character-set=utf8 [client] default-character-set=utf8default_authentication_plugin=mysql_native_passwordについて
mysqlのデフォルト認証プラグインが変わったので、デフォルトの認証プラグインを変更しています。
mysqlの環境変数でユーザ(appuser)作っていますが、mysql_native_passwordという認証プラグインで設定されます。
デフォルトのままだと、phpがmysqlへのアクセスで失敗します。./php-apache/Dockerfile
色んなサイトを見て参考にさせてもらいました。
FROM php:7.4-apache COPY ./php.ini /usr/local/etc/php/ RUN apt-get update RUN apt-get install -y zip unzip vim libpng-dev libpq-dev RUN docker-php-ext-install pdo_mysql./php-apache/php.ini
色んなサイトを見て参考にさせてもらいました。
[Date] date.timezone = "Asia/Tokyo" [mbstring] mbstring.internal_encoding = "UTF-8" mbstring.language = "Japanese"docker-compose build
上記を作った後、docker-compose.ymlと同階層で以下のコマンド実行
ksk@ksknoMacBook-Pro work % docker-compose build 〜〜〜中略〜〜〜 Successfully built e5b1c15e825e Successfully tagged work_php-apache:latest Building mysql Step 1/4 : FROM mysql:8.0 ---> d4c3cafb11d5 Step 2/4 : EXPOSE 3306 ---> Using cache ---> e11d55e213ab Step 3/4 : ADD ./my.cnf /etc/mysql/conf.d/my.cnf ---> Using cache ---> 6dd70a6b7ecd Step 4/4 : CMD ["mysqld"] ---> Using cache ---> c22190479ddf Successfully built c22190479ddf Successfully tagged work_mysql:latestコンテナ作成&起動
ksk@ksknoMacBook-Pro work % docker-compose up -d Creating web ... done Creating db ... done確認
コンテナの状態確認
ksk@ksknoMacBook-Pro work % docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b416b97d3f7b work_mysql "docker-entrypoint.s…" 2 seconds ago Up 2 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp db 9985abb2eb90 work_php-apache "docker-php-entrypoi…" 2 seconds ago Up 2 seconds 0.0.0.0:8080->80/tcp webコンテナが確認できました
画面確認
http://localhost:8080
こちらへアクセス以上!
- 投稿日:2021-01-17T19:33:54+09:00
Dockerでapache7.4+mysql8環境構築(初期データ入り)(自分メモ)
今更ですが、Macで表題の環境を作らなくてはいけなくなったので、構築してみました。
備忘録として書いておきます。環境
マシン macOS Catalina 10.15.7
構成
ファイル、ディレクトリの構成はざっくりと以下のようにします。
任意のディレクトリ │ ├── docker-compose.yml │ ├── html/ │ └── index.html │ ├── mysql/ │ ├── Dockerfile │ ├── data/ │ ├── init/ │ │ └── init.sql │ └── my.cnf │ ├── php-apahce/ ├── Dockerfile └── php.iniこの構築の重要な部分
docker-compose.ymlとDockerfileがこの構築の重要な部分になります。
ファイル名 説明 docker-compose.yml コンテナの構成を定義するもの。コンテナ間通信の定義もできる。 Dockerfile dockerのイメージに対する定義。 docker-compose.ymlの要素
調べて自分が認識している限りだと以下の通り
名称 意味 build Dockerfileがある位置を指定 volumus ローカル内のマウントされる場所:コンテナ内のマウントする場所 ports ポートフォワード container_name コンテナの名前 docker container lsのname environment 環境変数?変数名で何を意味するかがなんとなくわかる Dockerfileの要素
調べて自分が認識している限りだと以下の通り
名称 意味 FROM 何をどのバージョンで EXPOSE どのポートを使用するか ADD ローカルファイルをコンテナ内ファイルに追記 CMD コンテナ起動時に実行されるやつ COPY ローカルファイルをコンテナ内ディレクトリにコピーする RUN イメージ作成時に呼ばれるやつ。なのでパッケージのインストール等を書く。 構築
本編はここからです。
確認
まずコンテナの状態確認
ksk@ksknoMacBook-Pro work % docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES何もいません
./docker-compose.yml
docker-compose.ymlとは、コンテナの構成を定義するファイル
docker-compose.ymlversion: '3' services: php-apache: build: ./php-apache/ volumes: - ./html:/var/www/html ports: - 8080:80 container_name: web mysql: build: ./mysql/ volumes: - "./mysql/data:/var/lib/mysql" - "./mysql/init:/docker-entrypoint-initdb.d" environment: - MYSQL_ROOT_PASSWORD=docker - MYSQL_DATABASE=mydb - MYSQL_USER=appuser - MYSQL_PASSWORD=appuser1 container_name: db ports: - 3306:3306ymlに書いている属性?で、自分が理解していることを以下の表に書いてみる
(間違っているところを指摘してくれる優しい人いたら教えてください)./html/index.php
動作確認するために使用。
とりあえず、DBのデータを表示できれば良しとする。
volumesの定義により、htmlがドキュメントルートとなる。index.php<?php try { $db = sprintf('mysql:host=%s:3306;dbname=%s', 'mysql', 'mydb'); $dbh = new PDO($db, 'appuser', 'appuser1'); foreach($dbh->query('select * from users') as $row) { echo $row['name'] . '<br>'; } $dbh = null; } catch (PDOException $e) { echo $e; die(); } $dbh = null;hostの指定で「'mysql'」としていますが、これはdocker-compose.ymlのservice名と理解しています。
docker-compose.ymlmysql: ←これ!!! build: ./mysql/ volumes:./mysql/Dockerfile
mysql側のDockerfile
DockerfileとはDockerイメージの定義を書くファイルです。FROM mysql:8.0 EXPOSE 3306 ADD ./my.cnf /etc/mysql/conf.d/my.cnf CMD ["mysqld"]./mysql/init/init.sql
適当なテーブルとデータを詰め込むような記述にしておく
use mydb; CREATE TABLE users ( id int(10) unsigned not null auto_increment, name varchar(255) not null, primary key (id) ); insert into users(name) values('hogeo'); insert into users(name) values('fugao');./mysql/my.cnf
my.cnf[mysqld] character-set-server=utf8 default_authentication_plugin=mysql_native_password [mysql] default-character-set=utf8 [client] default-character-set=utf8default_authentication_plugin=mysql_native_passwordについて
mysqlのデフォルト認証プラグインが変わったので、デフォルトの認証プラグインを変更しています。
mysqlの環境変数でユーザ(appuser)作っていますが、mysql_native_passwordという認証プラグインで設定されます。
デフォルトのままだと、phpがmysqlへのアクセスで失敗します。./php-apache/Dockerfile
色んなサイトを見て参考にさせてもらいました。
FROM php:7.4-apache COPY ./php.ini /usr/local/etc/php/ RUN apt-get update RUN apt-get install -y zip unzip vim libpng-dev libpq-dev RUN docker-php-ext-install pdo_mysql./php-apache/php.ini
色んなサイトを見て参考にさせてもらいました。
[Date] date.timezone = "Asia/Tokyo" [mbstring] mbstring.internal_encoding = "UTF-8" mbstring.language = "Japanese"docker-compose build
上記を作った後、docker-compose.ymlと同階層で以下のコマンド実行
ksk@ksknoMacBook-Pro work % docker-compose build 〜〜〜中略〜〜〜 Successfully built e5b1c15e825e Successfully tagged work_php-apache:latest Building mysql Step 1/4 : FROM mysql:8.0 ---> d4c3cafb11d5 Step 2/4 : EXPOSE 3306 ---> Using cache ---> e11d55e213ab Step 3/4 : ADD ./my.cnf /etc/mysql/conf.d/my.cnf ---> Using cache ---> 6dd70a6b7ecd Step 4/4 : CMD ["mysqld"] ---> Using cache ---> c22190479ddf Successfully built c22190479ddf Successfully tagged work_mysql:latestコンテナ作成&起動
ksk@ksknoMacBook-Pro work % docker-compose up -d Creating web ... done Creating db ... done確認
コンテナの状態確認
ksk@ksknoMacBook-Pro work % docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b416b97d3f7b work_mysql "docker-entrypoint.s…" 2 seconds ago Up 2 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp db 9985abb2eb90 work_php-apache "docker-php-entrypoi…" 2 seconds ago Up 2 seconds 0.0.0.0:8080->80/tcp webコンテナが確認できました
画面確認
http://localhost:8080
こちらへアクセス以上!
- 投稿日:2021-01-17T19:07:21+09:00
MacBook Twitter 共有方法
ウェブページのTwitterボタンを使わずにTwitterで共有する方法
1.App StoreでTwitterアプリをインストール、ログインする
2.ツールバーのファイルを選択
3.共有を選択
4.Twitterを選択
- 投稿日:2021-01-17T18:38:39+09:00
.zshrcの設定について
はじめに
MacOS「Catalina」になってからシェルが
bash
からzsh
に変更されてまして、ちょっとこの機会に少し設定し直すことにしました。もし、「Catalina」以下のOSでzshに変えたい場合
cat /etc/shells # List of acceptable shells for chpass(1). # Ftpd will not allow users to connect who are not using # one of these shells. /bin/bash /bin/csh /bin/dash /bin/ksh /bin/sh /bin/tcsh /bin/zshPCに入ってるShell一覧を確認
brew install zsh udo sh -c "echo '/bin/zsh' >> /etc/shells" chsh -s /bin/zshzshがそもそもなかった場合は
Homebrew
などでインストールして、切り替え。chsh -s /bin/bash
bash
に戻したい場合はこれ。.bashrcは.zshrcに置き換え
echo $SHELL /bin/zsh一旦、上記で変更されていることを確認。
~/.zshrcPROMPT='%F{green}%m@%n%f %F{cyan}%~%f$ ' # プロンプト複数起動時のhistory共有 setopt share_history # 重複するコマンドのhistory削除 setopt hist_ignore_all_dups # コマンドのスペルミスの修正 setopt correct # Command補完 autoload -Uz compinit && compinit # ---------------------------------------------------------------------------------------- # alias設定 # ---------------------------------------------------------------------------------------- alias ll="ls -la" alias v="/usr/local/bin/vim" # vim alias his='history -Di | grep' # 引数でhistoryのgrepを行う alias history='history -Di' # ---------------------------------------------------------------------------------------- # zsh-completions(補完機能)の設定 # ---------------------------------------------------------------------------------------- if [ -e /usr/local/share/zsh-completions ]; then fpath=(/usr/local/share/zsh-completions $fpath) fi autoload -U compinit compinit -uとりあえず、簡単に設定しておく。
source ~/.zshrcこれで反映完了。
.zshrcの詳細
PROMPT='%F{green}%m@%n%f %F{cyan}%~%f$ 'プロンプトの設定はbashの時と違うので、色々参考に変更した。
brew install zsh-completionszsh-completions(補完機能)の設定は必須だと思うので、追加。
Homebrewでインストール出来る。設定は.zshrc内を参照。
あとは、下記をいれた。
- プロンプト複数起動時のhistory共有
- コマンドのスペルミスの修正
- Command補完. bash_profileは.zprofileに置き換え
今までだと
.bash_profile
から.bashrc
を呼んでいたのだが、新しいセッションごとに.zshrc
は呼ばれるようなのでこの設定はいらないみたいだ。なので、.zprofile
については特に今の所は何も記載していない。今後、何か記載した場合は追記する予定。まだまだ、
zsh
にはより良い機能がたくさんあるとのことなので、更新していきたい。
- 投稿日:2021-01-17T15:47:38+09:00
【emacs】company-ironyを導入してC言語補完環境を構築
ironyサーバーのビルドに失敗したので、その備忘録。
環境
macOS Mojava 10.14.6
GNU Emacs 26.3company-irony導入までの手順
ここは今回の主題ではないので、簡潔に(間違った箇所があるかも)。
まず必要なパッケージは以下で全部なはず。
company, irony, company-irony例えば設定としては(.emacsなどに記述)
;; companyとcompany-ironyを連携させる (with-eval-after-load 'company (add-to-list 'company-backends 'company-irony)) ;; Cファイルを開いたときにcompany, ironyモードが起動するようにする (add-hook 'c-mode-hook lambda()( ('company-mode) ('irony-mode) ))設定は以上だが、初回に
M-x irony-install-serverを実行する必要がある。
returnを押すと以下が実行されることを確認してきて、再びreturnで実行される。cmake -DCMAKE_INSTALL_PREFIX\=/Users/myname/.emacs.d/irony/ /Users/myname/.emacs.d/elpa/irony-1.4.0/server && cmake --build . --use-stderr --config Release --target installここでエラーが出た。
cmakeでエラー
エラーは以下のような内容。
Could NOT find LibClang (missing: LIBCLANG_LIBRARY LIBCLANG_INCLUDE_DIR)
解決策
まず
brew install llvm
でllvmをインストール。
ただしmacだと自動でこのllvmを見に行ってくれないらしい。インストールされた場所を確認すると
/usr/local/opt/llvm
をリンクすればいいらしい。$ brew info llvm llvm: stable 11.0.0 (bottled), HEAD [keg-only] Next-gen compiler infrastructure https://llvm.org/ /usr/local/Cellar/llvm/11.0.0 (8,922 files, 1.3GB) Poured from bottle on 2021-01-16 at 18:53:48 From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/llvm.rb License: Apache-2.0 ==> Dependencies Build: cmake ✘, python@3.9 ✘ Required: libffi ✔ ==> Options --HEAD Install HEAD version ==> Caveats To use the bundled libc++ please add the following LDFLAGS: LDFLAGS="-L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib" <以下略>ということで、cmakeする際に
-DCMAKE_PREFIX_PATH=/usr/local/opt/llvm
というフラグを追加するとうまくいった。チャンチャン。
- 投稿日:2021-01-17T15:23:15+09:00
mac python 環境構築時のエラー
macにpython環境を構築する際に発生したエラーの対処方法が調べても出てきにくかったのでまとめました.
pythonのインストール時に以下のコマンドをターミナルに入力しました.
$ pyenv install 3.9.1すると,以下のようなエラーが出てきました.
Last 10 log lines: checking for python3.9... python3.9 checking for --enable-universalsdk... no checking for --with-universal-archs... no checking MACHDEP... "darwin" checking for gcc... clang checking whether the C compiler works... no configure: error: in `/var/folders/9y/b18s20496nz6mc47pmf2czdm0000gn/T/python-build.20210117143950.2739/Python-3.9.1': configure: error: C compiler cannot create executables See `config.log' for more details xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrungcc(XcodeのCommand Line Tools)をインストールすると解決しました.
1.Xcodeを開き,左上(りんごマーク横)の
Xcodeタブ>Open Developer Tool>More Developer Tools...2.Xcodeのapple IDでログイン
3.Command Line Tools for Xcode 12.0.dmg(任意のバージョン)をダウンロード
4.インストール
5.インストールの確認
gcc -dumpversion 12.0.0以上の操作をしたところ,エラーがなくなりpythonをインストールできました.
pyenv install 3.9.1 python-build: use openssl@1.1 from homebrew python-build: use readline from homebrew Downloading Python-3.9.1.tar.xz... -> https://www.python.org/ftp/python/3.9.1/Python-3.9.1.tar.xz Installing Python-3.9.1... python-build: use readline from homebrew python-build: use zlib from xcode sdk Installed Python-3.9.1 to /Users/shogo/.pyenv/versions/3.9.1
- 投稿日:2021-01-17T15:02:19+09:00
Macでgqlgenのserver.goを起動するとファイアウォール警告が出る
GoのGraphQLサーバライブラリであるgqlgenの開発サーバ(GraphQL Playground)をMac上で起動すると、ファイアウォールの警告が出てしまってめんどくさい。
通常はMacの環境設定のセキュリティとプライバシーのファイアウォール設定で例外を設定するのですが、うまくいかなかったので別の方法で解決します。
server.goの最後で次のようになっています。
log.Fatal(http.ListenAndServe(":"+port, nil))これだと「0.0.0.0」でlistenするようです。0.0.0.0はすべてのネットワークインタフェースを指し、過剰です。
以下のように「localhost」まはは「127.0.0.1」を明示するように変更します。
log.Fatal(http.ListenAndServe("localhost:"+port, nil))これで警告は出なくなりました。
- 投稿日:2021-01-17T06:53:45+09:00
Macのgrepでgrep: empty (sub)expressionと出る場合の対処法
- Macを利用して業務や趣味でgrepをかけて検索や集計等を行うことが多い。
- その際に表題の通りのエラーに遭遇する場合がある。
- そのため今回は、このエラーが出た時の対処法を2点記録する。
結論
方法としては以下の2点。※先をお急ぎの方はGNU版導入を推奨。
brew install grep
でGNU版のgrepを導入。
- ※Mac標準のgrepはBSD版。
- BSDでも動作するようなgrepの書き方に修正する。
※詳細内容は以下の内容蘭で説明。
環境
- Mac OS X 10.15.6
- Darwin 19.6.0
内容
エラー元
- エラーは以下のような例で起きます。
# 文字列の中から、Hello or World or 空 かを検索する。 echo -e "Hello\nWorld" | grep -E '(Hello|World|)' # エラー出力 grep: empty (sub)expression原因
- 原因として、以下が考えられます。
- 正規表現での検索で、候補に空を加えている。
- GNUとBSD版で細かな挙動が違うと耳に入ったことがある。
- 検証のため、Dockerで用意したGNU grep環境で検証したところ、上記の書き方でも問題は無かった。
- このことから空選択時の処理で、細かな挙動の違いが原因であるとわかった。
解消
- 原因特定のため、以下の2点の方法で解消する。
- GNU版grepをインストールする。
- BSDでも動作するようなgrepの書き方に修正する
- 1つ目のGNU版は以下のコマンドをうつだけで完了。
brew install grep
- 2つ目は、以下のように空選択時の処理を変更する。
# 行頭・行末の記号で認識させる。 echo -e "Hello\World" | grep -E '(^|Hello|World)' # 空選択処理自体を削除。 echo -e "Hello\nWorld" | grep -E '(Hello|World)'
- ※空選択は、両方のやり方に一長一短があるため、無難の方を選択
まとめ
- 上記のことから、各OS・ライブラリによっての細かな挙動の違いを認識。
- そのため可搬性の高い記述を意識。
参考