かきスタンプ

福岡でフリーランスの物流系のエンジニアやってます。

Docker:基本操作メモ

Dockerは、軽量な仮想化環境を実現するツール。
2017年8月現在、以下のエディションがある。
 - CE(Community Edition):無償
 - EE(Enterprise Edition):有償    
以下、OSは Ubuntu 14.04.5 を使用しています。

Docker CE をインストール

sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get -y install docker-ce

バージョン確認

docker --version

Docker Image検索

sudo docker search <検索ワード>

(例:centosのイメージを検索)
sudo docker search centos

Docker Hubからも検索できる。

Imageファイルの取得

sudo docker pull <イメージ名>

(例:centosのイメージを取得)
sudo docker pull centos

ローカルのイメージの一覧を確認

sudo docker images

イメージの詳細を確認

sudo docker inspect <REPOSITORY:TAG>

(例)
sudo docker inspect centos:latest

TAGは省略可能で、その時は latestとなる。
以下のようにIMAGE ID指定でもOK。

sudo docker inspect <IMAGE ID>

(例)
sudo docker inspect 328edcd84f1b

REPOSITORY、TAG、IMAGE IDは、上記のsudo docker imagesにて確認できる。

イメージの削除

sudo docker rmi <REPOSITORY:TAG>

または

sudo docker rmi <IMAGE ID>

コンテナ作成

sudo docker run <REPOSITORY:TAG>

または

sudo docker run <IMAGE ID>

オプション無しで runを実行した場合、起動後にすぐに終了する。
バックグラウンドで動作させたい場合、-tdオプションを使用する。

(よく使うオプション)
-t:疑似ターミナル (pseudo-TTY) を割り当て
-d:コンテナをバックグラウンドで実行(デタッチドモード)
-i:コンテナの STDIN にアタッチ
-p:コンテナのポートをホスト側に公開

実行中のコンテナ一覧を表示

sudo docker ps

実行終了したコンテナ一覧を表示

sudo docker ps -a

コンテナの削除

sudo docker rm <CONTAINER ID>

CONTAINER ID は、上記の docker psにて確認できる。
CONTAINER ID を指定する時は、先頭X文字を入力するだけでも判別してくれる。

実行中のコンテナのログを確認

sudo docker logs <CONTAINER ID>

バックグラウンドで実行中のコンテナを、フォアグラウンドに移動

sudo docker attach --sig-proxy=false <CONTAINER ID>

ctrl+C でコンテナを再びバックグランドに戻す。

バッググラウンドで実行中のコンテナにログイン

sudo docker exec -it <CONTAINER ID> /bin/bash

実行中のコンテナを停止

sudo docker kill <CONTAINER ID>

停止したコンテナを再開

sudo docker start <CONTAINER ID>

コンテナの削除

sudo docker rm <CONTAINER ID>

停止中のコンテナを全て削除

sudo docker rm `sudo docker ps -a -q`

コンテナを起動し、内部で作業する

sudo docker run -it <REPOSITORY:TAG> /bin/bash/bin/bash

イメージ作成

sudo docker commit <CONTAINER ID> <イメージ名>

イメージ名は、「ユーザ名/名称」とするのが慣習だそうな。
ユーザ名は、Docker Hubのアカウント名と同一にしておく。

ビルド

イメージからコンテナを立ち上げ、何らかの変更を加えたものをイメージ化する作業を、スクリプトに記述して自動化できる。
自動化する内容は、『Dockerfile』というファイルを作成して記述する。
(以下、Dockerfile 記述例)

# 何のイメージかを表す
FROM centos
# 誰が書いたかを表す
MAINTAINER kakisoft <sample@gmail.com>
# RUN: buildする時に実行される
RUN echo "now building..."
RUN yum install -y httpd
# ADD: ローカルのファイルをコンテナにコピー
ADD ./index.html /var/www/html/
# EXPOSE: 起動時に指定ポートをLISTEN 
EXPOSE 80
# CMD: runする時に実行される
CMD ["echo", "now running..."]
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

Dockerfile作成後、以下を実行

sudo docker build -t <イメージ名> .

ホストのポートをコンテナのポートにリダイレクト

以下では、ホストのポート8080を、コンテナの80にリダイレクト。

sudo docker run -p 8080:80 -d <イメージ名>

Docker Hubへのログイン

sudo docker login

Docker Hubへプッシュ(アップロード)

ログイン後に実行する。

sudo docker push <DockerHubID/イメージ名>

入力例:sudo docker push kakisoft/httpd
イメージ名の先頭は、DockerHubIDでなければいけないのだろうか。
この辺はまだ良くわからないです。

プッシュしたイメージを取得する場合、 sudo docker pull <イメージ名> でOK。