超初心者向けにDockerの基本を解説してみた

Docker

Dockerとはそもそも何か

サンドボックスの中でアプリケーションを気軽に起動できる

DockerはホストOS(自分が今使っているPCのOS)上でサンドボックスを生成して、その中でアプリケーションを実行する仕組みを実現します。このサンドボックスはコンテナと呼ばれます。サンドボックスというのは元々ウイルス対策の為に自分のOSとは独立したアプリケーション実行環境のことを指します。仮にウイルスに感染してしまっても、その環境を切り捨てれば自身のOSには全く影響がないという点が特徴です。

What is sandbox (computer security)? - Definition from WhatIs.com
Using the Java programming language development environment, the 'sandbox' is the security model for the Java virtual machine or run-time platform.

Dockerの場合のサンドボックスはウイルス対策というよりもどのPCの環境で動かした場合でも同じような環境を構築することができるという観点が強みです。windowsでもUnixでもdockerのアプリケーションさえいれてしまえばどの環境でも同じように動作します。アプリを動かす環境を図にすると次のような絵になります。

ハードウエア、OSに依存せずにDockerさえインストールしてしまえばどの環境においても同じようにアプリケーションを実行する環境を生成することができます。

コンテナとは何か

Dockerが生成する独立したアプリケーション実行空間のことを指します。Dockerを使って一つのサービスを動かそうとした時、大抵の場合コンテナを複数立てるアーキテクチャーになります。あるコンテナはapatchが入ったWebサーバー用、またあるコンテナはMysqlが入ったDBサーバー用といったようにです。詳しく知りたい人はこちらの記事が勉強になるかもです。

コンテナ技術の基礎知識
コンテナの概要ITシステムにおいて、開発面や運用面の変化へ迅速に対応する解決策の1つとして、従来では、仮想化ソフトウェアの採用がありました。仮想化ソフトウェアは、複数のOS環境とアプリケーションを1つのファイルとして取り扱い、非常に可搬性の高い基盤を提供します。しかし、Dockerに比べ、複数のOS

Dockerとはについての紹介はここまでにして、次は基本的なコマンドについて紹介していきます。あくまでも自分がメモしておきたいと思った部分を書いているので全て網羅しているわけではないという点にはご注意ください。またDockerのインストール方法は以下のQiitaの記事を参考にすると良いかもしれません。

DockerをMacにインストールする(更新: 2019/7/13) - Qiita
## はじめに :whale: MacにDockerをインストールする方法についてまとめた記事です。 ザクザク行けば10分程度でnginxの起動までいけると思います。 この記事の目的は**Dockerに慣れること**です。 よって、...

Dockerfileからイメージを生成する

docker build

コンテナを生成するにあたって、イメージと呼ばれるコンテナの設計書のようなものを生成しなくてはいけません。イメージはDocker hubと呼ばれるプラットフォームに全て置いてあります。

Docker Hub

linuxやwindowsといったOSのイメージから個人がつくったイメージまで様々なイメージが置かれており、自由に取ってくることができます。アカウントを作れば自分のつくったイメージをDocker hub上で公開することができます。カスタマイズされたイメージを例えるならば、玉ねぎです。一番内側がLinuxやWindowsといったOSのイメージでこれらをmysqlやnodeなどのイメージでラップして行きます。

Dockerfile

そしてこのイメージを生成する為にはDockerfileと呼ばれるイメージの設計書を記述する必要があります。以下のDockerfileのサンプルを用意しました。

# 公式イメージを親イメージとして使用する
FROM node:current-slim

# ワーキングディレクトリを設定
WORKDIR /usr/src/app

# コンテナ内にファイルをコピーする
COPY package.json .

# buildした時に実行するコマンド
RUN npm install

# コンテナが実行時にある特定のポートを解放していることをDockerに通知する
EXPOSE 8080

# コンテナ内で実行するコマンド
CMD [ "npm", "start" ]

ホスト側にあるpackage.jsonをdocker内にコピーするコマンドを書いているのであらかじめpackage.jsonを用意しておきます。そしてdocker buildコマンドを叩きます。今回は次のコマンドを叩いてみました。

❯ npm init
❯ docker build .
Sending build context to Docker daemon  3.072kB
Step 1/6 : FROM node:current-slim
 ---> 26932a190e66
Step 2/6 : WORKDIR /usr/src/app
 ---> Using cache
 ---> 196fb23f076e
Step 3/6 : COPY package.json .
 ---> 897aaa1ae8b7
Step 4/6 : RUN npm install
 ---> Running in cdac3718fd35
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN docker-sample@1.0.0 No description
npm WARN docker-sample@1.0.0 No repository field.

up to date in 0.84s
found 0 vulnerabilities

Removing intermediate container cdac3718fd35
 ---> 31d05cdda9c9
Step 5/6 : EXPOSE 8080
 ---> Running in c60e4491bac5
Removing intermediate container c60e4491bac5
 ---> 62280c858dca
Step 6/6 : CMD [ "npm", "start" ]/
 ---> Running in d5d3b81785a6
Removing intermediate container d5d3b81785a6
 ---> 2c24789949be
Successfully built 2c24789949be

Dockerfileに記述した各行のコマンドは1つのstepとして実行されます。6個の命令を記述したので6step実行されていることが標準出力からわかると思います。

ちなみにdocker buildとは別にdocker image buildというコマンドも存在します。このコマンドもイメージを生成するコマンドで何が違うのだろうと疑問に思っていたのですがどうやらdocker buildはdocker image buildのaliasであるとstackoverflowに書かれていました。なのでどちらも同じコマンドになります。このようにaliasが設定されていることが多々あるのでコマンドが違っていても実は同じコマンドであったという事も多々あるので混乱しないように注意が必要です。

docker image build vs docker build
Why does my Docker client recognize docker build but not docker image build? Is the client too old? Does CLI depends on client or server? I believe I got my Do...

docker images

docker imagesというコマンドを叩けば現在保有するイメージ一覧を確認することができます。

❯ docker images
REPOSITORY               TAG                 IMAGE ID            CREATED              SIZE
<none>                   <none>              196fb23f076e        About a minute ago   140MB

docker tag

REPOSITORYとTAGがnoneになってしまっているので、名前を付与する為にdocker tagというコマンドを叩きます。第一引数にはIMAGE ID、第二引数にはREPOSITORYとTAGを指定します。

❯ docker tag 196fb23f076e node-current-slim:latest
❯ docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
node-current-slim        latest              196fb23f076e        7 minutes ago       140MB

初めからREPOSITORYとTAGを指定したい場合は次のようなコマンドを打ちます。

docker build -t node-current-slim:latest

イメージからコンテナを生成する

docker run

先程生成したイメージからコンテナを生成する為にはdocker run というコマンドを打ちます。

❯ docker run --publish 8000:8080 --detach --name test node-current-slim:latest
786060ada96bf46f4d1dd4c96bead9acfac4d8e013fdd4e6c16e90f24d51a9d2

ちなみに–detach (-d でも可)を付与するとバックグランドでコンテナを起動することができます。

Docker Detached Mode
What is detached mode in the docker world? I read this article Link, but it does not explain exactly what detached mode mean.

ではバックグラウンドモードの反対であるフォアグラウンドモードでコンテナを起動してみたいと思います。ちなみに何も指定しない場合はディフォルトでフォアグラウンドモードになります。フォアグラウンドモードでコンテナを起動するとホストとコンテナの標準入力を繋げることができるので、起動直後にコンテナ内部にはいることができます。

❯ docker run --publish 8000:8080 -t --name test1 node-current-slim:latest
npm ERR! missing script: start

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2020-03-07T01_40_09_635Z-debug.log

実は先程書いたnpm startのコマンドでエラーが起きているのでそのエラーが出力されます。ちなみにエラーが起きるとコンテナも停止します。

docker ps

docker ps というコマンドを使えば現在起動中のコンテ一覧を表示することができます。aオプションを付与すると停止中のコンテナも表示することができます。

❯ docker ps -a
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                      PORTS                                            NAMES
786060ada96b        node-current-slim:latest   "docker-entrypoint.s…"   33 seconds ago      Exited (0) 32 seconds ago                                                    test

コンテナを停止・削除する

docker stop

コンテナを停止する場合はdocker stopというコマンドを打ちます。第一引数に停止したいコンテナのNAMESを指定すればOKです。

❯ docker stop test

docker rm

コンテナを削除する場合はdocker rmというコマンドを打ちます。第一引数に削除したいコンテナのNAMESを指定すればOKです。

❯ docker stop test

 

以上でDockerの基本的な操作についての記事は終わりです。

番外:おすすめアイテム

記事の内容とは別に自宅・オフィスでの開発がもっと快適に、楽しくなる商品を紹介します。アイテム1つで開発効率が一気に向上したり、開発のモチベーションが上がったりするので良いアイテムにはお金を投資すると良いかと。

KATUO
KATUO
今回紹介する商品は普段自分が使っているものなので自信を持ってお勧めできますー。では1つずつ紹介していきます。

おすすめアイテム①

自分はオフィス次の2点の座布団と背もたれクッションを利用してます。姿勢が安定し、お尻への負担が激減します。オフィスにいるのに自宅で作業しているような感覚になるので気に入ってます。また疲労感もかなり減るので費用対効果が非常に高いアイテムです。

おすすめアイテム②

ブックスタンドみなさん使ってますか?PCを打ちながら参考書見る時に手で抑える必要がなくなるので非常に便利です。自分も購入した時なんでいままで使ってなかたんだろうと後悔したのでまだ持ってない方は買っておくと作業効率があがります。

おすすめアイテム③

PCスタンド、magic keyboard、magic mouseを購入してから、開発効率があがり、身体的負担が減って快適に開発ができるようになりました。

エンジニアの基礎知識・教養

別の記事でエンジニアとして知っておくべき技術本についてまとめました。初心者には最低限読んでおいて欲しい技術本をまとめました。例えば「リーダブルコード」などは技術力の高いエンジニアなら必ず過去に読んでいる本だと思います。

筆者
筆者

今回の記事の内容は以上で終了です!最後まで読んでくれてありがとうございました!Twitterもやってるのでよかったらフォローしてください!

タイトルとURLをコピーしました