20210128のdockerに関する記事は16件です。

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 ls
CONTAINER 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.rb
require 'sinatra'

get '/' do
  'Hello world!'
end

myapp.rbは上記のように記述します。

myapp.rbをコンテナ内にコピーします。

~/sinatra_test$ docker container cp myapp.rb sinatra_test:/

ここからはコンテナ内で作業をしていきます。

$ docker container exec -it sinatra_test bash
root@d4f1f93f0c61:/#

コンテナ内に入れました。まずはコピーしたmyapp.rbが存在するか見てみます。

root@d4f1f93f0c61:/# ls
bin  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 -v
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux]

Sinatraをインストールします。

root@d4f1f93f0c61:/# gem install sinatra
Fetching 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 webrick
Fetching webrick-1.7.0.gem
Successfully installed webrick-1.7.0
1 gem installed

webrickがインストールされたのでもう一度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を揃えたほうがいいことがわかりました。

この記事が少しでも皆さんのお役に立てれば幸いです。

参考サイト

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 -d

hostsの書き換え

リポジトリのREADMEに書いてある通り進めていきます。
ローカルのhostsファイルに以下を追記。

127.0.0.1 symfony.localhost

hostsの場所

Windowsの場合

C:\Windows\System32\drivers\etc

macの場合

/private/etc/hosts

※違ってたらご指摘お願いします。

コンテナへ入る

$ docker exec -it php-fpm sh

symfonyプロジェクトのインストール

# composer create-project symfony/website-skeleton . 4.2.x

バージョンを変えたい方は末尾の数字を変えてください。
今回は4.2.xを指定しています。

確認

http://symfony.localhost/

image.png

終わりです!

これで環境構築は終わりです。
多分これが一番早いと思います。
kibanaとかxdebugはREADME読めばすぐにわかるハズ。

さいごに

チュートリアルでサンプルを作成しましたが、Symfony4の参考書も購入してみました。
とても読みやすいので最初はおすすめです。

https://www.amazon.co.jp/dp/B07NQ5WH6R/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.tf
terraform {
  # 本体のバージョン指定
  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
}


  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

「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で白背景と黒背景にした例ですが、特に設定変更することなく自動で切り替わります。

image.png
image.png

ちなみに自動検出の方法は以前記事にしたので方法に興味のある方はご覧ください。

ターミナルの背景色を取得する

スレッド情報を表示する

これはかなり以前からの要望だったのですが、スレッドの情報も(特にツリーモードで)表示したいというものがあり、今回Linux限定ですが対応しました。
下のようにPIDが[]で囲まれたものがスレッドです。

image.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.sh
export 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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

とりあえず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/cudaREPOSITORY, コロンの後の11.2.0-runtime-ubuntu20.04TAGといいます)

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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[小ネタ]Dockerのnginxコンテナ内で設定更新する

背景

docker-compose でローカル開発している中で、nginxの設定(nginx.conf)を変更した後にコンテナ内部で

コンテナ内部
service nginx restart

したらコンテナが終了してしまった。

結論

コンテナ内部
service nginx reload

で対応すると終了しない。restart だとnginxのプロセスが終わるので処理が終わったとみなされるという事かな。
もちろんDockerコンテナ再起動するのが王道。

ホスト
# 最後のnginxはコンテナ名でなく、サービス名
docker-compsose restart nginx

でも細かくいろいろやりたい時とかにコンテナ再起動までしたくないケースで使えるかと。

再現テスト

docker-compose.yml
version: '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

今度はコンテナ終了しません。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 quit

exec 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のDockerfile
FROM 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
└── workspace
docker-compose.yml
version: '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.4

envとは何か

本件ではあまり触れなかったが、気になったのでメモっておく。
「.envファイル」だが、ladarac直下にある。
envというと、envコマンド、.envファイルがあるらしいが、
「.envファイル」は環境変数を記載し、他で使用するためのものである

env(エンブ)は Unix系オペレーティングシステム (OS) で使われるユーティリティである。環境変数のリストを出力したり、現在の環境を変えることなく異なる環境変数の下で他のコマンドを実行するのに使われる。envを使うことで、変数の追加や削除、変数の値の変更を行える。
( https://ja.wikipedia.org/wiki/Env を参照)

.envファイルの説明で下記等を参考
https://qiita.com/harutakaoka522/items/e0abddfd0311eb4fb32b

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【docker初心者】phpMyadmin on dockerを使ってみた

docker環境でLaravelアプリを作成しています。
元々学習していた教材でphpMyadmin on dockerを使っていたので
自分でもできるかなと思い挑戦してみました。

こちらの記事を拝見させていただきました!
感謝です!

公式からimageをとってくる

公式サイトに行きます。
スクリーンショット 2021-01-27 20.02.01.png

上の画像のように公式のGithubに行きます。

スクリーンショット 2021-01-27 20.12.34.png

画像のようにdocker-compose.ymlのファイルを開きます。

スクリーンショット 2021-01-27 20.14.36.png

上の画像のように囲んだところのコードをコピーします。

そして自分のdocker-compose.ymlに貼ります。

docker-compose.yml
phpmyadmin:
    image: phpmyadmin
    container_name: phpmyadmin
    environment:
     - PMA_ARBITRARY=1
    restart: always
    ports:
     - 8080:80
    volumes:

これでコンテナを起動します。

ターミナル
docker-compose up -d

そしてhttp://localhost:8080にアクセスします。

スクリーンショット 2021-01-27 23.30.06.png

が、ここでデータベース名ユーザー名パスワードを入れる画面が出てきたのですが何のこっちゃって感じです。
知識なさすぎて悲しくなる。

先ほどの参考にしたサイトでは

docker-compose.yml
phpmyadmin:
  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.yml
  db:
    build: ./infra/mysql
    volumes:
      - db-store:/var/lib/mysql

となっていたので
データベース名はdb

ユーザー名パスワード

mysql/Dockerfile
MYSQL_USER= <ここ>
MYSQL_PASSWORD= <ここ>

ここに記載されていたものを入れて無事に使えるようになりました!

docker-compose.ymlは以下のように

docker-compose.yml
phpmyadmin:
    image: phpmyadmin
    container_name: phpmyadmin
    environment:
     - PMA_ARBITRARY=1
    restart: always
    ports:
     - 8080:80
    volumes:

元に戻してます。

メンターさん感謝です!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[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"

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

書籍「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 axwf

PID16の/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  supervise

cronは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 axwf

Dockerイメージを構築する

[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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

書籍「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 kB
digest名を指定した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 kB
ENV 環境変数の指定

以下のどちらのファイルの書き方でも指定できる

[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 MB

step3/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 MB   
LABEL メタデータの付与
[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 MB    
SHELL [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 7dfba7eb3110
WORKDIR 相対パスを指定した時のディレクトリを指定

複数回記述した場合はその都度ワークディレクトリが変わる

[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 d85bec60cbbd
ADD ファイル、ディレクトリ、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 f1d67759af12
COPY ※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 443
ENTRYPOINT コンテナ起動時の実行コマンドを指定

RUNコマンドと同様に2種類(1.shell form, 2. exec form(推奨))の書き方がある。
docker run実行時に引数が設定された場合、EXTRYPOINTのコマンドの引数となって実行される。
ENTRYPOINTを複数記述した場合は最後の記述のみ有効となる。

例えば、以下の通り1.shell formでは記述したコマンドはPID 1以外、 2.exec formで記述したコマンドはPID 1となる。
しかし、docker stopdocker 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
done

2.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 top   

docker 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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

書籍「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-compose

Dockerコマンド利用例

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 kB

Dockerイメージから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-TTY

Dockerコンテナ一覧の確認 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_noether

Dockerコンテナ上でコマンド実行 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
exit

Dockerコンテナの現在の状態からイメージを作成 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_0

Dockerイメージの削除 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 kB

Dockerイメージをファイルから読み込む 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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker】Rails6を構築+便利コマンド

前提知識

Dockerに関する詳しい解説は下記URLを参照
・【図解】Dockerの全体像を理解する

Docker

仮想環境を構築するための道具

イメージ

Dockerコンテナを実行する際に必要なもの

Dockerfile

イメージを作成するためのファイル

コンテナ

仮想環境そのもの

Docker Compose

複数のアプリケーションをまとめて操作できる仕組み(例:DBとWEB、WEBはRailsのこと)

本編

1.アプリ名でフォルダを作成

Console
yuki@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  src

3.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 install

FROM:使用するイメージとバージョン
RUN:コマンドの実行
WORKDIR:作業ディレクトリの設定
COPY:コピー元とコピー先のファイルまたはディレクトリを指定

詳しくは下記URLのコードリストを参照
・Dockerfileの書き方と使い方

3.Gemfileを編集

src/Gemfile
source 'https://rubygems.org'
gem 'rails', '~> 6.1.0'

4.docker-compose.ymlを編集

docker-compose.ymlを設定することで一つのコマンドでDBとWEBが両方起動するようになる。

docker-compose.yml
version: "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:
      - db

version:docker-composeのバージョンを指定
depends_on:依存関係を示していて、起動順を制御できる。ここでは「db→web」へと起動する。
service:Docker composeでは、アプリケーションを動かすための各要素をserviceと呼ぶ。通常はweb(rails)とdb(mysql)と名付ける。

4.Railsアプリケーションを作成

docker-compose run web〜はコンテナ側で作動させるコマンド

Console
yuki@yuki docker-test % docker-compose run web rails new . --force --database=mysql

上記のコマンドによりGemfileやDockerファイルが更新される。その様な場合はイメージをbuildし直す必要がある。

Console
yuki@yuki docker-test % docker-compose build

5.データベースを設定

database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  #追記
  password: password
  #データベースの接続先をDBに変更
  host: db

6.コンテナにDBを作成

Console
yuki@yuki docker-test % docker-compose run web rails db:create   

7.Railsを起動

Console
yuki@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.yml
version: '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
   #省略
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 docker

docker 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
3733e8696b64ed2207d2b10ffe566dc562309a108b91a2e13278a8d749dcc98e

tcpdump の結果は以下のとおりです。
※見やすいように整形しています。

# 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

簡単にリクエストをまとめると、

  1. HEAD で「/_ping」をリクエスト
    ⇒ 200 OK を受信
  2. POST でコンテナ作成をリクエスト
    ⇒ 404 を受信(イメージがホストにない)
  3. GET で docker の情報をリクエスト
    ⇒ 200 OK を受信(json で docker の情報を取得)
  4. POST でイメージ作成(取得)をリクエスト
    ⇒ 200 OK でイメージの取得情報を受信
  5. POST でコンテナ作成を再リクエスト
    ⇒ 201 で作成した旨を受信
  6. POST でコンテナの停止待ち
  7. POST でコンテナを起動
    ⇒ 正常に開始をレスポンス

おわりに

docker のリクエスト、レスポンスを今回は確認してみました。
docker のサブコマンド一つ取っても多くのリクエストが発行されていることが分かりました。

今回利用した docker のバージョンの API リファレンスは以下になります。ご参考までに。
https://docs.docker.com/engine/api/v1.41/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

はじめてのdocker

勉強前イメージ

知ってはいるけど、触ったことないし最初難しそう....

dockerのインストール・設定

  • インストール
yum update
yum search docker
yum install -y docker
  • dockerの起動・自動起動設定
systemctl start docker
systemctl enable docker
  • バージョン確認
docker -v

ubuntuの環境を立ててみる

  • 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
==========

勉強後イメージ

インストールしてコンテナを実行するまでしかできてないけど、案外簡単にできたかも?
次はコンテナ上でいろいろしてみたい

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む