20210303のdockerに関する記事は10件です。

Docker環境でのByebugの使い方

docker&railsの開発を学んでるとByebugを使うには一手間いるとのこと

以下docker-compose.ymlにコード追加

docker-compose.yml
services:
  web:
    stdin_open: true <= 追加する
    tty: true <= 追加する

続けてコードを反映するために以下をする

$ docker-compose up -d

エラーが特に出なければOK

Byebugの使い方

コンテナIDまたはコンテナ名を調べる

$ docker ps

コンテナのIDか名前をアタッチする

$ docker attach <container name or ID>

デバッグの準備完了

Byebug終わり方

byebugが終わり、標準出力に戻りたい場合は

Ctrl + P + Q

または

(byebug) quit

でデバッグから抜けます
Ctrl + C で抜けようとするとめんどくさい事になるらしいのでやらないように

参考記事

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

unshareコマンドで、Namespaceを作成してみる

こんにちは。

Dockerの仕組みを学習して、コンテナはNamespaceなどのLinuxの機能で出来ている事が判明し、Namespaceを自分で作成できることがわかったので試してみました。
今回はプロセスの分離と、ホスト名の分離を行いました。

$ unshare コマンドでNamespaceを作成してみる

筆者はCentOS7環境で行っています。

プロセスの分離(PID, Mount)

まず$ps axで通常のNamespaceのプロセスを表示します。

たくさん表示されます。

$ ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:01 /usr/lib/systemd/systemd --switched-root --system --d
    2 ?        S      0:00 [kthreadd]
    3 ?        S      0:00 [kworker/0:0]
    4 ?        S<     0:00 [kworker/0:0H]
    5 ?        S      0:00 [kworker/u4:0]  
    ~~~
    2195 pts/0    R+     0:00 ps ax

Namespaceを作成するために以下のコマンドを実行します。

$ sudo unshare --pid --mount-proc --fork /bin/bash
  • --pidは、PID Namespaceを分離します。
  • --mount-procは、/procディレクトリをマウントする設定で、これを指定しないと親のpid名前空間の情報を出力してしまいます。 /procディレクトリは、システムの状態などが保管されている特殊なディレクトリで、これらはメモリ上に保存される仮想ファイルと呼ばれるものです。
  • --forkは指定されたプログラムを直接実行するのではなく、unshareの子プロセスとしてフォークします。

PID Namespaceを作成する際は、これらがセットで用いられるのが一般的のようです。

新たなNamespaceで$ps axを実行すると、bashpsのみが表示され、プロセス空間が分離されていることがわかります。

# ps ax
  PID TTY      STAT   TIME COMMAND
    1 pts/0    S      0:00 /bin/bash
   14 pts/0    R+     0:00 ps ax

確認ができたので、$exitで元の名前空間に戻ります。

# exit
exit

ホスト名の分離(UTS)

今度はホスト名の分離をします。
ホスト名はUTS Namespaceで管理されています。

$hostnameで現在のホスト名を確認します。

$ hostname
localhost.localdomain

以下のコマンドでUTS Namespaceを分離します。

$ sudo unshare -u /bin/bash
  • -uはUTS Namespaceを分離します。

以下のコマンドでホスト名newhostに変更します。

# hostname newhost

再度$hostnameを実行し、ホスト名が変更されたことを確認します。

# hostname
newhost

$exit元のNamespaceに戻ります。

# exit
exit

最後にもう一度$hostnameを実行し、元のNamespaceではホスト名が変更されていない事が確認できます。

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

docker-compose up で突然エラーになる

備忘録的なもの

dockerでのrails開発中にいきなり docker-compose up したらエラーになり頭を抱えた。

ERROR: for <コンテナ名>  UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60)

ERROR: for web  UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60)
ERROR: An HTTP request took too long to complete. Retry with --verbose to obtain debug information.
If you encounter this issue regularly because of slow network conditions, consider setting COMPOSE_HTTP_TIMEOUT to a higher value (current value: 60).

長い時間解決法を探していたがDocker for Macを再起動すれば解決した。
Dockerがたまにおかしくなるらしいとのことで、、
理解するのにはまだ長い道のり

参考記事

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

DockerでAnaconda環境構築+jupyterの分析環境を整える

0.はじめに

SIGNATEで「日本取引所グループ ファンダメンタルズ分析チャレンジ」というコンペが開催されています。私も参加していますが、その中で出てくる知識に関して基礎部分をまとめよう!という動機の記事第3弾(最終回)です。

本コンペのチュートリアルではDocker環境でサンプルコード(.ipynb )が動くようになっていて、結構運営への質問も多かったようである。私事ですが最近実務でもクラウド/コンテナを勉強しなければならなくなったので、本記事はその備忘録も多少兼ねています。

  • 動作環境
    • OS : Windows10 pro (Ver.2004)
    • Docker : 20.10.2

1.Dockerって何なのか?

これに関しても溢れるほど解説記事がありますが、本記事は自分自身の備忘録を兼ねる為、理解に必要な周辺知識含めてなるべく平易な用語を使って私なりの理解を改めて書いておこうと思います。
※なおサーバやインフラ系の知識については自分自身もまだ勉強中な身ですので、悪しからず。

仮想環境(PC)とは?
「1つの物理的なPC(OS)の中で別の仮想的なPC(OS)を動かす」こと。
pythonをやっている方の場合「conda」等の仮想環境を思い浮かべてもらえるとわかりやすいかも。
あれは「この検証にはpython3.6を使いたいけど、あの検証にはpython3.8が使いたい!」という時に実行環境を分けることができますよね? これをpythonだけではなくて別の言語、はたまたOSまで使い分けたい!という場合にこの仮想環境が必要なのである。

Dockerとは?
↑で説明した仮想化環境を提供するソフトウェア(Docker社が公開しているOSS)の1つ。仮想化環境の実現に「コンテナ型」という技術を使っている
なお、Dockerを動かすためのOSにはlinuxが必要である。
よってWindowsの場合はWSL(Windows Subsystem for Linux)というものを使用することでDockerを使えるようになる

で、そのコンテナって何?
データとかプログラムとかOS(正確にはOSっぽいもの)とかを細かい部屋に分ける「仕切り(物置)」のこと。その物置を別のPC(環境)にそのまま移設することも出来るので、貿易船で積み荷として輸送されるコンテナみたいだね!っていうことで「コンテナ」と名付けられているらしい。
Dockerの場合、Dockerエンジンを使うことでこのコンテナが使えるようになる。

(Docker)コンテナイメージとは?
貿易コンテナの中には当然「荷物」が入っているはずである。その積み荷を「コンテナイメージ」と呼んでいる。
CD-Rを例にすると、CD-Rの中に入っているデータがまさにここでいうイメージである。(CD-Rは持ち運んで色々なPCにインストールできるのでコンテナとも言えるかも・・)

通常はOS(linuxとかWindowsとか)+アプリ(pythonとかTensorflowとか)がインストール済の環境をまとめたものが積み荷(イメージ)として存在する
コンテナイメージ自体は、一般的に企業や有志が誰でも使えるように配布していて、我々はそのイメージをコンテナに格納することで全く同じ環境を簡単に構築できるというわけである。
Docker Hubというサイトでこの配布されているイメージを確認可能。

また、当然逆に自作コンテナからイメージを作ることもできる。
配布されているイメージで足らない分を自分で改造すれば、その改造コンテナを新イメージとして作ることもできる。

2台の物理PCにそれぞれ環境を作るのと何が違うの?
物理的な環境が違っていたり、PC構成が微妙に違っていても「意識せずに同じ環境が用意できる」ことが強み。
1台目のPCで苦労して環境構築し、同じ環境を2台目にも。。という場合に「あれ?うまくいかない」という場面はみんな経験したことがあるのではないだろうか? Qiitaを見てみても「環境構築」の記事がたくさん見受けられるということは、みんなそれだけ微妙な構成違いで苦しんでいるということの裏返しなのである。

つまり、どんな環境でも絶対に動いてほしい場合にこのコンテナ(Docker)という技術はとても重宝するのである

でなんで、色々な仮想化手法がある中でDockerがいいの?
とにかく動作が軽い。
詳細は記載しないが、「OSの一部機能をホストPC(物理PC)に託している」ことが軽量につながっているらしい。※これが「OSっぽいもの」と呼んでいる正体。実際には完全なOSではないのである。

2.Dockerの導入

過去に素晴らしい解説記事があったので、この記事を参照して環境構築してください。
なお、私のPCはwindows10 proですが今はWindows10 Homeでもproでも↓の方法で構築すればOKなはずです。(この手の記事でよく出てくるHyper-VはWSL2になってからは不要です)

参考記事:WindowsでDockerを始める手順

※もしかしたらWin10のバージョンが古いと失敗するかもですが、その場合は現時点(2021/2時点)最新のVer.2004にアップデートしてください。

3.Dockerでpython(Anaconda)環境を構築

Anacondaの公式がDockerイメージをDocker hubで公開しているのでこれを使うだけ。
continuumio/anaconda3 – Docker Hub
↑がAnacondaの配布イメージのページである。もしAnacondaの古いバージョンで作成したい場合は「Tags」の中に入っている。

コンペの中では「Anaconda3 2019.03」のコンテナイメージ(以下参考図)を使っているので、今回はそれを例として進める。まずはコンテナイメージから取得する。

※コマンドプロンプトにて
docker pull continuumio/anaconda3:2019.03

これでAnacondaイメージを取得できた。ちなみにこの時「このAnacondaイメージってなんのOSっぽいものが一緒に使われてるんだ??」って疑問に思ったのでそれも調べてみる。

※コマンドプロンプトにて
docker inspect --format="{{ .Os}}" continuumio/anaconda3:2019.03
実行結果
linux

つまりこのAnacondaイメージで一緒になっているOSはlinuxということがわかった。
JupyterはこのAnacondaの中に入っているので、これを使う。

4.コンテナ経由でjupyter notebookを起動

落としてきたイメージをコンテナに乗せて起動し、jupyterをそこから起動させていく。
その際に「マウント」といって、自分のPCのローカルフォルダとDockerの中のディレクトリ(フォルダ)を同期させるようなことを今回はしていく。
このマウントをすることで、コンテナから外部(自分の指定したフォルダ)を操作することができるようになる。

4-1.まずは落としてきたイメージの確認

docker images
実行結果
REPOSITORY              TAG     IMAGE ID       CREATED         SIZE
continuumio/anaconda3   2019.03    (略)      (略)     (略)

先程docker pullで落としてきたanaconda3のイメージがあることが確認できた。

4-2.コンテナの作成、コンテナ内のディレクトリ構造確認

下のコマンドでイメージからコンテナを作成し、rootディレクトリに入ることが出来る

docker run -it continuumio/anaconda3:2019.03
実行結果
(base) root@*****:/#

このままlinuxの直下ファイル確認コマンド(ls)を押せばroot直下のコンテナ内ディレクトリ等が確認可能

ls

※(base) root@*****:/#の中で実行している
実行結果
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

今回は「マウント」を行うので、コンテナ内のどのディレクトリにマウントするか?を考える上でディレクトリ構造の把握をしておくといい。
ちなみに、(base) root@*****:/#(コンテナ)の中から抜け出すには「exit」コマンドを入力すればいい

4-3.マウント設定等を反映させてコンテナを起動する

まずは、Windows側でコンテナ側とマウントさせたいフォルダ(コンテナ側のjupyterから直接参照させるフォルダ)を作成しておく

# Windows側のディレクトリ構成 
#「docker_sample 」の直下にIPython(jupyterのプログラム)を配置させる ※ここをマウント対象にする
#「data_dir」の中にjupyterで読み込むようなデータを入れる想定

''' Windows側ディレクトリ
Desktop -- docker_sample -- data_dir -- 共有するファイル(csvとか画像とか)
'''

Windows側の準備が終わったならば、まずはjupyterプログラムを配置させるディレクトリへ移動しておく。

cd C:\Users\***\Desktop\docker_sample

※ディレクトリをjupyterを起動させたい場所にしておく

次にマウント設定等をした上でのコンテナ起動コマンドを実行する

"""
【docker run + オプション(下記) + イメージ】
--name → コンテナ名を指定(なくてもいい)
-v → マウント指定(コロンの左側がローカル側、右側がコンテナ側のpath)
-p → ポート接続(コロンの左側がローカル側、右側がコンテナ側※jupyterは8888)
--rm → コンテナ終了時にコンテナ自動的に削除
--it → ホスト側のターミナルからコンテナ内部の操作
※^ は長いコマンドの場合に改行の意味を示すコマンド(キャレット)
※-v "%cd%":/notebook の意味は「ローカル側が未記載≒今のpath(docker_sample)」、
「コンテナ側はnotebookフォルダ」をマウントさせるという意味。
notebookフォルダはデフォルトでは存在しないのでコンテナ側で作成される
"""

docker run --name docker_practice ^
-v "%cd%":/notebook ^
-p 8888:8888 --rm -it continuumio/anaconda3:2019.03
実行結果
(base) root@****:/#

これでローカル側をマウントした上でコンテナを起動できた!
後は、この起動したコンテナの中でjupyterを起動するだけである

"""
jupyter notebook以下は起動オプション。ここでの説明は省略する。
最後の「/notebook」はなくてもいいが、つけておくと最初のjupyter起動ディレクトリがマウントさせているnotebookになる
※この時点ですでに「コンテナ」に入っているのでlinux環境。改行が^ではなく、バックスラッシュになる
"""
jupyter notebook --ip 0.0.0.0 --allow-root --no-browser \
--NotebookApp.disable_check_xsrf=True  --NotebookApp.token='' \
--NotebookApp.password='' /notebook
実行結果
・・・略・・・
[I **:**:** NotebookApp] The Jupyter Notebook is running at:
[I **:**:** NotebookApp] http://*****:8888/

後は、ブラウザからhttp://localhost:8888/でjupyterを起動すれば、docker_sampleをマウントした「notebook」ディレクトリでスタートする。
そしてローカル側でマウントさせたフォルダ直下であれば、適当にファイルを入れればjupyter側(コンテナ側)でも同様に確認できるはず。

キャプチssssャ.PNG

そして、適当にプログラムを作成して下のようなコマンドを入れれば、今このjupyterがいるディレクトリがコンテナ側のマウントディレクトリ「/notebook」であることがわかる。
これで後は好きに分析をやっていけばいい。
※jupyterでは、%を入れることでlinuxコマンドを扱える。%pwdで今自分がいるpathを表示できる

対象ページの検証

5.おわりに

どうだったであろうか?
ちなみに今回長々と記事にしたものは、本来Dockerでは1命令で全て完結できる。
(イメージのダウンロードも実は不要。無ければ勝手にダウンロードする仕組み)
しかし↓の命令をいきなり見ても、慣れていない人にはアレルギーが出るので、細かく分けて説明してきた。
本記事はDockerのほんの取っ掛かりにすぎず、まだまだ色々知ることはあると思うが、この記事をとっかかりにDockerで色々作業をしていってくれると私も報われます。一緒に勉強していきましょう

"""
Windows側のフォルダ準備やチェンジディレクトリ(cd)さえしておけば、
本記事の解説内容は実はこの1命令で済んでしまう(実際のコンペチュートリアルはこれだけが書かれていた)
"""
docker run --name docker_practice -v "%cd%":/notebook ^
-p 8888:8888 --rm -it continuumio/anaconda3:2019.03 ^
jupyter notebook --ip 0.0.0.0 --allow-root --no-browser ^
--NotebookApp.disable_check_xsrf=True  --NotebookApp.token='' ^
--NotebookApp.password='' /notebook
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerでAnaconda環境構築+jupyterを起動させる

0.はじめに

SIGNATEで「日本取引所グループ ファンダメンタルズ分析チャレンジ」というコンペが開催されています。私も参加していますが、その中で出てくる知識に関して基礎部分をまとめよう!という動機の記事第3弾(最終回)です。

本コンペのチュートリアルではDocker環境でサンプルコード(.ipynb )が動くようになっていて、結構運営への質問も多かったようである。私事ですが最近実務でもクラウド/コンテナを勉強しなければならなくなったので、本記事はその備忘録も多少兼ねています。

  • 動作環境
    • OS : Windows10 pro (Ver.2004)
    • Docker : 20.10.2

1.Dockerって何なのか?

これに関しても溢れるほど解説記事がありますが、本記事は自分自身の備忘録を兼ねる為、理解に必要な周辺知識含めてなるべく平易な用語を使って私なりの理解を改めて書いておこうと思います。
※なおサーバやインフラ系の知識については自分自身もまだ勉強中な身ですので、悪しからず。

仮想環境(PC)とは?
「1つの物理的なPC(OS)の中で別の仮想的なPC(OS)を動かす」こと。
pythonをやっている方の場合「conda」等の仮想環境を思い浮かべてもらえるとわかりやすいかも。
あれは「この検証にはpython3.6を使いたいけど、あの検証にはpython3.8が使いたい!」という時に実行環境を分けることができますよね? これをpythonだけではなくて別の言語、はたまたOSまで使い分けたい!という場合にこの仮想環境が必要なのである。

Dockerとは?
↑で説明した仮想化環境を提供するソフトウェア(Docker社が公開しているOSS)の1つ。仮想化環境の実現に「コンテナ型」という技術を使っている
なお、Dockerを動かすためのOSにはlinuxが必要である。
よってWindowsの場合はWSL(Windows Subsystem for Linux)というものを使用することでDockerを使えるようになる

で、そのコンテナって何?
データとかプログラムとかOS(正確にはOSっぽいもの)とかを細かい部屋に分ける「仕切り(物置)」のこと。その物置を別のPC(環境)にそのまま移設することも出来るので、貿易船で積み荷として輸送されるコンテナみたいだね!っていうことで「コンテナ」と名付けられているらしい。
Dockerの場合、Dockerエンジンを使うことでこのコンテナが使えるようになる。

(Docker)コンテナイメージとは?
貿易コンテナの中には当然「荷物」が入っているはずである。その積み荷を「コンテナイメージ」と呼んでいる。
CD-Rを例にすると、CD-Rの中に入っているデータがまさにここでいうイメージである。(CD-Rは持ち運んで色々なPCにインストールできるのでコンテナとも言えるかも・・)

通常はOS(linuxとかWindowsとか)+アプリ(pythonとかTensorflowとか)がインストール済の環境をまとめたものが積み荷(イメージ)として存在する
コンテナイメージ自体は、一般的に企業や有志が誰でも使えるように配布していて、我々はそのイメージをコンテナに格納することで全く同じ環境を簡単に構築できるというわけである。
Docker Hubというサイトでこの配布されているイメージを確認可能。

また、当然逆に自作コンテナからイメージを作ることもできる。
配布されているイメージで足らない分を自分で改造すれば、その改造コンテナを新イメージとして作ることもできる。

2台の物理PCにそれぞれ環境を作るのと何が違うの?
物理的な環境が違っていたり、PC構成が微妙に違っていても「意識せずに同じ環境が用意できる」ことが強み。
1台目のPCで苦労して環境構築し、同じ環境を2台目にも。。という場合に「あれ?うまくいかない」という場面はみんな経験したことがあるのではないだろうか? Qiitaを見てみても「環境構築」の記事がたくさん見受けられるということは、みんなそれだけ微妙な構成違いで苦しんでいるということの裏返しなのである。

つまり、どんな環境でも絶対に動いてほしい場合にこのコンテナ(Docker)という技術はとても重宝するのである

でなんで、色々な仮想化手法がある中でDockerがいいの?
とにかく動作が軽い。
詳細は記載しないが、「OSの一部機能をホストPC(物理PC)に託している」ことが軽量につながっているらしい。※これが「OSっぽいもの」と呼んでいる正体。実際には完全なOSではないのである。

2.Dockerの導入

過去に素晴らしい解説記事があったので、この記事を参照して環境構築してください。
なお、私のPCはwindows10 proですが今はWindows10 Homeでもproでも↓の方法で構築すればOKなはずです。(この手の記事でよく出てくるHyper-VはWSL2になってからは不要です)

参考記事:WindowsでDockerを始める手順

※もしかしたらWin10のバージョンが古いと失敗するかもですが、その場合は現時点(2021/2時点)最新のVer.2004にアップデートしてください。

3.Dockerでpython(Anaconda)環境を構築

Anacondaの公式がDockerイメージをDocker hubで公開しているのでこれを使うだけ。
continuumio/anaconda3 – Docker Hub
↑がAnacondaの配布イメージのページである。もしAnacondaの古いバージョンで作成したい場合は「Tags」の中に入っている。

コンペの中では「Anaconda3 2019.03」のコンテナイメージ(以下参考図)を使っているので、今回はそれを例として進める。まずはコンテナイメージから取得する。

※コマンドプロンプトにて
docker pull continuumio/anaconda3:2019.03

これでAnacondaイメージを取得できた。ちなみにこの時「このAnacondaイメージってなんのOSっぽいものが一緒に使われてるんだ??」って疑問に思ったのでそれも調べてみる。

※コマンドプロンプトにて
docker inspect --format="{{ .Os}}" continuumio/anaconda3:2019.03
実行結果
linux

つまりこのAnacondaイメージで一緒になっているOSはlinuxということがわかった。
JupyterはこのAnacondaの中に入っているので、これを使う。

4.コンテナ経由でjupyter notebookを起動

落としてきたイメージをコンテナに乗せて起動し、jupyterをそこから起動させていく。
その際に「マウント」といって、自分のPCのローカルフォルダとDockerの中のディレクトリ(フォルダ)を同期させるようなことを今回はしていく。
このマウントをすることで、コンテナから外部(自分の指定したフォルダ)を操作することができるようになる。

4-1.まずは落としてきたイメージの確認

docker images
実行結果
REPOSITORY              TAG     IMAGE ID       CREATED         SIZE
continuumio/anaconda3   2019.03    (略)      (略)     (略)

先程docker pullで落としてきたanaconda3のイメージがあることが確認できた。

4-2.コンテナの作成、コンテナ内のディレクトリ構造確認

下のコマンドでイメージからコンテナを作成し、rootディレクトリに入ることが出来る

docker run -it continuumio/anaconda3:2019.03
実行結果
(base) root@*****:/#

このままlinuxの直下ファイル確認コマンド(ls)を押せばroot直下のコンテナ内ディレクトリ等が確認可能

ls

※(base) root@*****:/#の中で実行している
実行結果
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

今回は「マウント」を行うので、コンテナ内のどのディレクトリにマウントするか?を考える上でディレクトリ構造の把握をしておくといい。
ちなみに、(base) root@*****:/#(コンテナ)の中から抜け出すには「exit」コマンドを入力すればいい

4-3.マウント設定等を反映させてコンテナを起動する

まずは、Windows側でコンテナ側とマウントさせたいフォルダ(コンテナ側のjupyterから直接参照させるフォルダ)を作成しておく

# Windows側のディレクトリ構成 
#「docker_sample 」の直下にIPython(jupyterのプログラム)を配置させる ※ここをマウント対象にする
#「data_dir」の中にjupyterで読み込むようなデータを入れる想定

''' Windows側ディレクトリ
Desktop -- docker_sample -- data_dir -- 共有するファイル(csvとか画像とか)
'''

Windows側の準備が終わったならば、まずはjupyterプログラムを配置させるディレクトリへ移動しておく。

cd C:\Users\***\Desktop\docker_sample

※ディレクトリをjupyterを起動させたい場所にしておく

次にマウント設定等をした上でのコンテナ起動コマンドを実行する

"""
【docker run + オプション(下記) + イメージ】
--name → コンテナ名を指定(なくてもいい)
-v → マウント指定(コロンの左側がローカル側、右側がコンテナ側のpath)
-p → ポート接続(コロンの左側がローカル側、右側がコンテナ側※jupyterは8888)
--rm → コンテナ終了時にコンテナ自動的に削除
--it → ホスト側のターミナルからコンテナ内部の操作
※^ は長いコマンドの場合に改行の意味を示すコマンド(キャレット)
※-v "%cd%":/notebook の意味は「ローカル側が未記載≒今のpath(docker_sample)」、
「コンテナ側はnotebookフォルダ」をマウントさせるという意味。
notebookフォルダはデフォルトでは存在しないのでコンテナ側で作成される
"""

docker run --name docker_practice ^
-v "%cd%":/notebook ^
-p 8888:8888 --rm -it continuumio/anaconda3:2019.03
実行結果
(base) root@****:/#

これでローカル側をマウントした上でコンテナを起動できた!
後は、この起動したコンテナの中でjupyterを起動するだけである

"""
jupyter notebook以下は起動オプション。ここでの説明は省略する。
最後の「/notebook」はなくてもいいが、つけておくと最初のjupyter起動ディレクトリがマウントさせているnotebookになる
※この時点ですでに「コンテナ」に入っているのでlinux環境。改行が^ではなく、バックスラッシュになる
"""
jupyter notebook --ip 0.0.0.0 --allow-root --no-browser \
--NotebookApp.disable_check_xsrf=True  --NotebookApp.token='' \
--NotebookApp.password='' /notebook
実行結果
・・・略・・・
[I **:**:** NotebookApp] The Jupyter Notebook is running at:
[I **:**:** NotebookApp] http://*****:8888/

後は、ブラウザからhttp://localhost:8888/でjupyterを起動すれば、docker_sampleをマウントした「notebook」ディレクトリでスタートする。
そしてローカル側でマウントさせたフォルダ直下であれば、適当にファイルを入れればjupyter側(コンテナ側)でも同様に確認できるはず。

キャプチssssャ.PNG

そして、適当にプログラムを作成して下のようなコマンドを入れれば、今このjupyterがいるディレクトリがコンテナ側のマウントディレクトリ「/notebook」であることがわかる。
これで後は好きに分析をやっていけばいい。
※jupyterでは、%を入れることでlinuxコマンドを扱える。%pwdで今自分がいるpathを表示できる

対象ページの検証

5.おわりに

どうだったであろうか?
ちなみに今回長々と記事にしたものは、本来Dockerでは1命令で全て完結できる。
(イメージのダウンロードも実は不要。無ければ勝手にダウンロードする仕組み)
しかし↓の命令をいきなり見ても、慣れていない人にはアレルギーが出るので、細かく分けて説明してきた。
本記事はDockerのほんの取っ掛かりにすぎず、まだまだ色々知ることはあると思うが、この記事をとっかかりにDockerで色々作業をしていってくれると私も報われます。一緒に勉強していきましょう

"""
Windows側のフォルダ準備やチェンジディレクトリ(cd)さえしておけば、
本記事の解説内容は実はこの1命令で済んでしまう(実際のコンペチュートリアルはこれだけが書かれていた)
"""
docker run --name docker_practice -v "%cd%":/notebook ^
-p 8888:8888 --rm -it continuumio/anaconda3:2019.03 ^
jupyter notebook --ip 0.0.0.0 --allow-root --no-browser ^
--NotebookApp.disable_check_xsrf=True  --NotebookApp.token='' ^
--NotebookApp.password='' /notebook
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

webpack-dev-serverにドメインでアクセスする

やりたいこと

Dockerコンテナ上でnpm run serveしたときに任意のドメインでアクセスしたい

設定

nginx-proxyを利用して設定したドメインで各コンテナにアクセスできる状態にする。

nginx-proxyを利用した環境の構築はここ等を参考にしてください。

docker-compose.ymlはこんな感じ

docker-compose.yml
version: '3.5'

services:
  node:
    build: ./infra/node
    environment:
      VIRTUAL_HOST: "任意のドメイン"
      HTTPS_METHOD: "noredirect"
    expose:
      - 3000
    networks:
      - app-network
      - local-network
    command: sh -c "npm run serve"

networks:
  app-network:
    name: app-network
  local-network:
    external: true
    name: local-network

vue.config.jsに設定を記述します。

vue.config.js
module.exports = {
  devServer: {
    host: '0.0.0.0',
    port: 3000,
    disableHostCheck: true, 
    watchOptions: {
      poll: true
  }
}

以上の設定でnpm run serveした後に任意のドメインでアクセスが可能になります。

所感

今回やりたいことを実現するにあたって正直理解できていないところがたくさんある(host: '0.0.0.0'やnginx-proxyの仕組み等)ので、一つ一つ調べて理解して使うことが大事だと痛感しました。

参考

nginx-proxyを利用した環境の構築
【超便利】DockerでPHPローカル開発環境の最強構築方法

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

bratサーバーをGCPのVM(Ubuntu 20.04)に作成し、Webブラウザを使ってアノテーションを始めるまでの手順

はじめに

アノテーションの方法として、oxを判定する比較的簡単なデータ分析はグーグルスプレッドシートで対応していました。

しかし、最近系列ラベリングなどのアノテーションが必要になり、グーグルスプレッドシートでは厳しくなってきたので、何かしらのアノテーションツールを導入することにしました。

要件としては以下のとおりです。

  1. OSによらず(特にWindowsは必須)、極力複雑な手順を含めずに、かつ複数ユーザーからアクセス可能にする
  2. サーバーはGCPのVMを使い、データはサーバ上で管理する(クライアントにデータを置かない)

今回は利用経験があるということもあり、bratを使うことにしました。

ただ、bratサーバを立てる記事は少なめ(ローカルでとりあえず使うというのは結構ある)なので、「VM作成〜クライアントからbratへアクセスしてexampleにタグ付け」までの流れを忘備録としてまとめることにしました。

手順

0. 前準備: gcloudをインストールする

GCPのVMへ接続する上で、クライアントPCにgcloudをインストールしておくと、色々はかどります。

以下のクイックスタートからOSに応じたgcloudをインストールしておきましょう。

1. GCPでbratを導入するVMを作成する

まずbratをインストールするサーバーを作ります。今回はGCP computer engingのVMを使います。

ポイントは以下のとおりです。

  • スペックは軽めで問題ない(アノテーション対象のデータが乗る程度のディスク容量は確保しておく)
  • bratサーバーへHTTPでアクセスできるようにするためのファイアウォールの設定が必要
  • セキュリティを高めるために外部IPは付与しない(エフェメラルIPもなし)

今回は、例として以下のようなサーバーを作成しました

  • OS: Ubuntu 20.04
  • スペック: 適当(ディスクは一応20G用意)
  • サーバー名: brat-server
  • project名: test
  • zone名: asia-east1-a
  • 外部IP: なし
  • ファイアウォール: tcp:8888を開ける(ポートは他と重複しなければ自由。接続元IPアドレスの範囲は適宜調整)
  • サービスアカウント: アクセス予定のユーザーを詰め込んだものを設定しておく

2. dockerをインストールする

今回はbratのdockerコンテナを利用するため、先にdockerをインストールします。

といっても、brat用に特別な対応は必要なく、普通にdockerをインストールすればよいだけです。

記述する必要性も薄いですが、一応手順を掲載しておきます

# gcloud ssh を使って(1)で作成したサーバーへ接続(ブラウザからのアクセスでも問題ない)
gcloud compute ssh --project "test" --zone "asia-east1-a" brat-server

# とりあえずupdate
sudo apt update

# インストールに必要なアプリケーションをインストール
sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

# 承認用のキーを取得・確認し、dockerのリポジトリ情報をインストール
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

# dockerのインストールとテスト
sudo apt update
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo docker run --rm run-test
sudo docker rmi run-test #イメージの削除

3. bratをインストールする

brat用のdockerコンテナを作成している方がいますので、それをそのまま利用します。

今回はコメントなどを日本語化しているroy29fuku様のコンテナを使いました。

bratコンテナとそのデプロイ方法は、コンテナ作成者の以下のサイトを参考にさせていただきました(というかほぼそのまま)。

# docker volumeの作成と確認(brat関係のデータ置き場になります)
sudo docker volume create --name brat-data
sudo docker volume create --name brat-cfg

sudo docker volume ls

# bratコンテナDL〜起動まで
git clone https://github.com/roy29fuku/brat-docker.git
cd brat-docker/

### 注意: Dockerfileの書き換えが必要 ###
# `FROM ubuntu` 以降の近いところに `ENV DEBIAN_FRONTEND=noninteractive` を追加

# build
sudo docker build . -t roy29fuku/brat
# 確認
sudo docker images

# docker コンテナの初回起動
sudo docker run --name=brat-dev -d -p 8888:80 -v brat-data:/bratdata -v brat-cfg:/bratcfg -e BRAT_USERNAME=brat -e BRAT_PASSWORD=brat -e BRAT_EMAIL=hogehoge@xxx.com roy29fuku/brat

注意点としては、ubuntu18以降の環境だとdocker buildがうまく通らないことです(タイムゾーン選択で詰まる)。

対処方法として、DockerfileにENV DEBIAN_FRONTEND=noninteractiveを書き加えることで解決できます。

原因については以下の記事を参照してください。

4. クライアントからブラウザ上でbratサーバーにアクセスする。

gcloud ssh でローカルフォワーディングし、ブラウザから設定したポートへアクセスすることで比較的安全にbratサーバーへアクセスできます(設定したprojectおよびサービス アカウントに関するGoogleの認証が必要になります)。

# ポートフォワーディング(ローカルのポートは他のポートと被らないなら何でも良い)
gcloud compute ssh --project "test" --zone "asia-east1-a" brat-server -- -N -L 2222:localhost:8888

# Chromeなどのブラウザ上で localhost:2222 にアクセス(bratサーバーにつながる)# 右上のbratのアイコンからログインする(ユーザー名とパスワードは(3)で設定したもの)# example のデータでタグ付けができればOK

5. その他

本記事ではbrat自体の設定については省略します。以下のページが参考になると思います。

おわりに

今回はGCPのVMにUbuntuサーバーを作成し、bratをdockerインストールして、ローカル環境からexampleをアノテーションするところまでを解説しました。

やっぱりアノテーション専用のツールを使うと作業が快適になりました。皆様もぜひ導入してみてはいかがでしょうか?

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

初学者がコンテナを何度も落としながらもECSデプロイに成功したのでメモしておく

未経験ですが、めちゃくちゃ苦戦しながらもECSへのデプロイに成功したので、メモしておきます。
特にDockerfileの記述ミスでコンテナが落ちまくったので今回はDockerfileの書き方を中心に書いていきます。
何か間違いなどありましたら遠慮なくコメントにメッセージをお願いします。成長できればと思っています。

前提

PHP Laravel PostgreSQL Docker
7.4.5 7.28.4 13.1 19.03.13

ECSデプロイまでの大まかな流れ

(注意 Dockerfileから作成したイメージをカスタムイメージとここでは呼びます)
ECSデプロイまでの全体図

用語確認

ECS
コンテナに関する設定、管理などあらゆるものを自動化してくれるサービス

タスク
コンテナの集合体

タスク定義
どのようなタスクを生成するか定義している

サービス
指定したタスク定義からタスクを生成する(イメージをコンテナ化させる)

クラスター
タスクとサービスをグルーピングする。クラスターにアプリケーションを動かすためのサーバーなどを指定する。

厳密ではありませんが大まかに上記の流れを踏んでECSへサービスをデプロイします。
AWS側の設定も大変ですが、今回は起点となるDockerfileの書き方(ECSバージョン)をフォーカスしてみます。

Dockerfileとは?

Docker上で動作させるコンテナの構成情報を記述するファイル。コンテナ内の環境を構築するファイル。
この説明では分かりにくいと思うのでこれから詳しく見ていきます。

Dockerfileの役割

基本的にはイメージをビルドすること。
イメージをビルドするとは、ベースとなるイメージに対して何らかの機能や設定を加えて、独自のイメージを生成するということ。

Dockerfileによるイメージビルドまでの流れ

Dockerfileによるイメージビルドまでの流れ

厳密ではありませんが僕のいろいろ調べたところ上の流れになっていると認識しました。

実際のDockerfile(ECSデプロイバージョン)

FROM php:7.4.1-fpm

RUN apt-get update \
  && apt-get install -y wget git unzip libpq-dev libfreetype6-dev libjpeg62-turbo-dev libpng-dev \
  && : 'Install Node.js' \
  &&  curl -sL https://deb.nodesource.com/setup_12.x | bash - \
  && apt-get install -y nodejs \
  && : 'Install PHP Extensions' \
  && docker-php-ext-install -j$(nproc) pdo_pgsql \
  && mkdir /workdir

COPY --from=composer /usr/bin/composer /usr/bin/composer
COPY . /workdir
WORKDIR /workdir
RUN composer install
CMD ["php","artisan", "serve", "--host", "0.0.0.0", "--port", "8085"]

Dockerfileの解説

ベースイメージの指定

FROM php:7.4.1-fpm

まずはベースとなるDockerイメージを指定します。これを基点にオリジナルのイメージを作成していきます。

パッケージリストの更新

RUN apt-get update \

パッケージリストの更新を行います。
具体的に何をやっているのかというと、

/etc/apt/sources.list

に書かれているURLからパッケージインデックスファイルを引っ張ってきて

$ cd /var/lib/apt/lists

に格納しています。

コンテナ正常に稼働させるために必要なパッケージをインストール

&& apt-get install -y wget git unzip libpq-dev libfreetype6-dev libjpeg62-turbo-dev libpng-dev \

&&について
RUNコマンドを複数使うとそれだけイメージレイヤが増えるため、&&で連結させ複数の処理をひとつのRUNにまとめて記述することが推奨されているそうです。

apt-get install -y
apt-getは引数に書いたパッケージがアップロードされているサーバーに問い合わせて、そのパッケージを自動でインストールしてくれるコマンド。引数 -y を設定しておくとインストール途中に「yes/no」を聞かれたとき自動で「yes」を選んでくれる。

Node.jsのインストール

&& : 'Install Node.js' \
&&  curl -sL https://deb.nodesource.com/setup_12.x | bash - \

最初の行は下の実行処理に名前をつけています。
Node.jsとは、ブラウザ上という制限された環境でしか動けないJavaScriptを、パソコン上で動かせるようにしてくれるJavaScriptの実行環境。

PDO_PGSQLのインストール

&& : 'Install PHP Extensions' \
&& docker-php-ext-install -j$(nproc) pdo_pgsql \

PDO_PGSQLとは、PHPからPostgreSQLデータベースへアクセス可能にするためのドライバ。
これによりPostgreSQLが使用できるようになります。

コンテナ内に作業ディレクトリを作成しておく

&& mkdir /workdir

コンテナ内にディレクトリを作成しておきます。
のちのちコンテナの中にアプリケーションコード群(Laravelのコード群)を配置しなければならず(そうしないと当然アプリは動かない)、そのアプリケーションコード群を格納するためのディレクトリが必要なのでここで作成しておきました。

Composerのインストール

COPY --from=composer /usr/bin/composer /usr/bin/composer

わずかこの1行だけで完了します。

補足
composerとは、パッケージ依存管理ツールです。
パッケージは依存し合っているので、Aというパッケージをインストールするとき、パッケージAを利用するにはパッケージB,C,D,Eが必要なケースもあります。
そんなときcomposerを利用することで、パッケージB,C,Dまとめてインストールしてくれます。
詳しくは以下の記事から!
PHP開発でComposerを使わないなんてありえない!基礎編

アプリケーションコード群をコンテナ内にコピペする

COPY . /workdir

もちろん動かす予定のコンテナ内にアプリケーションコードがなければアプリは起動しないので、コンテナにコードを配置させるという処理をしなければなりません。

このとき便利なのがCOPYコマンドです。
ローカル上にあるコード郡をコンテナ内部にコピーして貼り付けてくれます。このCOPYコマンドを実施しなければコンテナの中身は空っぽな状態になります。

COPYコマンドの引数は以下の通りです。

COPY コピー元 コピー先

さらに細かく見ると、

COPY Dockerfileから見たコード群の位置(相対パス) コンテナ内の貼り付ける位置(絶対パス)

それを踏まえた上でもう一度、上のCOPYコマンドを確認してみます。

COPY . /workdir

第1引数は「カレントディレクトリ」を表すドットです。
DockerfileをLaravelのコード群の中に配置したので、この場合コピー元にカレントディレクトリと指定するとDockerfileも含めたLaravelコード群がまずコピーされます。

注意点
Dockerfileより上の階層にあるファイルやディレクトリをコピー元として選択できません。
上の階層のものを指定したい場合、docker-compose.ymlのbuildオプションを利用して実現可能です。(ここではその解説は省略します)

第2引数に /workdir を指定しました。
このディレクトリは以前上で作成したディレクトリです。このディレクトリの中にコピーしたLaravelコード群一式をペーストします。

以上でコンテナ内にもアプリケーションコード群が存在するようになりました!

作業ディレクトリを移動する

WORKDIR /workdir

この後に続く処理は、アプリケーションコードが格納されたディレクトリ内部で実行しなければならないため、実行場所をあらかじめ移動しておきます。

補足

WORKDIRは、作業するディレクトリ(コマンドの実行場所)を指定しますが、指定したディレクトリが存在しない場合、自動的に指定したディレクトリを作成した上で移動してくれます。

vendorディレクトリのインストール(省略可)

RUN composer install

僕の場合、Gitを利用してリモートリポジトリにプッシュしたあとCircleCI/CDを利用して自動でデプロイが実行されるように設定したのでこの処理が必要でした。
Gitでプッシュされるものの中に「vendorディレクトリ」は省かれる(.gitignore)ためです。

コンテナ内のアプリケーションコードの中に「vendor」ディレクトリが存在しない場合、コンテナ起動時に以下のようなエラーが検出されます。

Warning: require(/workdir/vendor/autoload.php): failed to open stream: No such file or directory in /workdir/artisan on line 18

これはvendorディレクトリが存在しないために発生するエラーです。
vendorディレクトリを改めてインストールするには「composer install」コマンドを実行しなければなりません。

なので、ビルド時にコンテナ内であらかじめ「composer install」コマンドを実行して「vendorディレクトリ」を再インストールしておきました。

コンテナ起動時に自動的にPHPサーバーを立ち上げる

CMD ["php","artisan", "serve", "--host", "0.0.0.0", "--port", "8085"]

CMDコマンドとは、カスタムイメージのビルド成功後、そのカスタムイメージをコンテナとして起動させるタイミングで一度だけ実行できるコマンドです。これを設定しておけばコンテナ起動時に毎回指定の処理を実行してくれます。

僕はこれを指定しておらずコンテナが何度も落ちてしまいました。
これを指定しなければコンテナのヘルスチェックに引っかかり続けます。
なぜならサーバーが立ち上がっていないため、ヘルスチェックによって指定のパスにアクセスしても正常なレスポンスが返らないからです。

補足 ヘルスチェックとは?
特定のサーバー上のサービスに、作業を正常に実行できるかどうかを確認する方法です。
分かりやすくいうと、ロードバランサーにサービス上のあるパスを設定しておき、その設定したパスにロードバランサーが試験的にアクセスし、正常なレスポンスが返ればOK、異常ならばコンテナを落とします。

以上でECSにデプロイ可能なカスタムイメージを作成できうるDockerfileを作成することができました!!!!!

開発環境にDockerを使う方法やdocker-compose.ymlについてもまとめたいところですが、長くなるので別の記事にまとめます。

最後に

まだ未経験の初学者なもので、公式サイトやあらゆる記事を参考に手探りでDockerfileの書き方や内容を学んできました。
また大枠を捉えられるようにするため、厳密には異なる箇所もあると思います。
しかし初学者にとってDockerfile(特にECSへのデプロイ用)を理解するのは結構ハードル高いように感じたので、自分なりに記事にまとめてみました。
何か相違点などある場合は遠慮なくメッセージしていただけると嬉しいです。
ここまで読んで頂きありがとうございました!

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

Dockerコマンド チートシート

run = create + start

-it

  • -iはインプットのチャネルを開く。stdinのチャネルを開く
  • -tは出力した結果を開く。整えてくれる

デフォルトコマンドの上書き

docker run <image> <command>

コンテナ名の指定

docker run --name <container_name> <image>

detached バックグラウンドでコンテナを回す

docker run -d <image>

foreground コンテナを起動するけど、閉じたらコンテナを削除

docker run --rm <image>

コンテナの削除

削除したいコンテナはPSを予め止める必要がある

Docker stop

IDなどを指定して削除

docker rm

まとめて削除

docker system prune

参考資料

米国AI開発者がゼロから教えるDocker講座 | Udemy

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

データサイエンス100本ノックを C# でやってみた

データサイエンス100本ノック を C# でも

データサイエンティスト協会 様が公開してくれている
データサイエンス100本ノック

を C# でもやってみました。

まだ日本語の情報は少ないですが C# でも データサイエンス関連のライブラリがすこしづつ充実してきている感じです。

今回 MathNet.Numerics を利用しました。

その Jupyter Notebook の ページがこちら 『 データサイエンス100本ノック C# 実行結果 (Notebook Viewer) 』

Visual Studio Code 上に 環境を構築すると LINQ を使って わりとサクサク 回答する事ができました。

Docker イメージと 回答例 を github 上に公開 しています。

Docker 環境構築が 面倒な方でも Web 上で 直接実行できる環境があります。
このボタン
Binder 
をクリックして 画面が表示されるまで しばらくお待ちください。
実際に データサイエンス 100本ノック C# 版 の コードを WEB 上で動かす事ができます。

Visual Studio Code で Jupyter Notebook 環境構築手順

Visual Studio Code をインストールし、

.NET Interactive Notebooks
パッケージを追加し

.NET 5 SDK
を インストールすると

Visual Studio Code で サクサク開発ができます。

自動補完の機能が便利です。

編集例

編集例

Jupyter Notebook の 実行環境 Docker Image 説明

Jupyter Notebook を 簡単に試すための Docker Image を作成しました。

Docker Desktop を インストールしている環境で

git clone https://github.com/kkato233/100knocks-data-scientist-cs
cd 100knocks-data-scientist-cs
docker-compose up -d --build

とすると
http://localhost:8889/ の アドレスで .NET 対応版の Jupyter Notebook が開きます。

Notebook

Jupyter Notebook の環境構築は Docker が便利ですね。

Python 複数バージョンが競合したり、ライブラリが変に競合する事がありません。

誰かが作ってくれたイメージをありがたく使わせてもらいましょう。

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