20210117のMacに関する記事は8件です。

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.yml
version: '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:3306

ymlに書いている属性?で、自分が理解していることを以下の表に書いてみる
(間違っているところを指摘してくれる優しい人いたら教えてください)

./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.yml
  mysql:     ←これ!!!
    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=utf8

default_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
こちらへアクセス

qiita_20200117_01.png

以上!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.yml
version: '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:3306

ymlに書いている属性?で、自分が理解していることを以下の表に書いてみる
(間違っているところを指摘してくれる優しい人いたら教えてください)

./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.yml
  mysql:     ←これ!!!
    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=utf8

default_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
こちらへアクセス

qiita_20200117_01.png

以上!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MacBook Twitter 共有方法

ウェブページのTwitterボタンを使わずにTwitterで共有する方法

1.App StoreでTwitterアプリをインストール、ログインする
2.ツールバーのファイルを選択
3.共有を選択
4.Twitterを選択

image.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

.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/zsh

PCに入ってるShell一覧を確認

brew install zsh
udo sh -c "echo '/bin/zsh' >> /etc/shells"
chsh -s /bin/zsh

zshがそもそもなかった場合はHomebrewなどでインストールして、切り替え。

chsh -s /bin/bash

bashに戻したい場合はこれ。

.bashrcは.zshrcに置き換え

echo $SHELL
/bin/zsh

一旦、上記で変更されていることを確認。

~/.zshrc
PROMPT='%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-completions

zsh-completions(補完機能)の設定は必須だと思うので、追加。
Homebrewでインストール出来る。設定は.zshrc内を参照。
あとは、下記をいれた。
- プロンプト複数起動時のhistory共有
- コマンドのスペルミスの修正
- Command補完

. bash_profileは.zprofileに置き換え

今までだと.bash_profileから.bashrcを呼んでいたのだが、新しいセッションごとに.zshrcは呼ばれるようなのでこの設定はいらないみたいだ。なので、.zprofileについては特に今の所は何も記載していない。今後、何か記載した場合は追記する予定。

まだまだ、zshにはより良い機能がたくさんあるとのことなので、更新していきたい。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【emacs】company-ironyを導入してC言語補完環境を構築

ironyサーバーのビルドに失敗したので、その備忘録。

環境

macOS Mojava 10.14.6
GNU Emacs 26.3

company-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というフラグを追加するとうまくいった。

チャンチャン。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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/xcrun

gcc(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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Macでgqlgenのserver.goを起動するとファイアウォール警告が出る

GoのGraphQLサーバライブラリであるgqlgenの開発サーバ(GraphQL Playground)をMac上で起動すると、ファイアウォールの警告が出てしまってめんどくさい。
20210108160313.png

通常は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))

これで警告は出なくなりました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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・ライブラリによっての細かな挙動の違いを認識。
  • そのため可搬性の高い記述を意識。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む