たのしい工学

プログラミングを学んで、モノをつくりたいひと、効率的に仕事をしたい人のための硬派なブログになりました

【Docker入門 独学】Dockerシェルへ接続

   

本記事はこちらの記事のつづきです。
【Docker入門】Dockerでサーバを立てる

とくに初心者のひとはこちらから読んでいただくのがおすすめです。こちらもよかったらどうぞ!【Docker入門 初心者向け 】Docker基本コマンド集

シェルへの接続

おもに2パターンあります

docker attach


docker attach <コンテナ名またはコンテナID>

(注意1)
ただし、起動時にシェルではなく、デーモンも起動していた場合には、そのデーモンの標準入出力に接続されてしまいます。
(注意2)
attachで接続してexitで抜けた場合、PID1のプロセスが終了し、コンテナも停止してしまいます。ctrl + p + qでプロセスを終了することなくシェルから抜けることができますが、起動時に-itオプションをつけていない場合には、抜けることができません。

docker exec


docker exec -it <コンテナ名またはコンテナID> /bin/bash

※/bin/bashを実行していますが、bashがなければ別のシェルを指定してください。

docker exec自体は起動しているコンテナ内で任意のコマンドを実行するためのコマンドであり、シェルを起動するためのコマンドというわけではありません。

-itオプションつきでコマンドを実行す立ち上がったシェルの標準入出力に接続した状態になります。

シェルに接続した状態から抜けるには、exitで抜けられます。docker attachとはことなり、exitで抜けてもコンテナが停止することがないので、こちらのほうが安全な方法かもしれません。

docker commit

docker commit コマンドを実行することで、コンテナの状態をイメージとして保存することができます。

docker commit コマンドを利用して、新しく保存するイメージ名、タグ名を指定します。


docker <コンテナ名またはコンテナID><イメージ名>:<タグ名>

インフラのコード化という意味でも、Dockerfileに操作を記載して、履歴を残すようにすることが大切です。

実際にコードを書いて実行していきましょう。

ubuntuの起動
Image from Gyazo

docker attachコマンドでシェルへ接続
Image from Gyazo
rootでシェルにログインが完了しました。

dd コマンドについて

コンテナのリンク機能

nginxサーバをふたつ用意して、簡単なウェブサーバを構築します。

Image from Gyazo

リバースプロキシの設定ファイルを下記のように設定します


server{
        listen 8080;
        server_name localhost;

        location / {
                proxy_pass http://ss;
        }
}

この設定により、リバースプロキシコンテナの8080ポートにアクセスがきた場合に、ssというホストにリクエストの転送をします。

この設定ファイルをnginxの設定ファイルディレクトリに配置して、新しいイメージを作成するDockerファイルを作成します。

作成するDockerfileは以下のようなものです。


FROM nignx:latest
COPY /reverse_proxy.conf /etc/nginx/conf.d/reverse_proxy.conf
RUN apt-get update && apt-get install -y inetutils-ping

2行目でさきほどのnginxの設定が/etc/nginx/conf配下にコピーされます。
3行目でpingで通信確認をするためのツールのインストールを行っています。

つぎに、このDockerfileをビルドします


docker build -t reverse-proxy .

下記のとおり、イメージのビルドが完了しました。
Image from Gyazo

static-siteコンテナにlinkするためには、リバースプロキシコンテナよりも先にstatic-siteコンテナを起動しておく必要がありますので、static-siteコンテナの起動コマンドを実行します。


docker run --name static-site -e AUTHOR="user" -d dockersamples/static-site

-e オプションは引数の環境変数を設定するオプションです。このイメージはAUTHORという環境変数に名前を設定しておくと、サンプルのウェブページにその名前が表示されるようになります。

つぎに、先ほど作成したリバースプロキシイメージからリバースプロキシコンテナを起動します。


docker run --name reverse-proxy -p 8080:8080 --link static-site:ss -d reverse-proxy

static-siteにはエイリアスとしてssという名前をつけています。

docker psで起動中のコンテナを確認すると、下記のようにコンテナが起動していることがわかります。
Image from Gyazo

ブラウザから8080番ポートにアクセスしてみると、下記のように表示されます。
Image from Gyazo

このページはリバースプロキシを経由して、static-siteコンテナにアクセスすることで取得しており、先ほど設定したAUTHOR環境変数の名前がサイト上に表示されています。

では、リバースプロキシコンテナにシェルで接続して、リンクによる設定を確認していきます。

Image from Gyazo

まず、どのようにして、static-siteやssというエイリアス名で通信先が特定できたのかを確認してみましょう。その理由はhostsファイルにあります。

Image from Gyazo

リンク先コンテナの名前とIPの組み合わせがこのように追加され、名前解決ができるようになっています。

これがlinkの機能のひとつです。

もうひとつの機能として、環境変数の追加についても確認しておきましょう。

Image from Gyazo

このように、リバースプロキシコンテナには追加していない情報が追加されています。

自動ビルド

GithubやBitbucketといったソースコードのホスティングサービスでビルドコンテキスト(Dockerfileやその他のビルドに必要なファイル)を管理し、リポジトリのビルドコンテキストの内容が変更された場合に自動的にビルドを実行するしくみのことです。

Automated Buildの設定

ここではGithubを例にします。
GithubとDockerhubのリンク設定をする必要があります。

今回はGithubを使用します。
(Githubのアカウントは用意しておいてください)

手順は以下のとおり
1.DockerHubにログイン
2.画面右上の「Create」の項目をクリック
3.Githubとの連携のほうを選択

Githubとリンクができたら、ふたたび「Create」をクリックすしましょう。

Click here to customizeをクリックすると、このような画面になるとおもいます。

Image from Gyazo

とくに項目の変更はおこなわず、Descriptionだけ記載すればよいでしょう。

GitHubをつかったことのないひとは以下のコマンドで、ユーザ名とメールアドレスの設定ができます。


git config --global user.name "your name"
git config --global email "xxx@xxx.xxx"

automated-test リポジトリをcloneして取得します。cloneとはリポジトリをコピーすることです。

リポジトリのコピーコマンドは以下


git clone https://github.com/ユーザ名/automated-build-test.git

このコマンドをターミナルにうちこみましょう。
そして、automated-build-testリポジトリに移動してください。

移動したら、このリポジトリのなかにDockerfileを作成します。
以前つくったstatic-siteのリポジトリを利用するように設定をします。


FROM dockersamples/static-site
ENV AUTHOR="user"

Dockerfileをつくったら、Githubにcommitをして、自動ビルドを実行してみます。

ターミナルからgit commitのプロセスを実行しましょう


git add Dockerfile
git commit -m "Initial commit"
git push origin master

(gitについてはこちらの記事もどうぞ)
【Githubで個人開発】初心者がまず知りたいコマンドと使い方心得

dockerhubのbuild detailsをみると、StatusがBuildingになっています。
Image from Gyazo

ビルドが成功すると、ステータスがsuccessにかわります。
Image from Gyazo

では、自動ビルドしたイメージをpullしてみましょう。


docker pull <dockerHubのリポジトリ名>/dockersamples/static-site

これを実行すると、docker imagesでローカルリポジトリのイメージに<dockerHubのリポジトリ名>/dockersamples/static-siteが追加されていることが確認できるとおもいます。

以上が自動ビルドの流れです。
これをうまく利用することで、都度手動でビルドせずに済み、ほかのサービスやアプリケーションと連携することで、コンテナの実行まで自動化することが可能です。

Dockerを詳しく学びたいひとは、Udemyの「ゼロからはじめる Dockerによるアプリケーション実行環境構築」がおすすめです!よかったら受講してみてください。

 - Docker