勉強会
初心者
docker
ハンズオン
新人プログラマ応援

Dockerの勉強会(ハンズオン)用のテキストをつくってみた - 基礎編

はじめに

  • 私は、そもそも勉強会というのもがあまり好きではありません。なので、参加はほとんどしたことがありません。
  • また、人前で発表したりするのも苦手です。
  • 拒否反応をいままで示していましたが、色々なきっかけで開催まで踏み切ってみたお話です。
  • 発表内容や資料などは稚拙なものや誤りがあるかもしれません。ご了承ください。
  • 前回の機械学習が終わったので、Dockerについて開催してみました。
  • 第1回としては、簡単な導入や操作について行いました。

アジェンダ

目的とゴール

Docker環境を導入して、仮想イメージを作ってみよう。

  1. Dockerとは ※約10分
  2. コンテナの作成と起動 ※約10分
  3. イメージの作成と保存 ※10分
  4. イメージをDocker Hubに保存する ※約10分
  5. ホストマシンとコンテナ間のファイル共有 ※約10分(時間があれば)
  6. 演習:好きなソフトウェアを入れてみよう(特になければMySQL) ※約10分(時間があれば)

進め方

  • ノートパソコンを用意してください。(64bitマシンが必要です)
  • ペアプログラミングでもかまいません。用意が難しいけど参加してみたい場合は、相談ください。
  • 事前にDockerをインストールしておいてください。
  • 事前にDocker Hubのアカウントを取得しておいてください。
  • 特に前提知識はありません。アジェンダに添って事前に予習していただいてもかまいません。
  • 開始も終了も時間厳守にします。あまりにも中途半端な場合は宿題 or 次回持越とします。

宿題

イメージとコンテナのインポートとエクスポートをやってみよう

Dockerとは

https://www.slideshare.net/KeitaNeriai/docker-84331236

Dockerのインストール

Macの場合

https://www.docker.com/docker-mac

Windowsの場合

https://docs.docker.com/docker-for-windows/

Dockerの起動

プロキシの設定をする

Preferences > Proxies

起動する

start

イメージの取得

Docker Hubにログインする

docker login

イメージ一覧を確認する

docker images

CentOS 6を取得する

docker pull centos:6

取得したイメージを確認する

docker images

コンテナの作成と起動

起動中のコンテナ一覧を確認する

docker ps

コンテナの作成

※なお、イメージ取得も同時に行ってくれるためpullは省略可能

docker run -it centos:6

OSのバージョンを確認する

cat /etc/redhat-release

コンテナの起動と停止

コンテナからログアウトする

cntl + Q か cntrl + P

起動中のコンテナIDを取得する

docker ps

起動中のコンテナにログインする

docker attach {コンテナID}
docker exec {コンテナID} /bin/bash

コンテナを停止する

exit

コンテナの停止状態を確認する

docker ps

コンテナの再起動

 起動するコンテナIDを取得する

docker ps -a

コンテナを起動する

docker start {コンテナID}

コンテナを停止する

docker stop {コンテナID}

すべてのコンテナの状態を削除する

docker rm `docker ps -a -q`

イメージを削除する

docker rmi {イメージID}

イメージの作成と保存

プロキシの設定を追加する

export http_proxy="{URL}"
export https_proxy="{URL}"
export ftp_proxy="{URL}"
export no_proxy="localhost,127.0.0.1,172.17.0.0/16"

yumのダウンロードのタイムアウト設定を変更する

echo "timeout=300" >> /etc/yum.conf

Apacheをインストールする

yum install -y httpd

Apacheのサーバ名を設定する

sed -i -e 's/\#ServerName www.example.com:80/ServerName example-web-server.example.com/g' /etc/httpd/conf/httpd.conf

Apacheの起動テストをする

/etc/init.d/httpd configtest

Apacheを起動する

/etc/init.d/httpd start

接続テスト用のHTMLを作成する

echo "docker test server" >> /var/www/html/index.html

起動確認をする

curl http://127.0.0.1/

コンテナを停止する

exit

停止したコンテナIDを取得する

docker ps -a

コンテナをイメージにコミットする

docker commit {コンテナID} {イメージ名(centos:6/httpd-test)}

Apacheをブラウザから確認する

ポートを指定してコンテナを起動する

docker run -i -t -p {アクセスポート:docker内部の起動ポート(10080:80)} {イメージ名(centos:6/httpd-test)} /bin/bash

Apacheの起動状態を確認する

ps alx | grep httpd

Apacheを起動する

/etc/init.d/httpd start

ブラウザから確認する

http://localhost:10080

イメージをDocker Hubに保存する

イメージIDを取得する

docker images

タグを作成する

docker tag {イメージID} {ユーザ名/イメージ名:タグ名(neriai/httpd-test:latest)}

Docker Hubにプッシュする

docker push {ユーザ名/イメージ名:タグ名(neriai/httpd-test:latest)}

プッシュされたことを確認する

https://hub.docker.com/

他の人のイメージを検索してみる

docker search {イメージ名(neriai)}

ホストマシンとコンテナ間のファイル共有

ホスト側のマウント先を確認する

Preferences > File Sharing

ホスト側のマウントしたいディレクトリとファイルを作成する

mkdir docker-share
touch index.html
echo "docker share test" >> index.html

マウント元とマウント先を指定して起動する

docker run -v "{ホスト側のマウント元ディレクトリ{/Users/neriai/***}}:{コンテナ側のマウント先ディレクトリ(/var/www/html/)}" -i -t -p 10080:80 "centos:6/httpd-test" /bin/bash

正常にマウントされ、起動できるかを確認する

cat /var/www/html/index.html
/etc/init.d/httpd start
http://localhost:10080

演習:好きなソフトウェアを入れてみよう

※以下MySQLの場合のヒントTipsです

インストール

yum install -y http://repo.mysql.com/mysql-community-release-el6-4.noarch.rpm
yum install -y mysql-community-server

初期設定

echo "" >> /etc/my.cnf
echo "[mysql]" >> /etc/my.cnf
echo "default-character-set=utf8" >> /etc/my.cnf
echo "" >> /etc/my.cnf
echo "[client]" >> /etc/my.cnf
echo "default-character-set=utf8" >> /etc/my.cnf

起動

/etc/rc.d/init.d/mysqld start
CREATE DATABASE {データベース名} DEFAULT CHARACTER SET utf8;

ホストマシンからの接続

docker run -i -t -p 13306:3306 {コンテナ名} /bin/bash
GRANT ALL PRIVILEGES ON *.* TO root@"%";

宿題

イメージをエクスポートする

docker save {イメージ名(sample-image)} > {ファイル名(sample-image.tar)}

イメージをインポートする

docker load < {ファイル名(sample-image.tar)}

コンテナをエクスポートする

docker export {コンテナ名(sample-image)} > {ファイル名(sample-image.tar)}

コンテナをインポートする

docker import < {ファイル名(sample-image.tar)}