ふるてつのぶろぐ

福岡在住のエンジニアです。

写真提供:福岡市

今度は客先でコンテナ勉強会

今日すること

f:id:tetsufuru:20190806104529p:plain:w100
こんにちはふるてつです。

最近客先にて勉強会がスタートしまして、ただいまDockerを勉強中です。
まずは入門ということでこちらのサイト「入門Docker」を勉強しております。
https://y-ohgi.com/introduction-docker/
今週は自社の会議で参加できず、自宅にて「コンポーネント」 メニューの 「Dockerfile」ページを自習しました。

1. Dockerfile

Dockerfileを記述してそのファイルを元にDocker Imageをビルドすることでスナップショットの作成ができます。
試しにDockerfileを記述してDocker Imageを作成してみます。
f:id:tetsufuru:20190824090522p:plain:w500

1-1. 環境の用意

ローカルに任意のディレクトリを作成しテキストファイルを1つ作ります(hello.txt)
中身はhello docker !と書いておきます。

1-2. Dockerfile の編集

次に同一のディレクトリに下記内容のDockerfileを作成します。

FROM ubuntu

COPY hello.txt /tmp/hello.txt

CMD ["cat", "/tmp/hello.txt"]

上記のDockerfileは上から順番に
1. ubuntu というDocker Imageをもとに、
2. ホストの hello.txt をコンテナの /tmp/hello.txt へコピーして、
3. 「cat /tmp/hello.txt コマンドを実行」という意味になります。

1-3. Docker Image のビルド&実行

docker buildコマンドでDockerfileから Docker Image を作成します。

docker build -t hello .

-t hello オプションは「Docker Imageを hello というタグ名にする」という意味です。
"."はdocker build 実行時のコンテキストの指定です。
COPY コマンドを実行する際にどのディレクトリを起点とするかを指定します。

実行すると下記のメッセージが表示されました。

You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.

わたしはWindows環境を使用していますのでその関係で出てくるもようです。
「すべてのディレクトリのpermissionを755にとりあえずしますよ」という旨のようです。
今回はテストなのでそのままにしておきます。

docker imagesコマンドで確認します、下のようにhelloイメージができています。
補足ですがFromで指定したubuntuのイメージもダウンロードされてきています。

docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello               latest              b789b8db2e5f        3 seconds ago       64.2MB
ubuntu              latest              a2a15febcdf3        5 days ago          64.2MB

ではdocker run helloで、このイメージを実際に動かしてみます。
下記のように CMD で指定した cat /tmp/hello.txt が実行され、"hello docker !"と表示されました。

docker run hello
hello docker !

なるほどDockerfileはこんな感じで作るわけです。
このコマンドを色々組合わせて自分独自のDocker Imageを作っていくんでしょうね。

2. Docker Hub へアップロード

ローカルで開発したイメージをステージングや本番環境で動かすにはDockerレジストリにアップロードする必要があるようです。
DockerレジストリはDocker Image を保存するための場所で、Docker版のGitHubのようなものだそうです。
Docker公式が提供しているDockerHubへ先ほど作成した hello イメージをアップロードします。
使用する前にアカウント登録が必要になります、下記サイトです。
f:id:tetsufuru:20190824110923p:plain https://hub.docker.com/

2-1. Docker Hubへログイン

下記コマンドでDocker Hubへログインします。

docker login

ユーザ名やパスワードを聞かれるのでコンソールに従って入力していきます。

2-2. Docker Image を命名

Docker HubにアップロードするためにはDocker Image命名規則に従う必要があるそうです。
ユーザーのオリジナルイメージは<USER NAME>/<IMAGE NAME>:<TAG>という命名になります。
( : は省略可能で、省略すると :latest と命名されます)
まずはdocker tagコマンドで命名します。
<USER NAME> は自分のユーザー名を入力します。

docker tag hello <USER NAME>/hello

命名できたかdocker imagesコマンドで確認します。
REPOSITORYが <USER NAME>/hello になっているイメージが新たにできています。

docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
hello                 latest              b789b8db2e5f        14 minutes ago      64.2MB
<USER NAME>/hello     latest              b789b8db2e5f        14 minutes ago      64.2MB
ubuntu                latest              a2a15febcdf3        5 days ago          64.2MB

2-3. Docker Imageのアップロード

下記のコマンドでDocker Imageをアップロードします。

docker push <USER NAME>/hello

うまくいったようです。下のようなメッセージが表示されました。

bf69b9f7a066: Pushed
122be11ab4a2: Mounted from library/ubuntu
7beb13bce073: Mounted from library/ubuntu
f7eae43028b3: Mounted from library/ubuntu
6cebf3abed5f: Mounted from library/ubuntu
latest: digest: sha256:f4c69205069a08247f3e5403d982b8635b7c74620a9966a4b1105e62c5974a83 size: 1359

Docker Hubを確認してみます。
登録されていますね✨ f:id:tetsufuru:20190824101838p:plain

2-4. Docker Hub にアップロードしたDocker Imageの実行

現在存在するローカルのイメージを削除します。
同名のイメージが存在するとDockerHubから取得せず、ローカルに存在するイメージを参照してしまうからだそうです、なるほど。

docker container pruneコマンドを実行します。
container pruneコマンドは停止しているコンテナをすべて消すコマンドです。
参考サイト:https://docs.docker.com/engine/reference/commandline/container_prune/

docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
ca5ffc8299ad46f659ee21aa8b3793d651b3be8f1124d1cd7469cb99ab2dba2f
8f2895514831065050183538213b4f28bb829c823363466801bb63b48ef7fc16
4348253120ae6d8fdb1ad1c479091b446c15b3a56ac42ef9cf012dc8b7cbbbb8
d9dddcfe7a042bf7813ea5308a4a880a9c0d5742c649229c69272a54f8f4dfdd
af14ba183197d11fc16365470d989dad9d28e101ffeba56c8e3c377929235101

次にdocker image prune -aコマンドを実行します。
image pruneコマンドは停止しているイメージを消すコマンドです。
-aオプションをつけるとすべてになります(-all)

参考サイト:https://docs.docker.com/engine/reference/commandline/image_prune/

docker image prune -a 
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Deleted Images:
untagged: hello:latest
untagged: tetsufuru1968/hello:latest
untagged: tetsufuru1968/hello@sha256:f4c69205069a08247f3e5403d982b8635b7c74620a9966a4b1105e62c5974a83
deleted: sha256:b789b8db2e5f37ea6eda822a1fcf82334d60bb36f1dc8940518e1238cbb9335f
deleted: sha256:5ebfb5bb22e017b5f43655e7388072f559c9b547148e906101b8be88d4e97a25
deleted: sha256:01af779985d92c769233e7a4f07321dac0e25a5ec198660c9faed0c3590195e7
untagged: ubuntu:latest
untagged: ubuntu@sha256:d1d454df0f579c6be4d8161d227462d69e163a8ff9d20a847533989cf0c94d90
deleted: sha256:a2a15febcdf362f6115e801d37b5e60d6faaeedcb9896155e5fe9d754025be12
deleted: sha256:fdc47e80ad3dbe1767a5c2141442c0c7aa93a14a817357a0d4353cd8ae48ee58
deleted: sha256:2b4ed599a73ad82b15d4e3488d95af4f387037b90401d63ad6cb433374b3e3d3
deleted: sha256:8f06e3a624319de717230f0d766dd8922d048441adb9e0387860a8047d000409
deleted: sha256:6cebf3abed5fac58d2e792ce8461454e92c245d5312c42118f02e231a73b317f

それでは改めてdocker pull <USER NAME>/helloコマンドでDocker Hubから自作したイメージを取得します。

docker pull <USER NAME>/hello
Using default tag: latest
latest: Pulling from <USER NAME>/hello
35c102085707: Pull complete
251f5509d51d: Pull complete
8e829fe70a46: Pull complete
6001e1789921: Pull complete
2cf3a5dd5be8: Pull complete
Digest: sha256:f4c69205069a08247f3e5403d982b8635b7c74620a9966a4b1105e62c5974a83
Status: Downloaded newer image for <USER NAME>/hello:latest
docker.io/<USER NAME>/hello:latest

docker run <USER NAME>/helloコマンドで上記で取得したDocker imageを実行します。

docker run <USER NAME>/hello
hello docker !

3. DSL(Domain Specific Language:ドメイン固有言語)

Dockerfileには17のコマンドが用意されているそうですが、わたしは初心者ですのでいきなり全部は大変そうです。
「入門Docker」のサイトで言われている基本的な7つのコマンドをまずは覚えて、今後試してみようかと思います。
FROMCOPYRUNCMDWORKDIRENVUSER

今日の感想


今回も勉強した「入門Docker」の内容をそのまままとめた内容になりました。
申し訳ありませんがDocker初心者ですのでご勘弁ください。
でもこうやってブログに書くのは良いですね、書くことでいい復習になります。

それではまた