- 投稿日:2019-05-03T22:05:28+09:00
Docker のインストール on Ubuntu
2018.11 頃に書いて放置していた下書きの供養記事。
気が向いたら最近の状況に合わせて更新。
Docker (と Ubuntu) のインストールについてのメモ。
Docker Compose もインストールする。Ubuntu のインストール
Docker を動作させるための OS をインストールする。
雑誌 (日経Linux) の付録で Ubuntu 18.04 LTS があったのでそれを試すことにした。付録のものはサーバ版ではなくデスクトップ版だが、不要なパッケージは削除すればいいと思ってそのまま使用した 1 。
ざっと調べた感じではサーバ版とデスクトップ版はカーネルが少し違うらしい。特に問題にはならないはず。
また、サーバ版は日本語インストーラがないらしく、インストール後に言語設定が必要になる。デスクトップ版はその辺を省略できるので少し楽かもしれない。
- OS をインストール。
- デフォルトの構成ではオフィスソフトやゲーム等が入るようなので、それらのない最小構成を選択した。
- インストールが完了するとDVD の自動取り出しと再起動ボタンの表示がされるので、DVD をトレイから外して再起動ボタンを押す。
- 再起動後の作業。
- 諸々のパッケージを更新する。
sudo apt update
sudo apt upgrade
- ネットワーク設定をごにょごにょ。
/etc/netplan/
にある YAML ファイルを適宜変更してsudo netplan apply
- SSH 接続して作業したい。
sudo apt install openssh-server
- デフォルトのエディタが nano 。人権がない 。Vim を入れる。
sudo apt install vim
sudo update-alternatives --config editor
でvim.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
docker
やdocker-engine
パッケージをはもう古いもの(なのでアンインストールする必要がある)らしい。おお、マジか。
今はdocker-ce
パッケージとのこと。
ググると古いパッケージでインストール手順を紹介している記事が多いので注意しよう。
- 一方で Ubuntu のパッケージ管理用のコマンドが
apt
ではなくapt-get
で記載されてたりする。適宜読み替えていこう。Supported storage drivers
サポートしているストレージドライバの話。
ストレージドライバとは…? とりあえず後回し。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-worldInstall 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-composeMaster builds
開発中バージョンの 入手方法の紹介。今回は不要なのでスルー。
Upgrading
Docker Compose 1.3 からコンテナの扱いが変わったので
1.2 以前のバージョンを使用していればアップグレードしましょう、というお話。
今回は気にしなくてよい。Uninstallation
Docker Compose のアンインストール。
Docker 同様にアンインストールが必要になったとき参照する。
- 投稿日:2019-05-03T20:29:25+09:00
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.ymlversion: '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 は追加しません。Gemfilegroup :test do # Adds support for Capybara system testing and selenium driver gem 'capybara', '>= 2.15' gem 'selenium-webdriver' gem 'rspec-rails' enddocker 環境で、bundle install を実行する
docker 環境で追加した gem をインストールします。
$ docker-compose up -d $ docker-compose exec web bash # 以下は web コンテナ内で実行します。 $ bundle installrspec の初期設定をする。
続けて、rspec の初期設定をします。
# 以下は web コンテナ内で実行します。 $ bin/rails g rspec:installsystem 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.rbrequire '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
の中で、url
にSELENIUM_DRIVER_URL
環境変数の値を設定しています。
headless chrome からは、ローカル環境ではなく、web
コンテナ側の rails アプリを表示してテストする必要があるため、
Capybara.server_host
とCapybara.app_host
を設定しています。参考情報
- 投稿日:2019-05-03T18:25:23+09:00
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:latestupdateは無事。
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/firmwaretzdataだけ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.
- 投稿日:2019-05-03T18:22:30+09:00
Dockerで立ち上げた開発環境をVS Codeで開く!
待望のリモート開発機能がやってきました!
Introducing Remote Development for @code ???️
— Visual Studio Code (@code) 2019年5月2日
A new set of extensions that enable you to open any folder in a container, on a remote machine, or in the Windows Subsystem for Linux (WSL) and take advantage of VS Code's full feature set. #remote
? https://t.co/ChYGQ89Y5f発表記事はこちら 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 が必要なので、開きます。
Remote - Containers のExtensionを Insiders にインストール。 (まだ発表されたばかりで表示順序が低いのでスクロールして探す)
開発リポジトリの設定
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 で開きます。
Remote-Containers: Open Folder in Container...
を選択します。
remote-dev-go
を Clone した先のディレクトリを開きます。開くと、 docker-compose の build が走るのでしばらく待ちます。
これで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を追加することが可能です。
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.ymlversion: '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-composedocker-compose -f /元々の/docker-compose.yml -f /リモート開発環境用の/docker-compose.extend.yml up -d --buildまとめ
これで開発のための環境をローカルに構築しなくても、 Docker と VSCode がインストールしてあれば開発出来るようになりそうです。
VS Code は Code Server として動作させ、ブラウザから操作するということも出来るようになってきているようなので、組み合わせれば Docker とブラウザさえあればどんな開発環境でもローカル環境を汚すことなく起動できるようになるかもしれません。また、発表当日からドキュメントとExamplesの充実具合が凄いです。
この開発リソースの多さが VS Code の強みと言えると思います。参考
リモートサーバーにSSHする場合の記事もありました。
- 投稿日:2019-05-03T17:25:51+09:00
.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"インストール
基本的には本家ドキュメントを見てね
各ディストリビューション毎にあるよ
- Install .NET Core SDK on Linux Ubuntu 16.04 - x64
- aptで入れるよ
- Install .NET Core SDK on Linux CentOS / Oracle - x64
- yumで入れるよ
以下のように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
にビルド構成(Debug
やRelease
) を指定できるよ
bin/Release/netcoreappx.x/publish/
配下が配布用の成果物一式だよ$ dotnet publish -c Release $ dotnet bin/Release/netcoreapp2.2/publish/my-app.dll Hello World! $コンテナイメージにする
ベースイメージは.NET Core Runtime
DockerfileFROM 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! $
- 投稿日:2019-05-03T16:31:57+09:00
istio 1.0.5 を Kiali で可視化
Istio を導入したのはいいが、判りにくい。
少しでもわかりやすくしたいと思い調べていくと下記のようなサイトにたどり着いた。
KialiでIstio Service Meshをよりリッチにする
Visualizing Your MeshKiali を追加すれば、判りやすくなるだろうということで試してみた。
● 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-servicehttp://: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.yamlapiVersion: 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: httpdeploy02.yamlapiVersion: 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: httpgateway.yamlapiVersion: 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.yamlapiVersion: 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
- 投稿日:2019-05-03T14:59:22+09:00
一足遅れて Kubernetes を学び始める - 05. workloads その1 -
ストーリー
- 一足遅れて Kubernetes を学び始める - 01. 環境選択編 -
- 一足遅れて Kubernetes を学び始める - 02. Docker For Mac -
- 一足遅れて Kubernetes を学び始める - 03. Raspberry Pi -
- 一足遅れて Kubernetes を学び始める - 04. kubectl -
- 一足遅れて 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
* CronJobPod,ReplicationController,ReplicaSet,Deploymentまでを見ていきます。
Pod
コンテナを1つ以上含めた最小単位のリソース。
Pod毎にIPアドレスが振られる。ボリュームは共有。
基本的に、Podにコンテナを詰め込めるのではなく、「分離できるなら、分離する」方針がマイクロサービスとして良いそうです。
さっそく、動かしてみます。※
alias k=kubectl
sample-2pod.yamlapiVersion: v1 kind: Pod metadata: name: sample-2pod spec: containers: - name: nginx-container image: nginx:1.12 - name: redis-container image: redis:3.2pi@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.yamlapiVersion: 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.2pi@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で動いている? 数十秒後...
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には動かさないで!」みたいな要望を叶えれるのでしょうか。
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で動いているので、下記を試してみます。
- sample-rsはraspi002でのみ動くよう設定
- raspi002をシャットダウン
その結果、「sample-rsはraspi002が動いていないので、セルフヒーリングしない」ことを期待とします。
sample-rs.yamlapiVersion: 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 unchangednodeSelectorを追加しました。
今回は単純な指定なのでこれで良いですが、より柔軟に指定したい場合は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.yamlapiVersion: 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: 80pi@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 8hsample-deploymentが、deployment,replicaset,podを作成しました。
では、sample-deploymentのnginxコンテナを1.12から1.13に更新してみます。
sample-deployment.yamlapiVersion: 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: 80pi@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のコンテナに遷移したら大丈夫なのかな 」と思いました。しかし、これはローリングアップデートに限った話ではないので、それは考えないこととしました。ちゃんと設計すれば良い話ですね。
ちなみに、マニュフェストを書かずに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を試します。
- 投稿日:2019-05-03T14:43:18+09:00
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/v7
やlinux/arm64
、さらにはwindows/amd64
がビルドできるようになりました。
ただし、19.03はまだベータ版なので、以下のURLからDocker Desktop for Mac Community
のベータ版を入れる必要があります。$ 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に対応しているということ
です。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!参考
- 投稿日:2019-05-03T14:26:52+09:00
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を拾ってきました。
- 他のcudaやcudnnのバージョンのDockerfileも https://gitlab.com/nvidia/cuda/ から拾ってこれます。
変な環境変数?等あったので適当にコメントアウトしつつ書き換えました
# 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以上!
1マイクロミリバイト以上の情報を得たらいいねしよう☆
- 投稿日:2019-05-03T12:18:51+09:00
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の状態に遷移しなかった。以下のキャプチャようにDocker for Macの設定画面から利用できるリソースの上限を変更して、数分待ったら、
Kubernetes is running
の状態に遷移した。参考
[helm] elasticsearchをinstallしたらkubectlが「Unable to connect to the server:」しか返さなくなった
- 投稿日:2019-05-03T10:07:34+09:00
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/DownloadsVagrant をインストールします。
https://www.vagrantup.com/downloads.htmlGitHub からリポジトリをクローンします。
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/hosts192.168.27.100 mycluster.icpブラウザからダッシュボードの URL
https://192.168.27.100:8443
を指定し、上の admin とパスワードでログインします。
ログインできない場合は下のトラブルシューティングも参照ください。
ICP 環境の停止、再開、削除
ICP 環境を停止、再開、アンインストールするには、インストールに使用したディレクトリで
vagrant
コマンドを実行します。停止:
vagrant halt
再開:vagrant up
削除:vagrant destroy
master ノードへのログイン:vagrant ssh
ICP クライアント環境の構築
構築した ICP に対して
kubectl
やhelm
コマンドを利用するには、個々にインストールする必要があります。以下の手順に従ってインストールしてください。
- 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
- 投稿日:2019-05-03T10:05:52+09:00
メモ 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 echoalpineAWSコンソールから確認してリポジトリが作成されていればOK
ECRにpushするdockerイメージのビルド (ただpullしたのでもok)
ここはわざわざビルドしなくても
docker pull alpine
とかで取得したイメージをpushしてもいいけれどechoalpine
という名前なのでビルドする適当にechoalpine イメージ用のディレクトリを作成してその中に
Dockerfile
とecho.sh
というファイルを作成するmkdir echoalpine cd echoalpine touch Dockerfile touch echo.shDockerfileFROM alpine:3.9.3 ADD ./echo.sh /tmp/echo.sh CMD /tmp/echo.shecho.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 echoalpineECRに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-emailaws ecr get-login --region ap-northeast-1 --no-include-email > docker login -u AWS -p zzzzzzz== https://xxxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.comdockerログイン用コマンドが出力されるのでそれを実行するとECRのリポジトリにpush出来るようになる
権限の有効期限は12時間らしい先程タグ付けしたイメージをpushする
docker push xxxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/echoalpine:1.0.0AWSコンソールの作成したリポジトリを選択してイメージを確認すると
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とかで使っていきたい参考
- 投稿日:2019-05-03T04:57:59+09:00
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_datadocker 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.htmlportainerの初期設定
下の画面が表示されるので、ユーザー登録をします。
続いて、どこのDockerに接続するか聞かれるので
local
を選択。
Home
に移動できるので、Endpoints
の中のlocal
をクリックするとDashboard
に移動できます。
基本的にportainerは
Dashboard
から操作します。次回からはログインをするとHome
を開けます。コンテナを作る
今回はTensorflow公式のイメージを使用します(公式ページ)。
使用するイメージは
tensorflow/tensorflow:latest-gpu-py3
としました。
(tensolflowの最新バージョンのGPU版でpython3系のイメージ)コンテナの一覧を開く
Dashboard
のContainers
を選択すると, 以下のように現在のコンテナ一覧が表示されます(起動していないものも含む)。
コンテナの新規作成画面を開く
Container list
のAdd container
をクリックするとCreate container
画面が開きます。
コンテナ名とイメージ名を入力
Name
にコンテナ名を入力する。今回はコンテナ名をTensorflowとしました。
先ほどのイメージ名を入力。このイメージはDockerHubにあるのでRegistry
はDockerHubでいいです。
Interactive & TTYを有効にする
Docker内のコンソールに接続できるように
Interactive & TTY
を有効にします。
docker run
のコマンドのオプションで言うと-it
です。変更する場所は、
Create container
画面の下側のAdvanced container settings
内のCommand & logging
です。
Console
のInteractive & TTY
のチェックします。
ランタイムの変更
GPUを使用するコンテナを作成するときは、nvidia-dockerを使用することを明示しなければなりません。
docker run
のオプションで言うと--runtime=nvidia
の部分です。変更する場所は、
Create container
画面の下側のAdvanced container settings
内のRuntime & Resources
です。
Runtime
をnvidia
に変更してください。
共有フォルダの作成
ホスト側とコンテナ内に共有フォルダを作成します。必須ではありませんが
docker cp
とかしなくていいので楽です。
Create container
画面の下側のAdvanced container settings
内のVolumes
から設定できます。
Volume mapping
のmap additional volume
をクリックしてボリュームを追加します。
Bind
とWritable
を選択します。
container
側にコンテナ側の共有フォルダのパス、host
側にホスト側の共有フォルダのパスを入力します。
コンテナを作成
最後に
Deploy the container
をクリックすればコンテナが作成されます。
共有フォルダの権限変更
今のままでは共有フォルダの権限のせいでホスト側から書き込めません。
なので、コンテナ内から権限を付与する必要があります(もっといい方法あれば教えてください…)。
Container list
の作成したコンテナのQuick actions
の>_
をクリックすると、Container console
画面が開くので、Connect
をクリック。
するとコンソールが開くので、次のコマンドを入力。
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ビルドする記事も書きます。