- 投稿日:2021-01-28T23:50:12+09:00
Ruby3.0.0からwebrickが削除されてSinatraの環境構築で困惑した件
Onoda Kenta(@onoda_kenta)と申します。プログラミング初学者です。
Rubyの学習の一環として簡単なwebアプリを作成するためにまずはRailsではなくSinatraを利用することにしました。
そのための環境構築にDockerを使用したのですが、RubyのイメージをRuby:latestとしたためversionがRuby3.0.0になってしまい導入に際して少し戸惑ったので共有したいと思います。
結論から述べると
- Ruby3.0.0からwebrickが削除された
- 実行にはthin,puma,reel,HTTP,webrick等のアプリケーションサーバーが必要
- webrickを利用したい場合はRubyGemsからインストールする
- もしくはRuby2.x系を利用する
それでは実際に環境構築をしてみたいと思います。
環境
前提として今回利用した環境は以下の通りです。
- Windows 10 Pro 20H2 64bit
- WSL 2 Ubuntu 20.04 LTS
- Docker version 20.10.2
- Ruby 3.0.0
- Sinatra 2.1.0
- webrick 1.7.0
Docker + Ruby3.0.0でSinatraの環境構築
Sinatra: READMEに記載されている通りの手順をDockerを利用して環境構築をしていきたいと思います。
Ruby3.0.0のイメージからコンテナの立ち上げ
まずはRubyのコンテナを立ち上げます。
$ docker container run -it -d -p 4567:4567 --name sinatra_test ruby:latest-it -dのオプションはRubyのコンテナをバックグラウンドで実行したままにするためにつけています。
Sinatraでは通信にデフォルトでポート番号4567を使用するため-pでホストのポート番号4567にコンテナのポート番号4567を割り当てます。
それと今回は--nameでコンテナにsinatra_testという名前をつけました。
Unable to find image 'ruby:latest' locally ~中略~ d4f1f93f0c61eb98d1007f2012e3d4d5225e9d3996e809c609be1ab6e1586169実行中のコンテナを確認してみます。
$ docker container lsCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d4f1f93f0c61 ruby:latest "irb" 6 minutes ago Up 6 minutes 0.0.0.0:4567->4567/tcp sinatra_testちゃんとRubyのコンテナが立ち上がっています。
rbファイルの実行
次にSinatra用のrbファイルを実行するために準備をします。
$ mkdir sinatra_test $ cd sinatra_test ~/sinatra_test$ touch myapp.rbまずは適当に作業用のディレクトリを作成します。今回はsinatra_testとしました。作成したsinatra_testディレクトリに移動しmyapp.rbというファイルを作成します。
myapp.rbrequire 'sinatra' get '/' do 'Hello world!' endmyapp.rbは上記のように記述します。
myapp.rbをコンテナ内にコピーします。
~/sinatra_test$ docker container cp myapp.rb sinatra_test:/ここからはコンテナ内で作業をしていきます。
$ docker container exec -it sinatra_test bashroot@d4f1f93f0c61:/#コンテナ内に入れました。まずはコピーしたmyapp.rbが存在するか見てみます。
root@d4f1f93f0c61:/# lsbin boot dev etc home lib lib64 media mnt myapp.rb opt proc root run sbin srv sys tmp usr var次にrubyのversionを確認してみましょう。
root@d4f1f93f0c61:/# ruby -vruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux]Sinatraをインストールします。
root@d4f1f93f0c61:/# gem install sinatraFetching sinatra-2.1.0.gem ~中略~ Successfully installed sinatra-2.1.0 6 gems installedこれで本来ならmyapp.rbを実行すればWebアプリが立ち上がるはずです。-oでhostをlocalhostにセットします。実行してみましょう。
root@d4f1f93f0c61:/# ruby myapp.rb -o 0.0.0.0/usr/local/bundle/gems/sinatra-2.1.0/lib/sinatra/base.rb:1755:in `detect_rack_handler': Server handler (thin,puma,reel,HTTP,webrick) not found. (RuntimeError) from /usr/local/bundle/gems/sinatra-2.1.0/lib/sinatra/base.rb:1493:in `run!' from /usr/local/bundle/gems/sinatra-2.1.0/lib/sinatra/main.rb:45:in `block in <module:Sinatra>'エラーが出てしまい起動しません。Server handler (thin,puma,reel,HTTP,webrick) not found.と書いてあります。
Ruby 3.0.0 リリースに以下のような記述があります。
その他の注目すべき2.7からの変更点
- 以下のライブラリは標準添付ライブラリから削除されました。3.0以降で使いたい場合はrubygemsから利用してください。
- sdbm
- webrick
- net-telnet
- xmlrpc
Ruby3.0.0になりRuby2.7まで標準で添付されていたwebrickというアプリケーションサーバーのライブラリが削除されてしまったため、サーバーが起動しなかったようです。
webrickのインストール
webrickが削除されrubygemsから利用してくださいとのことなので、改めてwebrickをインストールしてみます。
root@d4f1f93f0c61:/# gem install webrickFetching webrick-1.7.0.gem Successfully installed webrick-1.7.0 1 gem installedwebrickがインストールされたのでもう一度myapp.rbを実行してみましょう。
root@d4f1f93f0c61:/# ruby myapp.rb -o 0.0.0.0[2021-01-28 14:04:00] INFO WEBrick 1.7.0 [2021-01-28 14:04:00] INFO ruby 3.0.0 (2020-12-25) [x86_64-linux] == Sinatra (v2.1.0) has taken the stage on 4567 for development with backup from WEBrick [2021-01-28 14:04:00] INFO WEBrick::HTTPServer#start: pid=36 port=4567無事に起動しました。この状態でhttp://localhost:4567/ にアクセスすればHello world!が表示されます。
Ruby2.7.2の場合
ちなみにRuby2.x系はwebrickが標準で添付されているため、Sinatraをインストールした後myapp.rbを実行すればサーバーが起動します。実際にやってみます。
$ docker container run -it -d -p 4567:4567 --name sinatra_test ruby:2.7.2 ~中略~ root@e66f1ebb8a85:/# ruby -v ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-linux] root@e66f1ebb8a85:/# gem install sinatra ~中略~ Successfully installed sinatra-2.1.0 6 gems installed root@e66f1ebb8a85:/# ruby myapp.rb -o 0.0.0.0 [2021-01-28 14:16:35] INFO WEBrick 1.6.0 [2021-01-28 14:16:35] INFO ruby 2.7.2 (2020-10-01) [x86_64-linux] == Sinatra (v2.1.0) has taken the stage on 4567 for development with backup from WEBrick [2021-01-28 14:16:35] INFO WEBrick::HTTPServer#start: pid=24 port=4567コンテナのイメージをruby:2.7.2とした以外は先程と同じ手順でやりました。Sinatraをインストールした後に$ gem install webrickをしなくてもmyapp.rbを実行すればちゃんとサーバーが起動しています。
まとめ
今回はDockerでSinatraの環境構築をする際、ruby:latestにしてしまったことが原因で途中でエラーが発生してしまいました。Sinatraの環境構築をする場合冒頭にも書きましたが以下の点を意識するといいと思います。
- Ruby3.0.0からwebrickが削除された
- 実行にはthin,puma,reel,HTTP,webrick等のアプリケーションサーバーが必要
- webrickを利用したい場合はRubyGemsからインストールする
- もしくはRuby2.x系を利用する
また今回の件に限らずネットの情報をもとに環境構築をする際はなるべくversionを揃えたほうがいいことがわかりました。
この記事が少しでも皆さんのお役に立てれば幸いです。
参考サイト
- 投稿日:2021-01-28T23:12:01+09:00
Docker + Symfonyで環境構築する
はじめに
仕事でSymfonyを扱うことになりそうなので、勉強用にDocker環境を構築しました。
SymfonyはPHPのメジャーフレームワークだけど、Laravelと比べると少し日本語の情報が少ないですね。
Laravelを使っているとSymfonyの日本語の情報の少なさに狼狽える自分ががg対象者
Symfonyが動く環境をdockerですぐに作りたい方
前提
- Docker
- Git
少し前のアプデでWindows10 HomeでもDocker for Windowsが使えるようになったんですね。
とりあえず、DockerとGitが使えればOKです。環境構築
docker symfony
とかでググると以下のリポジトリが出てきました。https://github.com/eko/docker-symfony
https://github.com/dunglas/symfony-docker
https://github.com/joeymasip/docker-symfony4一番最初のリポジトリがスター数が多かったのでそちらで進めます。
リポジトリをclone
$ cd 好きなディレクトリ $ git clone https://github.com/eko/docker-symfony.gitコンテナ作成
$ cd docker-symfony $ docker-compose up -dhostsの書き換え
リポジトリのREADMEに書いてある通り進めていきます。
ローカルのhostsファイルに以下を追記。127.0.0.1 symfony.localhosthostsの場所
Windowsの場合
C:\Windows\System32\drivers\etcmacの場合
/private/etc/hosts※違ってたらご指摘お願いします。
コンテナへ入る
$ docker exec -it php-fpm shsymfonyプロジェクトのインストール
# composer create-project symfony/website-skeleton . 4.2.xバージョンを変えたい方は末尾の数字を変えてください。
今回は4.2.xを指定しています。確認
終わりです!
これで環境構築は終わりです。
多分これが一番早いと思います。
kibanaとかxdebugはREADME読めばすぐにわかるハズ。さいごに
チュートリアルでサンプルを作成しましたが、Symfony4の参考書も購入してみました。
とても読みやすいので最初はおすすめです。https://www.amazon.co.jp/dp/B07NQ5WH6R/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1
- 投稿日:2021-01-28T21:13:41+09:00
WSL2 based Dockerを使用したGitlabの構築
docker-compose.yaml#docker-composeのバージョン #https://matsuand.github.io/docs.docker.jp.onthefly/compose/compose-file/ version: '3.8' services: gitlab: #インストール時点の最新版にすることを推奨 image: 'gitlab/gitlab-ce:13.8.0-ce.0' container_name: gitlab restart: always environment: GITLAB_OMNIBUS_CONFIG: | #公式ドキュメントを参照してください # https://docs.gitlab.com/omnibus/docker/README.html # https://docs.gitlab.com/omnibus/docker/README.html#install-gitlab-using-docker-compose # https://docs.gitlab.com/omnibus/docker/README.html#pre-configure-docker-container external_url 'http://localhost:10080' #gitlab_rails['gitlab_host'] = 'http://localhost:10022' gitlab_rails['gitlab_shell_ssh_port'] = 10022 nginx['listen_addresses'] = ['0.0.0.0', '[::]'] # 以降、カスタマイズ # https://github.com/gitlabhq/omnibus-gitlab/blob/master/files/gitlab-config-template/gitlab.rb.template # Maven(Gradle)パッケージレジストリの有効化 gitlab_rails['packages_enabled'] = true gitlab_rails['packages_storage_path'] = "/var/opt/gitlab/gitlab-rails/shared/packages" # grafana監視を使用 grafana['disable_login_form'] = false grafana['allow_user_sign_up'] = true grafana['admin_password'] = 'grafana' grafana['metrics_enabled'] = true grafana['metrics_basic_auth_username'] = 'grafana_metrics' grafana['metrics_basic_auth_password'] = 'grafana' ports: - '10080:10080' - '443:443' - '10022:22' volumes: - type: volume source: gitlab-config target: /etc/gitlab volume: nocopy: true - type: volume source: gitlab-log target: /var/log/gitlab volume: nocopy: true - type: volume source: gitlab-data target: /var/opt/gitlab volume: nocopy: true runner: build: context: . dockerfile: gitlab-runner.Dockerfile container_name: gitlab-runner environment: http_proxy: *** https_proxy: *** restart: always volumes: - gitlab-runner-volume:/etc/gitlab-runner - /var/run/docker.sock:/var/run/docker.sock volumes: gitlab-config: gitlab-log: gitlab-data: gitlab-runner-volume:gitlab-runner.Dockerfile#インストール時点の最新版にすることを推奨。うまく動作しない場合はubuntuにすること。 #https://hub.docker.com/r/gitlab/gitlab-runner/tags?page=1&ordering=last_updated FROM gitlab/gitlab-runner:ubuntu-v13.8.0 ENV http_proxy=*** ENV https_proxy=*** RUN ["/bin/bash", "-c", "apt update"] RUN ["/bin/bash", "-c", "apt -y install sshpass"] RUN ["/bin/bash", "-c", "apt -y install openjdk-8-jdk"]main.tfterraform { # 本体のバージョン指定 required_version = "~> 0.14" required_providers { gitlab = { source = "gitlabhq/gitlab" version = "3.4.0" } } } provider "gitlab" { # Configuration options token = *** base_url = "http://localhost:10080/api/v4/" } locals { #管理者一覧 admininfo = { #ここの下に全員分足してください。左は社員番号、右はメールアドレスの@から左 "user" = "prefix" } #一般ユーザ一覧 userinfo = { "user" = "prefix" } } resource "gitlab_user" "admin" { for_each = local.admininfo name = each.value username = each.key email = "${each.value}@foo.co.jp" is_admin = true projects_limit = 4 can_create_group = true is_external = false reset_password = true } resource "gitlab_user" "user" { for_each = local.userinfo name = each.value username = each.key email = "${each.value}@foo.co.jp" is_admin = false projects_limit = 2 can_create_group = true is_external = false reset_password = true } resource "gitlab_group" "cicd_test" { name = "cicd_test" path = "cicd_test" description = "An example group" visibility_level = "internal" } // Create a project in the example group resource "gitlab_project" "example" { name = "example" description = "example" namespace_id = gitlab_group.cicd_test.id visibility_level = gitlab_group.cicd_test.visibility_level } resource "gitlab_group_membership" "admin" { for_each = gitlab_user.admin group_id = gitlab_group.cicd_test.id user_id = each.value.id access_level = "maintainer" } resource "gitlab_group_membership" "user" { for_each = gitlab_user.user group_id = gitlab_group.cicd_test.id user_id = each.value.id access_level = "guest" } output "web_url" { value = gitlab_project.example.web_url } output "runners_token" { value = gitlab_project.example.runners_token }
- 投稿日:2021-01-28T21:08:23+09:00
「procs:新しいプロセス表示・検索ツール」の更新紹介(2021/1)
はじめに
procsというpsコマンドの代替ツールを作っているのですが、
久しぶりに大きなアップデートをしたので紹介します。ツールの基本的な紹介や過去の更新は以下をご覧ください。
あとYouTubeで紹介してくれている人がいるようです。
英語ですが、10分以上にわたって使い方や設定の書き方など解説してくれています。Procs: Nothing Is Safe From A Rust Rewrite Not Even Ps
特徴
procsはpsコマンドの代替となるプロセス一覧の表示ツールです。主な特徴は以下の通りです。
- 色・単位付きの表示
- キーワードによる絞り込み
- psで表示できないカラムに対応
- TCP/UDPポート
- ディスクのRead/Write速度
- Dockerコンテナ名
- ページャ対応
- topのような定期更新モード
- ツリービュー
更新内容
ターミナルの背景に応じたテーマ切り替え
procsは出力を色付けするのですが、デフォルトの色は黒背景のターミナルを前提としていました。
そのため白背景のターミナルでは一部の表示が見づらくなってしまっていました。
「コンフィグで色をカスタマイズできるので白背景の人はそれで変えてもらえばいい」という想定でしたが
やはりデフォルト状態で実行したときの見栄えが悪いのは良くないので、背景色を自動検出して
それに応じたテーマを適用するようにしました。以下はGNOME-terminalで白背景と黒背景にした例ですが、特に設定変更することなく自動で切り替わります。
ちなみに自動検出の方法は以前記事にしたので方法に興味のある方はご覧ください。
スレッド情報を表示する
これはかなり以前からの要望だったのですが、スレッドの情報も(特にツリーモードで)表示したいというものがあり、今回Linux限定ですが対応しました。
下のようにPIDが[]
で囲まれたものがスレッドです。
- 投稿日:2021-01-28T19:16:06+09:00
Ubuntu 18.04の上で手軽にIntel HLS(19.2.0.57)を使うためにDockerでCentOS7を動かす
タイトルのまま...なのですが,以前
Ubuntu16の上で手軽にIntel HLSを使うためにDockerでCentOS7を動かすで環境をつくってたのだけど,19.2.0.57をインストールしようとしたら若干手順の変更が必要だったのでメモ.
ちなみに,わざわざDockerで実行しなくてもi386系のlibX11などをインストールするとUbuntu 18.04の上でそのまま動かせる.なお,ホストであるUbuntu 16.04環境の /opt/intelFPGA_pro以下にQuartus一式がインストールしてある,という想定です.ちょっと変則的ですが、環境変数をこんな感じでセットするとすることを想定.
quartus_env.shexport LC_ALL=C export LANG=C export QSYS_ROOTDIR=/opt/intelFPGA_pro/quartus_19.2.0b57/quartus/sopc_builder/bin export PATH=/opt/intelFPGA_pro/quartus_19.2.0b57/quartus/bin:$PATH export PATH=/opt/intelFPGA_pro/quartus_19.2.0b57/qsys/bin:$PATH export PATH=/opt/intelFPGA_pro/19.2/modelsim_ase/bin:$PATH source /opt/intelFPGA_pro/hls/init_hls.shまた、vsimが実行できるように
sudo ln -s /opt/intelFPGA_pro/19.2/modelsim_ase/linux /opt/intelFPGA_pro/19.2/modelsim_ase/linux_rh60とかしとく。
準備
適当な作業ディレクトリを用意する
% mkdir -p $HOME/docker/hls % cd $HOME/docker/hlsこの作業ディレクトリに
quartus_env.sh
も置いておく.Dockerファイルの用意
↓の中身の Dockerfile という名前のファイルを$HOME/docker/hlsの下に用意する.sshでログインする前提は行儀が悪い??
FROM centos:centos7 ADD quartus_env.sh / RUN mkdir -p /opt RUN yum -y update RUN yum -y groupinstall "Development Tools" RUN yum -y install epel-release RUN yum -y install which RUN yum -y install zlib-devel RUN yum -y install glibc.i686 glibc-devel.i686 libX11.i686 libXext.i686 libXft.i686 ncurses-devel.i686 RUN yum -y install passwd openssh-server initscripts RUN sed -ri 's/^#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config RUN echo 'root:password' | chpasswd RUN ssh-keygen -t rsa -N "" -f /etc/ssh/ssh_host_rsa_key EXPOSE 22 CMD ["/usr/sbin/sshd", "-D"]以前との違いは、compat-gcc44とかインストールしないこと.インストールするとあとでIntel HLS向けのgccのセットアップでコケる.
% pwd /home/miyo/docker/hls % ls Dockerfile quartus_env.shと2つのファイルが
$HOME/docker/hls
に作成されたことになる (上の例では,$HOME=/home/miyo/
).コンテナの作成と起動
ファイルが用意できたら,コンテナ作って起動.
% docker build -t user/hls:1.1 . % docker run -v /opt:/opt -v /import:/import --name intel-hls -p 30022:22 user/hls:1.1ホストの
/opt
と/home
をそれぞれDockerゲスト内でも/optにマウントして使えるようにしている.二回目以降は,
% sudo docker start -a hls-testとか。
HLSを使う
% source /quartus_env.sh初回は
install_gcc
を実行しろと言われるので実行する./opt/intelFPGA_pro/hls/install_gcc終わったら動作確認.
% cd /root % cp -r /opt/intelFPGA_pro/hls/examples . % cd examples/counter/ % make % ./test-x86-64 % make test-gpp % ./test-gpp % make test-fpga % ./test-fpga
- 投稿日:2021-01-28T15:59:18+09:00
とりあえずcudaが使いたい人のためのQiita
Dockerを使いましょう
Docker知らないからってこのページを閉じようとしたあなた。多分想像以上に環境構築簡単なのでご安心を。Dockerさえ入ってしまえばLinuxのOSやversionが関係ないのがDockerの強みです。
背景
私事ながら、Geforce RTX3090を手に入れたのですが、今までのcudaの導入方法だと一向に認識されず、1週間溶かしまして絶望していたのですが、Dockerを使えば一瞬でしたので同じように悩んでる人に向けてそれを共有したいと思いました。
環境
- Ubuntu 18.04(GPUが接続されているLinuxならDockerさえ入ればなんでもいい)
やり方
1. Dockerのインストール
たくさんの記事があるので割愛。
https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-20-04-ja
などを参照。2. 使いたいDocker imageを探す
Docker hubで使いたいDockerイメージを探します。色々ありますがとりあえずcudaが使いたい人はnvidia/cudaの最新のものにしましょう。
base
,runtime
,devel
とありますが、特にこだわりがなければdevel
を選択するのが良いでしょう。(devel
にしかないコマンドがある)base: 事前ビルドされたCUDAアプリケーションを展開するための最小構成のイメージ。CUDA Toolkit 9.0以降のみ。
runtime: CUDA toolkitから全ての共有ライブラリを追加したCUDA実行用のイメージ。
devel: 共有ライブラリだけでなくコンパイラーチェーン、デバッグ用ツール、スタティックライブラリなどが追加されたCUDA開発用のイメージ。
https://www.atmarkit.co.jp/ait/articles/1804/18/news141_3.html以下で用いるDockerイメージは
nvidia/cuda:11.2.0-runtime-ubuntu20.04
とします。
(ちなみにコロンの前のnvidia/cuda
をREPOSITORY
, コロンの後の11.2.0-runtime-ubuntu20.04
をTAG
といいます)3. Docker pull
個人的には
Git
でいうgit clone
という理解をしています。使いたいDockerイメージをローカルに作成します。今回はnvidia/cuda:11.2.0-runtime-ubuntu20.04
を用いるので、docker pull nvidia/cuda::11.2.0-runtime-ubuntu20.04となります。
docker pull
は時間がかかるので気長に待ちましょう。4. コンテナを生成、起動
dockerイメージのコピーであるコンテナを生成し、その中に入っちゃいます。
docker run -it nvidia/cuda::11.2.0-runtime-ubuntu20.04
すると、謎の場所に連れて行かれると思います
[root@4ae03cb199f4 /]#
これで起動成功です。ここはcudaの入ったubuntu20.04の世界になっています。
あとはこの中でいつも通り環境を構築していきましょう。(僕は
anaconda
を入れました)もし何か失敗してしまってもコンテナを消してまた1から作ればOKです。ホストOSが汚染されることはありません。Dockerの使い方について
ちなみに上の方法をそのままやったところでろホストOSのディレクトリは覗けませんし、ipアドレスが繋がってないのでサーバーを立てることもできません。ここからどうカスタマイズしていくかは使う人にかかってきます。ぜひ色々と調べてみてください。(私も絶賛Docker勉強中であります)
例えばanaconda
を使うなら、-v
で接続するディレクトリを決めて-p
でポート番号を指定したりするとコンテナ内の環境でホストのファイルの操作ができるようになります。参考
https://www.amazon.co.jp/Docker実践ガイド-第2版-impress-top-gear/dp/4295005525
- 投稿日:2021-01-28T13:30:53+09:00
[小ネタ]Dockerのnginxコンテナ内で設定更新する
背景
docker-compose でローカル開発している中で、nginxの設定(nginx.conf)を変更した後にコンテナ内部で
コンテナ内部service nginx restartしたらコンテナが終了してしまった。
結論
コンテナ内部service nginx reloadで対応すると終了しない。restart だとnginxのプロセスが終わるので処理が終わったとみなされるという事かな。
もちろんDockerコンテナ再起動するのが王道。ホスト# 最後のnginxはコンテナ名でなく、サービス名 docker-compsose restart nginx
でも細かくいろいろやりたい時とかにコンテナ再起動までしたくないケースで使えるかと。
再現テスト
docker-compose.ymlversion: '3.7' services: nginx: image: nginx restart: always ports: - 8880:80 container_name: nginx-test起動sudo docker-compose up
コンテナログインsudo docker exec -it nginx-test bashコンテナ内部service nginx restart上記docker-compose.ymlではrestartつけてるのですぐ起動しますが、一旦は終了してコンテナからはログアウトされます。再度コンテナログインが必要です。
コンテナ内部service nginx reload今度はコンテナ終了しません。
- 投稿日:2021-01-28T13:05:37+09:00
Laradocを使用した環境構築を例にdockerの使い方を整理する
本記事の目的
本記事の目的は、dockerを学習したが、期間が開いてもすぐに使用できるよう記憶を定着させるためである。(dockerを使用した環境構築において、普段常にdockerを使用するわけではなく、期間が開くと忘れてしまっていた。)
Docker関連を読み直すだけでは頭に入らない。今回は、Laravelの開発においてLaradocを使用するが、その一般的な手順から、dockerの意味合いを整理し理解することにより記憶の定着を図りたい。
以下のようにまとめた(つもり)
◇1.laradocを使用したlaravelを動かすまでの手順
◇2.1の手順にて使用されているdockerコマンドの整理
◇3.docker-composerの整理
◇4.まとめ
◇5.その他1.laradocを使用したlaravelを動かすまでの手順
とりあえずlaradoc初期画面まで出す手順をざっくり4ステップで記載
1.laradocをダウンロードする$ git clone https://github.com/shonansurvivors/laradock-like.git laradock完了するとlaradocのディレクトリ ができる。
laradocを使用すれば、laravelの開発環境を簡単に構築できる。2.laradocディレクトリ の.env修正
環境変数を決めている。3.laradocディレクトリ にて下記実行(例)
docker-compose up -d workspace php-fpm nginx postgres複数のコンテナ(workspace、php-fpm、nginx、postgres)を同時に立ち上げ、コンテナをバックグランドで立ち上げている。(今回はpostgresは必要ないが記載)
4.laravelのインストール(例)
docker-compose exec workspace composer create-project --prefer-dist laravel/laravel . "5.5.*"laradocディレクトリ の直下で実行する。コンテナworkspaceに入り、composerよりlaravelをダウンロードしている。
ブラウザでlocalhostにアクセスすると、画面が表示される。
参考にしたQiita資料
Laradockを使ってLaravelを動かすまで
Laradockでの環境構築方法2パターンを細かめに説明2. 「1」の手順にて使用されているdockerコマンドの整理
使用しているコマンドは、docker-compose upと、docker-compose execである。
以下のステップで整理する。
1.docker-compose upとdocker-compose execの確認
2.execで行っていることの整理
3.docker-composeの意味合い2.1 docker-compose upとdocker-compose execの確認
リファレンス https://docs.docker.jp/compose/overview.html を参照すれば良いと思うが、項目を分けて記載する。
2.1.1 docker-compose upについて
docker-composer up
コンテナをまとめて立ち上げる。-dでバックグラングで立ち上がる。
今回は必要なコンテナ(workspace、php-fpm、nginx、postgres)を選択して実行している。2.1.2 docker-compose exec
起動中のコンテナに入ることで、今回は起動したコンテナworkspaceに入り、composerのコマンドを実行している。
docker-composeのコマンドリファレンスを見たら、execコマンドの記載がない。
Docker ドキュメントを見れば一応記載はあった。
またhelpコマンドで確認すると、下記が表示された。$ docker-compose --help Define and run multi-container applications with Docker. Usage: docker-compose [-f <arg>...] [options] [--] [COMMAND] [ARGS...] docker-compose -h|--help Options: -f, --file FILE Specify an alternate compose file (default: docker-compose.yml) -p, --project-name NAME Specify an alternate project name (default: directory name) -c, --context NAME Specify a context name --verbose Show more output --log-level LEVEL Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL) --no-ansi Do not print ANSI control characters -v, --version Print version and exit -H, --host HOST Daemon socket to connect to --tls Use TLS; implied by --tlsverify --tlscacert CA_PATH Trust certs signed only by this CA --tlscert CLIENT_CERT_PATH Path to TLS certificate file --tlskey TLS_KEY_PATH Path to TLS key file --tlsverify Use TLS and verify the remote --skip-hostname-check Don't check the daemon's hostname against the name specified in the client certificate --project-directory PATH Specify an alternate working directory (default: the path of the Compose file) --compatibility If set, Compose will attempt to convert keys in v3 files to their non-Swarm equivalent (DEPRECATED) --env-file PATH Specify an alternate environment file Commands: build Build or rebuild services config Validate and view the Compose file create Create services down Stop and remove containers, networks, images, and volumes events Receive real time events from containers exec Execute a command in a running container help Get help on a command images List images kill Kill containers logs View output from containers pause Pause services port Print the public port for a port binding ps List containers pull Pull service images push Push service images restart Restart services rm Remove stopped containers run Run a one-off command scale Set number of containers for a service start Start services stop Stop services top Display the running processes unpause Unpause services up Create and start containers version Show version information and quitexec Execute a command in a running container
より、起動中のコンテナに入ること。2.2 execで行っていることの整理
docker-compose exec workspace composer create-project --prefer-dist laravel/laravel . "5.5.*"「2.1.2」でとりあえずコンテナに入って処理しているのはわかるが、久しぶりに上記コマンドを確認すると、workspaceコンテナで、laravelがでてきていまいちわからなかったので、もう少し確認する。
以下の流れで確認する。
1.composerの確認
2.workspaceでのcomposerの適用の確認2.2.1 composerの確認
composerを使用している理由として、LaravelはComposerを依存パッケージの管理に使用しているからである。
laravelサイトより、laravelを使用するにあたり、以下の手順になる。
1.開発機にComposerを確実にインストール
2.Composerのcreate-projectコマンドを実行し、laravelをインストール2.2.2 workspaceでのcomposerの適用の確認
$ docker-compose exec workspace composer create-project --prefer-dist laravel/laravel . "6.8.*"workspaceのコンテナに入り、composerを実行しているが、workspaceのコンテナにcomposerをインするトールする必要があり、暗黙にそういう処理をしていることが想像できる。
コンテナ開発時に、Dockerfileを使用して、composerのインストールをしているのは予想され、その箇所を確認してみる。
./workspaceのDockerfileFROM laradock/workspace:2.6.1-${LARADOCK_PHP_VERSION} ~省略 ########################################################################### # Composer: ########################################################################### USER root # Add the composer.json COPY ./composer.json /home/laradock/.composer/composer.json # Add the auth.json for magento 2 credentials COPY ./auth.json /home/laradock/.composer/auth.json # Make sure that ~/.composer belongs to laradock RUN chown -R laradock:laradock /home/laradock/.composer # Export composer vendor path RUN echo "" >> ~/.bashrc && \ echo 'export PATH="$HOME/.composer/vendor/bin:$PATH"' >> ~/.bashrc USER laradock # Check if global install need to be ran ARG COMPOSER_GLOBAL_INSTALL=false ENV COMPOSER_GLOBAL_INSTALL ${COMPOSER_GLOBAL_INSTALL} RUN if [ ${COMPOSER_GLOBAL_INSTALL} = true ]; then \ # run the install composer global install \ ;fi # Check if auth file is disabled ARG COMPOSER_AUTH=false ENV COMPOSER_AUTH ${COMPOSER_AUTH} RUN if [ ${COMPOSER_AUTH} = false ]; then \ # remove the file rm /home/laradock/.composer/auth.json \ ;fi ARG COMPOSER_REPO_PACKAGIST ENV COMPOSER_REPO_PACKAGIST ${COMPOSER_REPO_PACKAGIST} RUN if [ ${COMPOSER_REPO_PACKAGIST} ]; then \ composer config -g repo.packagist composer ${COMPOSER_REPO_PACKAGIST} \ ;fi # Export composer vendor path RUN echo "" >> ~/.bashrc && \ echo 'export PATH="~/.composer/vendor/bin:$PATH"' >> ~/.bashrc ########################################################################### # Non-root user : PHPUnit path ########################################################################### # add ./vendor/bin to non-root user's bashrc (needed for phpunit) USER laradock RUN echo "" >> ~/.bashrc && \ echo 'export PATH="/var/www/vendor/bin:$PATH"' >> ~/.bashrc 省略~行っていることはcomposerをインストールし、workspaceで使えるようにしていることだと思われる。
composerコマンドで具体的にできることは下記を参照したりした。
Composerのcreate-projectが何をやっているのか調べてみた
【Laravel入門】プロジェクト作成から起動まで3.docker-composerの整理
1、2を通し、laradocを使用してlaravelを動く環境を作るのに、手順の意味を理解できたが、docker-composeと、それに付随して利用されるDockerfileについて得た理解を忘れぬようまとめておく。
docker-composeを使用する時は、基本的に下記3つのステップを踏む
1.コンテナを使用したアプリケーション環境を、Dockerfileに定義する。
2.アプリケーションを構成するサービスをdocker-compose.yml内に定義する。
こうすることで各サービスは独立した環境において起動することになる。
3.最後にdocker-compose upを実行したら、Composeはアプリケーション全体を起動・実行する。
(リファレンス https://docs.docker.jp/compose/overview.html をほぼ抜粋。)つまり、docker-composeは、複数のコンテナを定義し実行するDocker アプリケーションのためのツール。docker-compose.ymlのファイルがある直下のディレクトリで実行する。
手順1-3の場合、使用したコンテナだけとりあげると、以下のような構成になっている。. ├── docker-compose.yml ├── nginx ├── php-fpm ├── postgres └── workspacedocker-compose.ymlversion: '3' services: workspace: build: context: ./workspace 省略 postgres: build: ./postgres 省略 php-fpm: build: context: ./php-fpm 省略 nginx: build: context: ./nginx 省略docker-composer.ymlファイルのserveicesのworkspace、postgres、php-fpm、nginxがコンテナである。
docker-compose up によって、上記4つのコンテナが立ち上がる。
それぞれのコンテナは、build:のcontext:に記載ある箇所のDockerfileによってイメージが作成される。まとめ(感想)
今回はdocker-composeとDockerfileの使用方法をざっと整理した。
dockerコマンドを手広く応用できるよう整理したかったが、本件のテーマで整理すると、docker-composeとDockerfileの理解を軸に進めた。
深堀するとdocker以外のことで不明点がボロボロ出て、逆にその確認で時間を要した。その他
docker諸々を思い出すために、基礎となりそうな所でメモっていたことを備忘記録として残ししておく。
本記載においては、主に以下文献を使用させて頂いた。
大澤 文孝,浅居 尚. さわって学ぶクラウドインフラ docker基礎からのコンテナ構築 (Japanese Edition)DockerEngine
DockerはLinux上で動作するソフト。Linuxに「DockerEngine」をインストールすると、Dockerのコンテナを実行できるようになる。
DockerはLinux環境で動かす以外に、Windows環境やMac環境において「DockerDesktop」というソフトを動かす方法がある。
DockerEngineをインストールしたコンピューター(=Dockerコンテナを動かすコンピューター)のことを「Dockerホスト」と呼ぶ。Dockerイメージ
Dockerでは、コンテナ作りを支援するために、基本的なソフトやアプリケーションをインストールした「コンテナの元」が提供される。このようなコンテナの元のことを「Dockerイメージ」と言う。
Dockerイメージは、Docker社が運営しているDockerHubで公開されている。DockerHubのように、Dockerイメージを管理しているサーバーを「Dockerレジストリ」と言う。
イメージはDocker-Hubから取得するが、修正を加えたい場合の手段として、Dockerfileを作成しイメージを作ることができる。Dockerコンテナ
イメージよりコンテナ作る。
docker run コマンドは、「docker pull」、「docker create」、「docker start」という3つの一連のコマンドをまとめて実行する利便性を重視したコマンド。Dockerfileについて
https://knowledge.sakura.ad.jp/15253/
Dockerfileの使用の仕方は、コンテナを実行する時のカレントディレクトリに置くと、自動でDockerfileの記載に基づき実行される。
Dockerfileを使用しなければ、イメージを作成後に、コンテナで処理する作業を手作業で行う必要がある。
カスタムのDockerイメージを作るときは、手作業でファイルコピーやコマンド実行をするのではなく、Dockerfileと呼ばれる設定ファイルにファイルコピーや実行したいコマンドなど一連の設定を記述し、そのファイルを適用して作るのが一般的である。コマンド
Dockerイメージ、Dockerコンテナはまめに確認し削除しておく。
イメージのダウンロード、コンテナ作成は簡単にでき、学習にて使用しているとどんどんたまっていき、使用マシンのレスポンスへの影響が無視できなくなる。
その関連のコマンドを記載。・実行中のコンテナを参照する docker ps docker container ls 全コンテナの状態を確認する docker ps -a コンテナの停止、スタート、破棄 docker stop my-apache-app docker start my-apache-app docker rm my-apache-app どのようなイメージをダウンロードしたか docker image ls Dockerイメージを削除 docker image rm httpd:2.4 docker rmi httpd:2.4envとは何か
本件ではあまり触れなかったが、気になったのでメモっておく。
「.envファイル」だが、ladarac直下にある。
envというと、envコマンド、.envファイルがあるらしいが、
「.envファイル」は環境変数を記載し、他で使用するためのものであるenv(エンブ)は Unix系オペレーティングシステム (OS) で使われるユーティリティである。環境変数のリストを出力したり、現在の環境を変えることなく異なる環境変数の下で他のコマンドを実行するのに使われる。envを使うことで、変数の追加や削除、変数の値の変更を行える。
( https://ja.wikipedia.org/wiki/Env を参照).envファイルの説明で下記等を参考
https://qiita.com/harutakaoka522/items/e0abddfd0311eb4fb32b
- 投稿日:2021-01-28T10:30:45+09:00
【docker初心者】phpMyadmin on dockerを使ってみた
docker環境でLaravelアプリを作成しています。
元々学習していた教材でphpMyadmin on dockerを使っていたので
自分でもできるかなと思い挑戦してみました。こちらの記事を拝見させていただきました!
感謝です!公式からimageをとってくる
公式サイトに行きます。
上の画像のように公式のGithubに行きます。
画像のように
docker-compose.yml
のファイルを開きます。上の画像のように囲んだところのコードをコピーします。
そして自分の
docker-compose.yml
に貼ります。docker-compose.ymlphpmyadmin: image: phpmyadmin container_name: phpmyadmin environment: - PMA_ARBITRARY=1 restart: always ports: - 8080:80 volumes:これでコンテナを起動します。
ターミナルdocker-compose up -dそして
http://localhost:8080
にアクセスします。が、ここで
データベース名
、ユーザー名
、パスワード
を入れる画面が出てきたのですが何のこっちゃって感じです。
知識なさすぎて悲しくなる。先ほどの参考にしたサイトでは
docker-compose.ymlphpmyadmin: image: phpmyadmin/phpmyadmin environment: - PMA_ARBITRARY=1 - PMA_HOST=mysql - PMA_USER=root - PMA_PASSWORD=password links: - mysql ports: - 8080:80 volumes: - /sessionsとなっていたので
PMA_HOST
以下を編集してみましたがうまくいかず。メンターさんに質問し解決
私の場合は
docker-compose.ymldb: build: ./infra/mysql volumes: - db-store:/var/lib/mysqlとなっていたので
データベース名はdb
ユーザー名
とパスワード
はmysql/DockerfileMYSQL_USER= <ここ> MYSQL_PASSWORD= <ここ>ここに記載されていたものを入れて無事に使えるようになりました!
docker-compose.yml
は以下のようにdocker-compose.ymlphpmyadmin: image: phpmyadmin container_name: phpmyadmin environment: - PMA_ARBITRARY=1 restart: always ports: - 8080:80 volumes:元に戻してます。
メンターさん感謝です!
- 投稿日:2021-01-28T07:28:47+09:00
[Docker]searchコマンドでOfficialのイメージのみを抜き出すワンライナー
- Dockerhubからイメージを持ってくる際に、
docker search
コマンドで検索することは多い。- その際に、Official欄を見て公式かどうかを確認する状況も多い。
- 今回は、検索結果からOfficialのイメージを抜き出すシェルを記録する。
環境
- Mac OS X 10.15.6
- Docker version 19.03.12
結果
- 結果の記述は以下の通り。
# ubuntu docker search ubuntu | awk -F ' +' '{gsub(/[0-9]+/,"[NO]",$(NF-1)); print $1,$(NF-1)}' | grep -v "\[NO\]" NAME OFFICIAL ubuntu [OK] websphere-liberty [OK] ubuntu-upstart [OK] neurodebian [OK] ubuntu-debootstrap [OK] open-liberty [OK] # alpine docker search alpine | awk -F ' +' '{gsub(/[0-9]+/,"[NO]",$(NF-1)); print $1,$(NF-1)}' | grep -v "\[NO\]" NAME OFFICIAL alpine [OK] # node docker search node | awk -F ' +' '{gsub(/[0-9]+/,"[NO]",$(NF-1)); print $1,$(NF-1)}' | grep -v "\[NO\]" NAME OFFICIAL node [OK] mongo-express [OK] iojs [OK]補足
awkでの正規表現による区切り指定
docker search
コマンドは、多用な空白で見やすくなっている。- そのため、awkで連続空白を区切り文字として正規表現で指定する必要がある。
空白の扱い
docker search
コマンドは、該当しない場合は空白になっている。- そのため、該当フィールドが1つ前のフィールドとなっている場合、"NO"と置換している。
- ※officalイメージの抜き出しのため、starを出さない想定。
公式コマンド
- 以下のような公式であるサブコマンドのfilterを利用することも可能。
- ※必要な項目のみの抽出とawkの習得のため、今回は利用していない。
# ubuntu検索 docker search ubuntu --filter "is-official=true"参考
- 投稿日:2021-01-28T05:27:38+09:00
書籍「Dockerによるアプリケーション開発環境構築ガイド」part3 Baseimage-dockerを使った1コンテナでの複数サービス管理
はじめに
以下の書籍の演習をやったので、そのまとめ。
Docker初心者でも実際に手を動かしながら、Dockerの概念や基本を学ぶことが出来るので良本だと思います。演習のホストOSはCentOS7で試しています。書名:Dockerによるアプリケーション開発環境構築ガイド
著者:櫻井 洋一郎, 村崎 大輔 (著)関連
[part1] docker基本コマンド
[part2] Dockerfile記述方法Baseimage-dockerとは
一つのコンテナに複数のサービスを動かすことに適したベースイメージ(初心者に使いやすいらしい)
特徴
- Ubuntuベース
- initプロセスを使っている
- syslog, cronがインストール済み
- スーパーバイザRunit(コンテナ内で複数の子プロセスを管理するもの)がインストール済み
- SSHサーバ関連の設定済み
Baseimage-dockerを使ってみる
イメージのpull
[root@testvm WordPress]# docker pull phusion/baseimage:latest Trying to pull repository docker.io/phusion/baseimage ... latest: Pulling from docker.io/phusion/baseimage 281a73dee007: Pull complete 2aea1b77cff7: Pull complete 59a714b7d8bf: Pull complete 0218064da0a9: Pull complete ebac621dcea3: Pull complete a3ed95caeb02: Pull complete b580731643cc: Pull complete faa5fbdba239: Pull complete Digest: sha256:29479c37fcb28089eddd6619deed43bcdbcccf2185369e0199cc51a5ec78991b Status: Downloaded newer image for docker.io/phusion/baseimage:latest [root@testvm WordPress]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/phusion/baseimage latest 166cfc3f6974 22 months ago 209 MBコンテナの起動
-itオプションにより、出力結果ではinitとサービスが立ち上がった後に入力待ちになる。
[root@testvm SampleData_20180518]# docker run --rm -it docker.io/phusion/baseimage *** Running /etc/my_init.d/00_regen_ssh_host_keys.sh... *** Running /etc/my_init.d/10_syslog-ng.init... Nov 25 08:19:18 5e4b21077ccf syslog-ng[10]: syslog-ng starting up; version='3.5.6' Nov 25 08:19:18 5e4b21077ccf syslog-ng[10]: WARNING: you are using the pipe driver, underlying file is not a FIFO, it should be used by file(); filename='/dev/stdout' Nov 25 08:19:19 5e4b21077ccf syslog-ng[10]: EOF on control channel, closing connection; *** Running /etc/rc.local... *** Booting runit daemon... *** Runit started as PID 16 Nov 25 08:19:19 5e4b21077ccf cron[19]: (CRON) INFO (pidfile fd = 3) Nov 25 08:19:19 5e4b21077ccf cron[19]: (CRON) INFO (Running @reboot jobs)bashコマンドを指定して立ち上げた場合は、Baseimage-dockerのinitを経由しないため、以下の通りbashのプロンプトが表示される。
Baseimage-dockerでは実行コマンドを指定しない場合、独自のinitプログラムである/sbin/my_init
を実行するようになっている。[root@testvm SampleData_20180518]# docker run --rm -it docker.io/phusion/baseimage bash -l root@58ea53aff93b:/#以下の場合は
my_init
を経由してからbashのプロセスを立ち上げることができる
この場合、指定したコマンド(bash)の終了時にmy_initもシャットダウン処理を実行してから終了するようになっている。[root@testvm SampleData_20180518]# docker run --rm -it docker.io/phusion/baseimage /sbin/my_init -- /bin/bash -l *** Running /etc/my_init.d/00_regen_ssh_host_keys.sh... *** Running /etc/my_init.d/10_syslog-ng.init... Nov 25 08:24:43 321da8daacc0 syslog-ng[10]: syslog-ng starting up; version='3.5.6' Nov 25 08:24:43 321da8daacc0 syslog-ng[10]: WARNING: you are using the pipe driver, underlying file is not a FIFO, it should be used by file(); filename='/dev/stdout' *** Running /etc/rc.local... Nov 25 08:24:44 321da8daacc0 syslog-ng[10]: EOF on control channel, closing connection; *** Booting runit daemon... *** Runit started as PID 16 *** Running /bin/bash -l... Nov 25 08:24:44 321da8daacc0 cron[21]: (CRON) INFO (pidfile fd = 3) Nov 25 08:24:44 321da8daacc0 cron[21]: (CRON) INFO (Running @reboot jobs) root@321da8daacc0:/#コンテナ内部のプロセスの確認
root@321da8daacc0:/# ps axwf PID TTY STAT TIME COMMAND 1 ? Ss 0:00 /usr/bin/python3 -u /sbin/my_init -- /bin/bash -l 10 ? S 0:00 /usr/sbin/syslog-ng --pidfile /var/run/syslog-ng.pid -F --no-caps 16 ? S 0:00 /usr/bin/runsvdir -P /etc/service 18 ? Ss 0:00 \_ runsv cron 21 ? S 0:00 | \_ /usr/sbin/cron -f 19 ? Ss 0:00 \_ runsv sshd 17 ? S 0:00 /bin/bash -l 34 ? R+ 0:00 \_ ps axwfPID16の
/sur/bin/runsvdir
がスーパバイザの大元のプロセス。
ここからrunsv
を経由してcronやsshdを立ち上げている。root@321da8daacc0:/# sv status cron sshd run: cron: (pid 21) 443s down: sshd: 443s root@321da8daacc0:/# ls /etc/service/cron/ run supervise root@321da8daacc0:/# ls /etc/service/sshd/ down run supervisecronはPID21で実行中、sshdは停止していることがわかる。
サービスの自動起動の設定は/etc/service/サービス名
の下にdown
が有るか無いかで制御されている。
sv down
,sv up
でサービスの開始、終了ができる。root@321da8daacc0:/# sv down cron root@321da8daacc0:/# ps axwf PID TTY STAT TIME COMMAND 1 ? Ss 0:00 /usr/bin/python3 -u /sbin/my_init -- /bin/bash -l 10 ? S 0:00 /usr/sbin/syslog-ng --pidfile /var/run/syslog-ng.pid -F --no-caps 16 ? S 0:00 /usr/bin/runsvdir -P /etc/service 18 ? Ss 0:00 \_ runsv cron 19 ? Ss 0:00 \_ runsv sshd 17 ? S 0:00 /bin/bash -l 41 ? R+ 0:00 \_ ps axwf root@321da8daacc0:/# sv up cron root@321da8daacc0:/# Nov 25 08:36:13 321da8daacc0 cron[48]: (CRON) INFO (pidfile fd = 3) Nov 25 08:36:13 321da8daacc0 syslog-ng[10]: WARNING: you are using the pipe driver, underlying file is not a FIFO, it should be used by file(); filename='/dev/stdout' Nov 25 08:36:13 321da8daacc0 cron[48]: (CRON) INFO (Skipping @reboot jobs -- not system startup) root@321da8daacc0:/# ps axwf PID TTY STAT TIME COMMAND 1 ? Ss 0:00 /usr/bin/python3 -u /sbin/my_init -- /bin/bash -l 10 ? S 0:00 /usr/sbin/syslog-ng --pidfile /var/run/syslog-ng.pid -F --no-caps 16 ? S 0:00 /usr/bin/runsvdir -P /etc/service 18 ? Ss 0:00 \_ runsv cron 48 ? S 0:00 | \_ /usr/sbin/cron -f 19 ? Ss 0:00 \_ runsv sshd 17 ? S 0:00 /bin/bash -l 49 ? R+ 0:00 \_ ps axwfDockerイメージを構築する
[root@testvm 03-my-wordpress]# cat Dockerfile FROM phusion/baseimage:0.10.0 [root@testvm 03-my-wordpress]# docker build -t my-wordpress . Sending build context to Docker daemon 2.048 kB Step 1/1 : FROM phusion/baseimage:0.10.0 Trying to pull repository docker.io/phusion/baseimage ... 0.10.0: Pulling from docker.io/phusion/baseimage 281a73dee007: Already exists 2aea1b77cff7: Already exists 59a714b7d8bf: Already exists 0218064da0a9: Already exists ebac621dcea3: Already exists a3ed95caeb02: Already exists b580731643cc: Already exists faa5fbdba239: Already exists Digest: sha256:d72f41957bf41161c2b7ec00ed665573d17e8dfaaef55492063901a7e844532a Status: Downloaded newer image for docker.io/phusion/baseimage:0.10.0 ---> 166cfc3f6974 Successfully built 166cfc3f6974[root@testvm 03-my-wordpress]# pwd /root/SampleData_20180518/Chapter03/03-my-wordpress [root@testvm 03-my-wordpress]# docker run --rm -it -v "$(pwd):/build" -w /build my-wordpress bash -l root@87cebe41806d:/build#
-v "$(pwd):/build"
:カレントディレクトリとコンテナ内の/buildを同期(アクセス可能に)する
-w /build
:コンテナ内の作業用ディレクトリを/build
に指定する
コンテナ内では/sbin/my_init bash -l
が実行される。下記のApache, Mysql, PHP 7をインストールしLAMP環境を構築するスクリプトを、ホストのカレントディレクトリ/scripts配下に作成して、コンテナ内の/build/scripts配下のスクリプトとして認識させる。
[root@testvm SampleFile]# cat 3-3-2-1/01-provisioning-install-packages.sh #!/bin/bash # シェルの動作を設定する # -e: コマンドがエラーになった時点でエラー終了する # -u: 未定義変数を参照した場合にエラー終了する # -x: 実行されるコマンドを引数を展開した上で表示する set -eux # インストールするパッケージのリスト INSTALL_PACKAGES="\ apache2 \ language-pack-ja \ libapache2-mod-php7.0 \ mysql-server-5.7 \ php7.0 \ php7.0-mbstring \ php7.0-mysql \ php7.0-opcache \ tzdata \ " # パッケージのインストール時に、対話形式のユーザーインタフェースを抑制する export DEBIAN_FRONTEND=noninteractive # 日本国内のミラーサイトを使うようにし、ソースインデックスは取得しない sed -i \ -e 's,//archive.ubuntu.com/,//jp.archive.ubuntu.com/,g' \ -e '/^deb-src /s/^/#/' \ /etc/apt/sources.list # パッケージリストを取得する apt-get update # パッケージをインストールする apt-get install -y --no-install-recommends ${INSTALL_PACKAGES}[root@testvm 03-my-wordpress]# mkdir scripts [root@testvm 03-my-wordpress]# cp ../SampleFile/3-3-2-1/01-provisioning-install-packages.sh scripts/ [root@testvm 03-my-wordpress]# ls scripts/ 01-provisioning-install-packages.sh同様に以下のタイムゾーン設定用のスクリプトもscripts/配下に作成する
[root@testvm 03-my-wordpress]# cat ../SampleFile/3-3-2-2/02-provisioning-set-locales.sh #!/bin/bash set -eux # 設定するタイムゾーンのファイル LOCALTIME_FILE=/usr/share/zoneinfo/Asia/Tokyo # パッケージのインストール時に、対話形式のユーザーインタフェースを抑制する export DEBIAN_FRONTEND=noninteractive # ロケールを日本語にセットするが、メッセージ出力は翻訳しない update-locale LANG=ja_JP.UTF-8 LC_MESSAGES=C # 前のスクリプトでtzdataがインストールされていることを確認する if [ ! -f "${LOCALTIME_FILE}" ] ; then echo "${LOCALTIME_FILE} does not exist." exit 1 fi # タイムゾーンを日本時間にセットする(Ubuntu 16.04での設定方法) ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime dpkg-reconfigure tzdata用意したスクリプトをコンテナbuild時に実行するようにする
以下のDockerfileでbuildしてみる
[root@testvm 03-my-wordpress]# cp ../SampleFile/3-3-2-3/Dockerfile ./ cp: overwrite ‘./Dockerfile’? y [root@testvm 03-my-wordpress]# cat Dockerfile FROM phusion/baseimage:0.10.0 WORKDIR /build/ COPY scripts/*-provisioning-*.sh scripts/ # パーミッションをセットしてからスクリプトを実行する RUN chmod 755 scripts/*.sh \ && scripts/01-provisioning-install-packages.sh \ && scripts/02-provisioning-set-locales.sh[root@testvm 03-my-wordpress]# docker build -t my-wordpress . Sending build context to Docker daemon 6.144 kB Step 1/4 : FROM phusion/baseimage:0.10.0 ---> 166cfc3f6974 Step 2/4 : WORKDIR /build/ ---> b6bd0914b57e Removing intermediate container d365ecdc7999 Step 3/4 : COPY scripts/*-provisioning-*.sh scripts/ ---> a96386217bd0 Removing intermediate container c8bb054c08e8 Step 4/4 : RUN chmod 755 scripts/*.sh && scripts/01-provisioning-install-packages.sh && scripts/02-provisioning-set-locales.sh ---> Running in 1dd602fe24d5 + INSTALL_PACKAGES=' apache2 language-pack-ja libapache2-mod-php7.0 mysql-server-5.7 php7.0 php7.0-mbstring php7.0-mysql php7.0-opcache tzdata ' + export DEBIAN_FRONTEND=noninteractive + DEBIAN_FRONTEND=noninteractive + sed -i -e s,//archive.ubuntu.com/,//jp.archive.ubuntu.com/,g -e '/^deb-src /s/^/#/' /etc/apt/sources.list + apt-get update Get:1 http://jp.archive.ubuntu.com/ubuntu xenial InRelease [247 kB] Get:2 http://jp.archive.ubuntu.com/ubuntu xenial-updates InRelease [109 kB] Get:3 http://jp.archive.ubuntu.com/ubuntu xenial-backports InRelease [107 kB] (〜以下省略〜 パッケージがインストールされる) Removing intermediate container 1dd602fe24d5 Successfully built 8dcc6e2dabe7
- 投稿日:2021-01-28T05:25:38+09:00
書籍「Dockerによるアプリケーション開発環境構築ガイド」part2 Dockerfile記述方法
はじめに
以下の書籍の演習をやったので、そのまとめ。
Docker初心者でも実際に手を動かしながら、Dockerの概念や基本を学ぶことが出来るので良本だと思います。演習のホストOSはCentOS7で試しています。書名:Dockerによるアプリケーション開発環境構築ガイド
著者:櫻井 洋一郎, 村崎 大輔 (著)関連
[part1] part1 docker基本コマンド
[part3] Baseimage-dockerを使った1コンテナでの複数サービス管理DockerfileによるDockerイメージの作成
docker build
コマンドにより、Dockerfileで定義した一連の手続きを実行してイメージ作成できるFROM ベースとなるDockerイメージの指定
*タグ名やdigest名を指定しない場合、latestというタグ名が使われる
[root@testvm Dockerfile]# cat from/Dockerfile_simple FROM ubuntu RUN echo foo RUN echo bar [root@testvm Dockerfile]# docker build -f from/Dockerfile_simple -t build:from_simple . Sending build context to Docker daemon 72.7 kB Step 1/3 : FROM ubuntu Trying to pull repository docker.io/library/ubuntu ... latest: Pulling from docker.io/library/ubuntu 7ddbc47eeb70: Pull complete c1bbdc448b72: Pull complete 8c3b70e39044: Pull complete 45d437916d57: Pull complete Digest: sha256:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d Status: Downloaded newer image for docker.io/ubuntu:latest ---> 775349758637 Step 2/3 : RUN echo foo ---> Running in d3c97cc0ca90 foo ---> aa90c50f3a31 Removing intermediate container d3c97cc0ca90 Step 3/3 : RUN echo bar ---> Running in b18878ac3caa bar ---> 3129b3f87c7b Removing intermediate container b18878ac3caa Successfully built 3129b3f87c7b [root@testvm Dockerfile]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE build from_simple 3129b3f87c7b 16 minutes ago 64.2 MB sample/ubuntu_with_php 1_0 351b1877a1a0 About an hour ago 206 MB docker.io/ubuntu 16.04 5f2bf26e3524 3 weeks ago 123 MB docker.io/ubuntu latest 775349758637 3 weeks ago 64.2 MB docker.io/hello-world latest fce289e99eb9 10 months ago 1.84 kBdigest名を指定したFROM
digest
- イメージの内容が完全に同一であることを保証したい場合に利用できる
- Dockerレジストリにpushされているものにしか付与されない
[root@testvm Dockerfile]# cat from/Dockerfile_digest FROM ubuntu@sha256:e27e9d7f7f28d67aa9e2d7540bdc2b33254b452ee8e60f388875e5b7d9b2b696 RUN echo foo RUN echo bar [root@testvm Dockerfile]# docker images --digests REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE build from_simple <none> 3129b3f87c7b 18 minutes ago 64.2 MB sample/ubuntu_with_php 1_0 <none> 351b1877a1a0 About an hour ago 206 MB docker.io/ubuntu 16.04 sha256:bb5b48c7750a6a8775c74bcb601f7e5399135d0a06de004d000e05fd25c1a71c 5f2bf26e3524 3 weeks ago 123 MB docker.io/ubuntu latest sha256:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d 775349758637 3 weeks ago 64.2 MB docker.io/hello-world latest sha256:4df8ca8a7e309c256d60d7971ea14c27672fc0d10c5f303856d7bc48f8cc17ff fce289e99eb9 10 months ago 1.84 kB [root@testvm Dockerfile]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE build from_digest 3129b3f87c7b 22 minutes ago 64.2 MB build from_simple 3129b3f87c7b 22 minutes ago 64.2 MB sample/ubuntu_with_php 1_0 351b1877a1a0 About an hour ago 206 MB docker.io/ubuntu 16.04 5f2bf26e3524 3 weeks ago 123 MB docker.io/ubuntu latest 775349758637 3 weeks ago 64.2 MB docker.io/hello-world latest fce289e99eb9 10 months ago 1.84 kBENV 環境変数の指定
以下のどちらのファイルの書き方でも指定できる
[root@testvm Dockerfile]# cat env/Dockerfile_first FROM ubuntu ENV myName John Doe ENV myDog Rex The Dog ENV myCat fluffy RUN echo "$myName, $myDog, $myCat" [root@testvm Dockerfile]# cat env/Dockerfile_second FROM ubuntu ENV myName="John Doe" myDog=Rex\ The\ Dog \ myCat=fluffy RUN echo "$myName, $myDog, $myCat" [root@testvm Dockerfile]# docker build -f env/Dockerfile_second -t build:env_second . Sending build context to Docker daemon 72.7 kB Step 1/3 : FROM ubuntu ---> 775349758637 Step 2/3 : ENV myName "John Doe" myDog Rex\ The\ Dog myCat fluffy ---> Running in 5477587e40c4 ---> 6ae375f8167e Removing intermediate container 5477587e40c4 Step 3/3 : RUN echo "$myName, $myDog, $myCat" ---> Running in 4132c1dc3898 John Doe, Rex The Dog, fluffy ---> d521daf65407 Removing intermediate container 4132c1dc3898 Successfully built d521daf65407 [root@testvm Dockerfile]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE build env_second d521daf65407 6 seconds ago 64.2 MBstep3/3で環境変数が正しくechoできていることがわかる。
またdocker history
コマンドでイメージの履歴も確認できる。[root@testvm Dockerfile]# docker history build:env_second IMAGE CREATED CREATED BY SIZE COMMENT d521daf65407 About a minute ago /bin/sh -c echo "$myName, $myDog, $myCat" 0 B 6ae375f8167e About a minute ago /bin/sh -c #(nop) ENV myName=John Doe myD... 0 B 775349758637 3 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B <missing> 3 weeks ago /bin/sh -c mkdir -p /run/systemd && echo '... 7 B <missing> 3 weeks ago /bin/sh -c set -xe && echo '#!/bin/sh' >... 745 B <missing> 3 weeks ago /bin/sh -c [ -z "$(apt-get indextargets)" ] 987 kB <missing> 3 weeks ago /bin/sh -c #(nop) ADD file:a48a5dc1b9dbfc6... 63.2 MBLABEL メタデータの付与
[root@testvm Dockerfile]# cat label/Dockerfile FROM ubuntu:16.04 LABEL maintainer="Image maintainer team <hogehoge@example.com>" [root@testvm Dockerfile]# docker build -f label/Dockerfile -t build:label . Sending build context to Docker daemon 72.7 kB Step 1/2 : FROM ubuntu:16.04 ---> 5f2bf26e3524 Step 2/2 : LABEL maintainer "Image maintainer team <hogehoge@example.com>" ---> Running in 9537e0b33209 ---> 029aea12235a Removing intermediate container 9537e0b33209 Successfully built 029aea12235a
docker inspect
でイメージの詳細を確認できる[root@testvm Dockerfile]# docker inspect build:label [ { "Id": "sha256:029aea12235a101dfd046e7824607026696caa70f0f3b082d72fbd95c5b0b51b", "RepoTags": [ "build:label" ], "RepoDigests": [], "Parent": "sha256:5f2bf26e35249d8b47f002045c57b2ea9d8ba68704f45f3c209182a7a2a9ece5", "Comment": "", "Created": "2019-11-25T02:17:57.917903693Z", "Container": "9537e0b332090b0fec319cf6a76cee190a2ef94580d0796bdb2bcc4f1416c005", "ContainerConfig": { "Hostname": "9537e0b33209", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/sh", "-c", "#(nop) ", "LABEL maintainer=Image maintainer team <hogehoge@example.com>" ], "ArgsEscaped": true, "Image": "sha256:5f2bf26e35249d8b47f002045c57b2ea9d8ba68704f45f3c209182a7a2a9ece5", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": [], "Labels": { "maintainer": "Image maintainer team <hogehoge@example.com>" } }, "DockerVersion": "1.13.1", "Author": "", (以下省略)RUN shellの実行
書き方は以下の2種類(1. shell form と 2. exec form)
1.の場合,/bin/sh -cで実行される
2.の場合,SHELLの値は関係無く、実行可能コマンドを直接実行する[root@testvm Dockerfile]# cat run/Dockerfile FROM ubuntu:16.04 RUN echo $0 RUN ["sh", "-c", "echo $0"]ubuntuでは/bin/bashがdashとなっており、()という表現を受け付けないため、以下のDockerfileではそれぞれ、成功・失敗する
[root@testvm Dockerfile]# cat run/shell/Dockerfile_success FROM ubuntu:16.04 RUN ["/bin/bash", "-c", "FOO=(`ls`); echo $FOO"] [root@testvm Dockerfile]# [root@testvm Dockerfile]# cat run/shell/Dockerfile_with_error FROM ubuntu:16.04 RUN FOO=(`ls`); echo $FOOまた、1.と2.で環境変数の展開も異なる
# 3のexec formではコマンドシェル経由ではなく、実行ファイルを直接実行されているため、環境変数は展開されない。[root@testvm Dockerfile]# cat run/env/Dockerfile FROM ubuntu:16.04 # 1. set environment variable. ENV HOGE hoge # 2. echo by "shell form". RUN echo $HOGE # 3. echo by "exec form", without shell. RUN ["echo", "$HOGE"] # 4. echo by "exec form", with shell. RUN ["/bin/sh", "-c", "echo $HOGE"] [root@testvm Dockerfile]# docker build -f run/env/Dockerfile -t build:run_env ./run/env/ Sending build context to Docker daemon 2.048 kB Step 1/5 : FROM ubuntu:16.04 ---> 5f2bf26e3524 Step 2/5 : ENV HOGE hoge ---> Running in a8da17cf3a87 ---> 3580b7a865c6 Removing intermediate container a8da17cf3a87 Step 3/5 : RUN echo $HOGE ---> Running in b7c7dbb13af9 hoge ---> a1b63fac8a8e Removing intermediate container b7c7dbb13af9 Step 4/5 : RUN echo $HOGE ---> Running in cb5081f725cf $HOGE ---> 1e5e35162487 Removing intermediate container cb5081f725cf Step 5/5 : RUN /bin/sh -c echo $HOGE ---> Running in 8447b4ad41ce hoge ---> 425615fdbaec Removing intermediate container 8447b4ad41ce Successfully built 425615fdbaec
docker history
コマンドで確認すると、# 3の箇所(IMAGE ID=1e5e35162487の部分)では/bin/sh -c 経由ではなく、直接コマンド実行されているのが分かる。[root@testvm Dockerfile]# docker history build:run_env IMAGE CREATED CREATED BY SIZE COMMENT 425615fdbaec 5 minutes ago /bin/sh -c echo $HOGE 0 B 1e5e35162487 5 minutes ago echo $HOGE 0 B a1b63fac8a8e 5 minutes ago /bin/sh -c echo $HOGE 0 B 3580b7a865c6 5 minutes ago /bin/sh -c #(nop) ENV HOGE=hoge 0 B 5f2bf26e3524 3 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B <missing> 3 weeks ago /bin/sh -c mkdir -p /run/systemd && echo '... 7 B <missing> 3 weeks ago /bin/sh -c set -xe && echo '#!/bin/sh' >... 745 B <missing> 3 weeks ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0 B <missing> 3 weeks ago /bin/sh -c #(nop) ADD file:9511990749b593a... 123 MBSHELL [shell form]が利用された際に使用されるコマンドを指定
Linux:デフォルトは
/bin/sh
,-c
Windows:デフォルトはcmd
,\S
,\C
先ほどエラーになっていたDockerfileをSHELLコマンドでシェル指定することで、正しく実行できる
root@testvm Dockerfile]# cat shell/Dockerfile FROM ubuntu:16.04 SHELL ["/bin/bash", "-c"] RUN FOO=(`ls`); echo $FOO [root@testvm Dockerfile]# docker build -f shell/Dockerfile -t build:shell . Sending build context to Docker daemon 72.7 kB Step 1/3 : FROM ubuntu:16.04 ---> 5f2bf26e3524 Step 2/3 : SHELL /bin/bash -c ---> Running in 119915db64d1 ---> a3de822059a0 Removing intermediate container 119915db64d1 Step 3/3 : RUN FOO=(`ls`); echo $FOO ---> Running in d30fec3eada9 bin ---> 7dfba7eb3110 Removing intermediate container d30fec3eada9 Successfully built 7dfba7eb3110WORKDIR 相対パスを指定した時のディレクトリを指定
複数回記述した場合はその都度ワークディレクトリが変わる
[root@testvm Dockerfile]# cat workdir/Dockerfile FROM ubuntu:16.04 WORKDIR /a WORKDIR b WORKDIR c RUN pwd [root@testvm Dockerfile]# docker build -f workdir/Dockerfile -t build:workdir . Sending build context to Docker daemon 72.7 kB Step 1/5 : FROM ubuntu:16.04 ---> 5f2bf26e3524 Step 2/5 : WORKDIR /a ---> 7b584249016a Removing intermediate container d8c9f332724e Step 3/5 : WORKDIR b ---> 9c6281858297 Removing intermediate container 2c8f90abb159 Step 4/5 : WORKDIR c ---> 557de1101958 Removing intermediate container fae71b6ce31d Step 5/5 : RUN pwd ---> Running in e52da7fd8e55 /a/b/c ---> d85bec60cbbd Removing intermediate container e52da7fd8e55 Successfully built d85bec60cbbdADD ファイル、ディレクトリ、URLリソースなどをコンテナ上にコピー
tar
でアーカイブしたファイルを展開した状態でコピーする。
Linuxコンテナの場合のみ、--chown=<user>:<group>
のオプションが可能。[root@testvm Dockerfile]# cat add/Dockerfile FROM ubuntu:16.04 # 1. Make work directory at first. WORKDIR /add # 2. Add normal file. ADD ./files/not_archived_file . RUN ls -al /add # 3. Add remote resource to container. ADD https://github.com/docker/docker-ce/blob/master/README.md . RUN ls -al /add # 4. Uncompress and unarchive tar files. ADD ./files/tar_bzip2_file.tar.bzip2 ./files/tar_file.tar ./files/tar_file.tar ./files/tar_gz_file.tar.gz ./files/tar_xz_file.tar.xz ./ RUN ls -al /add # 5. NOT unarchive compressed files. ADD ./files/bzip2_file.bz2 ./files/gzip_file.gz ./files/xz_file.xz ./files/zip_file.zip ./ RUN ls -al /add # 6. Add directory. ADD ./files ./files RUN ls -al /add/files [root@testvm Dockerfile]# ll add/files/ total 32 -rw-r--r--. 1 root root 14 Mar 11 2018 bzip2_file.bz2 -rw-r--r--. 1 root root 30 Mar 11 2018 gzip_file.gz -rw-r--r--. 1 root root 0 Mar 11 2018 not_archived_file -rw-r--r--. 1 root root 396 Mar 11 2018 tar_bzip2_file.tar.bzip2 -rw-r--r--. 1 root root 2560 Mar 11 2018 tar_file.tar -rw-r--r--. 1 root root 354 Mar 11 2018 tar_gz_file.tar.gz -rw-r--r--. 1 root root 368 Mar 11 2018 tar_xz_file.tar.xz -rw-r--r--. 1 root root 32 Mar 11 2018 xz_file.xz -rw-r--r--. 1 root root 166 Mar 11 2018 zip_file.zip [root@testvm Dockerfile]# docker build -f add/Dockerfile -t build:add ./add/ Sending build context to Docker daemon 13.82 kB Step 1/12 : FROM ubuntu:16.04 ---> 5f2bf26e3524 Step 2/12 : WORKDIR /add ---> Using cache ---> 440865d619ab Step 3/12 : ADD ./files/not_archived_file . ---> e4bf598e3a12 Removing intermediate container 4bdea1d3d886 Step 4/12 : RUN ls -al /add ---> Running in faf4dd8b160d total 0 drwxr-xr-x. 1 root root 31 Nov 25 05:05 . drwxr-xr-x. 1 root root 17 Nov 25 05:05 .. -rw-r--r--. 1 root root 0 Mar 11 2018 not_archived_file ---> 0015e1708251 Removing intermediate container faf4dd8b160d Step 5/12 : ADD https://github.com/docker/docker-ce/blob/master/README.md . Downloading 69.95 kB ---> 67462f31863f Removing intermediate container a16cf375b2a1 Step 6/12 : RUN ls -al /add ---> Running in 94f495a81b87 total 72 drwxr-xr-x. 1 root root 23 Nov 25 05:05 . drwxr-xr-x. 1 root root 6 Nov 25 05:05 .. -rw-------. 1 root root 69950 Jan 1 1970 README.md -rw-r--r--. 1 root root 0 Mar 11 2018 not_archived_file ---> 19d1c776bb1f Removing intermediate container 94f495a81b87 Step 7/12 : ADD ./files/tar_bzip2_file.tar.bzip2 ./files/tar_file.tar ./files/tar_file.tar ./files/tar_gz_file.tar.gz ./files/tar_xz_file.tar.xz ./ ---> da128d3f06eb Removing intermediate container fd468212c260 Step 8/12 : RUN ls -al /add ---> Running in f1b7f3f6342d total 88 drwxr-xr-x. 1 root root 166 Nov 25 05:05 . drwxr-xr-x. 1 root root 6 Nov 25 05:05 .. -rw-r--r--. 1 501 dialout 239 Feb 18 2018 ._tar_bzip2_file -rw-r--r--. 1 501 dialout 239 Feb 18 2018 ._tar_file -rw-r--r--. 1 501 dialout 239 Feb 18 2018 ._tar_gz_file -rw-r--r--. 1 501 dialout 239 Feb 18 2018 ._tar_xz_file -rw-------. 1 root root 69950 Jan 1 1970 README.md -rw-r--r--. 1 root root 0 Mar 11 2018 not_archived_file -rw-r--r--. 1 501 dialout 0 Feb 18 2018 tar_bzip2_file -rw-r--r--. 1 501 dialout 0 Feb 18 2018 tar_file -rw-r--r--. 1 501 dialout 0 Feb 18 2018 tar_gz_file -rw-r--r--. 1 501 dialout 0 Feb 18 2018 tar_xz_file ---> 60f2893855fb Removing intermediate container f1b7f3f6342d Step 9/12 : ADD ./files/bzip2_file.bz2 ./files/gzip_file.gz ./files/xz_file.xz ./files/zip_file.zip ./ ---> b9a584f7c670 Removing intermediate container 39c3bead5ed3 Step 10/12 : RUN ls -al /add ---> Running in 1c3c46862f65 total 104 drwxr-xr-x. 1 root root 86 Nov 25 05:05 . drwxr-xr-x. 1 root root 6 Nov 25 05:05 .. -rw-r--r--. 1 501 dialout 239 Feb 18 2018 ._tar_bzip2_file -rw-r--r--. 1 501 dialout 239 Feb 18 2018 ._tar_file -rw-r--r--. 1 501 dialout 239 Feb 18 2018 ._tar_gz_file -rw-r--r--. 1 501 dialout 239 Feb 18 2018 ._tar_xz_file -rw-------. 1 root root 69950 Jan 1 1970 README.md -rw-r--r--. 1 root root 14 Mar 11 2018 bzip2_file.bz2 -rw-r--r--. 1 root root 30 Mar 11 2018 gzip_file.gz -rw-r--r--. 1 root root 0 Mar 11 2018 not_archived_file -rw-r--r--. 1 501 dialout 0 Feb 18 2018 tar_bzip2_file -rw-r--r--. 1 501 dialout 0 Feb 18 2018 tar_file -rw-r--r--. 1 501 dialout 0 Feb 18 2018 tar_gz_file -rw-r--r--. 1 501 dialout 0 Feb 18 2018 tar_xz_file -rw-r--r--. 1 root root 32 Mar 11 2018 xz_file.xz -rw-r--r--. 1 root root 166 Mar 11 2018 zip_file.zip ---> cf451a8b0cbb Removing intermediate container 1c3c46862f65 Step 11/12 : ADD ./files ./files ---> 76a5e5890369 Removing intermediate container 0a11f98e0b9e Step 12/12 : RUN ls -al /add/files ---> Running in f64b9cb5af2d total 32 drwxr-xr-x. 2 root root 215 Nov 25 05:05 . drwxr-xr-x. 1 root root 19 Nov 25 05:05 .. -rw-r--r--. 1 root root 14 Mar 11 2018 bzip2_file.bz2 -rw-r--r--. 1 root root 30 Mar 11 2018 gzip_file.gz -rw-r--r--. 1 root root 0 Mar 11 2018 not_archived_file -rw-r--r--. 1 root root 396 Mar 11 2018 tar_bzip2_file.tar.bzip2 -rw-r--r--. 1 root root 2560 Mar 11 2018 tar_file.tar -rw-r--r--. 1 root root 354 Mar 11 2018 tar_gz_file.tar.gz -rw-r--r--. 1 root root 368 Mar 11 2018 tar_xz_file.tar.xz -rw-r--r--. 1 root root 32 Mar 11 2018 xz_file.xz -rw-r--r--. 1 root root 166 Mar 11 2018 zip_file.zip ---> f1d67759af12 Removing intermediate container f64b9cb5af2d Successfully built f1d67759af12COPY ※ADDコマンドと同様
ADDコマンドとの違いは
- multi staging docker機能で作成した別のコンテナの中にあるファイルをコピーする
- URLリソースの指定不可
- tarでアーカイブしたファイルを展開しない
以下の例では、一つのDockerfile内で2つのイメージをベースに使い、イメージ間(コンテナ間)でファイルのコピーをしている
[root@testvm Dockerfile]# cat copy/Dockerfile # Use multi stage docker feature. FROM busybox AS build_env # 1. Make work directory at first. WORKDIR /multistage # 2. Copy COPY ./files/multi_stage_docker_file . RUN ls -al /multistage # Second docker definition. FROM ubuntu:16.04 # 3. Make work directory at first. WORKDIR /copy # 4. Copy normal file. COPY ./files/not_archived_file . RUN ls -al /copy # 5. Copy normal file. COPY --from=build_env /multistage/multi_stage_docker_file . RUN ls -al /copy # 6. NOT Uncompress and unarchive tar files. COPY ./files/tar_bzip2_file.tar.bzip2 ./files/tar_file.tar ./files/tar_file.tar ./files/tar_gz_file.tar.gz ./files/tar_xz_file.tar.xz ./ RUN ls -al /copy # 7. NOT unarchive compressed files. COPY ./files/bzip2_file.bz2 ./files/gzip_file.gz ./files/xz_file.xz ./files/zip_file.zip ./ RUN ls -al /copy # 8. Copy directory. COPY ./files ./files RUN ls -al /copy/files [root@testvm Dockerfile]# ll copy/files/ total 32 -rw-r--r--. 1 root root 14 Mar 11 2018 bzip2_file.bz2 -rw-r--r--. 1 root root 30 Mar 11 2018 gzip_file.gz -rw-r--r--. 1 root root 0 Mar 11 2018 multi_stage_docker_file -rw-r--r--. 1 root root 0 Mar 11 2018 not_archived_file -rw-r--r--. 1 root root 396 Mar 11 2018 tar_bzip2_file.tar.bzip2 -rw-r--r--. 1 root root 2560 Mar 11 2018 tar_file.tar -rw-r--r--. 1 root root 354 Mar 11 2018 tar_gz_file.tar.gz -rw-r--r--. 1 root root 368 Mar 11 2018 tar_xz_file.tar.xz -rw-r--r--. 1 root root 32 Mar 11 2018 xz_file.xz -rw-r--r--. 1 root root 166 Mar 11 2018 zip_file.zip [root@testvm Dockerfile]# docker build -f copy/Dockerfile -t build:copy ./copy/ Sending build context to Docker daemon 14.34 kB Step 1/16 : FROM busybox AS build_env Error parsing reference: "busybox AS build_env" is not a valid repository/tag: invalid reference format (buildでエラーが出たため以下省略)EXPOSE コンテナが利用するポートの宣言(実行上、意味はない)
実際にコンテナの特定ポートにアクセスするためには、
docker run
コマンドでコンテナ作成の際に-pオプションによるホスト・コンテナ間のポート接続が必要[root@testvm Dockerfile]# cat expose/Dockerfile FROM nginx EXPOSE 443ENTRYPOINT コンテナ起動時の実行コマンドを指定
RUNコマンドと同様に2種類(1.shell form, 2. exec form(推奨))の書き方がある。
docker run実行時に引数が設定された場合、EXTRYPOINTのコマンドの引数となって実行される。
ENTRYPOINTを複数記述した場合は最後の記述のみ有効となる。例えば、以下の通り1.shell formでは記述したコマンドはPID 1以外、 2.exec formで記述したコマンドはPID 1となる。
しかし、docker stop
やdocker kill
ではPID 1のプロセスに対してSIGTERMやSIGKILLが送信されるため、実行した本来のコマンドがSIGNALを受信できないため、1.shell formは非推奨となっている。~ENTRYPOINT実行コマンドのSIGNALのハンドリングについて~
下記のSIGNALを受け取るスクリプトを用意して動作確認する。
※3秒毎にrunning...と表示して、SIGTERMもしくは(SIGHUP/SIGINT/SIGQUIT)を受け取るとメッセージを表示する(SIGTERMの場合はそれに加えて終了する)[root@testvm Dockerfile]# cat entrypoint/signal/sample.sh #!/bin/sh trap_term_signal() { echo "trapped SIGTERM" exit 0 } trap_some_signal() { echo "trapped 1 or 2 or 3 SIGNAL" } trap "trap_term_signal" TERM trap "trap_some_signal" 1 2 3 while : do echo "running..." sleep 3 done2.exec formの場合
[root@testvm Dockerfile]# cat entrypoint/signal/Dockerfile_exec FROM ubuntu:16.04 COPY sample.sh /sample.sh ENTRYPOINT ["/sample.sh"] [root@testvm Dockerfile]# docker build -f entrypoint/signal/Dockerfile_exec -t build:entrypoint_signal_exec ./entrypoint/signal/ Sending build context to Docker daemon 4.096 kB Step 1/3 : FROM ubuntu:16.04 ---> 5f2bf26e3524 Step 2/3 : COPY sample.sh /sample.sh ---> 2a264ecbfe21 Removing intermediate container a4ba48b86e68 Step 3/3 : ENTRYPOINT /sample.sh ---> Running in 5c9871565f00 ---> 17a857ae75e7 Removing intermediate container 5c9871565f00 Successfully built 17a857ae75e7 [root@testvm Dockerfile]# docker run --name entrypoint_signal_exec --rm -it build:entrypoint_signal_exec running... running...別のターミナルで以下を実行
[root@testvm ~]# docker kill -s SIGHUP entrypoint_signal_exec entrypoint_signal_execすると、はじめのターミナル上で以下のように表示される。SIGHUPなので終了しない。
running... trapped 1 or 2 or 3 SIGNAL running... running...次に、以下の通り、
docker stop
でSIGTERMをコンテナに送信する[root@testvm ~]# docker stop entrypoint_signal_exec entrypoint_signal_execすると、はじめのターミナルで動作が終了する
running... trapped SIGTERM [root@testvm Dockerfile]#1.shell formの場合
同様にコンテナ起動&SIGNAL送信すると以下のようになる[root@testvm Dockerfile]# cat entrypoint/signal/Dockerfile_shell FROM ubuntu:16.04 COPY sample.sh /sample.sh ENTRYPOINT /sample.sh [root@testvm Dockerfile]# docker build -f entrypoint/signal/Dockerfile_shell -t build:entrypoint_signal_shell ./entrypoint/signal/ Sending build context to Docker daemon 4.096 kB Step 1/3 : FROM ubuntu:16.04 ---> 5f2bf26e3524 Step 2/3 : COPY sample.sh /sample.sh ---> Using cache ---> 53543e654866 Step 3/3 : ENTRYPOINT /sample.sh ---> Running in aa143a231c49 ---> e7872e3206a0 Removing intermediate container aa143a231c49 Successfully built e7872e3206a0 [root@testvm Dockerfile]# [root@testvm Dockerfile]# docker run --name entrypoint_signal_shell --rm -it build:entrypoint_signal_shell running...この場合、別ターミナルで以下の通りSIGTERMを送信しても
running
のまま表示は変わらない。
これはshell formの場合はPID1のプロセスがsample.shではないため、SIGNALが届いていないことに起因する。[root@testvm ~]# docker kill -s SIGHUP entrypoint_signal_shell entrypoint_signal_shell以下のようにdocker stopを実行した場合は10秒ほど経った後にコンテナが停止し、
entrypoint_signal_shell
と表示される。
これはdocker stopの仕様によるものであり、
PID1のプロセスにSIGTERMを送信して10秒ほど反応が返らない場合、SIGKILLを送信し強制終了する。[root@testvm ~]# docker stop entrypoint_signal_shell entrypoint_signal_shell~ENTRYPOINTとRUNの違いについて~
RUN:イメージをbuild(作成)するために実際にコンテナでコマンドを実行する。
ENTRYPOINT:docker run(起動)する際にコマンドを実行する。つまり、動作しないコマンドでもbuildは成功してしまう。CMD コンテナ起動時の実行コマンドを指定
※ENTRYPOINTとの違い:
docker runの際に実行されるデフォルトコマンドを指定するために使う
例えば以下のように使う[root@testvm Dockerfile]# cat cmd/parameter/Dockerfile FROM ubuntu:16.04 ENTRYPOINT ["top"] CMD ["-H"] [root@testvm Dockerfile]# docker build -f cmd/parameter/Dockerfile -t build:cmd_parameter ./cmd/parameter/ Sending build context to Docker daemon 2.048 kB Step 1/3 : FROM ubuntu:16.04 ---> 5f2bf26e3524 Step 2/3 : ENTRYPOINT top ---> Running in 72b1284dd07c ---> 86cfbe89f68e Removing intermediate container 72b1284dd07c Step 3/3 : CMD -H ---> Running in 9692599383c8 ---> 332002a8f056 Removing intermediate container 9692599383c8 Successfully built 332002a8f056 [root@testvm Dockerfile]# docker run --rm -it build:cmd_parameter top - 07:13:27 up 9:25, 0 users, load average: 0.07, 0.07, 0.06 Threads: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.1 us, 0.2 sy, 0.0 ni, 99.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 498736 total, 24964 free, 185872 used, 287900 buff/cache KiB Swap: 2097148 total, 1986556 free, 110592 used. 264796 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 36692 1720 1256 R 6.2 0.3 0:00.04 topdocker runの実行時に引数を与えると、CMDの内容を上書きできる。
以下ではbuild時の-H
(スレッド単位での表示)を-b
(バッチモード)で上書きしている。[root@testvm Dockerfile]# docker run --rm -it build:cmd_parameter -b top - 07:21:13 up 9:32, 0 users, load average: 0.01, 0.06, 0.05 Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.1 us, 0.2 sy, 0.0 ni, 99.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 498736 total, 24720 free, 183884 used, 290132 buff/cache KiB Swap: 2097148 total, 1986556 free, 110592 used. 266728 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 36520 1596 1236 R 0.0 0.3 0:00.02 top
- 投稿日:2021-01-28T05:24:48+09:00
書籍「Dockerによるアプリケーション開発環境構築ガイド」part1 docker基本コマンド
はじめに
以下の書籍の演習をやったので、そのまとめ。
Docker初心者でも実際に手を動かしながら、Dockerの概念や基本を学ぶことが出来るので良本だと思います。演習のホストOSはCentOS7で試しています。書名:Dockerによるアプリケーション開発環境構築ガイド
著者:櫻井 洋一郎, 村崎 大輔 (著)関連
[part2] Dockerfile記述方法
[part3] Baseimage-dockerを使った1コンテナでの複数サービス管理Docekrのインストール
# yum install docker # systemctl start docker # docker version Client: Version: 1.13.1 API version: 1.26 Package version: docker-1.13.1-103.git7f2769b.el7.centos.x86_64 Go version: go1.10.3 Git commit: 7f2769b/1.13.1 Built: Sun Sep 15 14:06:47 2019 OS/Arch: linux/amd64 Server: Version: 1.13.1 API version: 1.26 (minimum version 1.12) Package version: docker-1.13.1-103.git7f2769b.el7.centos.x86_64 Go version: go1.10.3 Git commit: 7f2769b/1.13.1 Built: Sun Sep 15 14:06:47 2019 OS/Arch: linux/amd64 Experimental: falseインストール後のテスト
# docker run hello-world Unable to find image 'hello-world:latest' locally Trying to pull repository docker.io/library/hello-world ... latest: Pulling from docker.io/library/hello-world 1b930d010525: Pull complete Digest: sha256:4df8ca8a7e309c256d60d7971ea14c27672fc0d10c5f303856d7bc48f8cc17ff Status: Downloaded newer image for docker.io/hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/docker-composeのインストール
実行ファイルをダウンロード
# curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 617 0 617 0 0 1070 0 --:--:-- --:--:-- --:--:-- 1071 100 15.4M 100 15.4M 0 0 616k 0 0:00:25 0:00:25 --:--:-- 624k # chmod +x /usr/local/bin/docker-compose # ll /usr/local/bin/docker-compose -rwxr-xr-x. 1 root root 16168192 Nov 24 22:16 /usr/local/bin/docker-composeDockerコマンド利用例
Dockerイメージの取得
pull
# docker pull ubuntu:16.04 Trying to pull repository docker.io/library/ubuntu ... 16.04: Pulling from docker.io/library/ubuntu e80174c8b43b: Pull complete d1072db285cc: Pull complete 858453671e67: Pull complete 3d07b1124f98: Pull complete Digest: sha256:bb5b48c7750a6a8775c74bcb601f7e5399135d0a06de004d000e05fd25c1a71c Status: Downloaded newer image for docker.io/ubuntu:16.04ローカルのイメージ一覧の確認
images
# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/ubuntu 16.04 5f2bf26e3524 3 weeks ago 123 MB docker.io/hello-world latest fce289e99eb9 10 months ago 1.84 kBDockerイメージからDockerコンテナの作成
# docker run -d -it ubuntu:16.04 bash d070e9c506d47474590a0ce250ee420f6d6d729d75b0fa1a7f9ad7932fc7c269-d, --detach Run container in background and print container ID
-i, --interactive Keep STDIN open even if not attached
-t, --tty Allocate a pseudo-TTYDockerコンテナ一覧の確認
ps
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d070e9c506d4 ubuntu:16.04 "bash" About a minute ago Up About a minute amazing_noetherDockerコンテナ上でコマンド実行
exec
# docker exec -it d070e9c506d4 bash root@d070e9c506d4:/# apt-get update && apt-get install -y php root@d070e9c506d4:/# php --version PHP 7.0.33-0ubuntu0.16.04.7 (cli) ( NTS ) Copyright (c) 1997-2017 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies with Zend OPcache v7.0.33-0ubuntu0.16.04.7, Copyright (c) 1999-2017, by Zend Technologies root@d070e9c506d4:/# exit exitDockerコンテナの現在の状態からイメージを作成
commit
# docker tag 351b1877a1a0 sample/ubuntu_with_php:1_0 # docker images REPOSITORY TAG IMAGE ID CREATED SIZE sample/ubuntu_with_php 1_0 351b1877a1a0 7 minutes ago 206 MB docker.io/ubuntu 16.04 5f2bf26e3524 3 weeks ago 123 MB作成したイメージをファイルに出力&ローカルからイメージ削除した後に、ファイルから復元する
Dockerイメージのファイルへの保存
save
# docker save -o /tmp/ubuntu_with_php_1_0 sample/ubuntu_with_php:1_0 # ll /tmp/ubuntu_with_php_1_0 -rw-------. 1 root root 211963904 Nov 25 00:53 /tmp/ubuntu_with_php_1_0Dockerイメージの削除
rmi
# docker rmi sample/ubuntu_with_php:1_0 Untagged: sample/ubuntu_with_php:1_0 Deleted: sha256:351b1877a1a0d82cd6626fa0e65512d4b275ca532f3e7164d95c3e05452ad151 Deleted: sha256:9e2f42e8210d03f5bb53cd86bf4a69822f0983a0c29920b68f7601de6c10180c # docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/ubuntu 16.04 5f2bf26e3524 3 weeks ago 123 MB docker.io/hello-world latest fce289e99eb9 10 months ago 1.84 kBDockerイメージをファイルから読み込む
load
# docker load < /tmp/ubuntu_with_php_1_0 08526c63bb5b: Loading layer [==================================================>] 85.31 MB/85.31 MB Loaded image: sample/ubuntu_with_php:1_0 # docker images REPOSITORY TAG IMAGE ID CREATED SIZE sample/ubuntu_with_php 1_0 351b1877a1a0 22 minutes ago 206 MB docker.io/ubuntu 16.04 5f2bf26e3524 3 weeks ago 123 MB docker.io/hello-world latest fce289e99eb9 10 months ago 1.84 kBホスト環境とコンテナ間ででファイルのコピー
cp
# touch samplefile # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d070e9c506d4 ubuntu:16.04 "bash" 32 minutes ago Up 32 minutes amazing_noether # docker cp samplefile d070e9c506d4:/ [root@testvm ~]# docker exec d070e9c506d4 bash -c 'ls -al / | grep sample' -rw-r--r--. 1 root root 0 Nov 25 01:09 samplefile [root@testvm ~]# docker cp d070e9c506d4:/samplefile /tmp [root@testvm ~]# ls /tmp/ | grep sample samplefileコンテナの停止、起動、強制停止、削除
コンテナの停止
stop
[root@testvm ~]# docker stop d070e9c506d4 d070e9c506d4 [root@testvm ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d070e9c506d4 ubuntu:16.04 "bash" 38 minutes ago Exited (0) 27 seconds ago amazing_noether 981377322c09 hello-world "/hello" 3 hours ago Exited (0) 3 hours ago xenodochial_hugle```コンテナの起動
start
[root@testvm ~]# docker start d070e9c506d4 d070e9c506d4 [root@testvm ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d070e9c506d4 ubuntu:16.04 "bash" 39 minutes ago Up 4 seconds amazing_noether 981377322c09 hello-world "/hello" 3 hours ago Exited (0) 3 hours ago xenodochial_hugleコンテナの強制停止
kill
[root@testvm ~]# docker kill d070e9c506d4 d070e9c506d4 [root@testvm ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d070e9c506d4 ubuntu:16.04 "bash" 39 minutes ago Exited (137) 2 seconds ago amazing_noether 981377322c09 hello-world "/hello" 3 hours ago Exited (0) 3 hours ago xenodochial_hugleコンテナの削除
rm
[root@testvm ~]# docker rm d070e9c506d4 d070e9c506d4 [root@testvm ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 981377322c09 hello-world "/hello" 3 hours ago Exited (0) 3 hours ago xenodochial_hugle
- 投稿日:2021-01-28T04:06:30+09:00
【Docker】Rails6を構築+便利コマンド
前提知識
Dockerに関する詳しい解説は下記URLを参照
・【図解】Dockerの全体像を理解するDocker
仮想環境を構築するための道具
イメージ
Dockerコンテナを実行する際に必要なもの
Dockerfile
イメージを作成するためのファイル
コンテナ
仮想環境そのもの
Docker Compose
複数のアプリケーションをまとめて操作できる仕組み(例:DBとWEB、WEBはRailsのこと)
本編
1.アプリ名でフォルダを作成
Consoleyuki@yuki docker-test % pwd /Users/yuki/workspace/docker-test
2.フォルダ直下にsrcファイル、docker-compose.yml、Dockerfileを作成。srcファイル下にGemfileを作成
yuki@yuki docker-test % ls Dockerfile docker-compose.yml src3.Dockerfileを編集
Dockerfile#Rubyのバージョン指定 FROM ruby:2.7 # node.jsやyarnなどのJavascript関連をインストール # 「-qqオプション」はエラー以外何も吐かないことを意味する。 # 「-y」オプションは全部yesで実行することを意味する。 # apt-getはパッケージを管理するコマンド。yumコマンドのようなもの。 RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \ && apt-get update -qq \ && apt-get install -y nodejs yarn #作業ディレクトリーの場所を指定 WORKDIR /app #ローカルのソースコードをapp配下にコピー COPY ./src /app #ruby関連のライブラリ(gem)をインストール RUN bundle config --local set path 'vendor/bundle' \ && bundle installFROM:使用するイメージとバージョン
RUN:コマンドの実行
WORKDIR:作業ディレクトリの設定
COPY:コピー元とコピー先のファイルまたはディレクトリを指定詳しくは下記URLのコードリストを参照
・Dockerfileの書き方と使い方3.Gemfileを編集
src/Gemfilesource 'https://rubygems.org' gem 'rails', '~> 6.1.0'4.docker-compose.ymlを編集
docker-compose.ymlを設定することで一つのコマンドでDBとWEBが両方起動するようになる。
docker-compose.ymlversion: "3" services: db: image: mysql:5.7 #左側のローカルのディレクトリを右側のdocker側のディレクトリに同期する volumes: - ./src/db/mysql_data:/var/lib/mysql #environmentは環境変数の設定 #MYSQL_ROOT_PASSWORDという環境変数にpasswordというパスワードを入れる。Mysqlはパスをードを入れないとエラーになる。 environment: MYSQL_ROOT_PASSWORD: password web: build: . command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" #ローカルのsrcをdockerコンテナ側のappと同期。ローカルのファイルを更新したらコンテナ側も更新されるように設定。同期することによりコンテナを削除してもデータはローカルに記録されているので、再度buildしてもデータが消えない。 volumes: - ./src:/app #ローカルの3000ポートをコンテナ側の3000ポートと同期 ports: - "3000:3000" environment: RAILS_ENV: development #mysqlへ簡単に接続するための設定 depends_on: - dbversion:docker-composeのバージョンを指定
depends_on:依存関係を示していて、起動順を制御できる。ここでは「db→web」へと起動する。
service:Docker composeでは、アプリケーションを動かすための各要素をserviceと呼ぶ。通常はweb(rails)とdb(mysql)と名付ける。4.Railsアプリケーションを作成
docker-compose run web〜はコンテナ側で作動させるコマンド
Consoleyuki@yuki docker-test % docker-compose run web rails new . --force --database=mysql上記のコマンドによりGemfileやDockerファイルが更新される。その様な場合はイメージをbuildし直す必要がある。
Consoleyuki@yuki docker-test % docker-compose build5.データベースを設定
database.ymldefault: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root #追記 password: password #データベースの接続先をDBに変更 host: db6.コンテナにDBを作成
Consoleyuki@yuki docker-test % docker-compose run web rails db:create7.Railsを起動
Consoleyuki@yuki docker-test % docker-compose up
「you're on rails」画面ができてたら完成。
今後dockerファイルやGemfileを編集した際、情報を反映させるため一度イメージを再構築する必要がある。そのような場合はdocker-compose buildを実行する。Dockerでよく使うコマンド一覧
console#イメージのビルド docker-compose build #コンテナの作成と起動(ーdはバックグラウンドで行うためのオプション) docker-compose up -d #コンテナを停止・削除 docker-compose down #コンテナの一覧を表示 docker-compose ps #ログを表示 docker-compose logs #コンテナを作成してコマンド実行 #runコマンドではイメージの構築から、コンテナの構築・起動までしてくれる。 docker-compose run <サービス><コマンド> #起動中のコンテナにコマンド実行 docker-compose exec <サービス><コマンド> #コンテナの中に入る(exitで抜ける) docker-compose exec web /bin/bash参考
・Docker ComposeでRailsを構築しよう
・docker-compose upしたときに「A server is already running.」って言われないようにする・mysql8を使いたい場合は下記コードを参照
database.ymlversion: '3' services: db: image: mysql:8.0 command: --default-authentication-plugin=mysql_native_password volumes: - ./src/db/mysql_data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: password #省略
- 投稿日:2021-01-28T00:48:35+09:00
docker コマンドが発行するリクエスト
はじめに
普段意識しませんが、docker コマンドや kubectl コマンドは、API サービスに対し HTTP リクエストを投げています。
今回は何気なく実行している docker コマンドのリクエストの中身を興味本位で見てみました。環境構成
OS:ubuntu 18.04.5
docker-ce:20.10.2前準備
通常は UNIX ドメインソケットで通信を行っているため、今回は TCP の設定を追加します。
docker-ce をインストールした状態で、設定ファイルを変更します。# 起動オプションを追加 $ vim /lib/systemd/system/docker.service 変更前:ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 変更後:ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://127.0.0.1 $ sudo systemctl daemon-reload $ sudo systemctl restart dockerdocker info のリクエストを見てみる
docker コマンドでリクエストを発行してたところを、
tcpdump 使ってリクエストの中身を見てみます。# -i:インタフェースの設定(any:全てのNIC) # -A:受信したパケットを ASCII で表示 $ sudo tcpdump -i any port 2375 -A別のターミナルを起動して、docker コマンドを実行します。
# リクエスト先をオプションで追加 # サブコマンド(今回の場合は info )の前で、接続先指定のオプションを指定すること $ docker -H tcp://127.0.0.1:2375 info Client: Context: default Debug Mode: false ・・・ Server: Containers: 1 Running: 0 Paused: 0 Stopped: 1 Images: 1 Server Version: 20.10.2 Storage Driver: overlay2 ・・・ WARNING: No swap limit support警告は出ましたが、結果がちゃんと返ってきました。
tcpdump を実行していたターミナルを見てみましょう。
※SYN/FINなどを除外して、抜粋しています05:16:44.346065 IP localhost.34928 > localhost.2375: Flags [P.], seq 1:90, ack 1, win 512, options [nop,nop,TS val 1763342899 ecr 1763342899], length 89 E...|.@.@............p G+[..Q8............. i.z3i.z3HEAD /_ping HTTP/1.1 Host: 127.0.0.1:2375 User-Agent: Docker-Client/20.10.2 (linux) 05:16:44.352702 IP localhost.2375 > localhost.34928: Flags [P.], seq 281:3193, ack 183, win 512, options [nop,nop,TS val 1763342906 ecr 1763342900], length 2912 E.....@.@.W......... G.pQ8..+[...... ...... i.z:i.z4HTTP/1.1 200 OK Api-Version: 1.41 Content-Type: application/json Docker-Experimental: false Ostype: linux Server: Docker/20.10.2 (linux) Date: Sat, 09 Jan 2021 05:16:44 GMT Transfer-Encoding: chunked a82 {"ID":"K5WR:OGR6:DCUW:U6FT:IVPQ:XZGL:VZRO:I2AS:6XFP:CPES:DKDE:5C6E","Containers":1,"ContainersRunning":0,"ContainersPaused":0,"ContainersStopped":1,"Images":1,"Driver":"overlay2","DriverStatus":[["Backing Filesystem","extfs"],["Supports d_type","true"],["Native Overlay Diff","true"]],"Plugins":{"Volume":["local"],"Network":["bridge","host","ipvlan","macvlan","null","overlay"],"Authorization":null,"Log":["awslogs","fluentd","gcplogs","gelf","journald","json-file","local","logentries","splunk","syslog"]},"MemoryLimit":true,"SwapLimit":false,"KernelMemory":true,"KernelMemoryTCP":true,"CpuCfsPeriod":true,"CpuCfsQuota":true,"CPUShares":true,"CPUSet":true,"PidsLimit":true,"IPv4Forwarding":true,"BridgeNfIptables":true,"BridgeNfIp6tables":true,"Debug":false,"NFd":23,"OomKillDisable":true,"NGoroutines":34,"SystemTime":"2021-01-09T05:16:44.346767868Z","LoggingDriver":"json-file","CgroupDriver":"cgroupfs","CgroupVersion":"1","NEventsListener":0,"KernelVersion":"4.15.0-124-generic","OperatingSystem":"Ubuntu 18.04.5 LTS","OSVersion":"18.04","OSType":"linux","Architecture":"x86_64","IndexServerAddress":"https://index.docker.io/v1/","RegistryConfig":{"AllowNondistributableArtifactsCIDRs":[],"AllowNondistributableArtifactsHostnames":[],"InsecureRegistryCIDRs":["127.0.0.0/8"],"IndexConfigs":{"docker.io":{"Name":"docker.io","Mirrors":[],"Secure":true,"Official":true}},"Mirrors":[]},"NCPU":2,"MemTotal":4136148992,"GenericResources":null,"DockerRootDir":"/var/lib/docker","HttpProxy":"","HttpsProxy":"","NoProxy":"","Name":"ubuntu","Labels":[],"ExperimentalBuild":false,"ServerVersion":"20.10.2","Runtimes":{"io.containerd.runc.v2":{"path":"runc"},"io.containerd.runtime.v1.linux":{"path":"runc"},"runc":{"path":"runc"}},"DefaultRuntime":"runc","Swarm":{"NodeID":"","NodeAddr":"","LocalNodeState":"inactive","ControlAvailable":false,"Error":"","RemoteManagers":null},"LiveRestoreEnabled":false,"Isolation":"","InitBinary":"docker-init","ContainerdCommit":{"ID":"269548fa27e0089a8b8278fc4fc781d7f65a939b","Expected":"269548fa27e0089a8b8278fc4fc781d7f65a939b"},"RuncCommit":{"ID":"ff819c7e9184c13b7c2607fe6c30ae19403a7aff","Expected":"ff819c7e9184c13b7c2607fe6c30ae19403a7aff"},"InitCommit":{"ID":"de40ad0","Expected":"de40ad0"},"SecurityOptions":["name=apparmor","name=seccomp,profile=default"],"Warnings":["WARNING: API is accessible on http://127.0.0.1:2375 without encryption.\n Access to the remote API is equivalent to root access on the host. Refer\n to the 'Docker daemon attack surface' section in the documentation for\n more information: https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface","WARNING: No swap limit support"]} 0ちょっと整形して見やすくすると、
# docker クライアント(localhsot:34928) から docker サービス(localhst:2375)にリクエストを受信 # HTTP の HEAD メソッドで /_ping にリクエスト 05:16:44.346065 IP localhost.34928 > localhost.2375: Flags [P.], seq 1:90, ack 1, win 512, options [nop,nop,TS val 1763342899 ecr 1763342899], length 89 HEAD /_ping HTTP/1.1 Host: 127.0.0.1:2375 User-Agent: Docker-Client/20.10.2 (linux) # docker サービス(localhst:2375) から docker クライアント(localhsot:34928)にレスポンスを受信 # HTTP ステータスコード 200 と json のデータを受信 05:16:44.352702 IP localhost.2375 > localhost.34928: Flags [P.], seq 281:3193, ack 183, win 512, options [nop,nop,TS val 1763342906 ecr 1763342900], length 2912 HTTP/1.1 200 OK Api-Version: 1.41 Content-Type: application/json Docker-Experimental: false Ostype: linux Server: Docker/20.10.2 (linux) Date: Sat, 09 Jan 2021 05:16:44 GMT Transfer-Encoding: chunked {"ID":"K5WR:OGR6:DCUW:U6FT:IVPQ:XZGL:VZRO:I2AS:6XFP:CPES:DKDE:5C6E","Containers":1,"ContainersRunning":0,"ContainersPaused":0,"ContainersStopped":1,"Images":1,"Driver":"overlay2","DriverStatus":[["Backing Filesystem","extfs"],["Supports d_type","true"],["Native Overlay Diff","true"]],"Plugins":{"Volume":["local"],"Network":["bridge","host","ipvlan","macvlan","null","overlay"],"Authorization":null,"Log":["awslogs","fluentd","gcplogs","gelf","journald","json-file","local","logentries","splunk","syslog"]},"MemoryLimit":true,"SwapLimit":false,"KernelMemory":true,"KernelMemoryTCP":true,"CpuCfsPeriod":true,"CpuCfsQuota":true,"CPUShares":true,"CPUSet":true,"PidsLimit":true,"IPv4Forwarding":true,"BridgeNfIptables":true,"BridgeNfIp6tables":true,"Debug":false,"NFd":23,"OomKillDisable":true,"NGoroutines":34,"SystemTime":"2021-01-09T05:16:44.346767868Z","LoggingDriver":"json-file","CgroupDriver":"cgroupfs","CgroupVersion":"1","NEventsListener":0,"KernelVersion":"4.15.0-124-generic","OperatingSystem":"Ubuntu 18.04.5 LTS","OSVersion":"18.04","OSType":"linux","Architecture":"x86_64","IndexServerAddress":"https://index.docker.io/v1/","RegistryConfig":{"AllowNondistributableArtifactsCIDRs":[],"AllowNondistributableArtifactsHostnames":[],"InsecureRegistryCIDRs":["127.0.0.0/8"],"IndexConfigs":{"docker.io":{"Name":"docker.io","Mirrors":[],"Secure":true,"Official":true}},"Mirrors":[]},"NCPU":2,"MemTotal":4136148992,"GenericResources":null,"DockerRootDir":"/var/lib/docker","HttpProxy":"","HttpsProxy":"","NoProxy":"","Name":"ubuntu","Labels":[],"ExperimentalBuild":false,"ServerVersion":"20.10.2","Runtimes":{"io.containerd.runc.v2":{"path":"runc"},"io.containerd.runtime.v1.linux":{"path":"runc"},"runc":{"path":"runc"}},"DefaultRuntime":"runc","Swarm":{"NodeID":"","NodeAddr":"","LocalNodeState":"inactive","ControlAvailable":false,"Error":"","RemoteManagers":null},"LiveRestoreEnabled":false,"Isolation":"","InitBinary":"docker-init","ContainerdCommit":{"ID":"269548fa27e0089a8b8278fc4fc781d7f65a939b","Expected":"269548fa27e0089a8b8278fc4fc781d7f65a939b"},"RuncCommit":{"ID":"ff819c7e9184c13b7c2607fe6c30ae19403a7aff","Expected":"ff819c7e9184c13b7c2607fe6c30ae19403a7aff"},"InitCommit":{"ID":"de40ad0","Expected":"de40ad0"},"SecurityOptions":["name=apparmor","name=seccomp,profile=default"],"Warnings":["WARNING: API is accessible on http://127.0.0.1:2375 without encryption.\n Access to the remote API is equivalent to root access on the host. Refer\n to the 'Docker daemon attack surface' section in the documentation for\n more information: https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface","WARNING: No swap limit support"]}整形したjson{ "ID":"K5WR:OGR6:DCUW:U6FT:IVPQ:XZGL:VZRO:I2AS:6XFP:CPES:DKDE:5C6E", "Containers":1, "ContainersRunning":0, "ContainersPaused":0, "ContainersStopped":1, "Images":1, "Driver":"overlay2", "DriverStatus":[ [ "Backing Filesystem", "extfs" ], [ "Supports d_type", "true" ], [ "Native Overlay Diff", "true" ] ], "Plugins":{ "Volume":[ "local" ], "Network":[ "bridge", "host", "ipvlan", "macvlan", "null", "overlay" ], "Authorization":null, "Log":[ "awslogs", "fluentd", "gcplogs", "gelf", "journald", "json-file", "local", "logentries", "splunk", "syslog" ] }, "MemoryLimit":true, "SwapLimit":false, "KernelMemory":true, "KernelMemoryTCP":true, "CpuCfsPeriod":true, "CpuCfsQuota":true, "CPUShares":true, "CPUSet":true, "PidsLimit":true, "IPv4Forwarding":true, "BridgeNfIptables":true, "BridgeNfIp6tables":true, "Debug":false, "NFd":23, "OomKillDisable":true, "NGoroutines":34, "SystemTime":"2021-01-09T05:16:44.346767868Z", "LoggingDriver":"json-file", "CgroupDriver":"cgroupfs", "CgroupVersion":"1", "NEventsListener":0, "KernelVersion":"4.15.0-124-generic", "OperatingSystem":"Ubuntu 18.04.5 LTS", "OSVersion":"18.04", "OSType":"linux", "Architecture":"x86_64", "IndexServerAddress":"https://index.docker.io/v1/", "RegistryConfig":{ "AllowNondistributableArtifactsCIDRs":[ ], "AllowNondistributableArtifactsHostnames":[ ], "InsecureRegistryCIDRs":[ "127.0.0.0/8" ], "IndexConfigs":{ "docker.io":{ "Name":"docker.io", "Mirrors":[ ], "Secure":true, "Official":true } }, "Mirrors":[ ] }, "NCPU":2, "MemTotal":4136148992, "GenericResources":null, "DockerRootDir":"/var/lib/docker", "HttpProxy":"", "HttpsProxy":"", "NoProxy":"", "Name":"ubuntu", "Labels":[ ], "ExperimentalBuild":false, "ServerVersion":"20.10.2", "Runtimes":{ "io.containerd.runc.v2":{ "path":"runc" }, "io.containerd.runtime.v1.linux":{ "path":"runc" }, "runc":{ "path":"runc" } }, "DefaultRuntime":"runc", "Swarm":{ "NodeID":"", "NodeAddr":"", "LocalNodeState":"inactive", "ControlAvailable":false, "Error":"", "RemoteManagers":null }, "LiveRestoreEnabled":false, "Isolation":"", "InitBinary":"docker-init", "ContainerdCommit":{ "ID":"269548fa27e0089a8b8278fc4fc781d7f65a939b", "Expected":"269548fa27e0089a8b8278fc4fc781d7f65a939b" }, "RuncCommit":{ "ID":"ff819c7e9184c13b7c2607fe6c30ae19403a7aff", "Expected":"ff819c7e9184c13b7c2607fe6c30ae19403a7aff" }, "InitCommit":{ "ID":"de40ad0", "Expected":"de40ad0" }, "SecurityOptions":[ "name=apparmor", "name=seccomp,profile=default" ], "Warnings":[ "WARNING: API is accessible on http://127.0.0.1:2375 without encryption.\n Access to the remote API is equivalent to root access on the host. Refer\n to the 'Docker daemon attack surface' section in the documentation for\n more information: https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface", "WARNING: No swap limit support" ] }HTTP の HEAD メソッドで /_ping にリクエストを発行し、レスポンスが 200 OK で json データが返却されているのがわかります。
docker コマンドは レスポンスの json データを整形し、出力しているのが分かります。docker run
今度は
docker run
コマンドでコンテナを起動してみましょう。$ docker -H tcp://localhost:2375 run --name alpine -itd alpine /bin/sh Unable to find image 'alpine:latest' locally latest: Pulling from library/alpine 801bfaa63ef2: Pull complete Digest: sha256:3c7497bf0c7af93428242d6176e8f7905f2201d8fc5861f45be7a346b5f23436 Status: Downloaded newer image for alpine:latest 3733e8696b64ed2207d2b10ffe566dc562309a108b91a2e13278a8d749dcc98etcpdump の結果は以下のとおりです。
※見やすいように整形しています。# HEAD で「/_ping」をリクエスト 05:37:59.128874 IP localhost.34930 > localhost.2375: Flags [P.], seq 1:90, ack 1, win 512, options [nop,nop,TS val 1764617682 ecr 1764617682], length 89 HEAD /_ping HTTP/1.1 Host: localhost:2375 User-Agent: Docker-Client/20.10.2 (linux) # 200 OK を受信 05:37:59.129029 IP localhost.2375 > localhost.34930: Flags [P.], seq 1:281, ack 90, win 512, options [nop,nop,TS val 1764617682 ecr 1764617682], length 280 HTTP/1.1 200 OK Api-Version: 1.41 Cache-Control: no-cache, no-store, must-revalidate Content-Length: 0 Content-Type: text/plain; charset=utf-8 Docker-Experimental: false Ostype: linux Pragma: no-cache Server: Docker/20.10.2 (linux) Date: Sat, 09 Jan 2021 05:37:59 GMT # POST でコンテナ作成をリクエスト 05:37:59.129633 IP localhost.34930 > localhost.2375: Flags [P.], seq 90:1799, ack 281, win 512, options [nop,nop,TS val 1764617683 ecr 1764617682], length 1709 POST /v1.41/containers/create?name=alpine HTTP/1.1 Host: localhost:2375 User-Agent: Docker-Client/20.10.2 (linux) Content-Length: 1536 Content-Type: application/json {"Hostname":"","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":true,"OpenStdin":true,"StdinOnce":false,"Env":null,"Cmd":["/bin/sh"],"Image":"alpine","Volumes":{},"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":{},"HostConfig":{"Binds":null,"ContainerIDFile":"","LogConfig":{"Type":"","Config":{}},"NetworkMode":"default","PortBindings":{},"RestartPolicy":{"Name":"no","MaximumRetryCount":0},"AutoRemove":false,"VolumeDriver":"","VolumesFrom":null,"CapAdd":null,"CapDrop":null,"CgroupnsMode":"","Dns":[],"DnsOptions":[],"DnsSearch":[],"ExtraHosts":null,"GroupAdd":null,"IpcMode":"","Cgroup":"","Links":null,"OomScoreAdj":0,"PidMode":"","Privileged":false,"PublishAllPorts":false,"ReadonlyRootfs":false,"SecurityOpt":null,"UTSMode":"","UsernsMode":"","ShmSize":0,"ConsoleSize":[0,0],"Isolation":"","CpuShares":0,"Memory":0,"NanoCpus":0,"CgroupParent":"","BlkioWeight":0,"BlkioWeightDevice":[],"BlkioDeviceReadBps":null,"BlkioDeviceWriteBps":null,"BlkioDeviceReadIOps":null,"BlkioDeviceWriteIOps":null,"CpuPeriod":0,"CpuQuota":0,"CpuRealtimePeriod":0,"CpuRealtimeRuntime":0,"CpusetCpus":"","CpusetMems":"","Devices":[],"DeviceCgroupRules":null,"DeviceRequests":null,"KernelMemory":0,"KernelMemoryTCP":0,"MemoryReservation":0,"MemorySwap":0,"MemorySwappiness":-1,"OomKillDisable":false,"PidsLimit":0,"Ulimits":null,"CpuCount":0,"CpuPercent":0,"IOMaximumIOps":0,"IOMaximumBandwidth":0,"MaskedPaths":null,"ReadonlyPaths":null},"NetworkingConfig":{"EndpointsConfig":{}},"Platform":null} # 404 を受信(イメージがホストにない) 05:37:59.130445 IP localhost.2375 > localhost.34930: Flags [P.], seq 281:533, ack 1799, win 512, options [nop,nop,TS val 1764617684 ecr 1764617683], length 252 HTTP/1.1 404 Not Found Api-Version: 1.41 Content-Type: application/json Docker-Experimental: false Ostype: linux Server: Docker/20.10.2 (linux) Date: Sat, 09 Jan 2021 05:37:59 GMT Content-Length: 43 {"message":"No such image: alpine:latest"} # GET で docker の情報をリクエスト 05:37:59.130755 IP localhost.34930 > localhost.2375: Flags [P.], seq 1799:1892, ack 533, win 512, options [nop,nop,TS val 1764617684 ecr 1764617684], length 93 GET /v1.41/info HTTP/1.1 Host: localhost:2375 User-Agent: Docker-Client/20.10.2 (linux) # 200 OK を受信(json で docker の情報を取得) 05:37:59.137124 IP localhost.2375 > localhost.34930: Flags [P.], seq 533:3444, ack 1892, win 512, options [nop,nop,TS val 1764617690 ecr 1764617684], length 2911 HTTP/1.1 200 OK Api-Version: 1.41 Content-Type: application/json Docker-Experimental: false Ostype: linux Server: Docker/20.10.2 (linux) Date: Sat, 09 Jan 2021 05:37:59 GMT Transfer-Encoding: chunked {"ID":"K5WR:OGR6:DCUW:U6FT:IVPQ:XZGL:VZRO:I2AS:6XFP:CPES:DKDE:5C6E","Containers":1,"ContainersRunning":0,"ContainersPaused":0,"ContainersStopped":1,"Images":1,"Driver":"overlay2","DriverStatus":[["Backing Filesystem","extfs"],["Supports d_type","true"],["Native Overlay Diff","true"]],"Plugins":{"Volume":["local"],"Network":["bridge","host","ipvlan","macvlan","null","overlay"],"Authorization":null,"Log":["awslogs","fluentd","gcplogs","gelf","journald","json-file","local","logentries","splunk","syslog"]},"MemoryLimit":true,"SwapLimit":false,"KernelMemory":true,"KernelMemoryTCP":true,"CpuCfsPeriod":true,"CpuCfsQuota":true,"CPUShares":true,"CPUSet":true,"PidsLimit":true,"IPv4Forwarding":true,"BridgeNfIptables":true,"BridgeNfIp6tables":true,"Debug":false,"NFd":23,"OomKillDisable":true,"NGoroutines":34,"SystemTime":"2021-01-09T05:37:59.13128067Z","LoggingDriver":"json-file","CgroupDriver":"cgroupfs","CgroupVersion":"1","NEventsListener":0,"KernelVersion":"4.15.0-124-generic","OperatingSystem":"Ubuntu 18.04.5 LTS","OSVersion":"18.04","OSType":"linux","Architecture":"x86_64","IndexServerAddress":"https://index.docker.io/v1/","RegistryConfig":{"AllowNondistributableArtifactsCIDRs":[],"AllowNondistributableArtifactsHostnames":[],"InsecureRegistryCIDRs":["127.0.0.0/8"],"IndexConfigs":{"docker.io":{"Name":"docker.io","Mirrors":[],"Secure":true,"Official":true}},"Mirrors":[]},"NCPU":2,"MemTotal":4136148992,"GenericResources":null,"DockerRootDir":"/var/lib/docker","HttpProxy":"","HttpsProxy":"","NoProxy":"","Name":"ubuntu","Labels":[],"ExperimentalBuild":false,"ServerVersion":"20.10.2","Runtimes":{"io.containerd.runc.v2":{"path":"runc"},"io.containerd.runtime.v1.linux":{"path":"runc"},"runc":{"path":"runc"}},"DefaultRuntime":"runc","Swarm":{"NodeID":"","NodeAddr":"","LocalNodeState":"inactive","ControlAvailable":false,"Error":"","RemoteManagers":null},"LiveRestoreEnabled":false,"Isolation":"","InitBinary":"docker-init","ContainerdCommit":{"ID":"269548fa27e0089a8b8278fc4fc781d7f65a939b","Expected":"269548fa27e0089a8b8278fc4fc781d7f65a939b"},"RuncCommit":{"ID":"ff819c7e9184c13b7c2607fe6c30ae19403a7aff","Expected":"ff819c7e9184c13b7c2607fe6c30ae19403a7aff"},"InitCommit":{"ID":"de40ad0","Expected":"de40ad0"},"SecurityOptions":["name=apparmor","name=seccomp,profile=default"],"Warnings":["WARNING: API is accessible on http://127.0.0.1:2375 without encryption.\n Access to the remote API is equivalent to root access on the host. Refer\n to the 'Docker daemon attack surface' section in the documentation for\n more information: https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface","WARNING: No swap limit support"]} # POST でイメージ作成(取得)をリクエスト 05:37:59.137800 IP localhost.34930 > localhost.2375: Flags [P.], seq 1892:2091, ack 3444, win 512, options [nop,nop,TS val 1764617691 ecr 1764617690], length 199 POST /v1.41/images/create?fromImage=alpine&tag=latest HTTP/1.1 Host: localhost:2375 User-Agent: Docker-Client/20.10.2 (linux) Content-Length: 0 Content-Type: text/plain X-Registry-Auth: e30= # 200 OK でイメージの取得情報を受信 05:38:03.056642 IP localhost.2375 > localhost.34930: Flags [P.], seq 3444:3716, ack 2091, win 512, options [nop,nop,TS val 1764621610 ecr 1764617691], length 272 HTTP/1.1 200 OK Api-Version: 1.41 Content-Type: application/json Docker-Experimental: false Ostype: linux Server: Docker/20.10.2 (linux) Date: Sat, 09 Jan 2021 05:38:03 GMT Transfer-Encoding: chunked {"status":"Pulling from library/alpine","id":"latest"} 05:38:03.105019 IP localhost.34930 > localhost.2375: Flags [.], ack 3716, win 512, options [nop,nop,TS val 1764621658 ecr 1764621610], length 0 05:38:03.946078 IP localhost.2375 > localhost.34930: Flags [P.], seq 3716:3793, ack 2091, win 512, options [nop,nop,TS val 1764622499 ecr 1764621658], length 77 {"status":"Pulling fs layer","progressDetail":{},"id":"801bfaa63ef2"} 05:38:03.946083 IP localhost.34930 > localhost.2375: Flags [.], ack 3793, win 512, options [nop,nop,TS val 1764622499 ecr 1764622499], length 0 05:38:04.811962 IP localhost.2375 > localhost.34930: Flags [P.], seq 3793:3985, ack 2091, win 512, options [nop,nop,TS val 1764623365 ecr 1764622499], length 192 {"status":"Downloading","progressDetail":{"current":29327,"total":2799066},"progress":"[\u003e ] 29.33kB/2.799MB","id":"801bfaa63ef2"} 05:38:04.811967 IP localhost.34930 > localhost.2375: Flags [.], ack 3985, win 511, options [nop,nop,TS val 1764623365 ecr 1764623365], length 0 05:38:04.920582 IP localhost.2375 > localhost.34930: Flags [P.], seq 3985:4179, ack 2091, win 512, options [nop,nop,TS val 1764623474 ecr 1764623365], length 194 {"status":"Downloading","progressDetail":{"current":1096159,"total":2799066},"progress":"[===================\u003e ] 1.096MB/2.799MB","id":"801bfaa63ef2"} 05:38:04.920586 IP localhost.34930 > localhost.2375: Flags [.], ack 4179, win 510, options [nop,nop,TS val 1764623474 ecr 1764623474], length 0 05:38:05.016751 IP localhost.2375 > localhost.34930: Flags [P.], seq 4179:4258, ack 2091, win 512, options [nop,nop,TS val 1764623570 ecr 1764623474], length 79 {"status":"Verifying Checksum","progressDetail":{},"id":"801bfaa63ef2"} 05:38:05.016756 IP localhost.34930 > localhost.2375: Flags [.], ack 4258, win 510, options [nop,nop,TS val 1764623570 ecr 1764623570], length 0 05:38:05.016966 IP localhost.2375 > localhost.34930: Flags [P.], seq 4258:4336, ack 2091, win 512, options [nop,nop,TS val 1764623570 ecr 1764623570], length 78 {"status":"Download complete","progressDetail":{},"id":"801bfaa63ef2"} 05:38:05.016969 IP localhost.34930 > localhost.2375: Flags [.], ack 4336, win 510, options [nop,nop,TS val 1764623570 ecr 1764623570], length 0 05:38:05.017153 IP localhost.2375 > localhost.34930: Flags [P.], seq 4336:4527, ack 2091, win 512, options [nop,nop,TS val 1764623570 ecr 1764623570], length 191 {"status":"Extracting","progressDetail":{"current":32768,"total":2799066},"progress":"[\u003e ] 32.77kB/2.799MB","id":"801bfaa63ef2"} 05:38:05.017157 IP localhost.34930 > localhost.2375: Flags [.], ack 4527, win 509, options [nop,nop,TS val 1764623570 ecr 1764623570], length 0 05:38:05.181267 IP localhost.2375 > localhost.34930: Flags [P.], seq 4527:4719, ack 2091, win 512, options [nop,nop,TS val 1764623735 ecr 1764623570], length 192 {"status":"Extracting","progressDetail":{"current":360448,"total":2799066},"progress":"[======\u003e ] 360.4kB/2.799MB","id":"801bfaa63ef2"} 05:38:05.181278 IP localhost.34930 > localhost.2375: Flags [.], ack 4719, win 508, options [nop,nop,TS val 1764623735 ecr 1764623735], length 0 05:38:05.222125 IP localhost.2375 > localhost.34930: Flags [P.], seq 4719:4912, ack 2091, win 512, options [nop,nop,TS val 1764623775 ecr 1764623735], length 193 {"status":"Extracting","progressDetail":{"current":2799066,"total":2799066},"progress":"[==================================================\u003e] 2.799MB/2.799MB","id":"801bfaa63ef2"} 05:38:05.222131 IP localhost.34930 > localhost.2375: Flags [.], ack 4912, win 507, options [nop,nop,TS val 1764623775 ecr 1764623775], length 0 05:38:05.274502 IP localhost.2375 > localhost.34930: Flags [P.], seq 4912:4986, ack 2091, win 512, options [nop,nop,TS val 1764623828 ecr 1764623775], length 74 {"status":"Pull complete","progressDetail":{},"id":"801bfaa63ef2"} 05:38:05.274512 IP localhost.34930 > localhost.2375: Flags [.], ack 4986, win 507, options [nop,nop,TS val 1764623828 ecr 1764623828], length 0 05:38:05.379954 IP localhost.2375 > localhost.34930: Flags [P.], seq 4986:5086, ack 2091, win 512, options [nop,nop,TS val 1764623933 ecr 1764623828], length 100 {"status":"Digest: sha256:3c7497bf0c7af93428242d6176e8f7905f2201d8fc5861f45be7a346b5f23436"} 05:38:05.379963 IP localhost.34930 > localhost.2375: Flags [.], ack 5086, win 507, options [nop,nop,TS val 1764623933 ecr 1764623933], length 0 05:38:05.398799 IP localhost.2375 > localhost.34930: Flags [P.], seq 5086:5155, ack 2091, win 512, options [nop,nop,TS val 1764623952 ecr 1764623933], length 69 {"status":"Status: Downloaded newer image for alpine:latest"} # POST でコンテナ作成を再リクエスト 05:38:05.420352 IP localhost.34930 > localhost.2375: Flags [.], ack 5160, win 507, options [nop,nop,TS val 1764623974 ecr 1764623974], length 0 05:38:05.420485 IP localhost.34930 > localhost.2375: Flags [P.], seq 2091:3800, ack 5160, win 512, options [nop,nop,TS val 1764623974 ecr 1764623974], length 1709 POST /v1.41/containers/create?name=alpine HTTP/1.1 Host: localhost:2375 User-Agent: Docker-Client/20.10.2 (linux) Content-Length: 1536 Content-Type: application/json {"Hostname":"","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":true,"OpenStdin":true,"StdinOnce":false,"Env":null,"Cmd":["/bin/sh"],"Image":"alpine","Volumes":{},"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":{},"HostConfig":{"Binds":null,"ContainerIDFile":"","LogConfig":{"Type":"","Config":{}},"NetworkMode":"default","PortBindings":{},"RestartPolicy":{"Name":"no","MaximumRetryCount":0},"AutoRemove":false,"VolumeDriver":"","VolumesFrom":null,"CapAdd":null,"CapDrop":null,"CgroupnsMode":"","Dns":[],"DnsOptions":[],"DnsSearch":[],"ExtraHosts":null,"GroupAdd":null,"IpcMode":"","Cgroup":"","Links":null,"OomScoreAdj":0,"PidMode":"","Privileged":false,"PublishAllPorts":false,"ReadonlyRootfs":false,"SecurityOpt":null,"UTSMode":"","UsernsMode":"","ShmSize":0,"ConsoleSize":[0,0],"Isolation":"","CpuShares":0,"Memory":0,"NanoCpus":0,"CgroupParent":"","BlkioWeight":0,"BlkioWeightDevice":[],"BlkioDeviceReadBps":null,"BlkioDeviceWriteBps":null,"BlkioDeviceReadIOps":null,"BlkioDeviceWriteIOps":null,"CpuPeriod":0,"CpuQuota":0,"CpuRealtimePeriod":0,"CpuRealtimeRuntime":0,"CpusetCpus":"","CpusetMems":"","Devices":[],"DeviceCgroupRules":null,"DeviceRequests":null,"KernelMemory":0,"KernelMemoryTCP":0,"MemoryReservation":0,"MemorySwap":0,"MemorySwappiness":-1,"OomKillDisable":false,"PidsLimit":0,"Ulimits":null,"CpuCount":0,"CpuPercent":0,"IOMaximumIOps":0,"IOMaximumBandwidth":0,"MaskedPaths":null,"ReadonlyPaths":null},"NetworkingConfig":{"EndpointsConfig":{}},"Platform":null} # 201 で作成した旨を受信 05:38:05.526077 IP localhost.2375 > localhost.34930: Flags [P.], seq 5160:5455, ack 3800, win 512, options [nop,nop,TS val 1764624079 ecr 1764623974], length 295 HTTP/1.1 201 Created Api-Version: 1.41 Content-Type: application/json Docker-Experimental: false Ostype: linux Server: Docker/20.10.2 (linux) Date: Sat, 09 Jan 2021 05:38:05 GMT Content-Length: 88 {"Id":"3733e8696b64ed2207d2b10ffe566dc562309a108b91a2e13278a8d749dcc98e","Warnings":[]} # POST でコンテナの停止待ち 05:38:05.527811 IP localhost.34930 > localhost.2375: Flags [P.], seq 3800:4035, ack 5455, win 512, options [nop,nop,TS val 1764624081 ecr 1764624079], length 235 POST /v1.41/containers/3733e8696b64ed2207d2b10ffe566dc562309a108b91a2e13278a8d749dcc98e/wait?condition=next-exit HTTP/1.1 Host: localhost:2375 User-Agent: Docker-Client/20.10.2 (linux) Content-Length: 0 Content-Type: text/plain 05:38:05.528158 IP localhost.2375 > localhost.34930: Flags [P.], seq 5455:5665, ack 4035, win 512, options [nop,nop,TS val 1764624081 ecr 1764624081], length 210 HTTP/1.1 200 OK Api-Version: 1.41 Content-Type: application/json Docker-Experimental: false Ostype: linux Server: Docker/20.10.2 (linux) Date: Sat, 09 Jan 2021 05:38:05 GMT Transfer-Encoding: chunked # POST でコンテナを起動 05:38:05.528488 IP localhost.34950 > localhost.2375: Flags [P.], seq 1:217, ack 1, win 512, options [nop,nop,TS val 1764624082 ecr 1764624082], length 216 POST /v1.41/containers/3733e8696b64ed2207d2b10ffe566dc562309a108b91a2e13278a8d749dcc98e/start HTTP/1.1 Host: localhost:2375 User-Agent: Docker-Client/20.10.2 (linux) Content-Length: 0 Content-Type: text/plain # 正常に開始をレスポンス 05:38:06.047454 IP localhost.2375 > localhost.34950: Flags [P.], seq 1:159, ack 217, win 512, options [nop,nop,TS val 1764624601 ecr 1764624082], length 158 HTTP/1.1 204 No Content Api-Version: 1.41 Docker-Experimental: false Ostype: linux Server: Docker/20.10.2 (linux) Date: Sat, 09 Jan 2021 05:38:06 GMT簡単にリクエストをまとめると、
- HEAD で「/_ping」をリクエスト
⇒ 200 OK を受信- POST でコンテナ作成をリクエスト
⇒ 404 を受信(イメージがホストにない)- GET で docker の情報をリクエスト
⇒ 200 OK を受信(json で docker の情報を取得)- POST でイメージ作成(取得)をリクエスト
⇒ 200 OK でイメージの取得情報を受信- POST でコンテナ作成を再リクエスト
⇒ 201 で作成した旨を受信- POST でコンテナの停止待ち
- POST でコンテナを起動
⇒ 正常に開始をレスポンスおわりに
docker のリクエスト、レスポンスを今回は確認してみました。
docker のサブコマンド一つ取っても多くのリクエストが発行されていることが分かりました。今回利用した docker のバージョンの API リファレンスは以下になります。ご参考までに。
https://docs.docker.com/engine/api/v1.41/
- 投稿日:2021-01-28T00:33:31+09:00
はじめてのdocker
勉強前イメージ
知ってはいるけど、触ったことないし最初難しそう....
dockerのインストール・設定
- インストール
yum update yum search docker yum install -y docker
- dockerの起動・自動起動設定
systemctl start docker systemctl enable docker
- バージョン確認
docker -vubuntuの環境を立ててみる
- ubuntuのコンテナを検索
docker search ubuntu ========== INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/ubuntu Ubuntu is a Debian-based Linux operating s... 11721 [OK] docker.io docker.io/dorowu/ubuntu-desktop-lxde-vnc Docker image to provide HTML5 VNC interfac... 487 [OK] docker.io docker.io/websphere-liberty WebSphere Liberty multi-architecture image... 266 [OK] docker.io docker.io/rastasheep/ubuntu-sshd Dockerized SSH service, built on top of of... 250 [OK] docker.io docker.io/consol/ubuntu-xfce-vnc Ubuntu container with "headless" VNC sessi... 231 [OK] docker.io docker.io/ubuntu-upstart Upstart is an event-based replacement for ... 110 [OK] docker.io docker.io/neurodebian NeuroDebian provides neuroscience research... 78 [OK] docker.io docker.io/1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 50 [OK] docker.io docker.io/ubuntu-debootstrap debootstrap --variant=minbase --components... 44 [OK] docker.io docker.io/open-liberty Open Liberty multi-architecture images bas... 42 [OK] docker.io docker.io/i386/ubuntu Ubuntu is a Debian-based Linux operating s... 24 docker.io docker.io/nuagebec/ubuntu Simple always updated Ubuntu docker images... 24 [OK] docker.io docker.io/1and1internet/ubuntu-16-apache-php-5.6 ubuntu-16-apache-php-5.6 14 [OK] docker.io docker.io/1and1internet/ubuntu-16-apache-php-7.0 ubuntu-16-apache-php-7.0 13 [OK] docker.io docker.io/1and1internet/ubuntu-16-nginx-php-phpmyadmin-mariadb-10 ubuntu-16-nginx-php-phpmyadmin-mariadb-10 11 [OK] docker.io docker.io/1and1internet/ubuntu-16-nginx-php-5.6-wordpress-4 ubuntu-16-nginx-php-5.6-wordpress-4 8 [OK] docker.io docker.io/1and1internet/ubuntu-16-apache-php-7.1 ubuntu-16-apache-php-7.1 6 [OK] docker.io docker.io/1and1internet/ubuntu-16-nginx-php-7.0 ubuntu-16-nginx-php-7.0 4 [OK] docker.io docker.io/pivotaldata/ubuntu A quick freshening-up of the base Ubuntu d... 4 docker.io docker.io/pivotaldata/ubuntu16.04-build Ubuntu 16.04 image for GPDB compilation 2 docker.io docker.io/1and1internet/ubuntu-16-php-7.1 ubuntu-16-php-7.1 1 [OK] docker.io docker.io/1and1internet/ubuntu-16-sshd ubuntu-16-sshd 1 [OK] docker.io docker.io/pivotaldata/ubuntu-gpdb-dev Ubuntu images for GPDB development 1 docker.io docker.io/smartentry/ubuntu ubuntu with smartentry 1 [OK] docker.io docker.io/pivotaldata/ubuntu16.04-test Ubuntu 16.04 image for GPDB testing 0 ==========
- dockerコンテナをダウンロード
コマンドは
docker pull イメージ名
を使用しますdocker pull ubuntu ========== [root@localhost ~]# docker pull ubuntu Using default tag: latest Trying to pull repository docker.io/library/ubuntu ... latest: Pulling from docker.io/library/ubuntu 83ee3a23efb7: Pull complete db98fc6f11f0: Pull complete f611acd52c6c: Pull complete Digest: sha256:703218c0465075f4425e58fac086e09e1de5c340b12976ab9eb8ad26615c3715 Status: Downloaded newer image for docker.io/ubuntu:latest ==========
- ダウンロードしてきたイメージを確認
docker images ========== REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/ubuntu latest f63181f19b2f 34 hours ago 72.9 MB ==========
- dockerコンテナの実行
コマンドは
docker run オプション イメージID
を使用します
イメージIDは↑で出力されている、f63181f19b2f
です。
オプションは -it でターミナル上での操作が可能です。docker run -it f63181f19b2f ========== [root@localhost ~]# docker run -it f63181f19b2f root@04632dddfde1:~# cat /etc/os-release NAME="Ubuntu" VERSION="20.04.1 LTS (Focal Fossa)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 20.04.1 LTS" VERSION_ID="20.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" VERSION_CODENAME=focal UBUNTU_CODENAME=focal root@04632dddfde1:~# ==========
- コンテナから抜ける
exit で抜けれます
root@04632dddfde1:~# exit exit [root@localhost ~]#
- dockerの状態を確認
docker ps -a ========== [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 04632dddfde1 f63181f19b2f "/bin/bash" 6 minutes ago Exited (0) 4 minutes ago naughty_keller ==========
- dockerを停止
docker stop コンテナID
で停止させることができますdocker stop 04632dddfde1 ========== [root@localhost ~]# docker stop 04632dddfde1 04632dddfde1 ==========勉強後イメージ
インストールしてコンテナを実行するまでしかできてないけど、案外簡単にできたかも?
次はコンテナ上でいろいろしてみたい参考