急いでイソイテク

並盛り技術ダクダクで。

Dockerfile

※記載途中

httpd

# vi Dockerfile

---
FROM docker.io/centos:centos7
MAINTAINER <name> <<メルアド>>
RUN yum -y install httpd
RUN sed -i -e 's/\#ServerName www.example.com:80/ServerName <アドレス>/g' /etc/httpd/conf/httpd.conf
CMD /usr/sbin/httpd -k start -D FOREGROUND
---

image作成は
# docker build -t <イメージ名>:<タグ> <Dockerfileのパス>

コンテナ起動は
# docker run -i -t -p <ホスト側ポート>:<コンテナ内ポート> -d --name <コンテナ名> <イメージ名:タグ>
※Dockerfile内のCMD節でコマンドを指定する場合は、最後のコマンドを省略する。
※もし省略しない場合は、Dockerfile内のCMDより優先されるっぽい。

動作確認は
# curl http://127.0.0.1:50050/

mysql

docker run -i -t -p 53306:3306 -d --name mysqldocker -e MYSQL_ROOT_PASSWORD=mysql centos7/mysql mysql mysql -h localhost:53306 -uroot -p

→エラーERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)が出て落ちている。

→この場合は、コンテナ内で

touch /var/lib/mysql/mysql.sockして

/etc/my.cnfに

[client] socket=/var/lib/mysql/mysql.sock

を追記する。

それから

docker run --privileged -i -t -p 53306:3306 -d --name mysqldocker -e MYSQL_ROOT_PASSWORD=mysql centos7/mysql /sbin/init

attachするには

nsenter -t $(sudo docker inspect --format '{{.State.Pid}}' mysqldocker) -m -u -i -n -p /bin/sh

メモ

mysql -u <username> -p<password> -h <inspectで調べたmysqlコンテナのIPアドレス>

Dockerコマンドまとめ

コンテナ起動・終了

普通に起動

# docker run -i -t docker.io/centos /bin/bash
-i:コンテナーの標準入力を開く。/bin/bashなどでコンテナーを操作する際に指定 -t:tty(端末デバイス)を確保する。/bin/bashなどでコンテナーを操作する際に指定

名前を付けて起動

# docker run --name isoittech01 -i -t docker.io/centos /bin/bash

終了と同時にコンテナ破棄する

# docker run --rm --name isoittech01 -i -t docker.io/centos /bin/bash

コンテナをバックグラウンドで起動する

# docker run --name isoittech01 -i -t -d docker.io/centos /bin/bash
※BG起動時は「--rm」オプションは指定できない(Conflictする)

BGで起動したコンテナへのアタッチ

# docker ps -aでCONTAINER IDを確認する
# docker attach 3437f04ffc49のようにCONTAINER IDを指定してコマンド実行する
※CONTAINER IDではなく、IMAGE NAMEでも可。 (ENTER)を押してアタッチする

BG起動コンテナへアタッチからのログアウト

dockerコンテナ内でCtrl + pキーとCtrl + qキーの順に押下

BGで起動したコンテナの停止

# docker ps -aでCONTAINER IDを確認する
# docker stop 3437f04ffc49のようにCONTAINER IDを指定してコマンド実行し、停止する
※CONTAINER IDではなく、IMAGE NAMEでも可。

ポートフォワードして起動

docker run -i -t -p 50050:80 centos:centos6/httpd /bin/bash

他の(データストレージ用の)コンテナをVolume指定して起動

docker run -h localmysql -p 3306:3306 --name mysql -d --volumes-from=storage centos7/mysql
-h localmysqlでは任意のホスト名を指定

再起動

docker restart <コンテナ名>


コンテナ保存

保存

# docker ps -aでCONTAINER IDを確認する
# # docker commit c731793b5526 docker.io/centos:latestで保存


コンテナ一覧

全て表示
# docker ps -a 
CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS                      PORTS               NAMES
738d5df288a8        docker.io/centos:latest   "/bin/bash"         10 minutes ago      Exited (0) 9 minutes ago                        isoittech01         
7aaf20cac495        docker.io/centos:latest   "/bin/bash"         14 minutes ago      Exited (0) 11 minutes ago                       jovial_elion

イメージ・コンテナ管理

イメージ取得

# docker pull centos

タグ名変更

# docker imagesでIMAGE IDを確認する
# docker tag <IMAGE ID> <TAG>

(例)
# docker tag centos7/mysql:latest centos7/mysql:20150815
# docker rmi <古いイメージのID>

イメージ削除

# docker rmi docker.io/centos:centos7
Untagged: docker.io/centos:centos7

コンテナ削除

# docker ps -aでCONTAINER IDを確認。
# docker rm 738d5df288a8 7aaf20cac495 でコンテナ削除(複数可能)。
※CONTAINER IDではなく、IMAGE NAMEでも可。
-f付けるとstopやってから削除してくれる。

イメージ作成

# docker commit <CONTAINER ID> <REPOSITORY:TAG>

イメージ作成(Dockerfile利用)

# docker build [ -t <イメージ名< [ : <タグ名> ] ] <Dockerfileのあるディレクトリ>
例:docker build -t centos7/httpd:latest .

イメージの系譜確認

# docker images --tree

Docker Registry

起動

# docker run -d -p 5000:5000 -v /var/docker/registry:/var/docker/registry registry:2.0

今後、Docker Registry自体を別サーバへ移行する際、上記/var/docker/registryを圧縮して
同様に起動する(※それが正規手法・効率的なのかは未確認)

push
  • まず、push対象イメージにタグを付ける

# docker tag <イメージ名> <レジストリホスト>[:<レジストリポート>]/<イメージ名>
例:docker tag docker.io/centos xxxxxx.com:5000/my_centos
例:docker tag docker.io/centos localhost:5000/my_centos
docker imagesREPOSITORYに表示されるdocker.io/centosdocker.ioは、要はタグ=レポジトリホスト名という理解でOK。

  • そしてpush

# docker push <レジストリホスト>[:<レジストリポート>]/<イメージ名>


コンテナ起動中のテクニック

コンテナ内のコマンドをコンテナ外から実行する

docker exec -d コンテナ名 <コマンド> <引数1> <引数2>...<引数Z>
-dを付けるとバックグラウンド

コンテナ内のファイルをホストOSにコピーする

docker cp <コンテナID>:/etc/some.txt some.txt

コンテナへファイルを送信する

docker cp <コピー元ファイル> <コンテナID>:<コピー先ファイルフルパス>
例:docker cp some.txt httpdocker:/etc/some.txt

Docker 1.7以前は下記:

docker exec -i <コンテナ名> bash -c 'cat > <コピー先ファイル>' < <コピー元ファイル>
ex)docker exec -i httpdocker /bin/bash -c 'cat > /path/to/file' < /path/from/file
  • docker exec でコンテナ内でコマンドを実行
  • その際 -i オプションによりホスト側の標準入力がコンテナ内の標準入力に接続される
  • ホスト側ではコピー元ファイルを標準入力に流し込む
  • コンテナ内では cat が標準入力の内容をコピー先ファイルに書き出す

コンテナのIPアドレスを調べる

docker inspect --format '{{ .NetworkSettings.IPAddress }}' <コンテナ名>


トラブルシューティング

dockerコマンド何してもアカン

FATA[0000] Get http:///var/run/docker.sock/v1.18/images/json: dial unix /var/run/docker.sock: no such file or directory. Are you trying to connect to a TLS-enabled daemon without TLS?

が出る場合は、service docker restartする。


未分類メモ

ストレージコンテナ

stopしただけじゃデータは無くならない。
  • ストレージコンテナとして/optをVOLUME指定でimageを作成。
  • 上記イメージからコンテナstorageを作成。
  • storageをストレージとして、mysqlコンテナを起動
  • mysqlコンテナ上でテストとしてDB,テーブルを作成。
  • mysql, storage両コンテナをstopで落とす。
  • 再度コンテナ起動して作成したテーブルの存在を確認を試みる。結果は存在。
  • docker rmしないとやっぱり無くならないのね。
ストレージコンテナ使用先コンテナでの見え方
  • 例えばVOLUME /optとしてstorageコンテナをbuildした場合、--volume-from=storageでrunしたコンテナでは、 /optが存在する。
  • mysqlの場合は/opt/mysqlにインストールされていた。
    ※ちょっと意味不明だが放置

Docker作業

Dockerを入れる

$ sudo rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6
$ sudo yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
→エラー(ファイル /etc/rpm/macros.ghc-srpm (パッケージ epel-release-6-8.noarch から) は、パッケージ redhat-rpm-config-9.1.0-68.el7.centos.noarch からのファイルと競合しています)
→スルー
$ sudo yum -y install docker-io
→成功

# サービスの起動
$ sudo service docker start
$ sudo chkconfig docker on

CentOS7のイメージを取得する

$ sudo docker pull centos:centos7
→下記エラー
centos7: Pulling from docker.io/centos
c852f6d61e65: Download complete 
c852f6d61e65: Error downloading dependent layers 
7322fbe74aa5: Error pulling image (centos7) from docker.io/centos, endpoint: https://registry-1.docker.io/v1/, Driver devicemapper failed to create image rootfs c852f6d67322fbe74aa5: Error pulling image (centos7) from docker.io/centos, Driver devicemapper failed to create image rootfs c852f6d61e65cddf1e8af1f6cd7db78543bfb83cdcd36845541cf6d9dfef20a0: device c852f6d61e65cddf1e8af1f6cd7db78543bfb83cdcd36845541cf6d9dfef20a0 already exists 

FATA[0023] Error pulling image (centos7) from docker.io/centos, Driver devicemapper failed to create image rootfs c852f6d61e65cddf1e8af1f6cd7db78543bfb83cdcd36845541cf6d9dfef20a0: device c852f6d61e65cddf1e8af1f6cd7db78543bfb83cdcd36845541cf6d9dfef20a0 already exists 

$ docker images
FATA[0000] Get http:///var/run/docker.sock/v1.18/images/json: dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS? 
→権限的な?それな?

$ yum update (一応)
$ sudo docker pull centos:centos7
→エラーの内容変わらず

# service docker restart
# docker pull centos:centos7
centos7: Pulling from docker.io/centos
c852f6d61e65: Download complete 
c852f6d61e65: Error downloading dependent layers 
7322fbe74aa5: Error pulling image (centos7) from docker.io/centos, Driver devicemapper failed to create image rootfs c852f6d61e65cddf1e8af1f6cd7db78543bfb83cdcd36845541cf6d9dfef20a0: Error running DeviceCreate (createSnapDevice) dm_task_run failed reate (createSnapDevice) dm_task_run failed 
FATA[0030] Error pulling image (centos7) from docker.io/centos, Driver devicemapper failed to create image rootfs c852f6d61e65cddf1e8af1f6cd7db78543bfb83cdcd36845541cf6d9dfef20a0: Error running DeviceCreate (createSnapDevice) dm_task_run failed 

# service docker stop
# cd /var/lib/
# mv docker bak.docker
# service docker restart
Redirecting to /bin/systemctl restart  docker.service
Job for docker.service failed. See 'systemctl status docker.service' and 'journalctl -xn' for details.

# rm -rf docker/
# mv bak.docker/ docker/
# service docker restart
Redirecting to /bin/systemctl restart  docker.service

# service docker stop
# cd /var/lib/
# cp -rp docker bak.docker
# rm -rf docker/* 
# service docker start
→SAME

# yum remove docker
# yum install epel-release.noarch
# yum install docker-io
# service docker restart
# docker pull centos:centos7
Trying to pull repository docker.io/centos ...
7322fbe74aa5: Download complete 
f1b10cd84249: Download complete 
c852f6d61e65: Download complete 
Status: Downloaded newer image for docker.io/centos:centos7
→Success!
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.io/centos    centos7             7322fbe74aa5        6 weeks ago         172.2 MB

サービス構築TODO

やることまとめ