LoginSignup
1
1

More than 3 years have passed since last update.

docker back to the basic

Last updated at Posted at 2020-05-26

TL;DR

以下のようなコマンドを使いこなそう

参考) http://docs.docker.jp/engine/reference/commandline/index.html

$ docker image ls
$ docker container ls
$ docker container ls -a
$ docker run -id --name hoge --rm -v $(pwd):/home
$ docker container exec
$ docker container attach
$ docker build -t [image-name] .

基礎知識

  • コンテナ型の仮想化では、コンテナはホストOSのカーネルを利用する。

  • 1コンテナ1プロセスで使用する。

  • Web server container やDB server container など複数のコンテナを立てる。

  • コンテナにはそれぞれ仮想NIC(eth0)が割り当てられる。

  • コンテナ同士で通信することが可能である。

NIC(ニック) : 別名 LANカード、Ethernetカード
NICとは、コンピュータなどの機器を通信ネットワーク(LAN)に接続するためのカード型の拡張装置。筐体背面や側面などに用意された拡張スロットなどに挿入して使用する。単にNICといった場合は最も普及しているイーサネット(Ethernet = 有線LANのこと)に接続するためのコネクタ(RJ45)のことを指す。(引用 http://e-words.jp)

What is image and what is container?

docker には、imagecontainerの2つがある。

OSのインストールDVDを仮想化したものがDockerイメージであり、

OSが起動しているサーバを仮想化したものがコンテナに相当する。

基本コマンド

まず、一番簡単なHello Worldをやってみます。

hello-worldというDockerイメージが用意されていますので、docker run hello-worldコマンドで起動します。

$ sudo docker run hello-world

pullしてきたDockerイメージの一覧docker image lsコマンドで確認できます。

$ docker image ls
$ docker container ls -a

作成済Dockerコンテナの一覧はdocker container ls -aで確認できます。

"-a"は「コンテナ一覧をすべて表示」するためのオプションです。これをつけないと起動中のコンテナしか表示されません。

dockerイメージの削除コマンドはdocker image rm [Repository]
コンテナの削除コマンドはdocker container rm [containerID]

$ docker image rm hello-world
$ docker container rm 484810ae0812

注意) docker runからの状況から脱するには「ctrlキーを押しながら'pq'と押す」

ホスト側との「ディレクトリ共有」

「ホストOSのディレクトリ」と「コンテナ内の/home/」をつなぐ。

「-v」オプションは、ポートフォワード設定の「-p」オプションと同様、コロンの左側(/root/tomcat-container/logs)がホスト側、右側(/share/logs)がコンテナ内のディレクトリを表していて、そのディレクトリが共有されるかたちとなります。

$ docker run -it -d --name hogehoge -v $(pwd):/home ubuntu:16.04 bash

docker container exec

docker container ls -aでまだコンテナが起動している場合、またコンテナに入ることができるはずである。起動しているコンテナに入る方法は2つある。

  • docker container attachコマンドを使う方法
  • docker container execコマンドを使う方法

attachは「ゲストOSの標準入力/標準出力を、ホストOSの標準入力/標準出力とつなげる」という意味です。attachは「既に起動している」1つのプロセスへつなぎに行きます。

$ docker container attach 5
$ ps aux
# ctrlキー + 'pq'

execは「引数のコマンドを実行する」という意味です。

execでは現在起動しているbashとは別に、新たにbashを起動します。

$ docker container exec -it 5 bash
$ ps aux
$ exit

DockerFile の作り方

Docker imageからDocker containerを作成する際に「必要なパッケージのインストール手順や実行コマンドなど」をスクリプト化したもの。

$ docker build -t workcheck

FROM

FROM 命令は、以降の命令で使う ベース・イメージ を指定します。あるいは、有効な Dockerfile は、1行めを FROM 命令で指定する必要があります。イメージとは、あらゆる有効なものが利用できます。 パブリック・リポジトリ から イメージを取得する 方法が一番簡単です。

# ubuntu 14.04のイメージを使う
FROM ubuntu:14.04

MAINTAINER

MAINTAINER 命令は、生成するイメージの Author (作者)フィールドを指定します。

RUN

イメージ作成時に実行するコマンドを書く。

RUN 命令は既存イメージ上の新しいレイヤで、あらゆるコマンドを実行し、その結果をコミットする命令です。コミットの結果得られたイメージは、 Dockerfile の次のステップで使われます。

#  update後にapache2をインストール
RUN apt update .
RUN apt install apache2 -y

CMD

DockerfileCMD 命令を一度だけ指定できます。複数の CMD がある場合、最も後ろの CMD のみ有効です。

CMD の主な目的は、 コンテナ実行時のデフォルトを提供します 。 デフォルトには、実行可能なコマンドが含まれているか、あるいは省略されるかもしれません

# nodeでサーバを起動する
CMD [ "node", "server.js" ]

EXPOSE

指定のポートを外部に公開する。

EXPOSE 命令は、特定のネットワーク・ポートをコンテナが実行時にリッスンすることを Docker に伝えます。 EXPOSE があっても、これだけではホストからコンテナにアクセスできるようにしません。アクセスするには、 -p フラグを使ってポートの公開範囲を指定するか、 -P フラグで全ての露出ポートを公開する必要があります。

# 80番ポートを外部に公開する
EXPOSE 80

ENV

ENV 命令は、環境変数 と 値 のセットです。値は Dockerfile から派生する全てのコマンド環境で利用でき、 インラインで置き換え も可能です。

ENV 命令は2つの形式があります。1つめは、 ENV であり、変数に対して1つの値を設定します。はじめの空白以降の文字列が `` に含まれます。ここには空白もクォートも含まれます。

2つめの形式は ENV = ... です。これは一度に複数の変数を指定できます。先ほどと違い、構文の2つめにイコールサイン(=)があるので気を付けてください。コマンドラインの分割、クォート、バックスラッシュは、空白スペースも含めて値になります。

ENV <key> <value>
ENV <key>=<value> ...

ADD

ADD 命令は <ソース> にある新しいファイルやディレクトリをコピー、あるいはリモートの URL からコピーします。それから、コンテナ内のファイルシステム上にある 送信先 に指定されたパスに追加します。

複数の <ソース> リソースを指定できます。この時、ファイルやディレクトリはソースディレクトリ(構築時のコンテクスト)からの相対パス上に存在しないと構築できません。

それぞれの <ソース> にはワイルドカードと Go 言語の filepath.Match ルールに一致するパターンが使えます。例えば、次のような記述です。

ADD hom* /mydir/        # "hom" で始まる全てのファイルを追加
ADD hom?.txt /mydir/    # ? は1文字だけ一致します。例: "home.txt"
ADD test relativeDir/          # "test" を `WORKDIR`/relativeDir/ (相対ディレクトリ)に追加
ADD test /absoluteDir/          # "test" を /absoluteDir/ (絶対ディレクトリ)に追加

COPY

COPY 命令は <ソース> にある新しいファイルやディレクトリをコピーするもので、コンテナ内のファイルシステム上にある <送信先> に指定されたパスに追加します。

COPY hom* /mydir/        # "hom" で始まる全てのファイルを追加
COPY hom?.txt /mydir/    # ? は1文字だけ一致します。例: "home.txt"

例) Node.jsのアプリケーションを起動する

FROM node:12

# アプリケーションディレクトリを作成する
WORKDIR /usr/src/app

# アプリケーションの依存関係をインストールする
# ワイルドカードを使用して、package.json と package-lock.json の両方が確実にコピーされるようにします。
# 可能であれば (npm@5+)
COPY package*.json ./

RUN npm install
# 本番用にコードを作成している場合
# RUN npm install --only=production

# アプリケーションのソースをバンドルする
COPY . .

EXPOSE 8080
CMD [ "node", "server.js" ]
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1