Adventカレンダー 社内Docker環境の話

会社でやっているAdventカレンダー 3日目の記事です。

ここ1年で蓄積したDockerのナレッジを書きます。

弊社では、ローカルの開発環境でDockerを利用しています。

決して安定している開発環境とは言えず、日々ブラッシュアップしている状況ですが、培ったナレッジを書き残します。

dockerネットワークの話

コンテナは起動する事に、排他的な独自のネットワークを作ります。
単純にコンテナを起動するだけであればあまり気にする事はありませんが、IPアドレスによる制限を行っている場合は起動の度にコンテナのIPアドレスが変わる為、ネットワーク設計を考える必要があります。

弊社の環境ではL7のPATHルーティングを必要としますので、以下のような構成になります。

127.0.0.1:80
 ↓
Nginxロードバランサコンテナ
 ↓     ↓
コンテナA  コンテナB

上記の構成の場合、
① NginxロードバランサーコンテナのIPアドレスを固定する。
② X-Forwardedに127.0.0.1を含む場合アクセスを許可する。

の2つの許可方法が考えられますが、①で行うように設定しようと考えました。

docker-composeでコンテナを起動する場合、単一のコンテナだけではなく全てのコンテナにIPアドレスを固定指定する必要がありますが、
上記のようにコンテナが3つだけであれば良いのですが、実際は20ぐらいのコンテナが動いています。

同一ネットワークでNginxロードバランサコンテナだけIPアドレスを固定してみましたが、DHCPレンジとぶつかるケースがコンテナ側の起動が出来ない事がありました。
その為、ネットワークの設定、DHCPプールの設定を行う必要があります。

docker network create --subnet=172.19.0.0/16 --gateway=172.19.0.1 --ip-range=172.19.1.0/24 ネットワーク名

・Dockerネットワーク全体のネットワークは172.19.0.0/16
・ゲートウェイは172.19.0.1
・DHCPレンジは172.19.1.0/24の範囲で設定する。

Dockerネットワーク作成後、172.19.1.0/24 以外を固定IPアドレス設定可能ネットワークとして、通常通りコンテナにIPアドレスを固定しても、
DHCPレンジとのバッティングも発生しなくなりました。

    networks: 
      ネットワーク名:
        ipv4_address: 172.19.0.5

node ビルドの話

nodeのbuild(npm run dev等)がとにかく遅い。
ソースコードをそのままvolumesとしてマウントを行いビルドを行うと、node_modules配下が作られるが、
node_modules配下を”別物として”マウントする事で、ビルドの速度改善が見られた。

services:
  app:
    build:
      context: ./app
    volumes:
      - app/src:/var/www/DocmentRoot
      - node_modules_volume:/var/www/DocmentRoot/node_modules

volumes:
  node_modules_volume:

快適に開発が行える環境までもう一歩。
現在は社内からクレームが多い 「自分の業務とは関係ないコンテナを立ち上げたくない(重い)」の対応を進めているので、
動き始めたらその事も記事に書く予定です。

SSH接続時にMacのターミナルのプロファイルを切り替える

何故、YAMAHA機器の文字コードはsjis何だろう・・・

と嘆いていましたが、MacのターミナルからSSHの接続先でプロファイルを切り替える方法を記載します。

itermでも同様の事が行えるようですが、sshのconfigのHostname情報と完全一致しないとプロファイルの切り替えがダメそう。

iTerm2でSSHログイン先別にプロファイルを自動的に切替えて事故防止する方法

192.168.x.xはYAMAHAしかないし、複数のL2スイッチ、L3スイッチ、ルーターとconfigを書きたくないんじゃー!という方向け。

  1. ターミナルのプロファイルを好きに作成します。
    今回は、
    「honban」 ・・・ Homebrewから複製。背景をゆるキャン△の画像に差し替え
    「network」 ・・・ Homebrewから複製。背景は拾ったネットワークチックな画像に差し替え。文字コードをsjinに変更。

  2. ~/.bash_sshなどに以下のスクリプトを記載します。

#!/bin/bash

# SSH接続先に、「prd」という文字列が入ってたら、本番環境とみなしてターミナルの「Honban」プロファイルを適用する
if [[ `echo $@ | grep 'prd'` ]] ; then
   /usr/bin/osascript -e "tell application \"Terminal\" to set current settings of first window to settings set \"Honban\""
   echo $@
   /usr/bin/ssh -F ~/.ssh/config $@

# SSH接続先に、「192.168」もしくは「172.20」のサブネットであれば、ターミナルの「network」プロファイルを適用する
elif [[ `echo $@ | egrep '192.168|172.20'` ]] ; then
   /usr/bin/osascript -e "tell application \"Terminal\" to set current settings of first window to settings set \"network\""
   /usr/bin/ssh -F ~/.ssh/config $@

# 上記に該当しない接続先は、Homebrewプロファイルを適用する
else
   /usr/bin/osascript -e "tell application \"Terminal\" to set current settings of first window to settings set \"Homebrew\""
   /usr/bin/ssh -F ~/.ssh/config $@
fi

実行権限を付けるのを忘れないように。

chmod +x ~/.bash_ssh
  1. .bash_profileで、sshコマンドへのaliasを設定します。
    最終行に以下を追記します。
alias ssh="~/.bash_ssh $@"

これで、itermのプロファイル切り替えとほぼ同等の事が出来るようになります。
違う点は、sshで接続終了後「ターミナルのデフォルトのプロファイル」に戻らないのは美しくありませんが、他のサーバーに繋ぐと改めてプロファイルが適用されますので、あまり気にしない事にします。

Mac+python3.7でSSL: CERTIFICATE_VERIFY_FAILEDが発生する場合の対応

BeautifulSoup4を使った時に発生したエラー

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 1317, in do_open
    encode_chunked=req.has_header('Transfer-encoding'))
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py", line 1229, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py", line 1275, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py", line 1224, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py", line 1016, in _send_output
    self.send(msg)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py", line 956, in send
    self.connect()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py", line 1392, in connect
    server_hostname=server_hostname)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ssl.py", line 412, in wrap_socket
    session=session
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ssl.py", line 853, in _create
    self.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ssl.py", line 1117, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1051)

During handling of the above exception, another exception occurred:

解決策:

$ /Applications/Python\ 3.7/Install\ Certificates.command

参考:
https://qiita.com/orangain/items/0a641d980019fd7e0c52

Mac(Lion)にgccを入れる

片手間で調べてて、3日間も無駄にしたからメモ

MacでSubsonicを動かすべく、ffmpegをコンパイルしようとしたらgccが無いよ!とエラーが出た。

Macド素人だけど、ググってる内に以下の事が分かった。

①gccは、Macの開発環境(Xcode)を入れると、一緒に入るらしい。

②インストール場所は、MaxOSによって異なるらしい。
  Snow Leopardまでは/Develop配下、Lionは/Application配下

③Xcodeの特定バージョン以降(忘れた)、gccが無くなった(?)らしい。

半ば諦めかけていたところ、以下のブログに遭遇した。
みる きく 考える 進む 仙台に住む音声工学系大学院生の雑記帳

こちらに紹介されていた
Command Line Tools for Xcode をインストールする。
って方法で、コマンドラインからgccが使えるようになった!
(ただ、xcodeに含まれるgccは本家のものとは違うらしいが、その辺はよくわからない)