入社3年目 インフラ女子の備忘録

入社3年目のインフラ女子があれこれ悩みながら&つまずきながら、サーバ構築やプログラミングの手順を備忘録的に残していくブログ

【初心者向け】dockerでコンテナを作ってみたい(Dockerインストール編)

こんにちは、ぴよまるです。
今私の会社ではVMwareで仮想サーバを乱立させる運用方法をしています。
自分の環境(mac)の上にESXiサーバを構築して、その上に仮想サーバを...ということもやれなくはないのですが、私のmacちゃんが耐えられるのか...?という心配の方が大きく、何か違う方法でやれないものか。と思っていた所でした。
世間のアプリケーション開発を行う企業ではコンテナ化がどんどん進み、仮想サーバの構築なんて遅くてやってらんない〜時代はコンテナっしょ?なんて話も聞くので、いい機会だしdockerを使ってコンテナの上でシステムを構築してみることにしました。

1. Dockerをインストールしよう!

コマンドプロンプトから以下のコマンドを使用して、インストールを行います。無事インストールが完了すると、/ApplicationにDockerのクジラアイコンができていると思います。

brew cask install docker

2. Docker アカウントを作成しよう!

hub.docker.com
Docker Hubからアカウントを作成します。
入力項目はDocker ID、E-mail、パスワードです。
作成を進めていくと、課金額設定の項目が出てきますが、今回は私はローカルでの検証目的なので、無料のものを選択しました。
ここは用途に合わせて選択してください。

f:id:GRWM_ITInfra:20200813130833p:plain

3 Docker Desktopアプリを立ち上げてサインインしよう!

/Applicationに入っていたクジラのアイコンを開くと、サインインの画面が出てきます。
ここに先ほど作成したアカウント情報を使ってログインします。
f:id:GRWM_ITInfra:20200813131621p:plain

4 Dockerが動くか確認しよう!

f:id:GRWM_ITInfra:20200813132033p:plain
デスクトップの右上にDockerのアイコンがあることを確認します。
そしたらコマンドプロンプトに戻って、念のためDockerが動いていることを、Dockerのバージョン確認のコマンドを使って確認します。

$docker --version:version
Server: Docker Engine - Community
 Engine:
  Version:          19.03.12
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.10
  Git commit:       48a66213fe
  Built:            Mon Jun 22 15:49:27 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

19.03.12が入っているようですね。

ちなみにdockerと打つと、使用可能なコマンドやオプションを一覧で出してくれます。

$docker
Usage:	docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Management Commands:
  builder     Manage builds
  config      Manage Docker configs
  container   Manage containers
  context     Manage contexts
  image       Manage images
  network     Manage networks
  node        Manage Swarm nodes
  plugin      Manage plugins
  secret      Manage Docker secrets
  service     Manage services
  stack       Manage Docker stacks
  swarm       Manage Swarm
  system      Manage Docker
  trust       Manage trust on Docker images
  volume      Manage volumes

Commands:
  attach      Attach local standard input, output, and error streams to a running container
  build       Build an image from a Dockerfile
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  exec        Run a command in a running container
  export      Export a container's filesystem as a tar archive
  history     Show the history of an image
  images      List images
  import      Import the contents from a tarball to create a filesystem image
  info        Display system-wide information
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  login       Log in to a Docker registry
  logout      Log out from a Docker registry
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  run         Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  search      Search the Docker Hub for images
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes

5. Dockerインストール完了

ここまででDockerのインストールが無事に完了です!次からはコンテナを作成していきたいと思います!

pythonでflaskを使ってwebサーバを建てたい

こんにちは、ぴよまるです。いよいよwebサーバを建てる時が来ました。
しかし、pythonは勉強をはじめたばかりで右も左もわかりません。そんな中での試行錯誤した点をまとめてみました。全くの初心者が知識豊富な人の記事を見てもついていけない時があります。そんな時にこういう初心者まるだしの記事がほしいなぁ、と自分では思っていたのでこういう初心者丸出し記事も作っていくことにしました。解答一直線の記事も別で作成します。

今回のサーバ構築は以下のような環境で行います。

環境説明

OS:mac OS Cataline 10.15.4
初期ディレクトリ構成:

/Users
  `--piyomaru
     `--piyomaru
        `--python
           `--index.html

そもそもFlaskって何?

全く知識のなかった私は、webサーバを構築する時にはFlaskというフレームワークを使うと良いのだということだけしか知らず、どのようにディレクトリ構成を組んでいったら良いのかすら検討がつきませんでした。
調べた所、前身にpythonファイル1個だけから成る「bottole」というwebのフレームワークがあり、それの機能拡張版のようです。ふむ。
とりあえず何事もインストールからだ!ということでインストールをしてみます。

flaskをインストール

$ pip install flask


無事にインストール完了です。
/Users/piyomaru/.pyenv/versions/3.8.0/bin//Users/piyomaru/.pyenv/versions/3.8.0/lib/にflaskが入っていることを確認できました。

どんなファイルを作ればいいの?

Flaskを動作させるためには、ルーティングをしてくれるpythonのファイルと、テンプレートとなるhtmlファイルがあればひとまず動くようです。
しかし、ベストプラクティスの構成で最初から作りたい!ということで以下を参考にしました。
qiita.com
めちゃめちゃ作るディレクトリ多い...。
ということで一旦ベストプラクティスの構成は諦めて、必要最低限の以下のディレクトリ構成にしてみます。

/Users
  `--piyomaru
 `--piyomaru
      `--python
          |--routing.py --- ルーティング用
          |--static
          |    `--index.html --- 一番最初に出力されるHTML
          `--templates
              `--echo.html --- ルーティングされた先の出力用

作成するファイルは3つ!

そんなわけで、作成するのはこの3つです。

  • routing.py
  • index.html
  • echo.html

routing.py

ルーティング用のpythonファイルはこんな感じ。Flaskの静的ファイルのホームディレクトリはstaticになります。

from flask import Flask, render_template
app = Flask(__name__)
 
@app.route("/")
def home():
    return app.send_static_file('index.html')
 
@app.route('/echo/<name>/<place>')
def echo(name, place):
    return render_template('echo.html', name=name, place=place)

app.run(port=5000, debug=True)

/static/index.html

次はstaticディレクトリに置く、index.htmlは以下のような感じで特に何も書いてません。文字が表示されるだけ。

<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>Index</title>
    </head>
    <body>
        Welcome to my home page!!!
    </body>
</html>

/template/echo.html

最後にTemplateディレクトリのecho.htmlです。こっちはちょっとギミック入り。echo.htmlに引数nameplaceを渡すと、その引数を使った文字が表示されます。

<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>Flask test</title>
    </head>
    <body>
        Hello  {{ name }}!
        Welcome to {{ place }}!
    </body>
</html>

いざwebサーバを立ち上げ!ようとするも...

さぁ、routing.pyを実行してwebサーバを立ち上げよう!とするものの...

$ python routing.py
Unable to import 'flask' pylint(import-error) [3,1]

なんでなんで!確かにインストールしたのに!flaskのimportができません...。

flaskへのPathが通っていない?

この辺りまで来ると、~/.bash_profile をいじるのに抵抗がなくなってきました。
さくっとflaskが入っていた、/Users/piyomaru/.pyenv/versions/3.8.0/bin//Users/piyomaru/.pyenv/versions/3.8.0/lib/をパスに追加します。

リトライ!→失敗 もう一度flaskについて学び直す

$ python routing.py
Unable to import 'flask' pylint(import-error) [3,1]

ちーん。うんともすんともです。何か間違っている気がするので、もう一度ここでflaskについての情報を探します。
すると、こんな記事を見つけました。
qiita.com

どうやら、プロジェクトごとに個別の実装環境を構築するようです。

virtualenvのインストール

virtualenvはシステムの中に分離されたPythonの仮想環境を作るためのソフトウェアです。つまりここに使用するpythonとflaskが同居していれば、pythonがflaskを見つけられて動くようになるということですね。また、いつもと違うバージョンでシステムを作りたい時にも重宝すると思います。

pip install virtualenv

インストールが完了。

virtualenvで仮想環境を作成

それでは仮想環境を作っていきます。まずは作成するディレクトリまで移動します。

cd /Users/piyomaru/piyomaru/python

そしたら、下記のコマンドでPython仮想環境を作成します。

python -m venv env

pythonディレクトリの中にenvというディレクトリが作成されます。この中にpythonも入っています。
今のディレクトリ構成はこんな感じ。

/Users
  `--piyomaru
      `--piyomaru
          `--python
              |--routing.py
              |--static
              |    `--index.html
              |--templates
              |    `--echo.html
              `--env

仮想環境を有効化する

以下のコマンドで仮想環境を立ち上げることができます。

$source env/bin/activate
(env)$ 

$マークの前に(env)がついていれば成功です。

仮想環境へflaskをインストール

もう一度、今度は仮想環境の方へflaskをインストールします。

pip install flask

無事にインストール完了です。

routing.pyの実行

python routing.py
 * Serving Flask app "routing" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 830-317-826

うおおお!動いた!サーバが立ち上がりました!ちなみに書いてある通りCTRL+Cでサーバはとまります。
さて早速ブラウザで表示されるか見てみよう。

http://127.0.0.1:5000/で接続したところ、無事にWelcome to my home page!!!と歓迎してくれました。
そしてhttp://127.0.0.1:5000/echo/Piyomaru/Japanで接続すると、上手くルーティングしてくれてHello Piyomaru! Welcome to Japan!と日本に来たことを歓迎してくれます。

仮想環境の無効化

使い終わった後は一応、仮想環境の無効化をしておきます。

deactivate

無事になんとかflaskを使用したwebサーバの構築は成功です。いやぁ、長かったなぁ...。

macのターミナルでコマンドが効かない

こんにちは、ぴよまるです。
pythonのパスを通そうと、~/.bash_profileをいじっていたら、macのターミナルでlsviができなくなっていることに気がつきました。
lsなんてめちゃくちゃ使うのに困った...!となったので、復旧方法について書いておきます。

$ ls
-bash:    : command not found

ああああ!なんで!ディレクトリの中身を見せてください!

まずは初期値に戻す

teratail.com
ここを参考に、以下をターミナルで入力し、初期のパスに戻します。

$ export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin

pythonで設定していたパスをもう一度記載

$ vi ~/.bash_profile
 export PYENV_ROOT="$HOME/.pyenv"
 export PATH="$PYENV_ROOT/bin:$PATH"
 eval (pyenv init -)

変更内容を適用

source ~/.bash_profile

これで完了!

これでまたlsを使ってディレクトリの中身を見られるようになりました。
ls意外にもsudoができなくなるみたいです。困っちゃいますね。

Pythonのバージョンが変わらないときの対処法

Pythonをinstallした後にpyenv global 3.8.0をしてもバージョンが2.6.1のままだ...!
どうしよう!というような感じでつまったので、対応方法について記載しておきます。
ちなみに私の環境はOS:mac OS Catalina 10.15.4です。(2020/8/11 現在)

バージョン違いが発覚

pythonを使って、WEBサーバを立ち上げようとしたのですが、以下のコマンドが通らず...。

$ python -m http.server 8000

おかしいなぁ、と思って調べた所、上記の記述はpython3でWEBサーバを立ち上げるものだったことが発覚。
python2ではこのように書きます。

$ python -m SimpleHTTPServer 8000

こっちだとサーバが起動したため、ここで導入したはずのバージョンと起動しているバージョンが違うことに気づきました。あほのこや。

バージョンの確認

現状を確認するためにバージョン確認コマンドを打ちます。

$ python -V
Python 2.6.1

うわぁ、やはりPython2で動いていらっしゃる。

pyenvを使用してpythonのバージョンを切り替える

pyenvとはPythonの実行環境を管理してくれる便利ツールです。pyenvの導入は別記事で書いているのでこちらを参照ください。
grwm-itinfra.hatenablog.com
バージョンの切り替えコマンドを打った後、バージョンを確認してみると...。

$ pyenv global 3.8.0
$python -V
Python 2.6.1

変わっていない!なぜ!

~/.bash_profileを書き換える

ここでいろいろなWebページを参考に、自分と全く同じ状況の方を見つける。
qiita.com
あった!これや!といそいそとviで~/.bash_profileを編集します。自分の場合、pyenv init -だけだと変わらなかったので以下の3行を追記。

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval (pyenv init -)

書き換えた後に適用するためsource ~/.bash_profileを実行。
そしてもう一度バージョン変更&確認をしたところ...

$ pyenv global 3.8.0
$python -V
Python 3.8.0

おおおお!!変わってる!!もうQiita様に足向けて寝られない!
ということで、無事に使いたかったバージョンのpythonを使えるようになりました。

【初心者向け】Pythonのインストール手順(for mac)

Pythonとは?

Pythonは、Webシステムや組込みシステムなど様々な分野で利用されている言語です。Pythonでは、多くのWebシステムが開発されており、「Django」「Bottle」「Flask」など、たくさんのフレームワークが準備されています。

Python以外だと「Apache」や「nginx」などがフレームワークでは有名ですね。

今回は「Flask」を利用したWebサーバを建てることを目標にインストールから進めていきます。

 

Pythonをインストールしよう

今回はmac OS X の環境へインストールしていきます。実はCatalinaの場合は、すでにPythonは入っていますが、最新のバージョンを入れたいのでインストールし直します。

pkgからGUIでインストールする方法もありますが、今回はターミナルからCUIでインストールしていきます。

1. ターミナルを起動

アプリケーションのユーティリティの中にターミナルがあるので、起動しましょう。

2. Homebrewをインストール

HomebrewはMac OS Xで使用できる、ソフトウェアの導入を手助けしてくれるパッケージ管理システムです。
以下のサイトよりインストール用のコマンドを拾ってきます。
https://brew.sh/index_ja
拾ってきたコマンドをターミナルへ入力します。

3. Pyenvをインストール

pyenvとはPythonの実行環境を管理してくれる便利ツールです。こちらも入れておいた方が後々役に立つので入れておきましょう!

$ brew install pyenv

  pyenvを使って、インストールできるpythonのバージョンを確認できます。

$ pyenv install -l
Available versions:
  2.1.3
  2.2.3
  2.3.7
  2.4.0
  2.4.1
  2.4.2
  2.4.3
  2.4.4
  2.4.5
  2.4.6
  2.5.0
  2.5.1
  2.5.2
    ...
    ...

 いっぱい出てきますね...。

4.Pythonをインストール

それでは先ほど確認した、利用できるバージョンのPythonをインストールしてみましょう!

$pyenv install 3.8.0

処理が全部終わればPythonがインストールできているはずです。
さあ、バージョンを確認してみましょう!

$python -V
Python 2.6.1

...あれぇ?あれぇ!?入れたバージョンと違うのですが!?
慌てることなかれです。MacにもともといたPythonが悪さをしているだけです。
パスを追記してあげれば問題なく動きますよ!
(動かすまで2時間ぐらい四苦八苦したので、ここは別の記事でも書いておきます。
 ここでは問題なく動くようになるまでの一連の手順を書いておきます。)
grwm-itinfra.hatenablog.com

5. ~/.bash_profileの編集

(1)ターミナルで~/.bash_profileを開く
vi ~/.bash_profile
(2)vi モードになったら[ i ]キーを押してinsertモードに切り替え、以下の記述を追記
$ export PYENV_ROOT="$HOME/.pyenv"
$ export PATH="$PYENV_ROOT/bin:$PATH"
$ eval (pyenv init -)
(3)[esc]キーを入力後、[:wq] を入力して変更内容を保存

Linuxを触っていると脳死でviで編集できてしまうと思いますが、このブログではプログラミング初心者が脳死でできるようできるだけ細かく書いてます。

(4)変更した内容を適用
$ source ~/.bash_profile

これでパスは通ったはずです。

6. 変更できるバージョンの確認

$ pyenv versions
*2.6.1
 3.8.0

あとはバージョンを変えるだけです!

7. バージョンの変更

$ pyenv gloval 3.8.0

ちなみに、pyenv glovalでは環境全体のバージョンを変更でき、
pyenv localでは、カレントディレクトリに指定したバージョンのファイルができて、そのpythonを参照して動作するようになります。

8.バージョンの確認

$python -V
Python 3.8.0

無事に入れたかったバージョンのPythonが入りました!!ぱちぱち
お疲れ様でした!