公式レポジトリを使って、独自の環境を作るには


まず、公式レポジトリを使い、独自の環境を作るためには、Dockerfileを作成します。

```
vim Dockerfile
```

汎用的な部分を抽出します。

```
FROM        centos:centos7
MAINTAINER  My name is akashima
ENV         container docker
EXPOSE      20020 20021 20022 ...
RUN         yum install -y openssh-server
RUN         yum install -y httpd
RUN         yum install -y vsftpd
RUN         sed -ri 's/^#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config
```

`FROM` -> ベースになるイメージを指定します。
`MAINTAINER` -> 作成者名を指定します。
`ENV` -> 環境変数を指定します。使うときは${container}とすれば使えます。
`EXPOSE` -> 複数のポート開放に使うそうです。今の所機能してないっぽい？
`RUN` -> /bin/sh で実行できる形式を指定します。sedなんかも使用可能です。

# Dockerfileのビルド

Dockerfileの作成が一通り終わったらイメージ化のためのビルドを行います。

```
docker build -t xxxx/yyyy:zzzz .
```

docker buildはいいとして、-tでイメージ名やタグを設定します。
あってもなくても問題ありませんが、あったほうがわかりやすくなります。

末尾のピリオドはDockerの位置を指定します。(ファイル名は指定しなくて良いそうです）

```
docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
xxxx/yyyy           zzzz                8f12....            About an hour ago   540 MB
centos              centos7             904d6c400333        11 days ago         196.8 MB
centos              latest              904d6c400333        11 days ago         196.8 MB
```

# ビルドしたイメージを起動する

ビルドしたイメージを起動するためには、docker runコマンドを使います。

```
docker run -i -t -p 80:80/tcp xxxx/yyyy:zzzz /bin/bash
```

これでログインが可能です。  

しかし、zshが使いたいなどとdocker runをいろいろ試していくと、runされたコンテナがどんどん増えます。
後、サービス起動も不能でした。
サービス起動するためには下記の二つがいるそうです。  

```
docker run --privileged -d -p 80:80 xxxx/yyyy:zzzz /sbin/init
979f7b....
docker exec -it 979f7b.... /bin/bash
```

他にもっとやり方があるのかもしれませんが、ひとまずこれでサービス起動までこぎつけました。

~~実際にアクセスしようとするとうまくいかないので調査中です。
多分知ってる人は知ってるんだと思います。-
でも、情報ソースが散らばっていてまとまってる情報がなかなか見つからないんですよね・・・。
よって、~~ 後で加筆修正します。

centos7は上記コマンドを実行した後、 `systemctl start httpd` で起動できたのでこれで正しいようです

2016/6/15 --- 訂正 ここから ---

~~２回目別のポートで試そうとしたら怒られるんですけど、そういうものなんですかね・・・~~

~~```
docker run --privileged -d -p 22:22 xxxx/yyyy:zzzz /sbin/init
1b937e2d0bfa16190520cc6511759b2a6a5ea4e8457ae172ab069aee4b785778
docker: Error response from daemon: driver failed programming external connectivity on endpoint gigantic_minsky (5630f64854a88368a633b195638cef7cefb516af334a5195aa4b2c612fe927b1): Error starting userland proxy: Failed to bind: EADDRINUSE.
```~~

いろいろ試した結果、centos7の場合は下記の通りに実行すると複数サービスのポート開放も許され、サービス起動も行えるようです。

```
docker run --privileged -d -p=22:22/tcp -p=80:80/tcp -p=50020:50020/udp xxxx/yyyy:zzzz /sbin/init
```

FTPサービスやCouchbaseのような大量にudpプロトコルを使用するケースは想定されていないようで、範囲指定でudpポートを開放する手段は見つかりませんでした。

DockerfileにEXPOSEすることも--expose=20020-20030/udpとすることも試しましたが、どちらもダメっぽいです。

```
Client:
 Version:      1.11.2
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   b9f10c9
 Built:        Wed Jun  1 21:20:08 2016
 OS/Arch:      darwin/amd64

Server:
 Version:      1.11.2
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   56888bf
 Built:        Mon Jun  6 23:57:32 2016
 OS/Arch:      linux/amd64
```

イケてない。できるようになったら更新します。
それまでは-p=20020:20020/udpを順次書いていくしかなさげです。

2016/6/15 --- 訂正 ここまで ---

Docker fileをcentos6にした場合は通常の/etc/init.d/でservice起動できました。

# サービスが問題なく起動できたかどうかのチェック

サービスが起動できたかどうかは下記の通りにすれば確認が行えます。

```
http://localhost/
```

# 起動したコンテナの停止及び削除

停止方法はいろいろやり方があります。  
まずは起動しているコンテナを確認します。  

```
docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                   NAMES
4a3b....        xxxx/yyyy:zzzz   "/sbin/init"        7 minutes ago       Up 7 minutes        0.0.0.0:10080->80/tcp   gloomy_pike
```

## 起動していたコンテナの停止方法

```
docker stop 4a3b....
``` 

## コンテナから削除する方法

```
docker rm 4a3b....
```

## まとめて一気に停止と削除を行う方法

```
docker ps -q | xargs docker stop | xargs docker rm
```

# 不要になったイメージの削除

イメージが不要になったら削除したくなります。
要らなくなったら下記のコマンドを叩きましょう

```
docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
xxxx/yyyy           zzzz                8f12....            About an hour ago   540 MB
centos              centos7             904d6c400333        11 days ago         196.8 MB
centos              latest              904d6c400333        11 days ago         196.8 MB
```

```
docker rmi 8f12....
docker rmi centos:centos7
```

# 参考にさせていただいたサイト

[SSH でログインできる CentOS の Docker イメージを作ってみる](http://momijiame.tumblr.com/post/125344790446/ssh-でログインできる-centos-の-docker-イメージを作ってみる)
[CentOS 7のDockerコンテナ内でsystemdを使ってサービスを起動する](http://qiita.com/yunano/items/9637ee21a71eba197345)
[ついに解決した！docker で centos7 コンテナ内にてsystemctl コマンドを使う！](http://100payback.com/?p=780)