こんにちはー hr-kです。
今日は皆様ご存知、仮想化ツールのdockerについてのお話です。
以前の記事でdockerの簡単な使い方についてあったかと思います。この記事では、ちょっとだけ発展して、Dockerfileを用いたdockerイメージ生成、およびdockerイメージに対する設定を、dockerコンテナ内でのユーザ設定を例にとって見ていきましょー
dockerコンテナ内でのユーザ
普通にCentOSなどのイメージをpullしてコンテナとして実行するとその初期ユーザは(一部別ユーザの場合もありますが基本的には)rootとなります。
$ docker pull centos:7 $ docker run --name centos7 -itd centos:7 /bin/bash $ docker exec -it centos7 /bin/bash ### ここからdockerコンテナ内 ### # whoami root
というか(基本的に初期に)我々が利用できるユーザはrootしかいません。
root以外のユーザを持ったdockerイメージの作成
dockerではとても便利に仮想サーバを扱うことができますが、こんなことありませんか??
複数人で一つのdockerの仮想サーバにログインしたいし、ユーザ毎で権限とか分けたい
環境毎にいくつも仮想サーバ立ててるけど、毎回同じ複数人のユーザがログインするのにサーバ内で設定してる
dockerコンテナ立てた後であればusermodなどのlinuxコマンドでユーザを足すことができますが、毎回毎回環境作るたびにこんなことするの、面倒ですよね。
そこで今回ここでは、「ユーザを足したイメージを作っておく」という方法を紹介します。あらかじめユーザを足しておけば、そのイメージを使う限り、毎回ユーザ作ったりとか、そんな無駄な作業とはおさらばです。
Dockerfile作成
自分で設定したイメージを作るにはDockerfileというテキストファイルを用意します。Dockerfileには本当はいろんな文法があるんですが、長くなるので割愛して、最低限だけ書くとこんな感じ。
From centos:7
これで、「dockerhubにあるcentos:7のイメージをpullしてきてイメージとして固めてね」って意味になります。
これにユーザ追加した状態にするにはどうしたらいいかというとー
From centos:7 RUN useradd -m amelieff && \ echo "amelieff:amelieff" | chpasswd
これ。文法としては
RUN useradd -m [user] && \ echo "[user]:[password]" | chpasswd
って感じで、user追加してpasswordを与えています。
もうちょっと発展させて、「sudo権限を持ったユーザをあらかじめ追加」するためのdockerファイルを書いて見ましょう。
From centos:7 RUN yum -y install sudo && \ useradd -m amelieff && \ echo "amelieff:amelieff" | chpasswd && \ echo "amelieff ALL=(ALL) ALL" >> /etc/sudoers
ユーザの追加に加えて、sudoコマンドをインストールして、echo "[user] ALL=(ALL) ALL" >> /etc/sudoers
で、追加したユーザをsudoersに加えてsudo権限を与えています。
Dockerfileを用いたイメージの作成
Dockerfileからdockerイメージをbuildします。Dockerfileのあるディレクトリに移動して
$ docker build -t testcent7:latest .
こんな感じです。 文法は
$ docker build -t [image-name]:[image-tag] .
みたいな形で、buildするイメージに名前とtagを割り当てます。
dockerイメージからコンテナを生成してログイン
実際にコンテナを生成してログインして見ましょー
コンテナ生成
$ docker run --name linuxcontainer -itd testcent7 /bin/bash
ユーザ(今回はameleiffという名前のユーザを作ったので、amelieff)を指定してログイン
$ docker exec -it -u amelieff linuxcontainer /bin/bash ### コンテナ内 ### $ whoami amelieff $ cd $ pwd /home/amelieff $ sudo ls /usr [sudo] password for amelieff: bin etc games include lib lib64 libexec local sbin share src tmp
amelieffユーザでログインできてますねー。かつちゃんとsudo権限も持ってますね。よしよし。
まとめ
今回はDockerfileを使ったdockerイメージに対する初期設定について見ていきました。
ここに書いているユーザの設定はほんの一例で、実際にはDockerfileではもっといろんな設定を行えます。
例えばcentosならyumを使えたり、ubuntuならapt系を使えたりと、ライブラリやコマンドの設定までできます。また、ファイルの持ち込みや環境変数の設定などなど、細々とした設定もDockerfikeで可能です。
皆さんも興味があれば、ぜひdockerを便利に使い倒していきましょう〜