notebook

都内でWEB系エンジニアやってます。

CentOS6でdockerを動かせるようにする

長いこと逃げてきたdockerですが色々と便利そうな感じになっているみたいなのでまずは触ってみようということでやってみます

インストール

epelリポジトリから取得できます

yum install docker-io -y --enablerepo=epel
$ docker version
Client version: 1.7.1
Client API version: 1.19
Go version (client): go1.4.2
Git commit (client): 786b29d/1.7.1
OS/Arch (client): linux/amd64
Server version: 1.7.1
Server API version: 1.19
Go version (server): go1.4.2
Git commit (server): 786b29d/1.7.1
OS/Arch (server): linux/amd64
$ docker -d
INFO[0000] Listening for HTTP on unix (/var/run/docker.sock)
WARN[0000] You are running linux kernel version 2.6.32-358.el6.x86_64, which might be unstable running docker. Please upgrade your kernel to 3.10.0.
docker: relocation error: docker: symbol dm_task_get_info_with_deferred_remove, version Base not defined in file libdevmapper.so.1.02 with link time reference

動かなかった...

stackoverflow.com

ここを参考にしてとりあえずインストールだけ行います

$ sudo yum install device-mapper-event-libs
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE

とりあえず何もイメージはない状態

$ docker pull centos
# バージョン指定何も指定しない場合はlatest Centosだと7
docker pull centos:6
  • 確認
docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              6                   6e93f19d1d37        10 days ago         228.9 MB
centos              latest              bb3d629a7cbc        10 days ago         196.6 MB
$ docker run centos:6 echo 'test'
Error response from daemon: Cannot start container f4a191964aad55436e7777178093f3c7112feff351dff71784c371cd1bed70dd: no such file or directory

おっと...

CentOS6系の記事を見つけたのでやってみます

eatsmart.hatenablog.com

yum -y upgrade
shutdown -r now

これは厳密にはkernelのバージョンだけあげれば良い模様、なので実際はyum -y upgrade kernelでもOK

upgradeしてしまったことでsambaのバージョンも上げてしまい、update後のセキュリティ系の?機能により開発環境で一時使えなくなってしまった...

$ docker run centos:6 echo 'test'
test

無事起動できました

dockerfileでイメージを作成

                リポジトリ名 Dockerfileがあるディレクトリ
$ docker build -t test/nginx ./
  • エラー
Error: Cannot retrieve repository metadata (repomd.xml) for repository: base. Please verify its path and try again

が、色々いじってるうちに通ってしまった...

コンテナの起動

$ docker run -i -t test/git /bin/bash

コンテナ一覧

起動しているコンテナ

$ docker ps

-a をつけることで全てのコンテナを表示してくれる

イメージの削除

$ docker rmi -f image_id

起動中のコンテナを停止して削除する

  • 起動中のコンテナIDを取得(-q)
$ docker ps -q
2ee754de991e
6a8cb37bb17e
cdf84747b41e
  • 起動中のコンテナを全て止める
$ docker ps -q | xargs docker stop
2ee754de991e
6a8cb37bb17e
cdf84747b41e
  • 起動中のコンテナを全て止めて削除する
$ docker ps -q | xargs docker stop | xargs docker rm
2ee754de991e
6a8cb37bb17e
cdf84747b41e

docker stop, rm 共にIDが出力されるのでxargsで使いまわすことが出来る

dockerでの外部への通信 yum

yum でepelをインストールしようとしたらエラーが出た

http://mirror.nus.edu.sg/centos/6.7/extras/x86_64/Packages/epel-release-6-8.noarch.rpm: [Errno 14] PYCURL ERROR 6 - "Couldn't resolve host 'mirror.nus.edu.sg'"

digした結果のSERVER: 10.0.2.3#(10.0.2.3) をdnsとして設定

  • /etc/sysconfig/docker
- other_args=
+ other_args="-dns 10.0.2.3"

として再度実行

無事インストールできた

外部からのアクセス

-p オプションでポートフォワードしてくれます

docker run -d -p 16379:6379  test/redis

試しにredisのコンテナを立てました

下記だとホスト側の受付ポートは16379で通信を受け取り

コンテナのポート6379へプロキシしている

なのでホスト側でクライアントを起動する際に16379ポートを指定すればredisに接続できる

起動中のコンテナへアクセス

# IDでログイン
docker exec -it 140c265a2b2b /bin/bash

COPYの罠

COPYがうまくいかない時がありました

.dockerignoreというファイルに設定を追加しないといけないようです

jetglass.hatenablog.jp

おわり

とりあえず今まで調べたところまで

公式読めばオプションなど詳しく載っているのでメモとして...

コマンドの実行環境をDockerfileにしてdocker runでコマンドを叩くだけ、といった使い方もできるよう

使ってみたらかなり便利でした

次はdocker-composeなども触ってみたいと思います