はじめに
今まで、全然理解できていなくて逃げてたDockerに関して、しっかり理解していこうと思います。
コレまで、便利なんだろうなと思いながらも、逃げてました。
なので、開発環境では使いこなせるスキルにまでは理解したいと思います。
あと、暗記してたDockerコマンドを1つ1つ理解していきます。
以下のような順番で勉強していきます。
- Dockerの概要(1/9)
-
Dockerの基本操作(イメージの作成, コンテナの起動, 停止, 削除)(2/9)
今ここ - Dockerの基本操作(ログの出力, コンテナの中でプロセスを実行する方法, 使用していない Docker オブジェクトの削除)(3/9)
- Dockerfileを使用したサーバー構築(座学編)(4/9)
- Dockerfileを使用したサーバー構築(実践編)(5/9)
- Docker Composeの概要(座学編)(6/9)
- Docker Composeのよく使う基本操作(7/9)
- Docker Composeを使ってRailsの環境を構築する(8/9)
- Docker上に構築したRailsをHeroku(本番環境)にデプロイ(公開)する(9/9)
Dockerのイメージとコンテナの基本操作
アプリケーションを作成して、Dockerで実行する基本的な流れは大まかに以下になります
- アプリケーションコードの用意
- Dockerfileの用意
- 上記2つをDockerイメージの雛形として、Dockerイメージを作成
- Dockerイメージからコンテナを作成し、起動
この流れに沿って、やっていきます。
アプリケーションコードの用意
RubyでWebサーバを用意して、TOPページにアクセスしたらHello
と出力するやつを作ります。
worikng directory
practice_docker
├ Dockerfile
└ main.rb
Ruby で簡易的なwebサーバーを作成する
require 'webrick'
# サーバーの初期設定
server = WEBrick::HTTPServer.new(
DocumentRoot: './',
BindAddress: '0.0.0.0',
Port: 8000
)
# TopページアクセスしたらHelloを返す設定
server.mount_proc('/') do |req, res|
res.body = 'hello'
end
# サーバーの起動
server.start
簡易的な内容なのでツッコミ不要です。
Dockerファイルの用意
詳しくは説明しますが、Dockerファイルとはイメージの雛形になり、それを作ります。
Dockerファイルには主に以下の内容を書いていきます。
- ベースとなるイメージ
- ライブラリ
- アプリケーションコード
この内容を元に、イメージを作成します。
FROM ruby:2.7
RUN mkdir /var/www
COPY main.rb /var/www
CMD ["ruby", "/var/www/main.rb"]
-
FROM
は rubyのバージョンは2.7と指定 -
RUN
は コマンドの実行、実際にRUN
の右側に書いてあるのは読んで字の如くですね -
COPY
はmain.rb
を/var/www
に置くよ、という内容 -
CMD
は Dockerイメージを作成・起動した時の実行するコマンドの指定- 今回は、実態ファイル
main.rb
を実行せよという意味です
- 今回は、実態ファイル
イメージの作成
これで、アプリケーションコードと、Dockerファイルというイメージを作成するための下準備が整いました。
ここからは、イメージを作成していきましょう。
基本的なコマンドはdocker image build
です。
docker image build -t sample/webrick:latest .
オプションの -t
は今回、sample/webrick:latest
という名前をつけますという意味
名前はなんでもいい/今回はwebrick使うので安易な名前だけどwebrickとした/最新バージョンなのでlatest
sample/webrick:latest
参考
.
はカレントディレクトリのDockerファイルを参照するということをやってます
それでは、イメージを作成していきましょう。
(base) ~/P/practice_docker ❯❯❯ docker image build -t sample/webrick:latest .
[+] Building 67.6s (8/8) FINISHED
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 131B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/ruby:2.7 3.3s
=> [1/3] FROM docker.io/library/ruby:2.7@sha256:29cb031943ce6279ad88af96a29f2843fc37e33c705b6d511e23326e8cad1592 63.1s
=> => resolve docker.io/library/ruby:2.7@sha256:29cb031943ce6279ad88af96a29f2843fc37e33c705b6d511e23326e8cad1592 0.0s
=> => sha256:d2d425f2fea63cf7390882a28ba32f877d2e19dd38592e978cc7643ed388afb9 7.29kB / 7.29kB 0.0s
=> => sha256:2756ef5f69a5190f4308619e0f446d95f5515eef4a814dbad0bcebbbbc7b25a8 5.15MB / 5.15MB 3.2s
=> => sha256:29cb031943ce6279ad88af96a29f2843fc37e33c705b6d511e23326e8cad1592 1.86kB / 1.86kB 0.0s
=> => sha256:27602366229f69bdfad44d27db27a85d6da4ae3a2a43dbabe8b0dd9eb9f41267 2.00kB / 2.00kB 0.0s
=> => sha256:955615a668ce169f8a1443fc6b6e6215f43fe0babfb4790712a2d3171f34d366 54.93MB / 54.93MB 17.1s
=> => sha256:911ea9f2bd51e53a455297e0631e18a72a86d7e2c8e1807176e80f991bde5d64 10.87MB / 10.87MB 6.1s
=> => sha256:27b0a22ee906271a6ce9ddd1754fdd7d3b59078e0b57b6cc054c7ed7ac301587 54.57MB / 54.57MB 22.9s
=> => sha256:8584d51a9262f9a3a436dea09ba40fa50f85802018f9bd299eee1bf538481077 196.45MB / 196.45MB 33.6s
=> => sha256:4cc0225b12dba7873a1c73379908bbb2c66514129663f6e5f022ee4dff6ba799 198B / 198B 17.6s
=> => sha256:96ae2b648fae87777d3b8700a23b9bb506fbf0bf8bc7642857a31a3df9898194 14.51MB / 14.51MB 22.7s
=> => extracting sha256:955615a668ce169f8a1443fc6b6e6215f43fe0babfb4790712a2d3171f34d366 11.6s
=> => sha256:07a5886d0a5ff026d91e07f7670ba6398fe6a266b301a5ebf1a7a40f78bebf76 173B / 173B 23.9s
=> => extracting sha256:2756ef5f69a5190f4308619e0f446d95f5515eef4a814dbad0bcebbbbc7b25a8 2.1s
=> => extracting sha256:911ea9f2bd51e53a455297e0631e18a72a86d7e2c8e1807176e80f991bde5d64 0.6s
=> => extracting sha256:27b0a22ee906271a6ce9ddd1754fdd7d3b59078e0b57b6cc054c7ed7ac301587 6.3s
=> => extracting sha256:8584d51a9262f9a3a436dea09ba40fa50f85802018f9bd299eee1bf538481077 19.4s
=> => extracting sha256:4cc0225b12dba7873a1c73379908bbb2c66514129663f6e5f022ee4dff6ba799 0.0s
=> => extracting sha256:96ae2b648fae87777d3b8700a23b9bb506fbf0bf8bc7642857a31a3df9898194 1.5s
=> => extracting sha256:07a5886d0a5ff026d91e07f7670ba6398fe6a266b301a5ebf1a7a40f78bebf76 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 338B 0.0s
=> [2/3] RUN mkdir /var/www 0.7s
=> [3/3] COPY main.rb /var/www 0.1s
=> exporting to image 0.1s
=> => exporting layers 0.0s
=> => writing image sha256:a1136785b9176e2a25e7a3a206745ce19cdd5d6c97ae7f53884f7fa5181428e6 0.0s
=> => naming to docker.io/sample/webrick:latest
イメージが作れたことの確認コマンドは以下
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
sample/webrick latest a1136785b917 2 minutes ago 864MB
hello-world latest d1165f221234 6 months ago 13.3kB
今存在しているイメージのリストが出力されました。
ちゃんと名前つけたsample/webrick
がありましたね。
うまくイメージが作成できたっぽいですね。
イメージからコンテナを作成し、起動させる
イメージ作成できたので、今度はイメージからコンテナを作成をして、起動させます。
基本的なコマンドはdocker container run
です。
docker container run -p 8000:8000 --name webrick sample/webrick:latest
作成と起動をセットでやりました。
-p
はportの指定です。
-p 8000:8000
はローカルの8000番ポートを、dockerの8000番ポートに接続させています。
ポートはアプリケーションの宛先的なやつですね。
dockerは、1つの独立した環境なので、外部のローカルPCから何かする場合は、お互いのポート番号の指定が必要になります。
左側は、なんでもいいのですが、
右側のdockerのポートはmain.rb
でサーバの設定でport: 8000
を指定したので右側は8000を指定する必要があります。
--name xxx
コンテナに名前をつけています。コンテナに名前をつけると、後々、操作する時に楽なので名前をつけています。
最後はイメージ名の指定です。
なんのイメージからコンテナを作成するかの指定です。
今回のイメージはsample/webrick:latest
ですね。
docker container run -p 8000:8000 --name webrick sample/webrick:latest
[2021-09-23 14:18:48] INFO WEBrick 1.6.1
[2021-09-23 14:18:48] INFO ruby 2.7.4 (2021-07-07) [x86_64-linux]
[2021-09-23 14:18:48] INFO WEBrick::HTTPServer#start: pid=1 port=8000
おそらくコンテナが立ち上がった(サーバが立ち上がった)ぽい。
今回は、webサーバ作成したので port: 8000 にアクセスして確かめましょう。
requestのbodyにhello的な文言仕込んだのでそれが出力されればOKです。
http://localhost:8000/
で、ブラウザから hello
と出力されればOKです。
コンテナの停止
起動中のコンテナを確認します。
docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1536301bd55d sample/webrick:latest "ruby /var/www/main.…" 8 minutes ago Up 13 seconds 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp webrick
おそらく、sample/webrick:latest
のサーバが立ち上がってるというか、コンテナ(プロセス)が実行中だと思うので、それをctrl + c
で起動中のプロセスを停止できます。
もしくは、以下のコマンドで停止できます。
docker container stop webrick
今度は、docker container ls
しても具体的なコンテナは出てきませんね。
コンテナの削除
以下のコマンドでコンテナの削除ができます。
docker container rm webrick
消えましたね。
以上です。
アウトプット100本ノック実施中