まず、公式レポジトリを使い、独自の環境を作るためには、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 --- 訂正 ここから ---
2回目別のポートで試そうとしたら怒られるんですけど、そういうものなんですかね・・・
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 イメージを作ってみる
CentOS 7のDockerコンテナ内でsystemdを使ってサービスを起動する
ついに解決した!docker で centos7 コンテナ内にてsystemctl コマンドを使う!