« 2013年6月 | トップページ | 2015年7月 »

2014年12月の5件の投稿

2014/12/07

CentOS6 Dockerイメージを--privilegedモードで動かすとinitが途中で止まる

CentOS6上にgitlabのdockerコンテナを作成して動作させる: 発火後忘失 に記載した通りセットアップを行った後、

$ docker run -d --privileged centos:centos6 /sbin/init

で動作させてこのコンテナに入りpstree -aを実行してみると、

sh-4.1# pstree -a
init
  |-rc.sysinit /etc/rc.d/rc.sysinit
  |   `-start_udev /sbin/start_udev
  |       `-udevadm settle
  `-udevd -d

の表示のまま動かないんですよね。udevadm settleで止まったまま。

私の知識では原因の想像もつかないので、前回の記事では--privilegedオプションを付けないようにしました。

再起動するとsshで入れなくなって、init使えないのかなあ?なんて思ってたらこんなオチでした。

--privilegedオプションも何のために必要なのか実はよくわかってないんですけれども…(ドキュメント読んでもさっぱりなのでした…)

 

 

以下余談。

centos:centos6 とかで指定した際に取得できるイメージ、これはいつでも同じものが取得できるとは限らないんですよね…

例えば今取得するとCentOS6.6のイメージが落ちてくるが、3ヶ月後にコマンドを打つとCentOS6.7のイメージだったり。

Dockerfile がgithubなんかで公開されてたりしますが、作成者と同じ環境で実行したとしても異なる結果になる可能性があるわけで。

 

DokerってよくImmutable Infrastructureの顔みたいな感じで紹介されたりしてますが、その第1行目からimmutableさをぶっ壊してるのがちょっと笑えた、というお話でした…

CentOS6上にgitlabのdockerコンテナを作成して動作させる

昨日CentOS7上で環境構築したのですが、実際に使用するのはCentOS6だということが今日分かり、再度構築手順を見直しました。

CentOS 6.5 (x86_64) - Release Media 上で行っています(yum updateしたのでバージョンはCentOS6.6になりました)。

昨日のCentOS7と合わせてcentosというユーザを作っています。余談ですが、紹介される手順だと作成したユーザでsshログインできないですね。authorized_keysファイルをコピーした後、

# chmod -R og-wrx /home/ec2-user/.ssh

をする必要があります。

 

CentOS7の時と異なり、SELinuxを無効化して、--privileged オプションを使用しないようにしています。理由は別のエントリで記載します。

また、postgresqlの使用するメモリ(shared_buffer)設定値をかなり小さくしています。デフォルト値だとpostgresがエラーとなり初期設定を完了させられないためです。

 

以降、本題です。

Dockerのインストールと初期設定

取り敢えずupdate。

$ sudo yum update -y

 

EPELからdockerパッケージを取得してインストール。

$ sudo yum install -y epel-release

$ sudo yum install -y docker-io

(バージョン1.3なので、docker execが使用できます!)

 

SELinuxを無効化。

$ sudo setenforce 0

またその他、 /etc/selinux/config 開き、SELINUXの値をpermissiveに変更する。

 

dockerサービスの起動。及び、OS起動時の自動起動設定。

$ sudo service docker start

$ sudo chkconfig dokcer on

 

CentOS7のときと同様、dockerグループにcentosユーザを所属させ、ログインし直し。

 

gitlabのインストール

CentOS7と違ってオフィシャルイメージからすぐgitlabコンテナを作成できます。

 

コンテナを起動。

$ mkdir /home/centos/gitlabdata

$ docker run -d -p 80:80 -p 44:44 -v /home/centos/gitlabdata:/var/opt/gitlab --name gitlab centos:centos6 /sbin/init

 

起動したコンテナに入る。

$ docker exec -i -t gitlab /bin/sh

 

言語設定(参考)。

# localedef -vc -i ja_JP -f UTF-8 ja_JP.UTF-8

 

公式に記載されている通り追加のパッケージを導入。

# yum install -y openssh-server postfix cronie

 

/etc/ssh/sshd_conf を編集し、44番ポートで待ち受けるように変更。

 

/etc/pam.d/sshd を編集します(参考: ubuntu - Why is it needed to set `pam_loginuid` to its `optional` value with docker? - Stack Overflow)。

session    required     pam_loginuid.so

という行のrequiredをoptionalに変更し、下記のようにします。

session    optional     pam_loginuid.so

 

サービスを起動。

# service postfix start

# chkconfig postfix on

# service sshd start

# chkconfig sshd on

 

gitlibパッケージをインストール(最新版のURLは公式ページを参照してください)。

# curl -O https://downloads-packages.s3.amazonaws.com/centos-6.6/gitlab-7.5.1_omnibus.5.2.0.ci-1.el6.x86_64.rpm

# rpm -ivh gitlab-7.5.1_omnibus.5.2.0.ci-1.el6.x86_64.rpm

 

/etc/gitlab/gitlab.rb を開き、external_urlの値を 'http://<IPアドレス>' とでもしておきます。

また、44番ポートを使用するようにするため、下記を追記します(参考: GitLab で使用する SSH のポート番号を変更する | バシャログ。)。

gitlab_rails['gitlab_shell_ssh_port'] = 44

同じく/etc/gitlab/gitlab.rb ファイルに、postgresの仕様メモリ量設定を小さい値にします(参考。実際に使用する際にはこの設定は小さすぎるかもしれませんが、大きくしても問題が発生しないようにする方法をまだ調べられていません[文末に追記有])。

postgresql['shared_buffers'] = "16MB"

 

gitlabの設定を実行。

# gitlab-ctl reconfigure

 

以上で完了。webブラウザでec2インスタンスにhttpアクセスすればgitlabスタートページが表示されるはず。

初期id,passwordは公式サイトに記載がある通りそれぞれ root と 5iveL!fe 。

 

追記:

Dockerコンテナ内でPostgreSQLを動かす場合のshared_buffers設定について、やはりよくぶち当たる問題のようで、検索するといくつか対処方法が書いてありました。

Docker 1.0 でDBを動かすときの共有メモリの設定 - 技術野郎の復習

こちらのページでは2つの方法が記載されています。

  • kernel.shmmaxを変更する。そのために/procを書き込み可能にして再マウントする。
  • lxcドライバを使用する

 

まず前者の/procの再マウントなのですが、permission deniedと言われてできませんでした… --privileged オプションを付けてコンテナを起動すれば可能なのですが、CentOS6 Dockerイメージを--privilegedモードで動かすとinitが途中で止まる: 発火後忘失 で書いた通り、なぜかinitが途中で止まるので今回は採れない手段なのです。

 

次に後者なんですが、こちらもinitが途中で止まってしまいました。なのでshmmaxの値が変更できるのかどうかは確認していません。

ちなみにCentOSでlxcドライバを使用したい場合は、 /etc/sysconfig/docker を開き、other_argsに --exec-driver=lxcを設定し

other_args=--exec-driver=lxc

と編集した後dockerサービスを再起動すれば良いです(リンク先解説の通りdocker info コマンドで実行ドライバは確認できます)。

 

従って、結局、16MBのまま運用しております。

2014/12/02

CentOS7上にgitlabのdockerコンテナを作成して動作させる

OfficicialのCentOS7用RPMを用いてgitlabコンテナを作成する手順です。

EC2のCentOS 7 (x86_64) with Updates HVMで試しています。

先の記事を読まれるとわかる通り、私はdockerのことほとんど知らないので、あまりここの記述を鵜呑みにしないようにご注意ください。

 

Dockerインストールと初期設定

取り敢えずupdate。

$ sudo yum update -y

 

dockerのinstall。

$ sudo yum install -y docker

 

dockerサービスの起動。及び、OS起動時の自動起動設定。

$ sudo systemctl start docker.service

$ sudo systemctl enable docker.service

 

vigrコマンドで自分(ユーザ名: centos)をdockerグループに所属させます。dockerグループに所属しているとdockerコマンド使用時にsudoしなくて良くなるそうです。
(※vigrでなくusermod -Gで編集するように解説しているページも多いです。)

 

グループ編集を反映させるため一旦ログアウトしてログインし直し。

 

dockerコマンドを実行してみて正常動作することを確認。

$ docker info

 

systemdが動作するCentOS7イメージの作成

gitlabのRPMがsystemd関連を要求するので予め導入しておきます。

参考: CentOS 7のDockerコンテナ内でsystemdを使ってサービスを起動する - Qiita

 

officialのcentos7イメージにはfakesystemdとやらが入っている。これを本物のsystemdに入れ替え、今回用いるイメージを作成する。

$ docker run -it --name temp centos:centos7 /bin/bash

# yum swap -y fakesystemd systemd

# exit

$ docker commit temp yukihane/centos7-systemd

 

コンテナ内作業のための準備

nsenter(及びdocker-enter)コマンドを導入。

$ docker run --privileged --rm -v /usr/local/bin:/target jpetazzo/nsenter

/usr/local/bin に上記2コマンドがインストールされます。ちなみにdocker1.3からはdocker execという標準コマンドで同等機能が実現できるようです(ので近い将来この作業は不要になるでしょう)。

 

コンテナを起動。sshdはホストOSの使用ポートとかぶらないよう44番を使用する前提です。

$ mkdir /home/centos/gitlabdata

$ docker run --privileged -d -p 80:80 -p 44:44 -v /home/centos/gitlabdata:/var/opt/gitlab --name gitlab yukihane/centos7-systemd /sbin/init

 

起動したコンテナに入る。

$ docker-enter gitlab /bin/sh

 

言語設定。

# localedef -vc -i ja_JP -f UTF-8 ja_JP.UTF-8

 

gitlabのインストール

公式に書いてある通りopenssh-serverとpostfix、そしてその他必要になるパッケージを導入します。

# yum install -y openssh-server postfix hostname cronie

 

/etc/ssh/sshd_config で44番ポートを使用するように設定変更します。

 

起動設定。

# systemctl enable sshd

# systemctl start sshd

# systemctl enable postfix

# systemctl start postfix


gitlibパッケージをインストールします。(URLは公式ページを参照してください。)

# curl -O https://downloads-packages.s3.amazonaws.com/centos-7.0.1406/gitlab-7.5.1_omnibus.5.2.0.ci-1.el7.x86_64.rpm

# rpm -ivh gitlab-7.5.1_omnibus.5.2.0.ci-1.el7.x86_64.rpm

 

/etc/gitlab/gitlab.rb を開き、external_urlの値を 'http://<IPアドレス>' とでもしておきます。

また、44番ポートを使用するようにするため、下記を追記します(参考: GitLab で使用する SSH のポート番号を変更する | バシャログ。)。

gitlab_rails['gitlab_shell_ssh_port'] = 44

 

/opt/gitlab/embedded/cookbooks/gitlab/recipes/selinux.rb を開き、すべてコメントアウトします。(SELinuxの設定のようですが、centos7イメージではSELinuxは無効に設定されているようなので。)

 

gitlabの設定を実行。

# gitlab-ctl reconfigure

 

以上で完了。webブラウザでec2インスタンスにhttpアクセスすればgitlabスタートページが表示されるはず。

初期id,passwordは公式サイトに記載がある通りそれぞれ root5iveL!fe

 

最終イメージ作成

次回から起動するためのイメージを作成しておく。

# exit

$ docker stop gitlab

$ docker commit gitlab yukihane/centos7-gitlab

(ここで作成したイメージって、gitlabのデータベースなどが含まれていないので不完全なんですよね。作法的にこれで良いのかは分かりません。)

gitlabを5秒で試そうとしたができなかった(dockerの入門解説が欲しい…)

gitlabの導入は結構面倒、という噂だけは聞いていて、そしてdockerを利用すれば楽に導入できる、なんてのもちらと聞いた記憶があったのです。

そんなわけでググってみたところ、

Dockerで5分くらいでGitLabを試す - Qiita

なんていうまさに私が望んでいたことが書かれていそうなページを見つけました。

で、sameersbn/docker-gitlabを試したわけなんですよ、CentOS7上で。

するとさっぱり動作しないのです。エラーログも全く出ないので何が原因か見当もつきません。

 

仕方が無いのでDockerfileなぞを眺めていると、どうもubuntu上にgitlabやpostgresを構築するようだ、というのが分かりました。

CentOSの上でubuntuを動かそうとしているのか、それってどういう仕組み(どこまでの(ソフトウェア)リソースをホストOSとゲストOSで共有してるのだろうか、等)なんだろう、と思いつつ、一抹の不安が。

そんなこんなで/dev/nullにログを捨ててる箇所なんかを直しつつ実行していると、やっとエラーが見つかりました。

error while loading shared libraries: libdevmapper.so.1.02: cannot open shared object file: No such file or directory

うーむ、わからん。共有オブジェクトって、ホストOSとコンテナ内で共有してたりするんだろうか(OS違うのに?それが原因?)などと思いつつググってみると、パッケージングのバグっぽい…?

Bug 1026545 – dockerinit fails with "libdevmapper.so.1.02: cannot open shared object file"

何が悪いんだかさっぱり分からないのですが、外の環境の設定が中の環境に影響を与えている…?

 

どうやらコンテナ内のOSをホストOSと同じものに合わせれば発生しないようなので、ubuntuをCentOSに変えれば!と思ってDockerfile見てみたら、ubuntu依存の記述なんですね…というわけで挫折。

 

 

ということでまとまりが無いのですが、何が言いたいかと言いますと…

世にあるDocker入門の記事や書籍って、コンテナ型とスーパバイザ/ハイパーバイザの違いを説明した後、いきなりdockerコマンドの使い方とかに入っちゃって、全然概観がつかめないのですよ。

コンテナ型はホストOSとリソース共有してるから軽い、ってそれどこまで共有してんの?ってのが上の事象に出会った時の疑問なんですが、その辺の解説がもっと欲しいなあ、と。(公式ドキュメントもイマイチですよね)

検索しても同じ内容ばっかりなんですよ、すごく不毛です…今気付いたのですが、もしかするとLXCやらlibcontainer辺りをキーワードにした方が良いんでしょうかね。

2014/12/01

CentOS7でgitサーバ(gitプロトコル)を立てる

$ sudo yum install git-daemon

でパッケージを導入する。

 

/usr/lib/systemd/system/ にあるファイル git.service を git@.service にリネーム。

 

git@.serviceファイルを開き、4行目の

Wants=git.socket

を削除し、

ExecStart=/usr/libexec/git-core/git-daemon ...

の箇所を

ExecStart=-/usr/libexec/git-core/git-daemon ...

とする。

 

$ sudo systemctl start git.socket

で起動完了。

 

OS起動時に自動起動するなら

$ sudo systemctl enable git.socket

 

 

ググったらxinetdの設定方法ばかりだったので。

参考: Bug 980574 – git-daemon does not start under systemd because git.service needs to be a template unit

« 2013年6月 | トップページ | 2015年7月 »

other sites

  • follow us in feedly
  • github
  • stackoverflow

ソフトウェアエンジニアとして影響を受けた書籍

  • Christain Bauer: HIBERNATE イン アクション

    Christain Bauer: HIBERNATE イン アクション
    理論と実践が双方とも素晴らしい製品であるHibernate。本書はそのプロダクトを書名に冠していますが、Hibernateを使うつもりがなく、ORマッピングの解説書として読むにしても十分な良書です。Second EditionとしてJava Persistence With Hibernateという書籍も出版されていますが、残念ながら現在のところ 和訳はされていません。-インアクションは2.xの、Java Persistence-は3.1の頃のものなので、最新版とはちょっと違うところもあることに注意。 (★★★★★)

  • アンドリュー・S・タネンバウム: 分散システム 原理とパラダイム 第2版

    アンドリュー・S・タネンバウム: 分散システム 原理とパラダイム 第2版
    クライアント/サーバシステムを構築する上で必要となる知識が総論されてます。Web技術者も、フレームワーク部分を開発するのであれば必読。 (★★★★★)

  • Joel Spolsky∥著: ジョエル・オン・ソフトウェア

    Joel Spolsky∥著: ジョエル・オン・ソフトウェア
    前述の書籍「ソフトウエア開発プロフェッショナル」をより砕いたもの、という感じでしょうか。 前書きではプログラマでなくSE向けの本のように書かれているが、プログラマが読んでも面白い本であると思われます。 SEになった新人(あるいはそういう会社に入る/入りたての人)にとっては、これからどういったことが仕事を遂行していく上で起こりえるのか、どのように考えて行なっていけばいいのか決定する助けになると思います。 元は″Joel on Software″というブログの記事で、web上でも一部日本語で読めます。 http://japanese.joelonsoftware.com/ (★★★)

  • ドナルド・C・ゴース,ジェラルド・M・ワインバーグ: ライト、ついてますか

    ドナルド・C・ゴース,ジェラルド・M・ワインバーグ: ライト、ついてますか
    問題解決(一昔前のの流行語で言うところの『ソリューション』)能力は、システムエンジニアのスキルとして備えるべきもののうちのひとつです。しかし、これは難しい。学校で出されるテストと違い、唯一の、(問題提出者が想定している)解を求めるだけが「問題解決」では無いからです。そもそも、何が問題なのか、それは本当に問題なのか、それは本当に解決すべき問題なのか、その問題解決方法は正しいのか、などを解決しなければ、「その解は正しいのか」に辿りつくことができません。この本の最も良いところのひとつは、本があまり厚くないこと。すぐに読めるし、何回も読み返す気になるでしょう。 (★★★★★)

  • スティーブ・マコネル: ソフトウエア開発プロフェッショナル

    スティーブ・マコネル: ソフトウエア開発プロフェッショナル
    コードコンプリートで有名なスティーブマコネルの著書。新人SEに読んで欲しい。個人として業界の中でどうあるべきか、組織としてどうあるべきか、SEのプロ意識とは?SEの心構え概論、といったところでしょうか。また、業界における資格の重要性についても説かれています。この業界では資格が特に軽んじられる傾向がありますが、この傾向はどんな弊害をもたらすのか、将来的にこの業界は資格に対してどのような姿勢で臨んでいくべきなのか。日経BP社では(他の出版社もだが)最近、似たような類いのあまり面白くない書籍が乱出版されていますが、この本は別格だと思うので安心して購入して欲しいと思います。 (★★★★★)

無料ブログはココログ