職場の先輩とDockerについて会話した。 名前は聞いたことがあるものの、具体的にどんなものかわからなかったので、実際に試してみることにした。
上記の記事にそって、Dockerに関するセットアップを行った。
環境まわり
- VirtualBox4.3
- Ubuntu 14.04 LTS
雑感
- Ubuntu上に、さらに仮想Ubuntuがいるような印象を受けた(これがコンテナと呼ばれているっぽい)
- コンテナ(Ubuntu)の立ち上がりが超速い
- サーバープログラムをピンポイントで起動できる
- hogeコンテナにあるnginxを起動して、ホストから接続したい
- hogeコンテナにあるdjangoアプリのrunserverを起動して、ホストから接続したい といったことができるみたい
- なんとなく・・・
- Windowsで.NET仮想環境的なものができるんなら、激しく仕事で使いたい
- .NET4、.NET4.5.2、.NET3.5の環境をコンテナとして作成して、それぞれでWebアプリ検証・・・とか。
- Windowsで.NET仮想環境的なものができるんなら、激しく仕事で使いたい
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イメージの立ち上がりが、爆速なことに感動。
素敵なツールが用意されていると思うので、調査しながら色々と試してみたい。