使い方
Docker
Howto
docker入門

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

More than 3 years have passed since last update.

まず、公式レポジトリを使い、独自の環境を作るためには、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 コマンドを使う!