ハトネコエ Web がくしゅうちょう

プログラミングやサーバー・Web制作、チームマネジメントなど得た技術のまとめ

はじめて Docker を使ったので使い方メモ

wercker で使うために Docker を初めて使ってみました。

参考にしたサイト :
今更始めるDocker on Mac、今更覚えるDockerコマンド - 病みつきエンジニアブログ
Docker Machineの作成

1. Docker Toolbox をインストール

brew install Caskroom/cask/docker-toolbox

Docker Toolbox をインストール。

brew install docker ではなく、上記の全部入りパッケージをインストールするのが良さそう。

これで docker コマンドであれこれ出来るようになるのかと思いきや、
このままではまだ Cannot connect to the Docker daemon. Is the docker daemon running on this host? というエラーメッセージが出るだけですので、
まずは仮想環境の設定から始めます。

2. docker コマンドが使えるようになるまで

docker-machine create --driver virtualbox docker-linux

今回は docker-linux という名前のマシン名にしましたが、ここはお好きなように。
VirtualBoxのマシン名一覧がカオスにならないよう docker-*** みたいな名前つけるのがおすすめかな)

docker-machine start docker-linux

これで仮想環境が起動されました。

起動された仮想環境の設定を見ます。

docker-machine env docker-linux

私の環境では以下のように出力されました。

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/nekonenene/.docker/machine/machines/docker-linux"
export DOCKER_MACHINE_NAME="docker-linux"
# Run this command to configure your shell:
# eval $(docker-machine env docker-linux)

言われたように

eval $(docker-machine env docker-linux)

コマンドを実行し、環境変数を設定してあげます。

これで docker コマンドは動くようになったはずですから

docker images

とコマンドを打ってみます。
今は何も Docker イメージをダウンロードしていないので、以下の1行だけが表示されます。

REPOSITORY   TAG       IMAGE ID      CREATED       SIZE  

3. Docker へのログイン

Docker のアカウントを取得したら、docker login コマンドでログインします。
これをしないと docker pull などがおこなえません。

docker login

ユーザーネームとパスワードが聞かれますので、登録通りに入力します。

ログイン作業が完了したら、

docker run -it hello-world

で、動作確認用の Docker イメージをダウンロードし実行してみます。

しばらく待ち、(自動的に docker pull hello-world:latest がおこなわれたのち)

Hello from Docker!
This message shows that your installation appears to be working correctly.

とメッセージが出てきて成功です。

docker images

とコマンドを打つと、以下のように Docker イメージがダウンロードされたことが確認できます。

REPOSITORY   TAG       IMAGE ID      CREATED       SIZE  
hello-world  latest    c54a2cc56cbb  7 weeks ago   1.848 kB

4. Ubuntu trusty を入れてみる

Docker Hub には、さまざまな Docker イメージがあります。
あなたが Docker Cloud にパブリックで置いたものも、自動的にここで公開されています。

さて、今回は Ubuntu の公式リポジトリ を見てみましょう。

f:id:nekonenene:20160823044439p:plain

ここに書かれている 14.04trustylatest などはすべてタグの名前です。

docker pull の際、リポジトリ名だけでなくタグ名も指定できます。
ですから、Ubuntutrusty タグの Docker イメージを入れて実行する際は、

docker run -it ubuntu:trusty

とコマンドを打ちます。

これは docker run -it ubuntu:14.04 とコマンドを打つ場合と同じだと、
上の写真からわかりますね。

5. Docker イメージの削除

いろいろ入れたあとで docker images を打ってみます。

REPOSITORY     TAG     IMAGE ID      CREATED       SIZE
node           latest  800da22d0e7b  6 days ago    651.4 MB
ubuntu         latest  f8d79ba03c00  11 days ago   126.4 MB
ubuntu         trusty  ff6011336327  11 days ago   188 MB
hello-world    latest  c54a2cc56cbb  7 weeks ago   1.848 kB

このなかの node:latest と ubuntu:latest を削除したくなったとします。

そのときは docker rmi コマンドを使います。

docker rmi -f 800da22d0e7b f8d79ba03c00

そのときに IMAGE ID を使うのですが、
実はこれは完全に記述する必要はありません。

一意に定まるのであれば

docker rmi -f 800 f8d

のようにコマンドしてもしっかり消えてくれます。

6. Dockerfile からのビルド

Dockerfile は例えば以下のように書きます。

文字コードの設定方法に関して、こちら↓の記事にお世話になりました。
Docker: コンテナのlocaleを設定したい

で、こう作った Dockerfile からイメージを作成するコマンドは、例えば以下のような感じ。

この Dockerfile が現在いるディレクトリから見て、config というフォルダの下に入っている場合、

docker build -t my-docker-image-name:v1.0 ./config

ここで気を付けるのが、指定するのは ./config/Dockerfile と、Dockerfile のファイル名まででなく、Dockerfile があるディレクトリ名までを書くことです。

ファイル名まで書いてしまうと
unable to prepare context: context must be a directory: とエラーメッセージが出て怒られます。

それから、ビルドが始まるまではけっこう時間がかかりますのでその点もお気をつけて。
何も表示が出ないから動いてないんじゃないかと心配になりますが、1分くらい待つと表示が始まります。

AWS EC2 インスタンスにユーザー追加する方法

親切なチュートリアルを見て、SSH 接続で EC2 のインスタンスにログインできるようになったところまではよかったんですが、
デフォルトの ec2-user でないユーザーを足そうとしたらいろいろハマったので覚え書き。

参考: Linux インスタンスでのユーザーアカウントの管理 - Amazon Elastic Compute Cloud

1. 新規ユーザーを足す

今回作るユーザーの名前は new-user とします。

さて、まずは SSH でログインです。

ssh -i ~/.ssh/aws_private_key.pem ec2-user@12.345.67.89

ここの接続に使う pem ファイルの名前や IP アドレスの部分は、自分に合う形に直してくださいね。

su root

で root アカウントに切り替えます。(su でもいいです)

useradd new-user

new-user が足されました。

ls -l /home

と打ってみれば、ec2-usernew-user の2つのフォルダが、/home ディレクトリ上にあることが確認できるでしょう。

ついでに root ユーザーにパスワードを

passwd

というコマンドでパスワードの設定ができます。

new-user のパスワードを設定するには

passwd new-user

と打ちます。

2. new-user でリモートログインできるようにする

まだ ssh -i ~/.ssh/aws_private_key.pem new-user@12.345.67.89 でリモートログインすることはできません。
それをできるようにするのがここでの作業です。

まず root アカウントから new-user アカウントへ切り替えます。

su new-user

これで new-user のホームディレクト/home/new-user が現在いるディレクトリになっているはずです。

このホームディレクトリにファイルを足し、アクセス制限をかけます。

mkdir ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

そして authorized_keys を編集します。

vi ~/.ssh/authorized_keys

このファイルには、あなたのパソコンの ~/.ssh/id_rsa.pub の中身を貼り付けましょう。
Escキー, :, w, q, Enterキー で保存しつつ終了です。

ここまでおこなえば、SSH 接続でのログインができるようになったはずです。

exit コマンドを何回か使い、EC2 インスタンスからログアウトしてください。

3. ec2-user を削除

さて、最初のログインとユーザー名の部分だけ変えて改めてログインしてみてください。

ssh -i ~/.ssh/aws_private_key.pem new-user@12.345.67.89

ログインできたでしょうか?

ちなみに、new-user でのログインが可能になったのかのテストのためだけでなく、
ec2-user でログインしてる状態では ec2-user アカウントを削除できないため、2. の最後で一度ログアウトしてもらいました。

new-user でログインできましたらまた root アカウントに戻ります。

su root

そして以下のコマンドで、元々あった ec2-user アカウントは削除できます。

userdel ec2-user

4. 新しいユーザーに sudo 権限を付与

new-user でログインできるようになりましたが、

sudo yum update

など、sudo をともなうコマンドは

new-user is not in the sudoers file.  This incident will be reported.

とエラー文が出て実行できません。

そこで new-user を wheel グループに入れます。

参考: sudoユーザーを追加する方法 - Linux入門 - Webkaru

usermod -G wheel new-user

これでまだ終わりでなく、/etc/sudoers をいじります。

参考: さくらVPS+CentOS:自分をsudoユーザに追加してみた

以下のコマンドを実行してください。

visudo

そして root ALL=(ALL) ALL の少し下にある以下を編集します。

# %wheel  ALL=(ALL)       ALL

とコメント化されてますので # を削除し、

%wheel  ALL=(ALL)       ALL

と直します。
これでOKです。

exit コマンドで root アカウントからログアウトし new-user アカウントに戻り、
sudo の付くコマンド、たとえば sudo yum update などが動作するか確認してみてください。


これで、新規ユーザーを追加するやり方について説明おしまいです。

はじめてで♥ドキドキ☆の AWS の感想

Amazon Web Services、略してAWS、なんだか難しそう〜なイメージあって手が出せていなかったのですが、
最近サーバーの設定とかにも少しずつ興味出てきたので、おそるおそる触ってみることにしました。

先達はあらまほしきことなり(教えてくれる人ほしいよぉ…)って感じですが、調べながらがんばろう……。

ところで最近Markdownで記述する機会が多くて、久々にはてな記法使おうとしたら戸惑いますね。
改行のときにスペース入れるのが地味にめんどいけど、今日からMarkdown記法で書いていこうっと。

1. まず AWS にどんなサービスがあるか見た

「AWS is 何」を3行でまとめてみるよ - Qiita
親切すぎることにここで解説してくれています。

真面目に全部理解しようとすると脳が焼き切れそうだったので、
前半部分を重点的になんとなーくの理解をして、あとは理解できなくともとりあえずやってみることにしました。

2. アカウント取得

Amazonのアカウント持っていればいい話なのでここは難なくクリア。

Amazon.co.jp でなくて Amazon.com のアカウントが必要ですので、持っていない人は取得必要になると思われー

3. チュートリアルインスタンス作成

親切なことにAmazon先生がチュートリアルを用意してくれています。

https://aws.amazon.com/jp/start-now/

最初に必要になる、Amazon EC2によるインスタンス(1つのサーバー)の作成方法がていねいに書かれていますのでこれで出来ました。

まあ、ただ、ハマりどころはあります。

3-a. リージョンに注意

f:id:nekonenene:20160817050044p:plain

ここ、今は「東京」の設定になっていますが、最初は「バージニア」でした。
チュートリアル進めてる途中で、Amazonのドキュメント読んでリンク飛んだらリージョン(地域設定)が「オレゴン」に変わってて、
「あれ? 私の作ったインスタンスがない? どこ?」ってなりました。

リージョンごとに設定は全く引き継がれないんですね。

当然、東京のサーバー使うのがアクセス段違いに速いですから(光回線でも海を越えて往復するのは時間かかるわけなので)
チュートリアルを始める前に右上のリージョン設定が「東京」になっているかは確認しておくと良いかと思います。

いちおう、リージョンによってはまだ提供されていないサービスがあったりしますが、東京はわりと手厚く、
たいていのサービスが提供されていますので迷うことはないかと。

なお、リージョン設定を見ずに東京以外のリージョンにあれこれ建てちゃった私みたいな人は、
ちゃんとインスタンスの削除(停止)やらサービスの解放やらしておくのを忘れずに。

インスタンスを2台1ヶ月間動かし続けると無料枠超えちゃいますので。

3-b. セキュリティグループの設定

f:id:nekonenene:20160817051944p:plain

チュートリアルでは何も設定していませんが、
SSHは自分の家のIPアドレス、HTTPは誰でもアクセス可、という設定をしておくといいです。

Amazonの用意してる下のチュートリアル動画でもSSHは0.0.0.0(誰でもアクセス可)の設定ですけど、
どうせほとんどの時間は自宅からのアクセスなので、必要なときにIPアドレスは足せばいいかなーという気持ち。

で、で! 忘れちゃいけないのが HTTPポートの開放!(人によってはHTTPSもね!)
これしておかないとせっかくWebアプリ上げてもブラウザからアクセスできませんからね!

チュートリアルに書いてないのでお気をつけて。

4. AWSコマンドラインツールのインストール

チュートリアル終わらせて思うのが、EC2インスタンスの再起動とかいちいちWebブラウザからやらないといけないの? ってこと。
Amazonさん、偉いのでちゃんとそういうモノグサさんのためにコマンドラインツール用意してくれてました。

AWS CLI のインストールと設定

ここに書かれてるとおりに pip からインストールしたんですが、
ふつうに homebrew にありました。なので、

brew install awscli

だけで大丈夫です。これで更新の時も楽。

インストール終了時のメッセージにも出ますが、zshに補完追加するには

source /usr/local/share/zsh/site-functions/_aws

してあげてください。aws コマンドは、補完が無いとコマンドが長すぎて死ねますので大事。

5. AWSコマンドラインツールの初期設定

aws configure

コマンドを打つと、
AWS Access Key ID [None]: 』だなんて見知らぬことを聞かれます。

これは Amazon IAM ( https://console.aws.amazon.com/iam/ ) で設定します。
(紛らわしいけど Amazon AMI のほうではないです)

5-a. Amazon IAM での設定

「グループ」>「新しいグループの作成」と進んで、
グループ名はてきとうに「admin」とかにして、
その次のページで権限の種類ありすぎて頭痛くなりそうですが「AdministratorAccess」(管理者アクセス)だけ選択。

f:id:nekonenene:20160817054558p:plain

で、これで管理者グループを作ったので次は「ユーザー」>「新規ユーザーの作成」でユーザー作成。

f:id:nekonenene:20160817055041p:plain

f:id:nekonenene:20160817055130p:plain

で、このユーザーのセキュリティ認証情報のアクセスキーIDとシークレットアクセスキーが、
AWSコマンドラインツールの初期設定に必要になりますので、しっかりメモるなり右下のボタンからCSVをダウンロードしてください。

そして、このユーザーを先ほど作ったadminグループに追加してあげれば作業OKです。

f:id:nekonenene:20160817055528p:plain

5-b. ターミナルに戻り初期設定ふたたび

AWS Access Key ID」と「AWS Secret Access Key」については先ほどのものを入れるとして、そのあとに
「Default region name [None]: 」と聞かれます。

ここ ( http://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html#ec2_region ) にも書いてあるのですが、
「東京」のリージョンコードは「ap-northeast-1」ですのでそれを入力。

続いて「Default output format [None]: 」と聞かれますので、
これは「json」「text」「table」のうち好きなものを入力。
個人的には「table」が見やすかったです。

これらの設定は、~/.aws/credentials および ~/.aws/config に格納されていますので、
あとで設定を変えたくなった場合はここのファイルをいじることでも変更できます。

設定がちゃんと完了できれば、

aws ec2 describe-instances

このコマンドで作成しているインスタンスの一覧が見られますし、
そこに表示される InstanceId を利用して

aws ec2 reboot-instances --instance-ids (インスタンスのID)

のようなコマンドでインスタンスの再起動ができたりと、いろいろはかどります。


初日の感想としてはこのくらいで。
難しそうなイメージでしたが、説明してくれているサイトが多いおかげもあり、思っていたよりはすんなり最初の一歩を踏み出すことが出来ました。

次は自動ビルドにチャレンジです。
GitHub なら CircleCI 使えばいいんですけど、個人開発だと bitbucket のプライベートリポジトリをフックにできると嬉しいので、まずはその調査からですね。