気ままなタンス*プログラミングなどのノートブック

プログラミングやRPGツクール、DTM、VOCALOIDについてのんびり書きます。

【メモ】Dockerを試してみる

職場の先輩とDockerについて会話した。 名前は聞いたことがあるものの、具体的にどんなものかわからなかったので、実際に試してみることにした。

www.atmarkit.co.jp

上記の記事にそって、Dockerに関するセットアップを行った。

環境まわり

  • VirtualBox4.3
  • Ubuntu 14.04 LTS

雑感

  • Ubuntu上に、さらに仮想Ubuntuがいるような印象を受けた(これがコンテナと呼ばれているっぽい)
    • コンテナ(Ubuntu)の立ち上がりが超速い
  • サーバープログラムをピンポイントで起動できる
    • hogeコンテナにあるnginxを起動して、ホストから接続したい
    • hogeコンテナにあるdjangoアプリのrunserverを起動して、ホストから接続したい といったことができるみたい
  • なんとなく・・・
    • Windowsで.NET仮想環境的なものができるんなら、激しく仕事で使いたい
      • .NET4、.NET4.5.2、.NET3.5の環境をコンテナとして作成して、それぞれでWebアプリ検証・・・とか。

Dockerのセットアップ

docker.ioをインストール

$ sudo apt-get install docker.io

docker.ioサービスの自動起動を有効にする

$ sudo update-rc.d docker defaults

Docker Engineの情報確認

$ sudo docker info
Containers: 0
Images: 0
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 0
 Dirperm1 Supported: false
Execution Driver: native-0.2
Kernel Version: 3.13.0-24-generic
Operating System: Ubuntu 14.04 LTS
CPUs: 1
Total Memory: 3.861 GiB
Name: mainubuntu-VirtualBox
ID: 5ZC6:T2F4:KRER:FXJW:LCNA:AFOH:CZTA:M5G4:D54H:3ETV:CCRS:MSY7

dockerグループに追加

$ sudo gpasswd -a main-ubuntu docker

sudoなしで実行可能となる

$ docker info

※なお、dockerグループに追加することについて、セキュリティに懸念があるとのこと。 以下の記事を参考にするように書いていた。 docs.docker.com

Docker Engineの構成

  • Dockerイメージというものが存在する(vagrantっぽい)
  • Dockerイメージからコンテナーを作成する(ubuntuイメージから、任意のubuntu1コンテナーを作成・・・等)
  • Dockerコンテナーには、実行中と停止の状態が存在する
    • Linuxプロセス管理と同様の扱いができる(バックグラウンドプロセス等)
  • コンテナ―のコピー
    • コンテナーに、必要なソフトウェアのインストールや、設定変更を行う
    • 該当コンテナ―から、同じデータを持つコンテナ―をコピーし、新しいイメージを作成することができる。
  • Dockerfileというテキストファイルに変更内容を記述すると、バッチ的に実施可能

Dockerによるコンテナ―作成

Dockerイメージをダウンロード

# docker pull イメージ名:タグ
$ docker pull ubuntu:latest

ダウンロードしたイメージの確認

$ docker images


REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              latest              ca4d7b1b9a51        11 days ago         187.9 MB
  • REPOSITORYは、基本的にユーザー名/イメージ名という形になっている
  • ユーザー名がついていないものはDocker公式のもの(トップレベリポジトリ

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

# docker run [オプション] [--name {コンテナー名}] {イメージ名} [: {タグ名} ] [コンテナ―で実行するコマンド] [引数]
$ docker run -it --name ubuntu1 ubuntu /bin/bash

上記コマンドを実行すると、ubuntu1コンテナのシェルが起動する

root@0080640d7613:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

コンテナ―にnginxをインストール

$ apt-get install nginx
  • ctrl + dでbashプロセスを終了

コンテナの稼働状態確認

# docker psで実行中のもののみ。
$ docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
0080640d7613        ubuntu:latest       "/bin/bash"         7 minutes ago       Exited (130) 2 minutes ago                       ubuntu1   

コンテナ―から、Dockerイメージを作成する

今回、ubuntu1というコンテナ―に、nginxをインストールした。 このコンテナ―を再利用し、新たなイメージ(rinnegrid/nginx)を作成する

# docker commit {コンテナ―名} | {コンテナ―ID} [{ユーザー名} /] {イメージ名}
$ docker commit ubuntu1 rinnegird/nginx
  • イメージの状態を確認すると、rinnegrid/nginxが増えている
$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
rinnegrid/nginx     latest              5c672a27e9b6        5 seconds ago       206.1 MB
ubuntu              latest              ca4d7b1b9a51        11 days ago         187.9 MB

バックグラウンドでコンテナ―を実行し、コンテナ―のnginx上コンテンツを表示

$ docker run -d -p 8000:80 --name nginx1 rinnegrid/nginx /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf

$ curl localhost:8000
# これで、ホスト側からコンテナ―のコンテンツにアクセスできるようになる

試しにDjangoアプリを動かしてみる

  • docker-composeという便利なツールがあるみたいだが、とりあえず今回の手順で作成してみる
# ubuntuからdjango1というコンテナ―を作成
$ docker run -it --name django1 ubuntu /bin/bash

# コンテナ―上のシェルで実行

# wgetをインストール
$ apt-get install wget

# pipをインストール
$ cd /tmp
$ wget https://bootstrap.pypa.io/get-pip.py
$ python3 get-pip.py

# pipの状況を確認
$ pip -V


# Djnagoのインストール
$ pip install django

# Djangoプロジェクトの作成
$ mkdir /usr/share/django
$ cd /usr/share/djagno

django-admin startproject docker_test
$ cd docker_test

# Djangoマイグレーション実行
$ python3 manage.py migrate

# 開発サーバーが起動できるか確認
$ python3 manage.py runserver


ここで一度、ctrl + dでコンテナ―を閉じて、ホストに戻る


# Dockerイメージの作成

# django1コンテナ―から、イメージを作成
$ docker commit django1 rinnegrid/django

# dockerイメージからコンテナ―を作成し、Djangoアプリを起動
$ docker run -d -p 8000:8000 --name django2 rinnegrid/django python3 /usr/share/django/docker_test/manage.py runserver 0.0.0.0:8000

# ホストから接続可能か確認
$ curl localhost:8000

ざっと使ってみた感じ、かなり便利だと感じた。

あと、ubuntuイメージの立ち上がりが、爆速なことに感動。

素敵なツールが用意されていると思うので、調査しながら色々と試してみたい。