いよいよ、インフラエンジニアもユーザーからのニュース記事イメージ先行の根拠の無いコンテナ・マイクロサービス化の要望が来る時代になりました。
実際、コンテナはどうなのか?と言う意味合いで、
インフラエンジニアの初心者Dockerに必要な知識情報をまとめます。
レジュメ
前提条件・環境
- Amazon Linux 2 AMI
を使用し、Docker環境を構築し、コンテナ起動をさせてみました。
Dockerのインストール、構築方法
1、LinuxにDockerパッケージをインストールします。
sudo yum update -y
sudo amazon-linux-extras install docker
2、Dockerサービスを起動します
sudo service docker start
基本は、これで終わりです。
参考、rootユーザー以外でdockerサービスにアタッチできるようにする
AWSの一般ユーザー「ec2-user」でdockerサービスを操作できるようにするためには、
sudo usermod -a -G docker ec2-user
一度、sshのターミナルをログアウト切断し、再度sshでec2-userでログインする。すると、sudoを使用せずにdockerコマンドが利用できることが確認できます。
docker info
上記dockerコマンドでエラーが出ないことを確認します。
参考、Amazon ECS における Docker の基本 - Amazon Elastic Container Service
インフラエンジニアに理解しやすいsshdのDockerイメージの作成
1、ec2-userでDockerfileを作成する。
vi Dockerfile
以下のインフラエンジニアが試せ、理解しやすいsshdのDockerfileの内容で作成する。
FROM ubuntu:16.04
RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:password' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_configSSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\srequired\spam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profileEXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
Dockerファイルを理解するポイントは、最後のCMD。
最後のCMDでデーモンプロセスを一つ起動させるのがコンテナの特徴。
基本的に、複数のデーモンプロセスは起動できず(頑張れば可能)、一つのデーモンをワンパッケージに出来るのがコンテナの特徴であり、インフラエンジニアが理解するためのポイントになります。
2、DockerfileからDockerイメージを作成する
※ ポイントですが「Dockerイメージ名≠コンテナ名」です。
docker build -t hello-sshd .
上記コマンドで、Dockerfileイメージファイルをビルドします。
docker images --filter reference=hello-sshd
上のコマンドで、イマージファイルが正しく作成されて管理されていることを確認します。
3、Dockerイメージからのコンテナ起動
docker run -t -i -p 1022:22 hello-sshd
上記コマンドを実行するとプロンプトは戻ってきません。
デーモンをコンテナと言うワンパッケージで起動できている状態です。
そして、DockerfileからではなくビルドしたDockerイメージから毎回コンテナは起動します(docker run起動のたびに毎回、 apt-get でインストールしているわけでは無く、イメージファイルが出来上がりそこからrun起動している)。
Dockerのネットワーク的な理解も必要なのですが、上記コマンドはDockerホストの1022ポートに、Dockerコンテナの22番ポートをマッピングしコンテナを起動するという意味合いです。
4、コンテナにネットワーク接続してみる
Dockerホストの1022番ポートにssh接続すると、Dockerコンテナに接続できます。
ssh root@127.0.0.1 -p 1022
上記、Dockerホストからssh接続したコマンドです。
今回はDockerホストから接続してみたので、127.0.0.1ですが、実際はDockerホストのIPアドレスで接続できます。
パスワードは、Dockerfileでデーモンを実施する前に設定した「password」になっています。
Dockerコンテナの起動・停止・コンソール接続といったよく使用するトラブルシューティングにも使えるDocker操作コマンド
Dockerイメージを起動させるコマンド
docker run -t -i -p 1022:22 hello-sshd
これでイメージ名「hello-sshd」からコンテナが起動できました。
コンテナ名は、hello-sshdでは無いです。
コンテナ名の確認方法コマンド
docker ps
コマンドを実行し、出力のNAMESに記載されているのがコンテナ名です。
コンテナに入りコンソール接続するdockerコマンド。トラブルシューティングに便利
docker exec -it <コンテナ名> <コンテナ内で実行するコマンド>
上記コマンドで、コンテナ内のシェルに接続できます。
コンテナの挙動がわからない時に、コンテナに入りトラブルシューティングが出来ます。(ただしワンパッケージコンテナのなので、インストールされているパッケージは標準で少ないです。pingも無し)
コンテナを停止するdockerコマンド
docker stop <コンテナ名>
で、実行中のコンテナを停止できます。
プロンプトが返ってこなかったdockerホストの実行コマンドは終了されプロンプトが戻ってきます。
また、
docker ps
を実施してもコンテナが一つも動いていないことが確認できます。