アメリエフの技術ブログ

Amelieff Staff Blog

Dockerfileを用いた初期設定:ユーザ追加

こんにちはー 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を便利に使い倒していきましょう〜