Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

Dockerを使ってみる 前編 djangoで使うことを想定

概要

Dockerを使ってみる。

参考書籍

https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEDocker%E6%95%99%E7%A7%91%E6%9B%B8-%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98%EF%BC%86%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AB%E3%82%88%E3%82%8B%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%AE%E8%87%AA%E5%8B%95%E5%8C%96-WINGS%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E9%98%BF%E4%BD%90%E5%BF%97%E4%BF%9D-ebook/dp/B017UGA7NG/ref=pd_sim_351_23?_encoding=UTF8&psc=1&refRID=Z5NBKNBWYV2EW1YVDEKJ

やってみたこと

docker pull image名:tag名

docker pull django
docker pull nginx
docker pull digmore/docker-django-uwsgi

djangoで使いそうなimageをdownloadしてみました。

docker push image名:tag名

image名は、/image名:tag名 で設定する。

docker push <dockerhub user名>/django

Docker Containerの生成、起動、停止

imageからcontainerを生成してみる。

docker run -it --name "test" centos /bin/cal
  • -it コンソールに結果を出す
  • --name コンテナ名をつける
  • centos image名
  • /bin/cal コンテナでcalコマンドを実行する
docker run -it --name "test2" centos /bin/bash
  • /bin/bash コンテナ内で、シェルを起動させる。

コンテナをバックグラウンドで実行する

docker run -d centos /bin/ping localhost
  • -d バックグランドで実行するオプション
  • /bin/ping localhost localhostpingコマンドを実行する。
  • ping 相手先のホスト名(IPアドレス) で、相手先のホストが疎通可能状態かを調べる

バックグラウンドで実行されているかどうかを確認する

docker logs -t コンテナID

コンテナ常時再起動の設定例

docker run -it --restart=always centos /bin/bash

コンテナのネットワーク設定

docker run -d -p 8080:80 httpd

この状態で、http://localhost:8080/ にアクセスすると、it works! が表示されるはず!

  • -d バックグラウンドで実行する
  • -p ホストの任意のポートをコンテナに割り当てる。
  • httpd httpd(apache)のイメージ名
  • -p 8080:80 httpd ホストPCの8080ポートにアクセスすると、コンテナ場で動作しているhttpd(80port)のサービスにアクセスできる。
  • ポート番号のレンジについては、exposeで設定できる

コンテナネットワークの設定、DNSサーバを設定

# DNSサーバ指定
docker run --dns=192.168.1.1 httpd

# MACアドレスの指定
docker run -it --mac-address="*************" centos

# ホスト名とIPアドレス定義(コンテナ内の/etc/hostsに)
docker run -it --add-host=test.com:192.168.1.1 centos

# コンテナ自身のホスト名を指定する(hostnameオプション)
docker run -it --hostname=www.test.com --add-host=node1.test.com:192.168.1.1 centos

リソースを指定してコンテナを生成実行

docker run --cpu-shares=512 --memory=512m centos

ホストOSとコンテナ内のディレクトリを共有したい時

docker run -v /c/Users/asa/WebPage:/var/www/html httpd

コンテナ生成起動する環境変数を指定

docker run -it -e foo=bar centos /bin/bash
  • -e 環境変数を設定できる。 試しにset とコマンドを打つと、foo=barという表示がされるはず。

環境変数を一括して登録する場合

# envファイルの作成
cat env_list
hoge=fuga
foo=bar

# envファイルの設定
docker run -it --env-file=env_list centos /bin/bash

コンテナ内の作業ディレクトリを指定する

docker run -it -w=/tmp/work centos /bin/bash

コンテナの一覧表示

docker ps

コンテナの稼動確認

docker stats [コンテナ名]

コンテナの起動・停止・再起動

docker start コンテナID
docker stop コンテナID
docker restart コンテナID

再起動などは時間指定可能。

# 2秒後に再起動
docker restart -t 2 コンテナID

コンテナの削除

docker rm コンテナid

コンテナの中断・再開

docker pause コンテナid
docker unpause コンテナid
  • stop とpauseの違いは?処理を強制終了するのと、処理を途中で保存して再開するみたいな違いなのか?

稼動しているdockerコンテナの操作

稼動コンテナへの接続

docker attach コンテナIDorName

稼動コンテナでプロセス実行

これはdocker runさせてないとerrorが出るので注意!

docker exec コンテナ識別子 実行するコマンド

## apacheという名前のコンテナのコマンドを実行する
docker exec -it modest_bell /bin/bash

稼動コンテナのプロセス確認

docker top コンテナ識別子

稼動コンテナのポート転送確認

docker port httpd

コンテナの名前を変更する

docker rename big_morse django

コンテナ内のファイルをコピーする

docker cp django:/etc/passwd /Users/****/Downloads/

ホストPCのファイルをコンテナにコピーする

逆にするだけ。

docker cp /Users/*****/Downloads/requirements.txt django:/temp/requiments.txt

コンテナ操作の差分確認

docker diff コンテナ識別子
  • Aと出ているものが、追加、Cが更新

Dockerの情報確認

# versionの確認
docker version

# docker の実行環境確認
docker info

コンテナからイメージの作成

docker commit -a "Yatchi" django designlabs/djangotest
  • docker commitで、イメージ作成
  • -a で、作者を指定する。
  • django コンテナ識別子
  • designlabs/djangotest がuser名と、イメージ名

コンテナをtarファイル出力(docker export)

docker export django > test.tar

test.tarファイルを確認する

tar -tvf test.tar

tarファイルからイメージ作成

docker import ファイルまたはURL

# 以下のような例になる
cat test.tar | docker import - djangorrila:1.0

イメージの保存

docker save 保存ファイル名 イメージ名

# 例
docker save -o testsave.tar httpd

イメージの読み込み

docker load -i tarファイル名

docer save/load, import/exportの違い

ファイル構造が違うため、 saveで作ったファイルは、load exportで作ったファイルは、import でそれぞれ読み込む。

とりあえず、前編はここまで。