20190503のdockerに関する記事は13件です。

Docker のインストール on Ubuntu

2018.11 頃に書いて放置していた下書きの供養記事。
気が向いたら最近の状況に合わせて更新。


Docker (と Ubuntu) のインストールについてのメモ。
Docker Compose もインストールする。

Ubuntu のインストール

Docker を動作させるための OS をインストールする。
雑誌 (日経Linux) の付録で Ubuntu 18.04 LTS があったのでそれを試すことにした。

付録のものはサーバ版ではなくデスクトップ版だが、不要なパッケージは削除すればいいと思ってそのまま使用した 1
ざっと調べた感じではサーバ版とデスクトップ版はカーネルが少し違うらしい。特に問題にはならないはず。
また、サーバ版は日本語インストーラがないらしく、インストール後に言語設定が必要になる。デスクトップ版はその辺を省略できるので少し楽かもしれない。

  1. OS をインストール。
    • デフォルトの構成ではオフィスソフトやゲーム等が入るようなので、それらのない最小構成を選択した。
    • インストールが完了するとDVD の自動取り出しと再起動ボタンの表示がされるので、DVD をトレイから外して再起動ボタンを押す。
  2. 再起動後の作業。
    • 諸々のパッケージを更新する。
      • sudo apt update
      • sudo apt upgrade
    • ネットワーク設定をごにょごにょ。
      • /etc/netplan/ にある YAML ファイルを適宜変更して sudo netplan apply
    • SSH 接続して作業したい。
      • sudo apt install openssh-server
    • デフォルトのエディタが nano 。人権がない :neutral_face: 。Vim を入れる。
      • sudo apt install vim
      • sudo update-alternatives --config editorvim.basic を選択。

Docker のインストール

Docker でググると色々情報が出てくるが、公式サイトに Ubuntu (とその他メジャーな OS) についてのインストール手順があるのでそれを参考にする。

Prerequisites

Docker インストール前の準備。

Docker EE customers

Docker EE (Enterprise Edtion) をインストールしたい人は別のエントリを参考にしてね、という案内文。
今回は Docker CE (Community Edition) をインストールするのでここはスルー。

OS requirements

OS の要件。
今回は x86_64 環境に Ubuntu 18.04 LTS をインストールしてある。ここも特に気にしなくてよし。

Uninstall old versions

dockerdocker-engine パッケージをはもう古いもの(なのでアンインストールする必要がある)らしい。おお、マジか。
今は docker-ce パッケージとのこと。
ググると古いパッケージでインストール手順を紹介している記事が多いので注意しよう。

  • 一方で Ubuntu のパッケージ管理用のコマンドが apt ではなく apt-get で記載されてたりする。適宜読み替えていこう。

Supported storage drivers

サポートしているストレージドライバの話。
ストレージドライバとは…? :kissing:  とりあえず後回し。

Install Docker CE

Docker のインストール。
やり方は下記の 3種類がある。

  • 大抵は Docker リポジトリを設定してそこからインストールする。公式のオススメはコレとのこと。
  • ダウンロードした DEB の Docker パッケージを手動でインストールする。ネットに繋げない状況では便利。
    • ダウンロードはネットに繋げる環境でやる必要がある。
  • テストおよび開発環境ではインストール用のスクリプトを使うこともできる。いくつかリスクがあるので本番環境での使用はオススメしない。

Install using the repository

Docker リポジトリを設定して Docker をインストールする。

$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt install docker-ce
$ sudo docker container run --rm hello-world

Install from a package

DEB パッケージからのインストール。今回はスルー。

Install using the convenience script

スクリプトを使用してのインストール。今回はスルー。

Uninstall Docker CE

Docker のアンインストール。
アンインストールが必要になったとき参照する。

Docker インストール後の設定

Manage Docker as a non-root user

sudo なしで docker コマンドを実行するための設定をする 2

$ sudo groupadd docker
groupadd: グループ 'docker' は既に存在します
$ sudo usermod -aG docker $USER

グループの設定を反映させるため、一度ログアウトして再度ログインする。

$ docker container run --rm hello-world

この後 $HOME/.docker を作り直す or オーナーとアクセス権限を変更する旨の手順があるが、
そもそも $HOME/.docker が存在しなかった。
このディレクトリは自動的に作成されるとのことなので、とりあえず気にしないことにした。

Configure Docker to start on boot

OS の起動時に Docker サービスを開始するよう設定する。

$ sudo systemctl enable docker

以降の手順は急いでやる必要はない気がしたので、Docker の設定は一旦ここまでとする。

Docker Compose のインストール

Docker のコンテナ管理をサポートする Docker Compose をインストールする。

Prerequisites

Docker Compose インストール前の準備。
Docker のインストールが終わっていれば特にやることはない。

Install Compose

Docker Compose のインストール。
注意書きにあるように Docker Compose のリリースを確認して最新版をインストールする。
1.23 がまだ RC版だったので、今回はバージョン 1.22 をインストールした。

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version

コマンドの補完ができると便利なので Command-line completion もインストールする。

$ sudo curl -L https://raw.githubusercontent.com/docker/compose/1.22.0/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

Master builds

開発中バージョンの 入手方法の紹介。今回は不要なのでスルー。

Upgrading

Docker Compose 1.3 からコンテナの扱いが変わったので
1.2 以前のバージョンを使用していればアップグレードしましょう、というお話。
今回は気にしなくてよい。

Uninstallation

Docker Compose のアンインストール。
Docker 同様にアンインストールが必要になったとき参照する。


  1. インストール後、実際にデスクトップ関連のパッケージを削除して再起動をかけたところ OS が起動しなくなった。色々試したが諦めて OS を再インストールすることにした。デスクトップ版のパッケージ(約1~2GB)はあっても特に困るものではないので、余計なことはしない方がよい。 

  2. 公式の記事で Warning とされているように、本当はよくない。責任の取れる範囲でやりましょう。 

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

Docker で RSpec の System Spec を実行するための設定メモ

はじめに

docker 環境で rspec の system spec を実行させるための設定に手間取ったので、メモ代わりに書いておきます。
railsが動くdocker の image に chrome をインストールするのもちょっとなあと思ったので、 selenium/standalone-chrome-debug
を使う方法です。

確認した Rails 環境は、5.2.2 です。

ちなみに Gemfile でバージョン指定はしていませんが、Gemfile.lock を確認したところ

capybara (3.14.0)
rspec-rails (3.8.2)
selenium-webdriver (3.141.0)

となってました。

docker-compose.yml の編集

chrome が動作するように設定を追加します。
Rails は web で動作します。

docker-compose.yml
version: '3'

services:
  web:
    build: .
    ports:
      - "3000:3000"
    volumes:
      - .:/app
      - bundle:/usr/local/bundle
    tty: true
    environment:
      # この環境変数を追加
      - "SELENIUM_DRIVER_URL=http://selenium_chrome:4444/wd/hub"
  # 以下の4行を追加
  selenium_chrome:
    image: selenium/standalone-chrome-debug
    logging:
      driver: none
  db:
    image: postgres:10.7-alpine
    volumes:
      - pgsqldb:/var/lib/postgresql/data
    environment:
      - "POSTGRES_USER=xxxx"
      - "POSTGRES_PASSWORD=xxxx"
volumes:
  pgsqldb:
  bundle:

chrome を動作させるために、selenium_chrome を追加しています。
logging の設定を driver: none にしているのは、不要なログ出力を抑制するためです。

rspec は web で実行しますが、 chrome は、selenium_chrome で動作させるため、web 側からアクセスできるように
環境変数 SELENIUM_DRIVER_URL を web 側に追加しています。

Gemfile を編集する

gem ファイルに rspec-rails を追加します。
chromedriver-helper を削除します。webdrivers gem は追加しません。

Gemfile
group :test do
  # Adds support for Capybara system testing and selenium driver
  gem 'capybara', '>= 2.15'
  gem 'selenium-webdriver'
  gem 'rspec-rails'
end

docker 環境で、bundle install を実行する

docker 環境で追加した gem をインストールします。

$ docker-compose up -d
$ docker-compose exec web bash

# 以下は web コンテナ内で実行します。
$ bundle install

rspec の初期設定をする。

続けて、rspec の初期設定をします。

# 以下は web コンテナ内で実行します。
$ bin/rails g rspec:install

system spec の設定をする。

system spec の設定をするために、 spec/rails_helper.rb を編集し、 spec/support/capybara.rb を追加します。

spec/rails_helper.rb
# 以下の1行を有効にします。
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f }

# Checks for pending migrations and applies them before tests are run.
# If you are not using ActiveRecord, you can remove these lines.
spec/support/capybara.rb
require 'capybara/rspec'

RSpec.configure do |config|
  config.before(:each, type: :system) do |config|
    driven_by :selenium, using: :headless_chrome, options: {
      browser: :remote,
      url: ENV.fetch("SELENIUM_DRIVER_URL"),
      desired_capabilities: :chrome
    }
    Capybara.server_host = 'web'
    Capybara.app_host='http://web'
  end
end

spec/support/capybara.rb 内で selenium_chrome 側の headless chrome を利用するための設定をしています。
web コンテナ側から selenium_chrome コンテナ の chrome を使用するために、 options の中で、 urlSELENIUM_DRIVER_URL 環境変数の値を設定しています。
headless chrome からは、ローカル環境ではなく、 web コンテナ側の rails アプリを表示してテストする必要があるため、
Capybara.server_hostCapybara.app_host を設定しています。

参考情報

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

docker gcc upgrade error

gcc公式dockerを導入

$ docker run -it gcc /bin/bash
Unable to find image 'gcc:latest' locally
latest: Pulling from library/gcc
e79bb959ec00: Pull complete 
d4b7902036fe: Pull complete 
1b2a72d4e030: Pull complete 
d54db43011fd: Pull complete 
69d473365bb3: Pull complete 
79806b91083b: Pull complete 
0005867d0332: Pull complete 
97e9d2778677: Pull complete 
21e48d1c09d5: Pull complete 
Digest: sha256:87d0585f5d309a641775563417a84f251eda7c89c6ae26b96eeb475a57094ea6
Status: Downloaded newer image for gcc:latest

updateは無事。

root@b7692fe59523:/# apt update
Ign:1 http://deb.debian.org/debian stretch InRelease
Get:2 http://deb.debian.org/debian stretch-updates InRelease [91.0 kB]
Get:3 http://deb.debian.org/debian stretch Release [118 kB]
Get:4 http://deb.debian.org/debian stretch Release.gpg [2434 B]
Get:5 http://security.debian.org/debian-security stretch/updates InRelease [94.3 kB]
Get:6 http://security.debian.org/debian-security stretch/updates/main amd64 Packages [487 kB]
Get:7 http://deb.debian.org/debian stretch-updates/main amd64 Packages [11.1 kB]
Get:8 http://deb.debian.org/debian stretch/main amd64 Packages [7082 kB]
Fetched 7886 kB in 2s (3549 kB/s)  
Reading package lists... Done
Building dependency tree       
Reading state information... Done
29 packages can be upgraded. Run 'apt list --upgradable' to see them.

upgradeが

root@b7692fe59523:/# apt -y upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Calculating upgrade... Done
The following packages will be upgraded:
  base-files imagemagick imagemagick-6-common imagemagick-6.q16 libjs-jquery libmagickcore-6-arch-config
  libmagickcore-6-headers libmagickcore-6.q16-3 libmagickcore-6.q16-3-extra libmagickcore-6.q16-dev
  libmagickcore-dev libmagickwand-6-headers libmagickwand-6.q16-3 libmagickwand-6.q16-dev
  libmagickwand-dev libmariadbclient-dev libmariadbclient-dev-compat libmariadbclient18 libpng-dev
  libpng16-16 libpq-dev libpq5 libssh2-1 libsystemd0 libudev1 linux-libc-dev tzdata unzip wget
29 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 11.7 MB of archives.
After this operation, 54.3 kB of additional disk space will be used.
Get:1 http://deb.debian.org/debian stretch/main amd64 base-files amd64 9.9+deb9u9 [67.4 kB]
Get:2 http://security.debian.org/debian-security stretch/updates/main amd64 libmagickwand-6.q16-dev amd64 8:6.9.7.4+dfsg-11+deb9u7 [418 kB]
Get:3 http://deb.debian.org/debian stretch/main amd64 libsystemd0 amd64 232-25+deb9u11 [281 kB]
Get:4 http://security.debian.org/debian-security stretch/updates/main amd64 libmagickwand-dev all 8:6.9.7.4+dfsg-11+deb9u7 [1254 B]
Get:5 http://security.debian.org/debian-security stretch/updates/main amd64 libmagickcore-6.q16-dev amd64 8:6.9.7.4+dfsg-11+deb9u7 [1094 kB]
Get:6 http://deb.debian.org/debian stretch/main amd64 libudev1 amd64 232-25+deb9u11 [126 kB]
Get:7 http://deb.debian.org/debian stretch/main amd64 tzdata all 2019a-0+deb9u1 [273 kB]
Get:8 http://deb.debian.org/debian stretch/main amd64 wget amd64 1.18-5+deb9u3 [800 kB]
Get:9 http://security.debian.org/debian-security stretch/updates/main amd64 libmagickcore-6.q16-3-extra amd64 8:6.9.7.4+dfsg-11+deb9u7 [190 kB]
Get:10 http://deb.debian.org/debian stretch/main amd64 libjs-jquery all 3.1.1-2+deb9u1 [154 kB]
Get:11 http://security.debian.org/debian-security stretch/updates/main amd64 libpng-dev amd64 1.6.28-1+deb9u1 [250 kB]
Get:12 http://security.debian.org/debian-security stretch/updates/main amd64 libpng16-16 amd64 1.6.28-1+deb9u1 [280 kB]
Get:13 http://security.debian.org/debian-security stretch/updates/main amd64 imagemagick-6.q16 amd64 8:6.9.7.4+dfsg-11+deb9u7 [563 kB]
Get:14 http://security.debian.org/debian-security stretch/updates/main amd64 libmagickcore-dev all 8:6.9.7.4+dfsg-11+deb9u7 [1266 B]
Get:15 http://security.debian.org/debian-security stretch/updates/main amd64 libmagickwand-6-headers all 8:6.9.7.4+dfsg-11+deb9u7 [10.5 kB]
Get:16 http://security.debian.org/debian-security stretch/updates/main amd64 libmagickcore-6-headers all 8:6.9.7.4+dfsg-11+deb9u7 [47.0 kB]
Get:17 http://security.debian.org/debian-security stretch/updates/main amd64 imagemagick-6-common all 8:6.9.7.4+dfsg-11+deb9u7 [184 kB]
Get:18 http://security.debian.org/debian-security stretch/updates/main amd64 libmagickcore-6.q16-3 amd64 8:6.9.7.4+dfsg-11+deb9u7 [1743 kB]
Get:19 http://security.debian.org/debian-security stretch/updates/main amd64 libmagickwand-6.q16-3 amd64 8:6.9.7.4+dfsg-11+deb9u7 [422 kB]
Get:20 http://security.debian.org/debian-security stretch/updates/main amd64 libmagickcore-6-arch-config amd64 8:6.9.7.4+dfsg-11+deb9u7 [149 kB]
Get:21 http://security.debian.org/debian-security stretch/updates/main amd64 imagemagick amd64 8:6.9.7.4+dfsg-11+deb9u7 [141 kB]
Get:22 http://deb.debian.org/debian stretch/main amd64 libmariadbclient-dev amd64 10.1.38-0+deb9u1 [1658 kB]
Get:23 http://deb.debian.org/debian stretch/main amd64 libmariadbclient18 amd64 10.1.38-0+deb9u1 [785 kB]
Get:24 http://deb.debian.org/debian stretch/main amd64 libmariadbclient-dev-compat amd64 10.1.38-0+deb9u1 [27.5 kB]
Get:25 http://deb.debian.org/debian stretch/main amd64 libpq-dev amd64 9.6.12-0+deb9u1 [216 kB]
Get:26 http://deb.debian.org/debian stretch/main amd64 libpq5 amd64 9.6.12-0+deb9u1 [136 kB]
Get:27 http://deb.debian.org/debian stretch/main amd64 libssh2-1 amd64 1.7.0-1+deb9u1 [139 kB]
Get:28 http://deb.debian.org/debian stretch/main amd64 linux-libc-dev amd64 4.9.168-1 [1420 kB]
Get:29 http://deb.debian.org/debian stretch/main amd64 unzip amd64 6.0-21+deb9u1 [170 kB]
Fetched 11.7 MB in 2s (5680 kB/s)         
debconf: delaying package configuration, since apt-utils is not installed
(Reading database ... 29982 files and directories currently installed.)
Preparing to unpack .../base-files_9.9+deb9u9_amd64.deb ...
Unpacking base-files (9.9+deb9u9) over (9.9+deb9u8) ...
Setting up base-files (9.9+deb9u9) ...
Installing new version of config file /etc/debian_version ...
(Reading database ... 29982 files and directories currently installed.)
Preparing to unpack .../libsystemd0_232-25+deb9u11_amd64.deb ...
Unpacking libsystemd0:amd64 (232-25+deb9u11) over (232-25+deb9u9) ...
Setting up libsystemd0:amd64 (232-25+deb9u11) ...
(Reading database ... 29982 files and directories currently installed.)
Preparing to unpack .../00-libmagickwand-6.q16-dev_8%3a6.9.7.4+dfsg-11+deb9u7_amd64.deb ...
Unpacking libmagickwand-6.q16-dev:amd64 (8:6.9.7.4+dfsg-11+deb9u7) over (8:6.9.7.4+dfsg-11+deb9u6) ...
Preparing to unpack .../01-libmagickwand-dev_8%3a6.9.7.4+dfsg-11+deb9u7_all.deb ...
Unpacking libmagickwand-dev (8:6.9.7.4+dfsg-11+deb9u7) over (8:6.9.7.4+dfsg-11+deb9u6) ...
Preparing to unpack .../02-libmagickcore-6.q16-dev_8%3a6.9.7.4+dfsg-11+deb9u7_amd64.deb ...
Unpacking libmagickcore-6.q16-dev:amd64 (8:6.9.7.4+dfsg-11+deb9u7) over (8:6.9.7.4+dfsg-11+deb9u6) ...
Preparing to unpack .../03-libmagickcore-6.q16-3-extra_8%3a6.9.7.4+dfsg-11+deb9u7_amd64.deb ...
Unpacking libmagickcore-6.q16-3-extra:amd64 (8:6.9.7.4+dfsg-11+deb9u7) over (8:6.9.7.4+dfsg-11+deb9u6) ...
Preparing to unpack .../04-libpng-dev_1.6.28-1+deb9u1_amd64.deb ...
Unpacking libpng-dev:amd64 (1.6.28-1+deb9u1) over (1.6.28-1) ...
Preparing to unpack .../05-libpng16-16_1.6.28-1+deb9u1_amd64.deb ...
Unpacking libpng16-16:amd64 (1.6.28-1+deb9u1) over (1.6.28-1) ...
Preparing to unpack .../06-imagemagick-6.q16_8%3a6.9.7.4+dfsg-11+deb9u7_amd64.deb ...
Unpacking imagemagick-6.q16 (8:6.9.7.4+dfsg-11+deb9u7) over (8:6.9.7.4+dfsg-11+deb9u6) ...
Preparing to unpack .../07-libmagickcore-dev_8%3a6.9.7.4+dfsg-11+deb9u7_all.deb ...
Unpacking libmagickcore-dev (8:6.9.7.4+dfsg-11+deb9u7) over (8:6.9.7.4+dfsg-11+deb9u6) ...
Preparing to unpack .../08-libmagickwand-6-headers_8%3a6.9.7.4+dfsg-11+deb9u7_all.deb ...
Unpacking libmagickwand-6-headers (8:6.9.7.4+dfsg-11+deb9u7) over (8:6.9.7.4+dfsg-11+deb9u6) ...
Preparing to unpack .../09-libmagickcore-6-headers_8%3a6.9.7.4+dfsg-11+deb9u7_all.deb ...
Unpacking libmagickcore-6-headers (8:6.9.7.4+dfsg-11+deb9u7) over (8:6.9.7.4+dfsg-11+deb9u6) ...
Preparing to unpack .../10-imagemagick-6-common_8%3a6.9.7.4+dfsg-11+deb9u7_all.deb ...
Unpacking imagemagick-6-common (8:6.9.7.4+dfsg-11+deb9u7) over (8:6.9.7.4+dfsg-11+deb9u6) ...
Preparing to unpack .../11-libmagickcore-6.q16-3_8%3a6.9.7.4+dfsg-11+deb9u7_amd64.deb ...
Unpacking libmagickcore-6.q16-3:amd64 (8:6.9.7.4+dfsg-11+deb9u7) over (8:6.9.7.4+dfsg-11+deb9u6) ...
Preparing to unpack .../12-libmagickwand-6.q16-3_8%3a6.9.7.4+dfsg-11+deb9u7_amd64.deb ...
Unpacking libmagickwand-6.q16-3:amd64 (8:6.9.7.4+dfsg-11+deb9u7) over (8:6.9.7.4+dfsg-11+deb9u6) ...
Preparing to unpack .../13-libmagickcore-6-arch-config_8%3a6.9.7.4+dfsg-11+deb9u7_amd64.deb ...
Unpacking libmagickcore-6-arch-config:amd64 (8:6.9.7.4+dfsg-11+deb9u7) over (8:6.9.7.4+dfsg-11+deb9u6) ...
Preparing to unpack .../14-libudev1_232-25+deb9u11_amd64.deb ...
Unpacking libudev1:amd64 (232-25+deb9u11) over (232-25+deb9u9) ...
Setting up libudev1:amd64 (232-25+deb9u11) ...
(Reading database ... 29982 files and directories currently installed.)
Preparing to unpack .../00-tzdata_2019a-0+deb9u1_all.deb ...
Unpacking tzdata (2019a-0+deb9u1) over (2018i-0+deb9u1) ...
Preparing to unpack .../01-wget_1.18-5+deb9u3_amd64.deb ...
Unpacking wget (1.18-5+deb9u3) over (1.18-5+deb9u2) ...
Preparing to unpack .../02-imagemagick_8%3a6.9.7.4+dfsg-11+deb9u7_amd64.deb ...
Unpacking imagemagick (8:6.9.7.4+dfsg-11+deb9u7) over (8:6.9.7.4+dfsg-11+deb9u6) ...
Preparing to unpack .../03-libjs-jquery_3.1.1-2+deb9u1_all.deb ...
Unpacking libjs-jquery (3.1.1-2+deb9u1) over (3.1.1-2) ...
Preparing to unpack .../04-libmariadbclient-dev_10.1.38-0+deb9u1_amd64.deb ...
Unpacking libmariadbclient-dev (10.1.38-0+deb9u1) over (10.1.37-0+deb9u1) ...
Preparing to unpack .../05-libmariadbclient18_10.1.38-0+deb9u1_amd64.deb ...
Unpacking libmariadbclient18:amd64 (10.1.38-0+deb9u1) over (10.1.37-0+deb9u1) ...
Preparing to unpack .../06-libmariadbclient-dev-compat_10.1.38-0+deb9u1_amd64.deb ...
Unpacking libmariadbclient-dev-compat:amd64 (10.1.38-0+deb9u1) over (10.1.37-0+deb9u1) ...
Preparing to unpack .../07-libpq-dev_9.6.12-0+deb9u1_amd64.deb ...
Unpacking libpq-dev (9.6.12-0+deb9u1) over (9.6.11-0+deb9u1) ...
Preparing to unpack .../08-libpq5_9.6.12-0+deb9u1_amd64.deb ...
Unpacking libpq5:amd64 (9.6.12-0+deb9u1) over (9.6.11-0+deb9u1) ...
Preparing to unpack .../09-libssh2-1_1.7.0-1+deb9u1_amd64.deb ...
Unpacking libssh2-1:amd64 (1.7.0-1+deb9u1) over (1.7.0-1) ...
Preparing to unpack .../10-linux-libc-dev_4.9.168-1_amd64.deb ...
Unpacking linux-libc-dev:amd64 (4.9.168-1) over (4.9.144-3.1) ...
Preparing to unpack .../11-unzip_6.0-21+deb9u1_amd64.deb ...
Unpacking unzip (6.0-21+deb9u1) over (6.0-21) ...
Setting up libjs-jquery (3.1.1-2+deb9u1) ...
Setting up imagemagick-6-common (8:6.9.7.4+dfsg-11+deb9u7) ...
Processing triggers for mime-support (3.60) ...
Setting up libpng16-16:amd64 (1.6.28-1+deb9u1) ...
Setting up tzdata (2019a-0+deb9u1) ...
debconf: unable to initialize frontend: Dialog
debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.)
debconf: falling back to frontend: Readline

Current default time zone: 'Etc/UTC'
Local time is now:      Fri May  3 02:03:07 UTC 2019.
Universal Time is now:  Fri May  3 02:03:07 UTC 2019.
Run 'dpkg-reconfigure tzdata' if you wish to change it.

Setting up libmagickcore-6-arch-config:amd64 (8:6.9.7.4+dfsg-11+deb9u7) ...
Setting up unzip (6.0-21+deb9u1) ...
Setting up linux-libc-dev:amd64 (4.9.168-1) ...
Setting up libmariadbclient18:amd64 (10.1.38-0+deb9u1) ...
Setting up libssh2-1:amd64 (1.7.0-1+deb9u1) ...
Setting up libpq5:amd64 (9.6.12-0+deb9u1) ...
Processing triggers for libc-bin (2.24-11+deb9u4) ...
Setting up wget (1.18-5+deb9u3) ...
Setting up libmagickcore-6-headers (8:6.9.7.4+dfsg-11+deb9u7) ...
Setting up libpng-dev:amd64 (1.6.28-1+deb9u1) ...
Processing triggers for hicolor-icon-theme (0.15-1) ...
Setting up libmariadbclient-dev (10.1.38-0+deb9u1) ...
Setting up libpq-dev (9.6.12-0+deb9u1) ...
Setting up libmagickcore-6.q16-3:amd64 (8:6.9.7.4+dfsg-11+deb9u7) ...
Setting up libmagickwand-6-headers (8:6.9.7.4+dfsg-11+deb9u7) ...
Setting up libmariadbclient-dev-compat:amd64 (10.1.38-0+deb9u1) ...
Setting up libmagickwand-6.q16-3:amd64 (8:6.9.7.4+dfsg-11+deb9u7) ...
Setting up imagemagick-6.q16 (8:6.9.7.4+dfsg-11+deb9u7) ...
Setting up libmagickcore-6.q16-3-extra:amd64 (8:6.9.7.4+dfsg-11+deb9u7) ...
Setting up imagemagick (8:6.9.7.4+dfsg-11+deb9u7) ...
Setting up libmagickcore-6.q16-dev:amd64 (8:6.9.7.4+dfsg-11+deb9u7) ...
Setting up libmagickcore-dev (8:6.9.7.4+dfsg-11+deb9u7) ...
Setting up libmagickwand-6.q16-dev:amd64 (8:6.9.7.4+dfsg-11+deb9u7) ...
Setting up libmagickwand-dev (8:6.9.7.4+dfsg-11+deb9u7) ...
Processing triggers for libc-bin (2.24-11+deb9u4) ...

他の作業がどうなるかを確かめるためclang を導入しうようとしてみた。

# apt install clang
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  binfmt-support clang-3.8 libclang-common-3.8-dev libclang1-3.8 libgc1c2 libjsoncpp1 libllvm3.8
  libobjc-6-dev libobjc4 libpipeline1 llvm-3.8 llvm-3.8-dev llvm-3.8-runtime
Suggested packages:
  gnustep gnustep-devel clang-3.8-doc llvm-3.8-doc
The following NEW packages will be installed:
  binfmt-support clang clang-3.8 libclang-common-3.8-dev libclang1-3.8 libgc1c2 libjsoncpp1 libllvm3.8
  libobjc-6-dev libobjc4 libpipeline1 llvm-3.8 llvm-3.8-dev llvm-3.8-runtime
0 upgraded, 14 newly installed, 0 to remove and 0 not upgraded.
Need to get 58.0 MB of archives.
After this operation, 293 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://deb.debian.org/debian stretch/main amd64 libpipeline1 amd64 1.4.1-2 [27.6 kB]
Get:2 http://deb.debian.org/debian stretch/main amd64 libgc1c2 amd64 1:7.4.2-8 [208 kB]
Get:3 http://deb.debian.org/debian stretch/main amd64 binfmt-support amd64 2.1.6-2 [59.5 kB]
Get:4 http://deb.debian.org/debian stretch/main amd64 libllvm3.8 amd64 1:3.8.1-24 [10.4 MB]
Get:5 http://deb.debian.org/debian stretch/main amd64 libclang1-3.8 amd64 1:3.8.1-24 [4190 kB]
Get:6 http://deb.debian.org/debian stretch/main amd64 libobjc4 amd64 6.3.0-18+deb9u1 [49.5 kB]
Get:7 http://deb.debian.org/debian stretch/main amd64 libobjc-6-dev amd64 6.3.0-18+deb9u1 [196 kB]
Get:8 http://deb.debian.org/debian stretch/main amd64 libclang-common-3.8-dev amd64 1:3.8.1-24 [2198 kB]
Get:9 http://deb.debian.org/debian stretch/main amd64 clang-3.8 amd64 1:3.8.1-24 [22.8 MB]
Get:10 http://deb.debian.org/debian stretch/main amd64 clang amd64 1:3.8-36 [5810 B]
Get:11 http://deb.debian.org/debian stretch/main amd64 llvm-3.8-runtime amd64 1:3.8.1-24 [87.9 kB]
Get:12 http://deb.debian.org/debian stretch/main amd64 llvm-3.8 amd64 1:3.8.1-24 [1548 kB]
Get:13 http://deb.debian.org/debian stretch/main amd64 libjsoncpp1 amd64 1.7.4-3 [75.6 kB]
Get:14 http://deb.debian.org/debian stretch/main amd64 llvm-3.8-dev amd64 1:3.8.1-24 [16.1 MB]
Fetched 58.0 MB in 2s (20.9 MB/s)        
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package libpipeline1:amd64.
(Reading database ... 29984 files and directories currently installed.)
Preparing to unpack .../00-libpipeline1_1.4.1-2_amd64.deb ...
Unpacking libpipeline1:amd64 (1.4.1-2) ...
Selecting previously unselected package libgc1c2:amd64.
Preparing to unpack .../01-libgc1c2_1%3a7.4.2-8_amd64.deb ...
Unpacking libgc1c2:amd64 (1:7.4.2-8) ...
Selecting previously unselected package binfmt-support.
Preparing to unpack .../02-binfmt-support_2.1.6-2_amd64.deb ...
Unpacking binfmt-support (2.1.6-2) ...
Selecting previously unselected package libllvm3.8:amd64.
Preparing to unpack .../03-libllvm3.8_1%3a3.8.1-24_amd64.deb ...
Unpacking libllvm3.8:amd64 (1:3.8.1-24) ...
Selecting previously unselected package libclang1-3.8:amd64.
Preparing to unpack .../04-libclang1-3.8_1%3a3.8.1-24_amd64.deb ...
Unpacking libclang1-3.8:amd64 (1:3.8.1-24) ...
Selecting previously unselected package libobjc4:amd64.
Preparing to unpack .../05-libobjc4_6.3.0-18+deb9u1_amd64.deb ...
Unpacking libobjc4:amd64 (6.3.0-18+deb9u1) ...
Selecting previously unselected package libobjc-6-dev:amd64.
Preparing to unpack .../06-libobjc-6-dev_6.3.0-18+deb9u1_amd64.deb ...
Unpacking libobjc-6-dev:amd64 (6.3.0-18+deb9u1) ...
Selecting previously unselected package libclang-common-3.8-dev.
Preparing to unpack .../07-libclang-common-3.8-dev_1%3a3.8.1-24_amd64.deb ...
Unpacking libclang-common-3.8-dev (1:3.8.1-24) ...
Selecting previously unselected package clang-3.8.
Preparing to unpack .../08-clang-3.8_1%3a3.8.1-24_amd64.deb ...
Unpacking clang-3.8 (1:3.8.1-24) ...
Selecting previously unselected package clang.
Preparing to unpack .../09-clang_1%3a3.8-36_amd64.deb ...
Unpacking clang (1:3.8-36) ...
Selecting previously unselected package llvm-3.8-runtime.
Preparing to unpack .../10-llvm-3.8-runtime_1%3a3.8.1-24_amd64.deb ...
Unpacking llvm-3.8-runtime (1:3.8.1-24) ...
Selecting previously unselected package llvm-3.8.
Preparing to unpack .../11-llvm-3.8_1%3a3.8.1-24_amd64.deb ...
Unpacking llvm-3.8 (1:3.8.1-24) ...
Selecting previously unselected package libjsoncpp1:amd64.
Preparing to unpack .../12-libjsoncpp1_1.7.4-3_amd64.deb ...
Unpacking libjsoncpp1:amd64 (1.7.4-3) ...
Selecting previously unselected package llvm-3.8-dev.
Preparing to unpack .../13-llvm-3.8-dev_1%3a3.8.1-24_amd64.deb ...
Unpacking llvm-3.8-dev (1:3.8.1-24) ...
Setting up libllvm3.8:amd64 (1:3.8.1-24) ...
Setting up libclang-common-3.8-dev (1:3.8.1-24) ...
Setting up libclang1-3.8:amd64 (1:3.8.1-24) ...
Setting up libgc1c2:amd64 (1:7.4.2-8) ...
Setting up libpipeline1:amd64 (1.4.1-2) ...
Processing triggers for libc-bin (2.24-11+deb9u4) ...
Setting up libjsoncpp1:amd64 (1.7.4-3) ...
Setting up binfmt-support (2.1.6-2) ...
mount: permission denied
update-binfmts: warning: Couldn't mount the binfmt_misc filesystem on /proc/sys/fs/binfmt_misc.
mount: permission denied
update-binfmts: warning: Couldn't mount the binfmt_misc filesystem on /proc/sys/fs/binfmt_misc.
mount: permission denied
update-binfmts: warning: Couldn't mount the binfmt_misc filesystem on /proc/sys/fs/binfmt_misc.
invoke-rc.d: could not determine current runlevel
invoke-rc.d: policy-rc.d denied execution of start.
Setting up libobjc4:amd64 (6.3.0-18+deb9u1) ...
Setting up libobjc-6-dev:amd64 (6.3.0-18+deb9u1) ...
Setting up llvm-3.8-runtime (1:3.8.1-24) ...
mount: permission denied
update-binfmts: warning: Couldn't mount the binfmt_misc filesystem on /proc/sys/fs/binfmt_misc.
Setting up llvm-3.8 (1:3.8.1-24) ...
Setting up llvm-3.8-dev (1:3.8.1-24) ...
Setting up clang-3.8 (1:3.8.1-24) ...
Setting up clang (1:3.8-36) ...
Processing triggers for libc-bin (2.24-11+deb9u4) ...
root@b7692fe59523:/# df -k
Filesystem     1K-blocks    Used Available Use% Mounted on
overlay         61252420 2747644  55363608   5% /
tmpfs              65536       0     65536   0% /dev
tmpfs            1023516       0   1023516   0% /sys/fs/cgroup
/dev/sda1       61252420 2747644  55363608   5% /etc/hosts
shm                65536       0     65536   0% /dev/shm
tmpfs            1023516       0   1023516   0% /proc/acpi
tmpfs            1023516       0   1023516   0% /sys/firmware

tzdataだけupgradeしようとしてみた。

# apt upgrade tzdata
Reading package lists... Done
Building dependency tree        
Reading state information... Done
Calculating upgrade... Done
The following packages will be upgraded:
  base-files imagemagick imagemagick-6-common imagemagick-6.q16 libjs-jquery libmagickcore-6-arch-config
  libmagickcore-6-headers libmagickcore-6.q16-3 libmagickcore-6.q16-3-extra libmagickcore-6.q16-dev
  libmagickcore-dev libmagickwand-6-headers libmagickwand-6.q16-3 libmagickwand-6.q16-dev
  libmagickwand-dev libmariadbclient-dev libmariadbclient-dev-compat libmariadbclient18 libpng-dev
  libpng16-16 libpq-dev libpq5 libssh2-1 libsystemd0 libudev1 linux-libc-dev tzdata unzip wget
29 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 11.7 MB of archives.
After this operation, 54.3 kB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://deb.debian.org/debian stretch/main amd64 base-files amd64 9.9+deb9u9 [67.4 kB]
Get:2 http://deb.debian.org/debian stretch/main amd64 libsystemd0 amd64 232-25+deb9u11 [281 kB]
Get:3 http://security.debian.org/debian-security stretch/updates/main amd64 libmagickwand-6.q16-dev amd64 8:6.9.7.4+dfsg-11+deb9u7 [418 kB]
Get:4 http://deb.debian.org/debian stretch/main amd64 libudev1 amd64 232-25+deb9u11 [126 kB]
Get:5 http://deb.debian.org/debian stretch/main amd64 tzdata all 2019a-0+deb9u1 [273 kB]
Get:6 http://security.debian.org/debian-security stretch/updates/main amd64 libmagickwand-dev all 8:6.9.7.4+dfsg-11+deb9u7 [1254 B]
Get:7 http://deb.debian.org/debian stretch/main amd64 wget amd64 1.18-5+deb9u3 [800 kB]
Get:8 http://deb.debian.org/debian stretch/main amd64 libjs-jquery all 3.1.1-2+deb9u1 [154 kB]
Get:9 http://security.debian.org/debian-security stretch/updates/main amd64 libmagickcore-6.q16-dev amd64 8:6.9.7.4+dfsg-11+deb9u7 [1094 kB]
Get:10 http://deb.debian.org/debian stretch/main amd64 libmariadbclient-dev amd64 10.1.38-0+deb9u1 [1658 kB]
Get:11 http://deb.debian.org/debian stretch/main amd64 libmariadbclient18 amd64 10.1.38-0+deb9u1 [785 kB]
Get:12 http://deb.debian.org/debian stretch/main amd64 libmariadbclient-dev-compat amd64 10.1.38-0+deb9u1 [27.5 kB]
Get:13 http://deb.debian.org/debian stretch/main amd64 libpq-dev amd64 9.6.12-0+deb9u1 [216 kB]    
Get:14 http://security.debian.org/debian-security stretch/updates/main amd64 libmagickcore-6.q16-3-extra amd64 8:6.9.7.4+dfsg-11+deb9u7 [190 kB]
Get:15 http://security.debian.org/debian-security stretch/updates/main amd64 libpng-dev amd64 1.6.28-1+deb9u1 [250 kB]
Get:16 http://deb.debian.org/debian stretch/main amd64 libpq5 amd64 9.6.12-0+deb9u1 [136 kB]
Get:17 http://deb.debian.org/debian stretch/main amd64 libssh2-1 amd64 1.7.0-1+deb9u1 [139 kB]
Get:18 http://security.debian.org/debian-security stretch/updates/main amd64 libpng16-16 amd64 1.6.28-1+deb9u1 [280 kB]
Get:19 http://deb.debian.org/debian stretch/main amd64 linux-libc-dev amd64 4.9.168-1 [1420 kB]
Get:20 http://security.debian.org/debian-security stretch/updates/main amd64 imagemagick-6.q16 amd64 8:6.9.7.4+dfsg-11+deb9u7 [563 kB]
Get:21 http://security.debian.org/debian-security stretch/updates/main amd64 libmagickcore-dev all 8:6.9.7.4+dfsg-11+deb9u7 [1266 B]
Get:22 http://security.debian.org/debian-security stretch/updates/main amd64 libmagickwand-6-headers all 8:6.9.7.4+dfsg-11+deb9u7 [10.5 kB]
Get:23 http://security.debian.org/debian-security stretch/updates/main amd64 libmagickcore-6-headers all 8:6.9.7.4+dfsg-11+deb9u7 [47.0 kB]
Get:24 http://security.debian.org/debian-security stretch/updates/main amd64 imagemagick-6-common all 8:6.9.7.4+dfsg-11+deb9u7 [184 kB]
Get:25 http://security.debian.org/debian-security stretch/updates/main amd64 libmagickcore-6.q16-3 amd64 8:6.9.7.4+dfsg-11+deb9u7 [1743 kB]
Get:26 http://deb.debian.org/debian stretch/main amd64 unzip amd64 6.0-21+deb9u1 [170 kB]
Get:27 http://security.debian.org/debian-security stretch/updates/main amd64 libmagickwand-6.q16-3 amd64 8:6.9.7.4+dfsg-11+deb9u7 [422 kB]
Get:28 http://security.debian.org/debian-security stretch/updates/main amd64 libmagickcore-6-arch-config amd64 8:6.9.7.4+dfsg-11+deb9u7 [149 kB]
Get:29 http://security.debian.org/debian-security stretch/updates/main amd64 imagemagick amd64 8:6.9.7.4+dfsg-11+deb9u7 [141 kB]
Fetched 11.7 MB in 0s (14.2 MB/s)
debconf: delaying package configuration, since apt-utils is not installed
(Reading database ... 29982 files and directories currently installed.)
Preparing to unpack .../base-files_9.9+deb9u9_amd64.deb ...
Unpacking base-files (9.9+deb9u9) over (9.9+deb9u8) ...
Setting up base-files (9.9+deb9u9) ...
Installing new version of config file /etc/debian_version ...
(Reading database ... 29982 files and directories currently installed.)
Preparing to unpack .../libsystemd0_232-25+deb9u11_amd64.deb ...
Unpacking libsystemd0:amd64 (232-25+deb9u11) over (232-25+deb9u9) ...
Setting up libsystemd0:amd64 (232-25+deb9u11) ...
(Reading database ... 29982 files and directories currently installed.)
Preparing to unpack .../00-libmagickwand-6.q16-dev_8%3a6.9.7.4+dfsg-11+deb9u7_amd64.deb ...
Unpacking libmagickwand-6.q16-dev:amd64 (8:6.9.7.4+dfsg-11+deb9u7) over (8:6.9.7.4+dfsg-11+deb9u6) ...
Preparing to unpack .../01-libmagickwand-dev_8%3a6.9.7.4+dfsg-11+deb9u7_all.deb ...
Unpacking libmagickwand-dev (8:6.9.7.4+dfsg-11+deb9u7) over (8:6.9.7.4+dfsg-11+deb9u6) ...
Preparing to unpack .../02-libmagickcore-6.q16-dev_8%3a6.9.7.4+dfsg-11+deb9u7_amd64.deb ...
Unpacking libmagickcore-6.q16-dev:amd64 (8:6.9.7.4+dfsg-11+deb9u7) over (8:6.9.7.4+dfsg-11+deb9u6) ...
Preparing to unpack .../03-libmagickcore-6.q16-3-extra_8%3a6.9.7.4+dfsg-11+deb9u7_amd64.deb ...
Unpacking libmagickcore-6.q16-3-extra:amd64 (8:6.9.7.4+dfsg-11+deb9u7) over (8:6.9.7.4+dfsg-11+deb9u6) ...
Preparing to unpack .../04-libpng-dev_1.6.28-1+deb9u1_amd64.deb ...
Unpacking libpng-dev:amd64 (1.6.28-1+deb9u1) over (1.6.28-1) ...
Preparing to unpack .../05-libpng16-16_1.6.28-1+deb9u1_amd64.deb ...
Unpacking libpng16-16:amd64 (1.6.28-1+deb9u1) over (1.6.28-1) ...
Preparing to unpack .../06-imagemagick-6.q16_8%3a6.9.7.4+dfsg-11+deb9u7_amd64.deb ...
Unpacking imagemagick-6.q16 (8:6.9.7.4+dfsg-11+deb9u7) over (8:6.9.7.4+dfsg-11+deb9u6) ...
Preparing to unpack .../07-libmagickcore-dev_8%3a6.9.7.4+dfsg-11+deb9u7_all.deb ...
Unpacking libmagickcore-dev (8:6.9.7.4+dfsg-11+deb9u7) over (8:6.9.7.4+dfsg-11+deb9u6) ...
Preparing to unpack .../08-libmagickwand-6-headers_8%3a6.9.7.4+dfsg-11+deb9u7_all.deb ...
Unpacking libmagickwand-6-headers (8:6.9.7.4+dfsg-11+deb9u7) over (8:6.9.7.4+dfsg-11+deb9u6) ...
Preparing to unpack .../09-libmagickcore-6-headers_8%3a6.9.7.4+dfsg-11+deb9u7_all.deb ...
Unpacking libmagickcore-6-headers (8:6.9.7.4+dfsg-11+deb9u7) over (8:6.9.7.4+dfsg-11+deb9u6) ...
Preparing to unpack .../10-imagemagick-6-common_8%3a6.9.7.4+dfsg-11+deb9u7_all.deb ...
Unpacking imagemagick-6-common (8:6.9.7.4+dfsg-11+deb9u7) over (8:6.9.7.4+dfsg-11+deb9u6) ...
Preparing to unpack .../11-libmagickcore-6.q16-3_8%3a6.9.7.4+dfsg-11+deb9u7_amd64.deb ...
Unpacking libmagickcore-6.q16-3:amd64 (8:6.9.7.4+dfsg-11+deb9u7) over (8:6.9.7.4+dfsg-11+deb9u6) ...
Preparing to unpack .../12-libmagickwand-6.q16-3_8%3a6.9.7.4+dfsg-11+deb9u7_amd64.deb ...
Unpacking libmagickwand-6.q16-3:amd64 (8:6.9.7.4+dfsg-11+deb9u7) over (8:6.9.7.4+dfsg-11+deb9u6) ...
Preparing to unpack .../13-libmagickcore-6-arch-config_8%3a6.9.7.4+dfsg-11+deb9u7_amd64.deb ...
Unpacking libmagickcore-6-arch-config:amd64 (8:6.9.7.4+dfsg-11+deb9u7) over (8:6.9.7.4+dfsg-11+deb9u6) ...
Preparing to unpack .../14-libudev1_232-25+deb9u11_amd64.deb ...
Unpacking libudev1:amd64 (232-25+deb9u11) over (232-25+deb9u9) ...
Setting up libudev1:amd64 (232-25+deb9u11) ...
(Reading database ... 29982 files and directories currently installed.)
Preparing to unpack .../00-tzdata_2019a-0+deb9u1_all.deb ...
Unpacking tzdata (2019a-0+deb9u1) over (2018i-0+deb9u1) ...
Preparing to unpack .../01-wget_1.18-5+deb9u3_amd64.deb ...
Unpacking wget (1.18-5+deb9u3) over (1.18-5+deb9u2) ...
Preparing to unpack .../02-imagemagick_8%3a6.9.7.4+dfsg-11+deb9u7_amd64.deb ...
Unpacking imagemagick (8:6.9.7.4+dfsg-11+deb9u7) over (8:6.9.7.4+dfsg-11+deb9u6) ...
Preparing to unpack .../03-libjs-jquery_3.1.1-2+deb9u1_all.deb ...
Unpacking libjs-jquery (3.1.1-2+deb9u1) over (3.1.1-2) ...
Preparing to unpack .../04-libmariadbclient-dev_10.1.38-0+deb9u1_amd64.deb ...
Unpacking libmariadbclient-dev (10.1.38-0+deb9u1) over (10.1.37-0+deb9u1) ...
Preparing to unpack .../05-libmariadbclient18_10.1.38-0+deb9u1_amd64.deb ...
Unpacking libmariadbclient18:amd64 (10.1.38-0+deb9u1) over (10.1.37-0+deb9u1) ...
Preparing to unpack .../06-libmariadbclient-dev-compat_10.1.38-0+deb9u1_amd64.deb ...
Unpacking libmariadbclient-dev-compat:amd64 (10.1.38-0+deb9u1) over (10.1.37-0+deb9u1) ...
Preparing to unpack .../07-libpq-dev_9.6.12-0+deb9u1_amd64.deb ...
Unpacking libpq-dev (9.6.12-0+deb9u1) over (9.6.11-0+deb9u1) ...
Preparing to unpack .../08-libpq5_9.6.12-0+deb9u1_amd64.deb ...
Unpacking libpq5:amd64 (9.6.12-0+deb9u1) over (9.6.11-0+deb9u1) ...
Preparing to unpack .../09-libssh2-1_1.7.0-1+deb9u1_amd64.deb ...
Unpacking libssh2-1:amd64 (1.7.0-1+deb9u1) over (1.7.0-1) ...
Preparing to unpack .../10-linux-libc-dev_4.9.168-1_amd64.deb ...
Unpacking linux-libc-dev:amd64 (4.9.168-1) over (4.9.144-3.1) ...
Preparing to unpack .../11-unzip_6.0-21+deb9u1_amd64.deb ...
Unpacking unzip (6.0-21+deb9u1) over (6.0-21) ...
Setting up libjs-jquery (3.1.1-2+deb9u1) ...
Setting up imagemagick-6-common (8:6.9.7.4+dfsg-11+deb9u7) ...
Processing triggers for mime-support (3.60) ...
Setting up libpng16-16:amd64 (1.6.28-1+deb9u1) ...
Setting up tzdata (2019a-0+deb9u1) ...
debconf: unable to initialize frontend: Dialog
debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.)
debconf: falling back to frontend: Readline

Current default time zone: 'Etc/UTC'
Local time is now:      Sat May  4 01:29:45 UTC 2019.
Universal Time is now:  Sat May  4 01:29:45 UTC 2019.
Run 'dpkg-reconfigure tzdata' if you wish to change it.

Setting up libmagickcore-6-arch-config:amd64 (8:6.9.7.4+dfsg-11+deb9u7) ...
Setting up unzip (6.0-21+deb9u1) ...
Setting up linux-libc-dev:amd64 (4.9.168-1) ...
Setting up libmariadbclient18:amd64 (10.1.38-0+deb9u1) ...
Setting up libssh2-1:amd64 (1.7.0-1+deb9u1) ...
Setting up libpq5:amd64 (9.6.12-0+deb9u1) ...
Processing triggers for libc-bin (2.24-11+deb9u4) ...
Setting up wget (1.18-5+deb9u3) ...
Setting up libmagickcore-6-headers (8:6.9.7.4+dfsg-11+deb9u7) ...
Setting up libpng-dev:amd64 (1.6.28-1+deb9u1) ...
Processing triggers for hicolor-icon-theme (0.15-1) ...
Setting up libmariadbclient-dev (10.1.38-0+deb9u1) ...
Setting up libpq-dev (9.6.12-0+deb9u1) ...
Setting up libmagickcore-6.q16-3:amd64 (8:6.9.7.4+dfsg-11+deb9u7) ...
Setting up libmagickwand-6-headers (8:6.9.7.4+dfsg-11+deb9u7) ...
Setting up libmariadbclient-dev-compat:amd64 (10.1.38-0+deb9u1) ...
Setting up libmagickwand-6.q16-3:amd64 (8:6.9.7.4+dfsg-11+deb9u7) ...
Setting up imagemagick-6.q16 (8:6.9.7.4+dfsg-11+deb9u7) ...
Setting up libmagickcore-6.q16-3-extra:amd64 (8:6.9.7.4+dfsg-11+deb9u7) ...
Setting up imagemagick (8:6.9.7.4+dfsg-11+deb9u7) ...
Setting up libmagickcore-6.q16-dev:amd64 (8:6.9.7.4+dfsg-11+deb9u7) ...
Setting up libmagickcore-dev (8:6.9.7.4+dfsg-11+deb9u7) ...
Setting up libmagickwand-6.q16-dev:amd64 (8:6.9.7.4+dfsg-11+deb9u7) ...
Setting up libmagickwand-dev (8:6.9.7.4+dfsg-11+deb9u7) ...
Processing triggers for libc-bin (2.24-11+deb9u4) ...

同じ警告。指示どうりdpkg-reconfigureをしてみる。

# dpkg-reconfigure tzdata
debconf: unable to initialize frontend: Dialog
debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.)
debconf: falling back to frontend: Readline
Configuring tzdata
------------------

Please select the geographic area in which you live. Subsequent configuration questions will narrow this
down by presenting a list of cities, representing the time zones in which they are located.

  1. Africa   3. Antarctica  5. Arctic  7. Atlantic  9. Indian    11. SystemV  13. Etc
  2. America  4. Australia   6. Asia    8. Europe    10. Pacific  12. US
Geographic area: 6

Please select the city or region corresponding to your time zone.

  1. Aden      16. Brunei       31. Hong_Kong    46. Kuala_Lumpur  61. Pyongyang      76. Tehran
  2. Almaty    17. Chita        32. Hovd         47. Kuching       62. Qatar          77. Tel_Aviv
  3. Amman     18. Choibalsan   33. Irkutsk      48. Kuwait        63. Qostanay       78. Thimphu
  4. Anadyr    19. Chongqing    34. Istanbul     49. Macau         64. Qyzylorda      79. Tokyo
  5. Aqtau     20. Colombo      35. Jakarta      50. Magadan       65. Rangoon        80. Tomsk
  6. Aqtobe    21. Damascus     36. Jayapura     51. Makassar      66. Riyadh         81. Ujung_Pandang
  7. Ashgabat  22. Dhaka        37. Jerusalem    52. Manila        67. Sakhalin       82. Ulaanbaatar
  8. Atyrau    23. Dili         38. Kabul        53. Muscat        68. Samarkand      83. Urumqi
  9. Baghdad   24. Dubai        39. Kamchatka    54. Nicosia       69. Seoul          84. Ust-Nera
  10. Bahrain  25. Dushanbe     40. Karachi      55. Novokuznetsk  70. Shanghai       85. Vientiane
  11. Baku     26. Famagusta    41. Kashgar      56. Novosibirsk   71. Singapore      86. Vladivostok
  12. Bangkok  27. Gaza         42. Kathmandu    57. Omsk          72. Srednekolymsk  87. Yakutsk
  13. Barnaul  28. Harbin       43. Khandyga     58. Oral          73. Taipei         88. Yangon
  14. Beirut   29. Hebron       44. Kolkata      59. Phnom_Penh    74. Tashkent       89. Yekaterinburg
  15. Bishkek  30. Ho_Chi_Minh  45. Krasnoyarsk  60. Pontianak     75. Tbilisi        90. Yerevan
Time zone: 79


Current default time zone: 'Asia/Tokyo'
Local time is now:      Sat May  4 10:31:15 JST 2019.
Universal Time is now:  Sat May  4 01:31:15 UTC 2019.

debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used)
https://nesterof.com/blog/2017/09/21/debconf-no-usable-dialog-like-program-is-installed-so-the-dialog-based-frontend-cannot-be-used/

# apt install dialog
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  dialog
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 262 kB of archives.
After this operation, 1138 kB of additional disk space will be used.
Get:1 http://deb.debian.org/debian stretch/main amd64 dialog amd64 1.3-20160828-2 [262 kB]
Fetched 262 kB in 0s (1764 kB/s)
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package dialog.
(Reading database ... 29984 files and directories currently installed.)
Preparing to unpack .../dialog_1.3-20160828-2_amd64.deb ...
Unpacking dialog (1.3-20160828-2) ...
Setting up dialog (1.3-20160828-2) ...

# apt upgrade tzdata
Reading package lists... Done
Building dependency tree        
Reading state information... Done
tzdata is already the newest version (2019a-0+deb9u1).
tzdata set to manually installed.
Calculating upgrade... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

# apt upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Calculating upgrade... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerで立ち上げた開発環境をVS Codeで開く!

待望のリモート開発機能がやってきました!

発表記事はこちら Remote Development with VS Code

この機能を使うと、以下の3つの環境にVSCodeからリモート接続して開発することができるようになります。

  • Docker上で動作しているWorkspace
  • SSHで接続可能なリモートサーバーで動作しているWorkspace
  • WindowsのWSLで動作しているWorkspace

Docker開発環境への接続を試す

個人的に一番欲しかった Docker への接続をGoの開発環境に追加する形で試してみます。

試した環境

  • macOS Mojave 10.14.4
  • Docker Desktop 2.0.0.3
  • Docker Engine 18.09.2
  • VS Code 1.34.0-insider

VS Code の設定

2019/05/03時点で試すには、 Visual Studio Code - Insiders が必要なので、開きます。

スクリーンショット 2019-05-03 14.23.22.png

Remote - Containers のExtensionを Insiders にインストール。 (まだ発表されたばかりで表示順序が低いのでスクロールして探す)

スクリーンショット 2019-05-03 14.35.12.png

開発リポジトリの設定

Quick Start として各開発環境をDockerで動かす例が用意されているので、参考にしつつ進めていきます。

https://github.com/Microsoft/vscode-remote-try-go を参考にしますが、docker-compose ベースではなかったので、docker-composeが使えるように少し変更を加えたものを用意したので、その環境をまず動かしてみましょう。

git clone https://github.com/yoskeoka/remote-dev-go

いつもならこのCloneしたディレクトリに移動するところですが、このディレクトリを Remote - Containers Extension で開きます。

開いたら、左下の緑のアイコンをクリック。
スクリーンショット 2019-05-03 17.03.58.png

Remote-Containers: Open Folder in Container... を選択します。

スクリーンショット 2019-05-03 17.04.10.png

remote-dev-go を Clone した先のディレクトリを開きます。

開くと、 docker-compose の build が走るのでしばらく待ちます。

スクリーンショット 2019-05-03 17.27.34.png

これでDocker内部で動作している開発環境(これを リモート開発環境 といいます)にVS Code で接続出来ました。
通常通りに開発できますし、~/.gitconfig をコピーしているので、Gitの操作もローカル開発環境と同じように出来ます。

試しに Goのコードを動かしてみます。
https://github.com/Microsoft/vscode-remote-try-go から拝借した server.go を起動して、自動リロードがかかるようにMakefile を用意しているので、それを実行します。

VS Codeの TERMINAL タブで bash を起動して make を実行します。

リモート開発環境
$ make start
reflex -g '**/*.go' -s -- sh -c "make build && ./bin/server"
[00] Starting service
[00] make[1]: Entering directory '/root/workspace'
[00] go build -o bin/server server.go
[00] make[1]: Leaving directory '/root/workspace'
[00] Server listening on port  9080

実行したものは docker-compose.yml に Port Forward の設定をしているため、ローカル開発環境からでも curl 等で実行できます。

ローカル開発環境
$ curl localhost:9080
Hello remote world!

Git 操作

Tips にある .gitconfig の共有を行なっているため、リモート開発環境から、 VS CodeのGit統合機能で操作することも、 git コマンドで操作することも出来ます。

リモート開発環境の設定を変更した場合

リモート開発環境に接続している場合は、左下の緑ボタンから Remote Containers: Rebuild Container を選択して反映することができます。

リモート開発環境へ再接続する

VS Code を開いた状態で、 左下の緑アイコンまたは、コマンドパレットから Remote-Containers: Open Folder in Container... を選択して、remote-dev-go リポジトリのディレクトリを再度開きます。

リモート開発環境を完全に停止する

docker-compose で起動しているため、docker ps などで Docker Container を削除して下さい。

$ docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS                               NAMES
dd24fb7b0c8a        remote-dev-go_remote-dev-go   "sleep infinity"         25 minutes ago      Up 25 minutes       0.0.0.0:9080->9080/tcp              remote-dev-go_remote-dev-go_1
f9f88e005b5a        phpmyadmin/phpmyadmin         "/run.sh supervisord…"   About an hour ago   Up About an hour    9000/tcp, 0.0.0.0:8080->80/tcp      remote-dev-go_phpmyadmin_1
93a095708b76        mysql:8                       "docker-entrypoint.s…"   About an hour ago   Up About an hour    0.0.0.0:3306->3306/tcp, 33060/tcp   remote-dev-go_mysql_1

リモート開発環境の管理

VSCode Extensions の管理

リモート開発環境は ローカル開発環境とは別で VS Code Extensionsを追加することが可能です。

スクリーンショット 2019-05-03 17.47.44.png

settings.json の管理

.devcontainer/settings.vscode.json の内容をコピーする記述がリモート開発環境の.devcontainer/Dockerfile にあります。

今回用意している例では、 GOPATHをVS Codeに明示するために以下のようになっています。

.devcontainer/settings.vscode.json
{
    "go.gopath": "/go"
}

開発用のコマンドの管理

Goで開発しているサーバーをコードの変更を検知して自動リロードをかけるための reflex コマンドのインストールを、 .devcontainer/Dockerfile に記述しています。
必要に応じて Dockerfileに使用するコマンドのインストールを追記していけば、開発チーム内で環境の共有が簡単に出来そうです。

既存の開発用コンテナとの共存

コンテナベースでのデプロイのためのDockerfileや、ローカル開発環境でNginx, MySQL等の依存をdocker-composeを使って管理している場合は多いと思います。
自分の普段開発している環境でもdocker-compose.ymlで色々と立ち上げているので、その辺とうまく共存できるようにリモート開発環境が立ち上がるように設定を導入してみました。

具体的には、プロジェクトルートに元々ある(という想定の) docker-compose.yml には一切リモート開発環境関連の記述を入れず、.devcontainer/docker-compose.extend.yml にリモート開発環境の記述をしています。

.devcontainer/docker-compose.extend.yml
version: '3'
services:
  dev:
    build: 
      context: .devcontainer
      dockerfile: Dockerfile
    volumes:
      - .:/root/workspace
      - ~/.gitconfig:/root/.gitconfig
    ports:
      - 9080:9080
    command: sleep infinity

この追加の Docker Compose 設定については、 .devcontainer/devcontainer.json

.devcontainer/devcontainer.json(一部)
    "dockerComposeFile": [
        "../docker-compose.yml",
        "docker-compose.extend.yml"
    ],

のように書いておくことで、リモート開発環境の起動時に次のように両方をうまく読み込んでくれるため、既存のDocker関連の設定を壊す必要はありません。

リモート開発環境起動時に実行されるdocker-compose
docker-compose -f /元々の/docker-compose.yml -f /リモート開発環境用の/docker-compose.extend.yml up -d --build

まとめ

これで開発のための環境をローカルに構築しなくても、 Docker と VSCode がインストールしてあれば開発出来るようになりそうです。
VS Code は Code Server として動作させ、ブラウザから操作するということも出来るようになってきているようなので、組み合わせれば Docker とブラウザさえあればどんな開発環境でもローカル環境を汚すことなく起動できるようになるかもしれません。

また、発表当日からドキュメントExamplesの充実具合が凄いです。
この開発リソースの多さが VS Code の強みと言えると思います。

参考

リモートサーバーにSSHする場合の記事もありました。

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

.NET Coreアプリをさくっと作ってコンテナにする

概要

Ubuntu に .NET Core SDK をさくっとインストールし
簡単な.NET Coreアプリを作り、
ついでにコンテナイメージにしたよ

環境

$ uname -a
Linux hoge 4.13.0-46-generic #51-Ubuntu SMP Tue Jun 12 12:36:29 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=17.10
DISTRIB_CODENAME=artful
DISTRIB_DESCRIPTION="Ubuntu 17.10"

インストール

基本的には本家ドキュメントを見てね
各ディストリビューション毎にあるよ

以下のようにsnapコマンドでもインストールできたよ

$ sudo snap install dotnet-sdk --classic
2019-04-07T17:24:48+09:00 INFO Waiting for restart...
dotnet-sdk 2.2.202 from 'dotnetcore' installed
$

バージョン確認。コマンド名が長いのでaliasを設定したよ。

$ dotnet-sdk.dotnet --version
2.2.203
$ sudo snap alias dotnet-sdk.dotnet dotnet
$ dotnet --version
2.2.203
$

新規プロジェクト作成

dotnet new {TEMPLATE}コマンドを使うよ

今回はコンソールアプリケーションを作るので、TEMPLATEにはconsoleを指定しているよ。
その他のテンプレートはここにあるよ

-nでプロジェクトの名前を指定するよ

$ dotnet new console -n my-app
The template "Console Application" was created successfully.

Processing post-creation actions...
Running 'dotnet restore' on my-app/my-app.csproj...
  Restore completed in 101.17 ms for /home/loft/dev/dotnet-apt-test/my-app/my-app.csproj.

Restore succeeded.

$ ls -Fla my-app
total 20
drwxrwxr-x 3 loft loft 4096  ./
drwxrwxr-x 3 loft loft 4096  ../
-rw-rw-r-- 1 loft loft  221  my-app.csproj
drwxrwxrwx 2 loft loft 4096  bj/
-rw-rw-r-- 1 loft loft  188  Program.cs
$

ビルド&起動

dotnet buildでビルド、dotnet runでビルド&起動するよ

$ cd my-app/
$ dotnet run
Hello World!
$
# ちなみにDebugビルドで、成果物はここにある
$ dotnet bin/Debug/netcoreapp2.2/my-app.dll
Hello World!
$

新規プロジェクト作成時点でHello World!が実装されているよ。

あとは必要な機能を実装するだけだね!

NuGetパッケージを追加する

dotnet add packageコマンドで追加できるよ

# やべえ! jsonの処理を実装したんだけど、Newtonsoftパッケージがねえ!
$ dotnet run
error CS0246: The type or namespace name 'Newtonsoft' could not be found (are you missing a using directive or an assembly reference?) [/home/loft/hoge/my-app/hoge.csproj]

The build failed. Please fix the build errors and run again.

# 追加しよう 
$ dotnet add package Newtonsoft.Json

# 無問題!
$ dotnet run
Hello World!
$

リリース構成で出力する

dotnet publish コマンドで出力できるよ

-cにビルド構成(DebugRelease) を指定できるよ

bin/Release/netcoreappx.x/publish/配下が配布用の成果物一式だよ

$ dotnet publish -c Release
$ dotnet bin/Release/netcoreapp2.2/publish/my-app.dll
Hello World!
$

コンテナイメージにする

ベースイメージは.NET Core Runtime

Dockerfile

FROM mcr.microsoft.com/dotnet/core/runtime:2.2
LABEL  maintainer "your-name <your@email.hoge>"

# dotnet publishした一式を配置
ENV APP=my-app
WORKDIR /root/${APP}
COPY ./bin/Release/netcoreapp2.2/publish/* ./

# 起動コマンド
CMD dotnet ${APP}.dll

コンテナイメージビルド、コンテナ起動

$ sudo docker build -t my-app .
$ sudo docker run -d --name my-app -h my-app my-app
$ sudo docker ps -a | grep my-app
38a2e6a3704e   my-app   "/bin/sh -c 'dotne..."   9 seconds ago  Exited (0) 7 seconds ago                                                                                        my-app
$ sudo docker logs my-app
Hello World!
$
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

istio 1.0.5 を Kiali で可視化

Istio を導入したのはいいが、判りにくい。
少しでもわかりやすくしたいと思い調べていくと下記のようなサイトにたどり着いた。
KialiでIstio Service Meshをよりリッチにする
Visualizing Your Mesh

Kiali を追加すれば、判りやすくなるだろうということで試してみた。

● kiali secret 登録
$ mkdir kiali

$ KIALI_USERNAME=$(echo testuser | base64)
$ KIALI_PASSPHRASE=$(echo testuser | base64)

$ NAMESPACE=istio-system
$ kubectl create namespace $NAMESPACE

$ cat <<EOF > ~/kiali/secret
apiVersion: v1
kind: Secret
metadata:
  name: kiali
  namespace: $NAMESPACE
  labels:
    app: kiali
type: Opaque
data:
  username: $KIALI_USERNAME
  passphrase: $KIALI_PASSPHRASE
EOF

$ kubectl apply -f ~/kiali/secret
● kiali 追加
$ helm template /usr/local/src/istio-1.0.5/install/kubernetes/helm/istio \
    --set kiali.enabled=true \
    --set "kiali.dashboard.jaegerURL=http://jaeger-query:16686" \
    --set "kiali.dashboard.grafanaURL=http://grafana:3000" \
    --set gateways.istio-ingressgateway.type=NodePort \
    --set gateways.istio-egressgateway.type=NodePort \
    --name istio --namespace istio-system > ~/kiali/istio_kiali.yaml

$ kubectl apply -f ~/kiali/istio_kiali.yaml
● kiali 外部公開

Kubernetes 環境外からの接続のための設定を行う。

$ cat <<EOF > ~/kiali/kiali-service
apiVersion: v1
kind: Service
metadata:
  labels:
    app: kiali
  name: kiali
  namespace: istio-system
spec:
  ports:
  - name: http-kiali
    port: 20001
    protocol: TCP
    targetPort: 20001
    nodePort: 32001
  selector:
    app: kiali
  sessionAffinity: None
  type: NodePort
EOF

kubectl apply -f ~/kiali/kiali-service

http://:32001/ への接続で Kiali のコンソールに接続できる。
ログインユーザおよびパスフレーズは、共に「admin」である。
コンソール画面で「Graph」を選択し、「Namespace」を「istio-system」にして、
「Dispplay unused nodes」をクリックすれば、なにか表示されるかも

● kiali テスト環境作成

テスト環境用の namespace を作成し、自動インジェクションの設定を行う。
~/kiali/ 配下に後述する Yaml ファイルを作成し、追加する。

kubectl create namespace kiali-check
kubectl label ns kiali-check istio-injection=enabled
kubectl apply -f ~/kiali/deploy01.yaml
kubectl apply -f ~/kiali/deploy02.yaml
kubectl apply -f ~/kiali/gateway.yaml
kubectl apply -f ~/kiali/virtualservice.yaml
● kiali コンソール確認

コンソール画面で「Graph」を選択し、「Namespace」を「kiali-check」にして、
「Dispplay unused nodes」をクリックする。
http://:31380/ にリクエストを送る。
「Display」で「Service Nodes」と「Traffic Animation」をチェックする。
流れている感じが見られるのでなんとなくうれしい。

● ~/kiali/ 配下に作成する Yaml ファイル
deploy01.yaml
apiVersion: v1
kind: Service
metadata:
  name: kiali-service01
  namespace: kiali-check
  labels:
    app: kiali-service
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
  selector:
    app: kiali-http01
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kiali-deployment01
  namespace: kiali-check
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kiali-http01
  template:
    metadata:
      labels:
        app: kiali-http01
        version: v1
    spec:
      containers:
        - name: kiali-nginx01
          image: nginx:1.15
          ports:
            - containerPort: 80
              name: http
deploy02.yaml
apiVersion: v1
kind: Service
metadata:
  name: kiali-service02
  namespace: kiali-check
  labels:
    app: kiali-service
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
  selector:
    app: kiali-http02
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kiali-deployment02
  namespace: kiali-check
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kiali-http02
  template:
    metadata:
      labels:
        app: kiali-http02
        version: v1
    spec:
      containers:
        - name: kiali-nginx02
          image: nginx:1.15
          ports:
            - containerPort: 80
              name: http
gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: kiali-gateway
  namespace: kiali-check
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
virtualservice.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: virtualservice-kiali
  namespace: kiali-check
spec:
  hosts:
  - "*"
  gateways:
  - kiali-gateway
  http:
  - match:
    - uri:
        prefix: /
    route:
    - destination:
        port:
          number: 80
        host: kiali-service01.kiali-check.svc.cluster.local
      weight: 50
    - destination:
        port:
          number: 80
        host: kiali-service02.kiali-check.svc.cluster.local
      weight: 50
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

一足遅れて Kubernetes を学び始める - 05. workloads その1 -

ストーリー

  1. 一足遅れて Kubernetes を学び始める - 01. 環境選択編 -
  2. 一足遅れて Kubernetes を学び始める - 02. Docker For Mac -
  3. 一足遅れて Kubernetes を学び始める - 03. Raspberry Pi -
  4. 一足遅れて Kubernetes を学び始める - 04. kubectl -
  5. 一足遅れて Kubernetes を学び始める - 05. workloads その1 -

前回

一足遅れて Kubernetes を学び始める - 04. kubectl -では、kubenetesのCLIツールkubectlを学習しました。
今回は、目玉機能であるworkloadsについて学習します。

workloads

Kubernetesには、下記のようにリソースの種類が存在します。
今回は、Workloadsを学習します。

リソースの分類 内容
Workloadsリソース コンテナの実行に関するリソース
Discovery&LBリソース コンテナを外部公開するようなエンドポイントを提供するリソース
Config&Storageリソース 設定・機密情報・永続化ボリュームなどに関するリソース
Clusterリソース セキュリティやクォータなどに関するリソース
Metadataリソース リソースを操作する系統のリソース

KubernetesのWorkloadsリソース(その1)

Workloadsには、下記8つの種類があります。
* Pod
* ReplicationController
* ReplicaSet
* Deployment
* DaemonSet
* StatefulSet
* Job
* CronJob

Pod,ReplicationController,ReplicaSet,Deploymentまでを見ていきます。

Pod

コンテナを1つ以上含めた最小単位のリソース。
Pod毎にIPアドレスが振られる。ボリュームは共有。
基本的に、Podにコンテナを詰め込めるのではなく、「分離できるなら、分離する」方針がマイクロサービスとして良いそうです。
さっそく、動かしてみます。

alias k=kubectl

sample-2pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-2pod
spec:
  containers:
    - name: nginx-container
      image: nginx:1.12
    - name: redis-container
      image: redis:3.2
pi@raspi001:~/tmp $ k apply -f . --prune --all
pod/sample-2pod created
pi@raspi001:~/tmp $ k get pod sample-2pod
NAME          READY   STATUS    RESTARTS   AGE
sample-2pod   2/2     Running   0          101s

期待通り複数のコンテナが動いていますね。(READY 2/2)
execで中に入る場合、どうなるのでしょうか。

pi@raspi001:~/tmp $ k exec -it sample-2pod /bin/sh
Defaulting container name to nginx-container.
Use 'kubectl describe pod/sample-2pod -n default' to see all of the containers in this pod.
#

なるほど、デフォルトのコンテナ(containersの最初になる)に入るみたいです。
redis-containerに入る場合は、

pi@raspi001:~/tmp $ k exec -it sample-2pod -c redis-container /bin/sh
# redis-cli
127.0.0.1:6379> exit
#

-cでコンテナを指定するだけみたいです。
他にもありますが、長くなりそうなので切り上げます。

ReplicaSet, ReplicationController

レプリカという名前だけあって、Podを複製するリソース。
過去の経緯からReplicationControllerからReplicaSetへ名前変更があったため、ReplicaSetを使うことが推奨

さっそく、動かしてみます。

sample-rs.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: sample-rs
spec:
  replicas: 3
  selector:
   matchLabels:
    app: sample-app
  template:
   metadata:
    labels:
     app: sample-app
   spec:
    containers:
      - name: nginx-container
        image: nginx:1.12
      - name: redis-container
        image: redis:3.2
pi@raspi001:~/tmp $ k apply -f . --prune --all
replicaset.apps/sample-rs created
pod/sample-2pod unchanged
pi@raspi001:~/tmp $ k get pods
NAME              READY   STATUS              RESTARTS   AGE
sample-2pod       2/2     Running             0          20m
sample-rs-ghkcc   2/2     Running             0          103s
sample-rs-nsc5b   0/2     ContainerCreating   0          103s
sample-rs-wk7vl   0/2     ContainerCreating   0          103s

確かに、replica3つ(sample-rs)で、それぞれコンテナが2つ(READY 2/2)作れていますね。
書いて気になるのは、 podのapiVersionは、v1に対して、replicaSetのapiVersionは、 apps/v1というちょっと違うのが気になりましたので、調べてみたところ、Kubernetesの apiVersion に何を書けばいいかという記事を見つけました。
Coreとなる機能は、v1で良いみたいです。

Kubernetesの目玉機能であるオーケストレーションの機能であるセルフヒーリングを試してみます。

pi@raspi001:~/tmp $ k get pods
NAME              READY   STATUS    RESTARTS   AGE
sample-2pod       2/2     Running   0          29m
sample-rs-ghkcc   2/2     Running   0          11m
sample-rs-nsc5b   2/2     Running   0          11m
sample-rs-wk7vl   2/2     Running   0          11m
pi@raspi001:~/tmp $ k delete pod sample-rs-wk7vl
pod "sample-rs-wk7vl" deleted
pi@raspi001:~/tmp $ k get pods
NAME              READY   STATUS              RESTARTS   AGE
sample-2pod       2/2     Running             0          30m
sample-rs-ghkcc   2/2     Running             0          11m
sample-rs-gq2hs   0/2     ContainerCreating   0          13s
sample-rs-nsc5b   2/2     Running             0          11m

おー、ContainerCreatingされています。良いですね〜。
ちなみに、気になったのはnode自体が故障してダウンした場合は、どうなるのでしょうか。試してみます。

pi@raspi001:~/tmp $ k get pods -o=wide
NAME              READY   STATUS    RESTARTS   AGE    IP            NODE       NOMINATED NODE   READINESS GATES
sample-2pod       2/2     Running   0          32m    10.244.1.25   raspi002   <none>           <none>
sample-rs-ghkcc   2/2     Running   0          13m    10.244.1.26   raspi002   <none>           <none>
sample-rs-gq2hs   2/2     Running   0          114s   10.244.1.27   raspi002   <none>           <none>
sample-rs-nsc5b   2/2     Running   0          13m    10.244.2.15   raspi003   <none>           <none>

raspi003の電源を落としてみます。

worker(raspi003)に移動

~ $ slogin pi@raspi003.local
pi@raspi003.local's password:
pi@raspi003:~ $ sudo shutdown now
sudo: unable to resolve host raspi003
Connection to raspi003.local closed by remote host.
Connection to raspi003.local closed.
~ $

master(raspi001)に移動

pi@raspi001:~/tmp $ k get nodes
NAME       STATUS     ROLES    AGE     VERSION
raspi001   Ready      master   5d16h   v1.14.1
raspi002   Ready      worker   5d16h   v1.14.1
raspi003   NotReady   worker   4d21h   v1.14.1
pi@raspi001:~/tmp $ k get pods -o=wide
NAME              READY   STATUS    RESTARTS   AGE     IP            NODE       NOMINATED NODE   READINESS GATES
sample-2pod       2/2     Running   0          35m     10.244.1.25   raspi002   <none>           <none>
sample-rs-ghkcc   2/2     Running   0          17m     10.244.1.26   raspi002   <none>           <none>
sample-rs-gq2hs   2/2     Running   0          5m38s   10.244.1.27   raspi002   <none>           <none>
sample-rs-nsc5b   2/2     Running   0          17m     10.244.2.15   raspi003   <none>           <none>

ん? raspi003で動いている? 数十秒後... :thinking:

pi@raspi001:~/kubernetes-perfect-guide/samples/chapter05/tmp $ k get pods -o=wide
NAME              READY   STATUS        RESTARTS   AGE   IP            NODE       NOMINATED NODE   READINESS GATES
sample-2pod       2/2     Running       0          40m   10.244.1.25   raspi002   <none>           <none>
sample-rs-ghkcc   2/2     Running       0          22m   10.244.1.26   raspi002   <none>           <none>
sample-rs-gq2hs   2/2     Running       0          10m   10.244.1.27   raspi002   <none>           <none>
sample-rs-nsc5b   2/2     Terminating   0          22m   10.244.2.15   raspi003   <none>           <none>
sample-rs-p2jsc   2/2     Running       0          53s   10.244.1.28   raspi002   <none>           <none>

おー、期待通り raspi003にあるpodが消えて、raspi002に作り直されました。sample-rs-nsc5bはnodeが落ちちゃっているので、消すこともできず残り続けます。

少し待ち時間が長いような?

Kubernetesはクラスタで障害があったとき、どういう動きをするのかという記事によれば、kube-controller-managerが検知して、kube-schedulerが正しい数に揃えているみたいです。数十秒待たされたのは、検知の間隔のせいでしょうか。

kube-controller-managerのオプションで、--attach-detach-reconcile-sync-period duration Default: 1m0sとあります。1分間隔なのですかね。

特定Nodeでは動かさないようにしたい

「特定のnodeには動かさないで!」みたいな要望を叶えれるのでしょうか。 :thinking:

Assigning Pods to Nodesによると、nodeSelectorフィールドでアサインされるnodeを指定できるそうです。(除外ではなく、指定)
ただし、Editing nodeSelector doesn't rearrange pods in ReplicaSetによると、それはreplicaSetではなく、deploymentで行うべきとのことです。replicaSetで動くかどうか、念の為試してみます。

まず、先程落としたraspi003を電源を入れ直して起動させます。
その後、master(raspi001)に移動。

pi@raspi001:~/tmp $ k label nodes raspi002 type=AWS
node/raspi002 labeled
pi@raspi001:~/tmp $ k label nodes raspi003 type=GCP
node/raspi003 labeled
pi@raspi001:~/tmp $ k get nodes -L type
NAME       STATUS   ROLES    AGE     VERSION   TYPE
raspi001   Ready    master   5d17h   v1.14.1
raspi002   Ready    worker   5d17h   v1.14.1   AWS
raspi003   Ready    worker   4d21h   v1.14.1   GCP
pi@raspi001:~/tmp $ k get pods -o=wide
NAME              READY   STATUS    RESTARTS   AGE   IP            NODE       NOMINATED NODE   READINESS GATES
sample-2pod       2/2     Running   0          75m   10.244.1.25   raspi002   <none>           <none>
sample-rs-ghkcc   2/2     Running   0          56m   10.244.1.26   raspi002   <none>           <none>
sample-rs-gq2hs   2/2     Running   0          44m   10.244.1.27   raspi002   <none>           <none>
sample-rs-p2jsc   2/2     Running   0          35m   10.244.1.28   raspi002   <none>           <none>

sample-rsは、全てraspi002で動いているので、下記を試してみます。

  1. sample-rsはraspi002でのみ動くよう設定
  2. raspi002をシャットダウン

その結果、「sample-rsはraspi002が動いていないので、セルフヒーリングしない」ことを期待とします。

sample-rs.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: sample-rs
spec:
  replicas: 3
  selector:
   matchLabels:
    app: sample-app
  template:
   metadata:
    labels:
     app: sample-app
   spec:
    containers:
      - name: nginx-container
        image: nginx:1.12
      - name: redis-container
        image: redis:3.2
    nodeSelector:
        type: AWS
pi@raspi001:~/tmp $ k apply -f . --prune --all
replicaset.apps/sample-rs configured
pod/sample-2pod unchanged

nodeSelectorを追加しました。
今回は単純な指定なのでこれで良いですが、より柔軟に指定したい場合はnodeAffinityを使うそうです。

worker(raspi002)に移動

~ $ slogin pi@raspi002.local
pi@raspi002.local's password:
pi@raspi002:~ $ sudo shutdown now
sudo: unable to resolve host raspi002
Connection to raspi002.local closed by remote host.
Connection to raspi002.local closed.
~ $

数十秒待つ...
結果は...!

master(raspi001)に移動

pi@raspi001:~/tmp $ k get nodes -L type
NAME       STATUS     ROLES    AGE     VERSION   TYPE
raspi001   Ready      master   5d17h   v1.14.1
raspi002   NotReady   worker   5d17h   v1.14.1   AWS
raspi003   Ready      worker   4d22h   v1.14.1   GCP
pi@raspi001:~/tmp $ k get pods -o=wide
NAME              READY   STATUS        RESTARTS   AGE   IP            NODE       NOMINATED NODE   READINESS GATES
sample-2pod       2/2     Terminating   0          89m   10.244.1.25   raspi002   <none>           <none>
sample-rs-4srpp   0/2     Pending       0          36s   <none>        <none>     <none>           <none>
sample-rs-6mgcr   0/2     Pending       0          37s   <none>        <none>     <none>           <none>
sample-rs-ghkcc   2/2     Terminating   0          71m   10.244.1.26   raspi002   <none>           <none>
sample-rs-gq2hs   2/2     Terminating   0          59m   10.244.1.27   raspi002   <none>           <none>
sample-rs-lc225   0/2     Pending       0          36s   <none>        <none>     <none>           <none>
sample-rs-p2jsc   2/2     Terminating   0          49m   10.244.1.28   raspi002   <none>           <none>

期待通りでした。つまり、sample-rsはraspi002以外で作り直せないので、Pending,Terminating状態です。
また、単純なpodであるsample-2podはreplicaSetではないので、セルフヒーリングされずにTerminatingになっています。
面白いですね。これ。

Deployment

複数のReplicaSetを管理。
ReplicaSetにない「ローリングアップデート、ロールバック」機能が存在。
PodやReplicaSetではなく、Deploymentが最も推奨されるリソース種類。

ReplicaSetでは、指定したコンテナイメージを更新した場合(アップデート)、どうなるのでしょうか。すべて更新されるのか、一部だけなのでしょうか。試してみます。

sample-2pod-replica.yamlのnginxイメージを1.12から1.13に更新しました。

pi@raspi001:~/tmp $ k get all
NAME                  READY   STATUS    RESTARTS   AGE
pod/sample-rs-4srpp   2/2     Running   0          7h14m
pod/sample-rs-6mgcr   2/2     Running   0          7h14m
pod/sample-rs-lc225   2/2     Running   0          7h14m

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   6d

NAME                        DESIRED   CURRENT   READY   AGE
replicaset.apps/sample-rs   3         3         3       8h
pi@raspi001:~/tmp $ k apply -f . --prune --all
replicaset.apps/sample-rs configured
pod/sample-2pod created
pi@raspi001:~/tmp $ k describe replicaset sample-rs
Name:         sample-rs
...
  Containers:
   nginx-container:
    Image:        nginx:1.13
...

replicasetのマニュフェストは更新されました。

pi@raspi001:~/tmp $ k describe pod sample-rs-4srpp
Name:               sample-rs-4srpp
...
  nginx-container:
    Container ID:   docker://9160f550ee9d9bbcd1a5c990ca95389b2b39aff6688bcd933c99fe93b1968b99
    Image:          nginx:1.12
...

podは変化なしのようです。
では、Deploymentを使ってみます。

sample-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: sample-app
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
        - name: nginx-container
          image: nginx:1.12
          ports:
            - containerPort: 80
pi@raspi001:~/tmp $ k apply -f . --prune --all --record
replicaset.apps/sample-rs configured
pod/sample-2pod configured
deployment.apps/sample-deployment created

--recordをつけることで、履歴を保持することができます。ロールバックに使います。

pi@raspi001:~/tmp $ k get all
NAME                                    READY   STATUS    RESTARTS   AGE
pod/sample-2pod                         2/2     Running   0          12m
pod/sample-deployment-6cd85bd5f-4whgn   1/1     Running   0          119s
pod/sample-deployment-6cd85bd5f-js2sw   1/1     Running   0          119s
pod/sample-deployment-6cd85bd5f-mjt77   1/1     Running   0          119s
pod/sample-rs-4srpp                     2/2     Running   0          7h28m
pod/sample-rs-6mgcr                     2/2     Running   0          7h28m
pod/sample-rs-lc225                     2/2     Running   0          7h28m

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   6d1h

NAME                                READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/sample-deployment   3/3     3            3           2m

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/sample-deployment-6cd85bd5f   3         3         3       2m
replicaset.apps/sample-rs                     3         3         3       8h

sample-deploymentが、deployment,replicaset,podを作成しました。

では、sample-deploymentのnginxコンテナを1.12から1.13に更新してみます。

sample-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: sample-app
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
        - name: nginx-container
          image: nginx:1.13
          ports:
            - containerPort: 80
pi@raspi001:~/tmp $ k apply -f . --prune --all --record
replicaset.apps/sample-rs unchanged
pod/sample-2pod unchanged
deployment.apps/sample-deployment configured
pi@raspi001:~/tmp $ k get pod
NAME                                 READY   STATUS              RESTARTS   AGE
sample-2pod                          2/2     Running             0          15m
sample-deployment-6cd85bd5f-js2sw    1/1     Running             0          4m53s
sample-deployment-6cd85bd5f-mjt77    1/1     Running             0          4m53s
sample-deployment-7dfb996c6b-gh2cg   0/1     ContainerCreating   0          21s
sample-deployment-7dfb996c6b-m4wrd   1/1     Running             0          38s
sample-rs-4srpp                      2/2     Running             0          7h31m
sample-rs-6mgcr                      2/2     Running             0          7h31m
sample-rs-lc225                      2/2     Running             0          7h31m

おー、deploymentのpodが作り変わっていっています。これがローリングアップデートです。
ローリングアップデートは、spec.template以下が更新されると変化したとみなすそうです。
また、ロールバックは、rolloutコマンドで実施できますし、revision指定で戻すこともできます。
しかし、基本的にはマニュフェストを戻してapplyすべきです。

アップデート戦略というものがあり、デフォルトはRollingUpdateです。過不足分のPod考慮した更新戦略になります。
アップデート中に許容される不足分と超過分を設定できます。
他の戦略として、Recreate戦略があります。こちらは、全て同時に作り直しになります。ですので、一時的にアクセス不可になってしまいます。

1つ不安に感じたものとして、「フロントエンドのバージョンを1から2にアップデートしたら、バージョン1のコンテナにアクセスしたユーザがバージョン2のコンテナに遷移したら大丈夫なのかな :thinking: 」と思いました。しかし、これはローリングアップデートに限った話ではないので、それは考えないこととしました。ちゃんと設計すれば良い話ですね。

ちなみに、マニュフェストを書かずにdeploymentができます。k run sample-deployment-cli --image nginx:1.12 --replicas 3 --port 80です。お試しなら、便利ですね。

お片付け

試しに、pruneで削除しています。

pi@raspi001:~/tmp $ ls
sample-2pod-replica.yaml  sample-2pod.yaml  sample-deployment.yaml
pi@raspi001:~/tmp $ mv sample-2pod-replica.yaml sample-2pod-replica.yaml.org
pi@raspi001:~/tmp $ mv sample-deployment.yaml sample-deployment.yaml.org
pi@raspi001:~/tmp $ k apply -f . --all --prune
pod/sample-2pod configured
deployment.apps/sample-deployment pruned
replicaset.apps/sample-rs pruned
pi@raspi001:~/tmp $ k get all
NAME              READY   STATUS    RESTARTS   AGE
pod/sample-2pod   2/2     Running   0          30m

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   6d1h

んー、こうすると消せるのですが、どうしても1ファイル残してしまいます...。
すべてorgにすると、k apply -f .が失敗しますし...。

pi@raspi001:~/tmp $ k delete pod sample-2pod
pod "sample-2pod" deleted

結局、こうしました...。

おわりに

思った以上に、ReplicaSetにハマってしまいました。
次は、残りのworkloadsを試します。

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

Raspberry PiでDockerを動かす

DockerCon19にてDockerのARM対応が話されていたので、ラズパイ向けのイメージをMacでクロスコンパイルして見ることにしました。
ちなみに、元々ARM自体には対応していましたが今回のカンファレンスの話だとクロスコンパイルとDockerHubでのマルチアーキテクチャ対応がメインかと思います。

Raspberry PiにDockerをインストール

まずは、ラズパイにDockerをインストールします。
Raspbianを使ってるのでこちらに記載がある通りapt-getで入れます。

$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
$ docker -v
Docker version 18.09.0, build 4d60db4

ラズパイ側の準備はこれで完了です。

Docker Desktop(β)のインストール

19.03.0からバックエンドでqemuを利用してMacでもlinux/amd64のみならずlinux/arm/v7linux/arm64、さらにはwindows/amd64がビルドできるようになりました。
ただし、19.03はまだベータ版なので、以下のURLからDocker Desktop for Mac Communityのベータ版を入れる必要があります。

https://beta.docker.com/

$ docker -v
Docker version 19.03.0-beta3, build c55e026

上記のように19.03がインストールされていれば成功です。

Dockerfileの作成

Dockerfileの作成をします。なんでも良いのですが、以前作った「Raspberry PIでデスクトップ環境無しでChromiumを起動する」の内容をDockerイメージにしてみます。

FROM debian:buster

RUN apt-get update && \
    apt-get install -y xinit matchbox-window-manager xterm chromium && \
    apt-get -y --purge autoremove && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY run.sh /app/run.sh
CMD ["./run.sh"]

run.shは以下の通り。

#!/bin/sh

xinit matchbox-window-manager &
chromium --no-sandbox -kiosk "http://www.youtube.com"

Raspbianを使う必要はないので普通にDebianを使用しています。
重要なのはDockerHubの公式を見れば分かると思うのですがこの公式イメージがArmに対応しているということです。

001.png

Dockerは実行環境または指定されたオプションに従って適切なCPUアーキテクチャのイメージを落とします。
Dockerfile内でapt-get等もしていますがこれも元イメージが同じなので特に意識することなくx86とARMが切り替わります。
これによって動作確認は高速なx86で行って同じDockefileを編集なしにARM版のモジュールを作成することができます。

ARMイメージのビルド

ではARM版のビルドを行います。具体的には--platformを指定します。

$ docker buildx build -t koduki/rpi-chrome --platform linux/arm/v7 --push .

開発版のbuildkitの機能を使うためにbuildxを指定しています。また、ラズパイはarmv7なのでlinux/arm/v7をplatformに指定しています。

詳細に関しては下記を参照してください。
https://github.com/docker/buildx#building-multi-platform-images

今回はlinux/arm/v7しか指定していませんが、マルチプラットフォームのイメージを作りたい場合は下記のようにDriverをdocker-containerに変更し、,で区切ることで複数モジュールのビルド/Pushができるようになります。

$ docker buildx create --driver docker-container --name multibuild
$ docker buildx use multibuild
$ docker buildx build -t koduki/rpi-chrome --platform linux/amd64,linux/arm/v7 --push .

Raspberry Piでコンテナを実行する

実行するに当たって特に特別な事はありませんがラズパイ上で実行してみます。

$ docker run -it koduki/rpi-chrome uname -a
Linux cd4a0c8248fb 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l GNU/Linux

通常通りDockerHubから落として実行されます。この時にARM向けのモジュールを登録しておけば適切に選択され上記のように実行されますあ、arm64とかamd64とかしか登録してないと当然実行時にエラーになるのでご注意ください。

では、Chromeを起動してみましょう。

$ docker run -it -e DISPLAY=:0 --privileged koduki/rpi-chrome

少しサボってprivilegedを渡しています。これはGPUを叩くためです。
また、同じく:0をDISPLAYとして環境変数に渡しています。

まとめ

「ラズパイでDocker動かしてなんの意味あるの?」と言われそうですがデプロイの管理がやはり楽になります。Dockerで配布して終わりになるので。ラズパイ側でaptとか不要!
あと、ラズパイ側が究極的にはかなり薄くできるのでIoT的にも良いんじゃないかと。

19.03.0はビルドが高速化されたり今回のクロスプラットフォームビルドなど、かなり新機能が盛りだくさんなのでもうちょっと追っていきたいと思います。
それではHappy Hacking!

参考

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

nvidia-docker+Dockerfileなコンテナの立て方

とどのつまり

予めDockerfileをしっかり書きたい、しかしnvidia-docker(2)使うときは、

# Test nvidia-smi with the latest official CUDA image
$ docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi

みたいにnvidia製のイメージを使わないとうまくいかなそう、どうすればいいの...?って思ったのでいろいろやってみた

結論、

$ docker run --runtime=nvidia オリジナルのDockerfileをビルドしたイメージ

でいけた。ただしDockerfileは本家に倣う必要あり。

ホスト環境

  • ubuntu16.04
  • cuda9.0
  • nvidia-docker2

作りたいコンテナ

  • ubuntu16.04
  • cuda9.0 + cudnn7
  • とりあえず nvidia-smi が動いてほしい

やったこと

Dockerfileを書く

  • 本家nvidia/cudaのDockerfileを拾ってきました。

  • 変な環境変数?等あったので適当にコメントアウトしつつ書き換えました

# ARG IMAGE_NAME
# FROM ${IMAGE_NAME}:9.0-devel-ubuntu16.04
FROM nvidia/cuda:9.0-devel-ubuntu16.04
# LABEL maintainer "NVIDIA CORPORATION <cudatools@nvidia.com>"
ENV CUDNN_VERSION 7.5.0.56
# LABEL com.nvidia.cudnn.version="${CUDNN_VERSION}"
RUN apt-get update && apt-get install -y --no-install-recommends \
            libcudnn7=$CUDNN_VERSION-1+cuda9.0 \
            libcudnn7-dev=$CUDNN_VERSION-1+cuda9.0 && \
    apt-mark hold libcudnn7 && \
    rm -rf /var/lib/apt/lists/*

イメージを作る

  • 書いたDockerfileがあるディレクトリで
$ docker build ./ -t cuda-9.0-cudnn7-devel
  • -t オプションで適当にcuda~~~っていう名前をつけました

じっこう!

$ docker run --runtime=nvidia --rm cuda-9.0-cudnn7-devel nvidia-smi

Screenshot from 2019-05-03 14-25-36.png

以上!

1マイクロミリバイト以上の情報を得たらいいねしよう☆

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

kubectlで「Unable to connect to the server」

Docker for Macで以前インストールしたKubernetesでクラスタ情報を取得しようとしたら

$ kubectl cluster-info
Kubernetes master is running at https://localhost:6443

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
Unable to connect to the server: EOF

というエラーが発生した。また、Docker for Macのメニューから「Preferences」で設定画面を開くと、以下のキャプチャのようにKubernetes is startingのままrunningの状態に遷移しなかった。

スクリーンショット 2019-05-03 10.07.08.png

以下のキャプチャようにDocker for Macの設定画面から利用できるリソースの上限を変更して、数分待ったら、Kubernetes is runningの状態に遷移した。

スクリーンショット 2019-05-03 11.24.27.png

参考

[helm] elasticsearchをinstallしたらkubectlが「Unable to connect to the server:」しか返さなくなった

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

IBM Cloud Private (ICP) のローカル環境をラクに構築する

はじめに

Vagrant と VirtualBox を利用した IBM Cloud Private ローカル環境構築を紹介します。vagrant up 一発で VirualBox 上の Ubuntu 16.04 と LXC コンテナを3つ作成し、ICP をインストールします。同様のインストールを Docker コンテナ + ゼロからインストールするよりもメモリ使用量を抑えられますし、手順的にラクです。
すでに別のインストール記事も公開されていますので、そちらも参照ください。

PCにICP 3.1.2 をたった3行でインストールする
https://qiita.com/yurak/items/d56575635bca0061155d

導入手順

以下のドキュメントに従って導入します。
https://github.com/IBM/deploy-ibm-cloud-private/blob/master/docs/deploy-vagrant.md

環境

  • macOS 10.14.4 (Mojave)
  • VirtualBox 5.2.26
  • Vagrant 2.2.3

手順

VirtualBox をインストールします。
https://www.virtualbox.org/wiki/Downloads

Vagrant をインストールします。
https://www.vagrantup.com/downloads.html

GitHub からリポジトリをクローンします。

git clone https://github.com/IBM/deploy-ibm-cloud-private.git
cd deploy-ibm-cloud-private

必要に応じて Vagrantfile を編集します。
デフォルトではメモリーに 8GB を割り当てています。環境に応じて増減してください。また admin のパスワードもここで指定しています。

Vagrantfile
# should be sufficent on laptops with 16GiB of RAM (but you won't want to run any apps
# while this vm is running)
memory = '8192'

# Default admin password - ICP 3.1.2 now requires 32 characters by default
default_admin_password = "S3cure-icp-admin-passw0rd-default"

vagrant up で環境構築を開始します。途中、ラインセンスの確認やホスト環境の管理者パスワードを求められます。

~ $ vagrant up
################################################################################
# You must accept the terms of the Software License under which we are         #
# providing the IBM Cloud Private community edition software.                  #
#                                                                              #
# See license terms here: https://hub.docker.com/r/ibmcom/icp-inception/       #
################################################################################
Do You Accept the Terms of the Software License? [Y|n]
Y
License Terms Accepted!
    :

約10分後、Ubuntu 16.04 のインストールと起動、LXC コンテナの作成と起動が完了すると以下のメッセージが表示され、IBM Cloud Private Community Edition のインストールが始まります。

==> icp: Running provisioner: shell...
    icp: Running: script: wait_for_worker_nodes_to_boot
    icp: 
    icp: Preparing nodes for IBM Cloud Private community edition cluster installation.
    icp: This process will take approximately 10-20 minutes depending on network speeds.
    icp: Take a break and go grab a cup of coffee, we'll keep working on this while you're away ;-)
    icp: .

上のメッセージでは10〜20分後ですが、私の環境では裏で別の仕事をしていたためか 約1時間かかって、導入が完了し、IBM の最初期のロゴとログイン情報が表示されました。なおパスワードはVagrantfile

    icp: Running: script: happy_dance
    icp: 
    icp:                                 O MMM .MM  MM7
    icp:                          ..M MMMM MMM DMMM MMM.MMMMO.
    icp:                        M.MM MMMM..MMM MMMM.MMM.NMMMMMM.
    icp:                      MM MM+MMM:. ,MM: MMMM MMM  MMMMMM
    icp:                     MM=.MM MMM   MMM. MMMM?MMM  MMM ..~ :MMM.
    icp:                 MM..MM.MM,OMMI   MMM .MMMMMMMM  MMM    MMMMMMM
    icp:               MMMM MM.NMM ~MMM   MMM..MMMMMMMM  MMM.  OMMMMMMMM
    icp:            ..MM.MMNMM.MM?  MMM  .MMM..MMMMMMMM  MMM   ~MM+  ,MM
    icp:           .MMM.MM:MM.?MM. .MMM  IMMM :MMMMMMMM  MMM   .MMM.  .
    icp:          .MMMMMMMMMM.MMM  .MMM~.MMMD MMMIMMMMM  MMMMMM. MMM   .,MMMM.
    icp:          NMMMMMM.MM: MM.    MMM.MMM, MMM.MMMMM  MMMMMM: =MMM   MMMMMM
    icp:       ..=MM,MMM.MMM MMM.   .MMM.MMM  MMM.8MMMM  MMM.  ,  .MMM .MMM  :
    icp:      MM MMM.MMM.MMM MMM     MMM MMM. MMM  MMMM  MMM.      MMMM.MMMM8.
    icp:    M . MMM.MMMZ7MM  MM.    .MMM MMM  MMM. MMMM  MMM.      .MMMM. MMMMMM   .
    icp:   M M.:MMMMMMM MMM.=MM      MMM.MMM  MMM  MMMM  MMM         MMM   .,MMMM MM
    icp:   M, M.7MMMMM..MMMMMMM.M   ~MMM.MMM .MMM. MMMM  MMM        .MMM ?   .MMM.M.M.
    icp:    MM. N       MMMMMM MMM=MMMM  MMM. MMM  MMMM  MMM. .DMM, MMMM MMMMMMMM  M M
    icp:    MMMM.  MM.   MMMM..MMMMMMM   MMM. MMM  MMMM :MMMMMZMMMMMMMMM  MMMMM  .M.$M
    icp:    MM.MMMMM.. MMM   .  ,MMM8    MMM .MMM  .MMM DMMMMM,  MMMMM      ..MM.. MM
    icp:    MM MM.MMMMMMM:   ~MMMM?       ... :IZ   MM,.NNO?,..         ZMM7.. MMMMMM
    icp:    MM MM MM MMMMMMMMMMMM=     .=MMMMMMMMMMMMNNMMMMMMMMMMMO...  .8MMMMMMMMMMM
    icp:    MM MM .M.M:  .MZMMMMMMMMMMMMMMMMMZ: .  . ......:INMMMMMMMMMMMMMMMMM :MMMM
    icp:    MM MM..M.MM,7MM :  MM  .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM.MMM  MM :MMMM
    icp:    MM MM M..MM,7MM :MMMM MM.MM  MM =MMM.MM:  ...M .MM.. .MM.:M MMM. MM :MMMM
    icp:    NMMMM M..MM,7MM  .:MM MM MM ..M =MM   MMMM MMM .M MMM MM. M MM8~ MM :M MM
    icp:     $MMMMMM.MM,7MM :MMMM .  MM Z.M =MM M MMMM MMM .M MMM =M..  MM +.MM  .NM8
    icp:       .MMMMMMM+7MM ~MMMM M: MM ZM .=MM M =MMM MMM .M.MMM.MM.M. MM.MMIMMMMMM
    icp:      MM  . MMMMMMMMMN.MM MM.MM ZM, =M .   MMM MMM .M .MI MM.MM M?MMMMMMMM
    icp:      MMM    ..  8MMMMMMMMMMMMMDOMM.~M.MMM.MMM.MMM..MM, 7MMMMMMMMMMMMM.
    icp:      MMMM  MMM  :   ..,MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM$   .
    icp:      .MMMMMMMM  MM$       .  .. ..:$MMMMMMMMMMMMMMMN=..     .    MMMMMMM.
    icp:       MMMMMMMM  MMM     MMMM  MMM. .,..   .   . .  IMM  MMMMMM  MMM7. I.
    icp:        MMMMOMM.~MMM.   MMMMM7.MMZ  ,MM: .MMM .MMM  MMM .MMMMMM $MM,
    icp:        DM M MM MMMM   MMM  8  MM,  OMM   MMM .MMM. MMM ?MM      MMMM.
    icp:        .MMZ MM.MM=MN  MMM     MM   MMM  .MMM  MMMM MMM MMM       MMMM
    icp:          ,  MM MM MM  MM+     MM.  MMM.  MMM  MMMM:MMM MMMMMM    MMMM
    icp:           ..MM MM MM. MMI    .MM=  MMM   MMM .MMMMMMM..MMMMMM    MMM
    icp:             MMM7MMMMM MMM     MMMMMMMM. .MMM $MMMMMMM  MMM    .MMMM.
    icp:              $M.MMMMM MMM     MMMMMMMM. .MMM.MMMMMMMM.=MM~     MMM
    icp:               . MMMMMM MM    .MMM. MMM. ZMM: MMMMMMMM MMM. IMM..
    icp:                  M :MM MM:    MMM. MMM  MMM  MMMMMMM  MMMMMMMM
    icp:                     MMM7MM. . MMM  MMM. MMM  MMMDMMM  MMMMMM+
    icp:                      MM.MMMMMMMMM  MMM..MMM ?MM=~MMM.~MMMM
    icp:                        . MMMM OMM. MMM .MMM MMM .MM= MM
    icp:                          . M   MMI MMM  MM  MMM..MM
    icp:                               ..NM =MM .MM .MD..  .
    icp: 
    icp: 
    icp: ###############################################################################
    icp: #          IBM Cloud Private community edition installation complete!         #
    icp: #                  The web console is now available at:                       #
    icp: #                                                                             #
    icp: #                          https://192.168.27.100:8443                        #
    icp: #        username/password is admin/S3cure-icp-admin-passw0rd-default         #
    icp: #                                                                             #
    icp: #                          Documentation available at:                        #
    icp: #               https://www.ibm.com/support/knowledgecenter/SSBS6K            #
    icp: #                                                                             #
    icp: #                 Request access to the ICP-ce Public Slack!:                 #
    icp: #                            http://ibm.biz/BdsHmN                            #
    icp: ###############################################################################

インストール完了後は /etc/hosts に以下の行を追記します。

/etc/hosts
192.168.27.100  mycluster.icp

ブラウザからダッシュボードの URL https://192.168.27.100:8443 を指定し、上の admin とパスワードでログインします。
icp-login1.png

ログインできない場合は下のトラブルシューティングも参照ください。

ICP 環境の停止、再開、削除

ICP 環境を停止、再開、アンインストールするには、インストールに使用したディレクトリでvagrant コマンドを実行します。

停止: vagrant halt
再開: vagrant up
削除: vagrant destroy
master ノードへのログイン: vagrant ssh

ICP クライアント環境の構築

構築した ICP に対して kubectlhelm コマンドを利用するには、個々にインストールする必要があります。以下の手順に従ってインストールしてください。

  • ICP ダッシュボード > 左上のハンバーガーメニュー > コマンド・ライン・ツール > Cloud Private CLI

環境によっては既存の Kubernetes 環境等と衝突する場合もあります。これを避けるため、ICP 関連の CLI をまとめた Dockerfile を作成しました。参考にしてください。

IBM Cloud Private (ICP) 用の各種 CLI を含む Dockerfile を作成しました
https://qiita.com/nzenge/items/5cae9fbcba8076bd4d77

なお Docker の証明書を取得する際には root アカウントが必要ですが、ユーザー vagrant、パスワード vagrant を使用します。

実行例
~/ $ scp vagrant@mycluster.icp:/etc/docker/certs.d/mycluster.icp\:8500/ca.crt ~/.docker/certs.d/mycluster.icp\:8500/ca.crt
vagrant@mycluster.icp's password:   ## vagrant と入力
ca.crt                                                            100% 6433     2.0MB/s   00:00    
~/ $ 

トラブルシューティング

Q. ダッシュボードにログインしようとするとエラー「404 Not Found」、メニューを選択すると「504 Gateway Time-out」エラーが返る。

A. おそらく ICP がまだ起動中です。しばらく待ってから再度試してみてください。頻発するようであれば Vagrnatfile 内のメモリーを増やしてください。

Q. カタログを開いても何も表示されない

A. 画面上部の「カタログ」をクリックしても何も表示されない場合があります。その際は ICP ダッシュボード > 左上のハンバーガーメニュー > 管理 > Helm リポジトリーを選択し、「リポジトリーの同期」をクリックしてください。

Q. (解決済み) LXC コンテナの作成でエラー「x509: certificate signed by unknown authority」が出力される

最初にこの Vagrantfile を試した際はコンテナの作成でエラーが発生し、ICP のインストールを開始できませんでした。調べると以下の記事でopensslが欠けていることがわかり、プルリクにつなげることができました(反映済み)。ありがとうございました。

失敗: Alpine 3.5.1上でLXD 2.8を使おうと試行錯誤した
https://qiita.com/tukiyo3/items/2833e6c5cdf1b8ae9eeb

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

メモ ECR ローカルMacからAWS CLIコマンドでリポジトリ作成/イメージpush/リポジトリ削除まで

やること

  • ローカルのMacからAWS CLIでECRにリポジトリを作成し、ビルドしたdocker imageをpush
  • AWSマネジメントコンソールでpushされたイメージ確認
  • AWS CLIでイメージの削除、リポジトリの削除

基本的にやってることはAmazon ECRにおけるdockerの基本と同じ
DockerHubとGoogleCloud Container Registryにしかイメージ上げたことなかったのでECRにも上げてみる

環境

  • Mac
  • Dockerインストール済み
  • aws cli使える(configureまで済ませてある)
  • AWSマネジメントコンソールにログインできる

作業

AWSマネジメントコンソールにログイン

まずはAWSコンソールにログインしてECSと検索する
左側にAmazon ECR リポジトリという項目があるので遷移
作ったリポジトリ一覧が表示されるか空の状態になってる

ローカルからAWS CLIでリポジトリを作成する

おもむろにコマンドをキメる

aws ecr create-repository --region リージョン --repository-name リポジトリ名

リージョンが東京でいいならap-notrheast-1にする

今回は10秒毎にechoを繰り返すalpineイメージをpushするのでリポジトリ名はechoalpineとした

aws ecr create-repository --region ap-notrheast-1 --repository-name echoalpine

AWSコンソールから確認してリポジトリが作成されていればOK

ECRにpushするdockerイメージのビルド (ただpullしたのでもok)

ここはわざわざビルドしなくてもdocker pull alpineとかで取得したイメージをpushしてもいいけれどechoalpineという名前なのでビルドする

適当にechoalpine イメージ用のディレクトリを作成してその中にDockerfileecho.shというファイルを作成する

mkdir echoalpine
cd echoalpine
touch Dockerfile
touch echo.sh
Dockerfile
FROM alpine:3.9.3

ADD ./echo.sh /tmp/echo.sh

CMD /tmp/echo.sh
echo.sh
#!/bin/ash

count=0
while true
do
    echo "my echoalpine container!! 1.0.0"
    sleep 10
    count=$(expr $count + 1)
    if [ $count -ge 10 ]; then
      echo "kiss of death..."
      exit
    fi
done

ビルドする

docker build -t echoalpine ./

動作確認(10回echoして終了、後のECS再起動確認のため)

docker run --rm -it --name echoalpine echoalpine

ECRにpushするイメージのタグ付け

先程作成したイメージもしくはpullしたイメージをECRのリポジトリにpushするためにtag付けする
形式は以下

docker tag ターゲットイメージ:タグ AWSアカウントID.dkr.ecr.ECRのリージョン.amazonaws.com/ECRリポジトリ名:ECRリポジトリに登録するタグ

echoalpineをタグ付けしたコマンドはこれ
AWSアカウントIDは適宜変更

docker tag echoalpine:latest xxxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/echoalpine:1.0.0

タグ付けしたイメージをリポジトリにpush

まずはECRへのpush権限をdockerに与えるためにawsコマンドを実行

aws ecr get-login --region リージョン --no-include-email
aws ecr get-login --region ap-northeast-1 --no-include-email

> docker login -u AWS -p zzzzzzz== https://xxxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com

dockerログイン用コマンドが出力されるのでそれを実行するとECRのリポジトリにpush出来るようになる
権限の有効期限は12時間らしい

先程タグ付けしたイメージをpushする

docker push xxxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/echoalpine:1.0.0

AWSコンソールの作成したリポジトリを選択してイメージを確認すると1.0.0のイメージが上がっているはず

pullも出来る

docker pull xxxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/echoalpine:1.0.0

作成したイメージとリポジトリの削除

ECRのリポジトリはAWS CLIからだと--forceオプションを付けないと削除できない
イメージを削除してからリポジトリを削除してみる(--forceで削除しないのは誤ってリポジトリを削除しないように使わないようにしている)

イメージの削除はAWS CLIから削除できる

aws ecr batch-delete-image --region リージョン --repository-name リポジトリ名 --image-ids imageTag=バージョン(タグ)
aws ecr batch-delete-image --region ap-northeast-1 --repository-name echoalpine --image-ids imageTag=1.0.0

イメージが消えたのをコンソールから確認したらリポジトリを削除する

aws ecr delete-repository --region リージョン --repository-name リポジトリ名 (--force)
aws ecr delete-repository --region ap-northeast-1 --repository-name echoalpine

リポジトリが消えたのを確認する

まとめ

aws ecr get-loginでECR用の権限を得る以外いつものdockerとあまり変わらない
ECSとかCodeBuildとかで使っていきたい

参考

Amazon ECRにおけるdockerの基本

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

GUIでDeep Learning用のDockerコンテナを作って学習する話(portainer)

はじめに

この記事はDockerでDeep LearningやってみたいけどCUIはめんどくさいという人向けの記事です。

Docker と nvidia-dockerのインストール方法等はもっとわかりやすい記事があるので、そちらをご覧ください。

Docker入門 ~Tensorflowも超簡単に!!~
https://qiita.com/yakigac/items/f14f12f182a564c091d0

今回の最終目標はDockerコンテナでTensorflow-gpuを動かすことです。

動作環境

  • Ubuntu 18.04.2 LTS
  • Docker 18.09.5
  • nvidia-docker 2.0.3
  • portainer 1.20.2

portainarインストール

以下のコマンドを順に実行

docker volume create portainer_data

docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

ブラウザからhttp://localhost:9000で接続できるます。

ポートを変えたいときはコマンド内の9000の部分を置き換えればいいです。

Deployment — Portainer 1.20.2 documentation
https://portainer.readthedocs.io/en/stable/deployment.html

portainerの初期設定

下の画面が表示されるので、ユーザー登録をします。

create_user.PNG

続いて、どこのDockerに接続するか聞かれるのでlocalを選択。

connect_docker.PNG

Homeに移動できるので、Endpointsの中のlocalをクリックするとDashboardに移動できます。

home.PNG
Dashboard.PNG

基本的にportainerはDashboardから操作します。次回からはログインをするとHomeを開けます。

コンテナを作る

今回はTensorflow公式のイメージを使用します(公式ページ)。

使用するイメージはtensorflow/tensorflow:latest-gpu-py3としました。
(tensolflowの最新バージョンのGPU版でpython3系のイメージ)

コンテナの一覧を開く

DashboardContainersを選択すると, 以下のように現在のコンテナ一覧が表示されます(起動していないものも含む)。

container_list.PNG

コンテナの新規作成画面を開く

Container listAdd containerをクリックするとCreate container画面が開きます。

Create_container.PNG

コンテナ名とイメージ名を入力

Nameにコンテナ名を入力する。今回はコンテナ名をTensorflowとしました。
先ほどのイメージ名を入力。このイメージはDockerHubにあるのでRegistryはDockerHubでいいです。

name_image.PNG

Interactive & TTYを有効にする

Docker内のコンソールに接続できるようにInteractive & TTYを有効にします。
docker runのコマンドのオプションで言うと-itです。

変更する場所は、Create container画面の下側のAdvanced container settings内のCommand & loggingです。
ConsoleInteractive & TTYのチェックします。

tty.PNG

ランタイムの変更

GPUを使用するコンテナを作成するときは、nvidia-dockerを使用することを明示しなければなりません。
docker runのオプションで言うと--runtime=nvidiaの部分です。

変更する場所は、Create container画面の下側のAdvanced container settings内のRuntime & Resourcesです。
Runtimenvidiaに変更してください。

runtime.PNG

共有フォルダの作成

ホスト側とコンテナ内に共有フォルダを作成します。必須ではありませんがdocker cpとかしなくていいので楽です。

Create container画面の下側のAdvanced container settings内のVolumesから設定できます。

Volume mappingmap additional volumeをクリックしてボリュームを追加します。

BindWritableを選択します。
container側にコンテナ側の共有フォルダのパス、host側にホスト側の共有フォルダのパスを入力します。

volumes.PNG

コンテナを作成

最後にDeploy the containerをクリックすればコンテナが作成されます。

container_list_after.PNG

共有フォルダの権限変更

今のままでは共有フォルダの権限のせいでホスト側から書き込めません。
なので、コンテナ内から権限を付与する必要があります(もっといい方法あれば教えてください…)。

Container listの作成したコンテナのQuick actions>_をクリックすると、Container console画面が開くので、Connectをクリック。

console_connect.PNG

するとコンソールが開くので、次のコマンドを入力。

chmod a+rwx <共有フォルダのパス>

これでTensorflowが動くコンテナ完成です。

動作確認

コンテナ内のコンソールで以下を実行してください。

python -c "from tensorflow.python.client import device_lib;device_lib.list_local_devices()"

実行結果

2019-05-02 19:53:24.463116: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2FMA
2019-05-02 19:53:24.601321: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:998] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2019-05-02 19:53:24.610259: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:998] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2019-05-02 19:53:24.610914: I tensorflow/compiler/xla/service/service.cc:150] XLA service 0x4cbebd0 executing computations on platform CUDA. Devices:
2019-05-02 19:53:24.610929: I tensorflow/compiler/xla/service/service.cc:158]   StreamExecutor device (0): GeForce GTX 1080 Ti, Compute Capability 6.1
2019-05-02 19:53:24.610934: I tensorflow/compiler/xla/service/service.cc:158]   StreamExecutor device (1): GeForce GTX 1080 Ti, Compute Capability 6.1
2019-05-02 19:53:24.630432: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 3192000000 Hz
2019-05-02 19:53:24.631122: I tensorflow/compiler/xla/service/service.cc:150] XLA service 0x4d305d0 executing computations on platform Host. Devices:
2019-05-02 19:53:24.631140: I tensorflow/compiler/xla/service/service.cc:158]   StreamExecutor device (0): <undefined>, <undefined>
2019-05-02 19:53:24.631495: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1433]Found device 0 with properties:
name: GeForce GTX 1080 Ti major: 6 minor: 1 memoryClockRate(GHz): 1.6325
pciBusID: 0000:01:00.0
totalMemory: 10.91GiB freeMemory: 10.68GiB
2019-05-02 19:53:24.631743: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1433]Found device 1 with properties:
name: GeForce GTX 1080 Ti major: 6 minor: 1 memoryClockRate(GHz): 1.6325
pciBusID: 0000:02:00.0
totalMemory: 10.92GiB freeMemory: 10.77GiB
2019-05-02 19:53:24.632553: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1512]Adding visible gpu devices: 0, 1
2019-05-02 19:53:24.633699: I tensorflow/core/common_runtime/gpu/gpu_device.cc:984] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-05-02 19:53:24.633719: I tensorflow/core/common_runtime/gpu/gpu_device.cc:990]    0 1
2019-05-02 19:53:24.633727: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1003]0:   N Y
2019-05-02 19:53:24.633733: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1003]1:   Y N
2019-05-02 19:53:24.634226: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115]Created TensorFlow device (/device:GPU:0 with 10389 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:01:00.0, compute capability: 6.1)
2019-05-02 19:53:24.634577: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115]Created TensorFlow device (/device:GPU:1 with 10479 MB memory) -> physical GPU (device: 1, name: GeForce GTX 1080 Ti, pci bus id: 0000:02:00.0, compute capability: 6.1)

GPUが認識できているのがわかります。

最後に

コンテナがGUIで全部使えるのほんとに楽でいいです。portainerすごい。

Deep LearningをちゃんとやっていくにはDockerは必須なんじゃないかなぁと個人的には思うので、もっと勉強しなきゃと思う次第です。

portainerには、まだよくわかってない機能がたくさんありそうなのでもっと使いこなしていきたい所存。

時間があったら、portainerでimageビルドする記事も書きます。

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