20190127のdockerに関する記事は11件です。

Dockerとはどういうものか

Dockerを半年くらい前にインターンで使ったが、そのときはどういうものなのかちゃんと理解できていなかった。

最近Dockerを使いたい、と思うことがあって少し調べたので簡単にまとめます。
Docker入門(第一回)~Dockerとは何か、何が良いのか~を参考にさせていただきました。

Dockerとは

Dockerは、Docker社が開発している、コンテナ型の仮想環境を作成、配布、実行するためのプラットフォーム

Dockerは、Linuxのコンテナ技術を使ったもので仮想マシンと比較される。
VirtualBoxなどの仮想マシンでは、ホストマシン上でハイパーバイザを利用しゲストOSを動かし、その上でミドルウェアなどを動かす。
それに対し、コンテナはホストマシンのカーネルを利用し、プロセスやユーザなどを隔離することで、あたかも別のマシンが動いているかのように動かすことができる。そのため、軽量で高速に起動、停止などが可能

仮想マシン:
[物理マシン]->[ホストOS]->[ハイパーバイザ]->[ゲストOS, ライブラリ/ミドルウェア, アプリ]

コンテナ:
[物理マシン]->[ホストOS]->[Docker Engine]->[ライブラリ/ミドルウェア, アプリ]

Dockerfile

また、Dockerはミドルウェアのインストールや各種環境設定をコード化して管理する。これをDockerfileと呼ぶ。

利点

  • コード化されたファイルを共有することで、どこでも誰でも同じ環境が作れる。
  • 作成した環境を配布しやすい。
  • スクラップ&ビルドが容易にできる。

開発環境準備の短縮化、環境のバージョンずれ防止ができるので新規メンバ参加時のコスト削減や、環境依存問題を減らせる。

まとめ

Dockerを使うことで安定した開発を進めたり、リリースサイクルの改善にも役立つ

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

Docker について

The Layered File System

まずは、Docker image と Dontainer の仕組みを理解。
Screen Shot 2019-01-26 at 5.42.34 PM.png

imageとfileSyatemは読み取り専用だが、Containerはこの上の層に構築されるので、その一番上のContainerにはRWが可能。

Screen Shot 2019-01-26 at 5.46.53 PM.png

Containerには、ログファイル・DBファイル・ソースコードの作成が可能ということを覚えておく。

...つまり、Dockerのimageに対していろいろ変更(書き込み)を行うのは、Containerという上レイヤーに対してのみ。だということ。

Volume

Hostのディレクトリと同期する(エイリアス)。

  • Host上に残っているため、Contanierが削除されても、データは残すことができる。

Custom Volume

docker run -p 8080:3000 -v /var/www node

例えば、container内のnodeが/var/wwwにログを吐き出したら...

  • Dockerは裏でマウントフォルダを作成する。 
docker inspect [ContainerName]
  • Name: 非常に長い一意
  • Source: ホスト側のマウントディレクトリ(Host側)
  • Destination: コンテナのボリューム ディレクトリ(Container側)

スクリーンショット 2019-01-27 22.25.42.png

デフォルトでContainer上のデータを半永久的に残す方法

Volumeの場所をカスタマイズ

docker run -p 8080:3000 -v $(pwd):/var/www node
  • 現在のディレクトリをマウントディレクトリとする。

スクリーンショット 2019-01-27 22.29.56.png

実践!

スクリーンショット 2019-01-27 22.33.51.png

このフォルダをコンテナにリンクして、nodeを起動!

$ docker run -p 8080:3000 -v $(pwd):/var/www -w "/var/www" node npm start
  • Host Port: 8080
  • Container Port: 3000
  • Host Volume: currentDir
  • Container Volume: /var/www
  • -w(作業ディレクトリ): ContaierのDirectoryを/var/wwwに移動し、node npm start を実行

これで、ホスト側のソースを弄っても、コンテナ内に同期してあるので、反映される。

もっかい一から。

docker pull [ImageName]
  • Containerと対話
docker run -it -p 8080:80 -v $(pwd):/var/www -w "/var/www" [ImageName] /bin/bash
  • -it: TTY, 一種の対話モード。コンテナに対抗するこまんどを発行
  • /bin/bash: ターミナルを返す(典型文で覚えればOK)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Datadog+DockerComposeでElixir/Phoenixのログをみる

datadog2.png

前回、 DockerCompose使ってElixirの開発環境を作った。基本的に、この環境を使って入れば、どんなOS上で開発を行っていても、エラーは、同じものが出ます。これをAWSなどのインスタンスにアップしてユーザーテストなどをしてもらうんですが、その時のElixir/Phoenixのログを見たい場合、テストする人に、ブラウザのデベロッパツールに出ているものなどを貼ってもらう必要がある。

ただ、送ってもらえない場合は、開発者が自分で、そのエラー状況を再現しないければならない。これは、たまに、難しい・。。環境(動作環境・開発環境=Docker Compose)は同じものでも、テストした人の状況によっては、再現がめんどくさいなど。そんな時は、テストしたテスト環境(AWS)のエラーログをみたくなる。

こんなケースに、ログ収集サービスがある。Datadogは、その機能を有している。ログ収集の方法は、Datadogの方に書いてある通りで、docker-compose.ymlへの記述方法も書かれているが、、なんどか聞かれたので、需要があるのかな?と思い、投稿。

docker-compose.yml
labels:
  com.datadoghq.ad.logs: '[{"source": "phoenix-test", "service": "phoenix-test"}]'

ログを出したいサービスのところにlabelsとして、こんな感じに1つ書いておけばいい。

datadogの方では、上の場合を例にとれば、phoenix-test という文字でフィルタすれば、見やすくなると思います。

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

ACR(Azure Container Registry)とAKS(Azure Kubernetes Service)関連のAzure CLIコマンドメモ

AKSの環境構築に必要となったAzure CLIコマンドをメモとして残しています。

全般

# リソースグループ作成
az group create
# リソースグループ削除
az group delete

ACR関連

# レジストリ名確認
az acr check-name
# ACRリポジトリ作成
az acr create
# イメージのビルド
az acr build
# リソースID取得
az acr show

サービスプリンシパル関連

# サービスプリンシパル作成
az ad sp create-for-rbac
# サービスプリンシパル情報参照
az ad sp show
# サービスプリンシパル削除
az ad sp delete

AKS関連

# クラスタ作成
az aks create
# 認証情報取得
az aks get-credentials
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerで送信専用メールサーバーなうに使っていいよ。

お手軽な送信専用メールサーバーが欲しい方はどうぞ。

docker pull takeyamajp/postfix

https://hub.docker.com/r/takeyamajp/postfix

Postfixは公式のイメージが無いようなので、自分が求める水準のものを自作しました。

dockerのメール送信ニーズを解決します。
また、Synology NASの通知用カスタムSMTPとして最適です。

業務用途にも耐えられると思います。

以下、簡単な説明です。

FROM centos:centos7

...

ENV TIMEZONE Asia/Tokyo

ENV HOST_NAME smtp.example.com
ENV DOMAIN_NAME example.com

ENV MESSAGE_SIZE_LIMIT 10240000

ENV AUTH_USER user
ENV AUTH_PASSWORD password

EXPOSE 25
EXPOSE 587

このイメージについて

CentOS 7 の公式イメージをベースに作成しています。
https://hub.docker.com/_/centos

変数の値はコンテナを再作成しなくても変更できます。
例えば、コンテナをstopして最大メールサイズやパスワードを変更してから再startする事で新しい値が反映されます。

メール送信ログ

業務用途でなければ特に気にしなくて大丈夫です。

ログはDocker logsに出力されます。
Docker界のベストプラクティスに従って、コンテナ内でsupervisordを使ってrsyslog経由でログ収集しています。

タイムゾーン

日本で使用する場合は気にしなくて大丈夫です。

もし、海外で使用する場合はTIMEZONEの値を変更してください。
CentOSで使用可能な値をそのまま設定できます。

wikipedia : List of tz database time zones
https://en.m.wikipedia.org/wiki/List_of_tz_database_time_zones

ホスト名、ドメイン名

ホスト名とドメイン名をHOST_NAMEDOMAIN_NAMEに設定してください。

送信先のメールサーバーからこのメールサーバーの正当性を検証できるように、別途DNSサーバーに以下のレコードを登録する必要があります

  • Aレコード
  • SPFレコード

無料のツールでDNS設定が正しいかどうか確認できます。
インターリンク オンライン確認ツール
https://diag.interlink.or.jp/spf

カゴヤさんなど一部のレンタルサーバーでは、SPFレコードを自動的に設定してくれます。

このメールサーバーは送信専用で受信する機能がありません。そのため、MXレコードを登録する必要はありません。

自分への通知目的なら有料のドメインを取得しなくても、MyDNS.jpなど無料でサブドメインを割り当ててもらえるDDNSサービスで十分です。
https://www.mydns.jp
無料で取得できるドメイン名はスパム認定されている事が多いため、受信側でホワイトリストに登録した方が良いでしょう。
MyDNS.jpでも自動でSPFレコードを設定してくれるようです。

メールサイズ

添付ファイルなどでメールサイズが10MBを超える場合はMESSAGE_SIZE_LIMITの値を増やしてください。
単位はバイトです。

認証アカウント

アカウント情報をAUTH_USERAUTH_PASSWORDに設定してください。
実際の認証で使用するユーザー名はuser@example.comのようなメールアドレス形式になります。

@の右側(ドメイン名)の部分はDOMAIN_NAMEに設定した値になります。

このユーザー名はメールアドレス形式になっていますが、実際に送信されるメールには含まれません。
メール送信の承認だけに使用される情報です。

メーラーやメール送信プログラムなどで、任意の送信元アドレスを使用することができます。
(例: シンプルにno-reply@example.comとするか、目的別にwordpress@example.comとかerror-info@example.comなど使い分けても良いでしょう)

ポート番号

ポート25と587は同じ設定にしてあるため、どちらを使っても構いません。

もし、コンテナをhostネットワークで動かしたい場合、かつレンタルサーバーでポート25がブロックされている場合は、サブミッションポート587を使ってください。


以上です。
それでは良いメールサーバーライフを。

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

alpine の apk updage && apk add と apk add --no-cache

alpine に浅かった頃

FROM alpine

RUN apk update && \
    apk upgrade && \
    apk add nginx && \
    rm /var/cache/*

みたいな Dockerfile を書いていたが、
https://github.com/hadolint/hadolint/wiki/DL3017 を見ると、apk upgrade は 本質的ではないパッケージが多数アップグレードされるので非推奨。

また、https://github.com/hadolint/hadolint/wiki/DL3019 では
apk update && apk add hoge && rm /var/cache/* ではなく apk add --no-cache が推奨。

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

DBを使わないRails on DockerのWebアプリの作り方

Problem

とりあえずブレスト」というWebアプリを作ったときに「DBなしでできそう!」となったのだが、docker docsだとpostgreSQLありきたっだのでDBなしで開発を始める手順をまとめておきました。

Simple Conclusion

  • Dockerfileやdocker-compose.ymlからDBに関係しそうなところを削除する
  • rails newする際に"-O"オプションをつける

Details

まずはdocker docsを参考にDBを使わないDockerfileやdocker-compose.ymlの準備する。
最初にmkdir myappでアプリのディレクトリを作成し、cd myappでアプリのディレクトリへ移動しておく。

Dockerfile

myapp/Dockerfile
FROM ruby:2.5
ENV LANG C.UTF-8
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install -j4
COPY . /myapp

ポイントはapt-getの対象からpostgresql-clientをのぞくこと。

docker-compose.yml

myapp/docker-compose.yml
version: '3'
services:
  web:
    container_name: myapp_web
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      TZ: Asia/Tokyo
    command: rails s
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"

こちらはdb serviceをごっそり削除。depends_onするdbを消去するのでweb側のdepends_onも削除。
container_name、dockerfile、TZなどの設定は好みなのでつけなくてもOKです。

Rails new

上で作った"Dockerfile"、"docker-compose.yml"以外はdocker docsにそって"Gemfile"と"Gemfile.lock"を作っておく。
4つのファイルを作ったらrails newをしてWebアプリを作成してdocker imageをbuildしますが、ここのrails newでDatabaseを利用しないことを宣言するために"-O"オプションをつける。
色々設定とかしないといけないんだろうなーと思っていたけど"-O"だけで済むなんてさすがRailsさん。

$ docker-compose run web rails new . -O
$ docker-compose build

このあと、docker docsではDatabaseのあれやこれやの設定をしていますが、無視してdocker containerを立ち上げる。

$ docker-compose up

http://localhost:3000へアクセス!
hello_world_rails.png

Yay! You're on Rails (without Database) !!

Reference

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

Windows環境にDocker Toolboxをインストールする

はじめに

Docker、非常に便利ですね。Dockerを使用すればローカル環境を汚すことなく、様々なアプリケーションを実行できたりしてしまいます。Dockerに関する記事はネット上に豊富にありますが、いかんせん界隈の技術の進歩も早くすぐに情報が陳腐化してしまいます。

本稿ではDocker/周辺のエコシステムについてインプットして実際に実行したことをアウトプットしたいと思います。

導入環境

  • Windows10 Home 64bit
  • Intel Core i5-8250U CPU

CPU仮想化を有効にする

インストールの前にCPUの仮想化が有効になっているか確認をします。無効の場合、Virtualization Technologyを有効にします。
1. タスクマネージャ⇒パフォーマンスタブ⇒CPU
2. 右下の[仮想化]が"無効"の場合、BIOSの設定から有効化します。
image.png
設定方法については"VT 有効化"等で検索するか、以下のサイトが参考になります。

DWAPP - CPU仮想化の確認(Windows10)
Tekwind - 仮想化機能を有効にするためのBIOS設定

BIOSで設定を有効にしたら、タスクマネージャから確認しておきます。
image.png

インストール

Windows環境でインストールできるDockerは「Docker Desktop(Windows)」もしくは「Docker Toolbox」です。
Docker Desktop(Windows)は以前はDocker for Windowsと呼ばれていました。Docker Desktop(Windows)はHyper-Vを使用したOSネイティブで動作します。そのため、必然的にHyper-Vを使用可能なエディション(Pro or Enterprise or Education)に限定されます。
今回導入する環境はWindows10のHomeエディションのため、Docker Toolboxをインストールします。

Install Docker Toolbox on Windows

上記サイトの"Get Docker ToolBox for Windows"リンクからダウンロードします。Legacy desktop solutionの記載がありますが、特に問題はありません。インストール後に使用するDockerコマンドもDocker Desktopと違いはありません。

ダウンロードしたインストーラからインストールします(後述のNDIS5 driver以外はデフォルトでOKです)。
image.png
image.png
image.png
※一番下のチェックボックスはデフォルトではOFFですが、ONにしてNDIS5 driverを使用するようにします。
image.png
image.png
※ユニバーサルシリアルバスコントローラーの確認が表示された場合はインストールします。
image.png
image.png

インストール後、デスクトップにOracle VM VirtualBoxDocker Quickstart TerminalKitematic (Alpha)のショートカットが作成されます。

まず、Oracle VM VirtualBoxを実行し、VirtualBoxマネージャーを確認してみると仮想マシンはまだひとつもありません。
image.png
次に、Docker Quickstart Terminalを実行します。諸々のセットアップが自動で行われた後、下記のような画面になればセットアップ含めてインストール完了です(途中、VirtualBoxによるコンピュータの変更ウインドウが表示された場合は"はい"を選択します)。
image.png
再度、Oracle VM VirtualBoxマネージャーを確認してみます。
image.png
defaultという名前の仮想マシンが作成されています。これがDocker(Toolbox)の実行環境になります。VirtualBoxマネージャーで何かを行うということは基本的にはありませんので、仮想マシンの作成後はあまり意識することはないかもしれません。

正常にインストールできているか、Dockerコマンドを実行して確認してみます。

$ docker --version
Docker version 18.03.0-ce, build 0520e24302

version情報が出力され、Dockerが正しくインストールされていることを確認できました。

また、現在ローカルPCに存在する実行環境は以下のコマンドで確認可能です。

$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
default   *        virtualbox   Running   tcp://192.168.99.100:2376           v18.09.1

VirtualBoxマネージャーで確認したdefaultという名前の実行環境が起動しています。[ACTIVE]の*は現在接続しているということを表します。

コンテナ起動

Dockerのインストールが無事完了したので、実際にコンテナを起動してみます。
DockerのコンテナはDockerイメージから作成します。以下のコマンドでローカルPCに存在するイメージの一覧を確認してみます。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

当然ですがまだひとつもイメージが存在しないため、まず、ローカルPCにイメージをpullします。
Dockerには公式のイメージ保管レジストリであるDocker Hubがあり、docker image pull <image-name:Tag>コマンドによりDocker Hubからイメージを取得可能です。

今回はhello-worldイメージからコンテナを起動してみます。なお、pull時のTagは省略可能で、省略した場合はデフォルトでlatestタグのイメージを取得します。

$ docker image pull hello-world:latest
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Downloaded newer image for hello-world:latest

再度、イメージ一覧を確認してみます。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              fce289e99eb9        3 weeks ago         1.84kB

hello-worldイメージをローカルPCにpull出来たので、このイメージからコンテナを起動してみます。docker container run <image-name>コマンドを使用します。

$ docker container run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

コンテナが作成・起動されました。docker container ls -aコマンドでコンテナの一覧を確認してみます。

$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
57b684deeb76        hello-world         "/hello"            6 seconds ago       Exited (0) 6 seconds ago                       thirsty_swartz

hello-worldイメージを元にしたコンテナがひとつ存在しているのが確認できます(hello-worldコンテナは起動後、停止するため、STATUSがExitedとなっています)。-aオプションは停止しているコンテナも含めて一覧表示します。

なお、ローカル上にDockerイメージが存在しない状態でdocker container run ~コマンドを実行した場合、run時にpullを行いコンテナを起動します。

また、Dockerコマンドについてはコマンド体系に変更があり、ネットの情報でも新旧コマンドが混在しています。がらりと変更になったわけではなく、現在も旧来のコマンドを使用可能ですが、できる限り新しいコマンドを使用するようにしましょう。
以下のQiitaが非常にまとまっており、参考になります。

docker container / image コマンド新旧比較

コンテナはdocker container rm <container-id or container-name>コマンドで削除できます。
コンテナIDを指定する場合は、削除対象のコンテナを特定できるレベルでOKで、IDを全桁指定しなくても問題ありません。

$ docker container rm 57b
57b
$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

おわりに

今回はdocker(toolbox)のインストールを行い、簡単なコンテナの起動までを行いました。hello-worldコンテナの場合、Dockerを使用するメリットが分かりづらいかもしれません。

手軽に有効利用できることとしては、公式のMySQLやPostgreSQL等のDBイメージがDocker Hubにあります。それらのイメージを使用することにより、ローカル環境にDBをインストールすることなく、ローカルの開発で手軽に様々なDB環境を構築・利用することができます。

Docker Desktopが利用できない環境でも、今回のようにDocker toolboxでDockerを利用することが可能ですので、利用してみてください。
最後に、公式ドキュメントのリンクになります。Dockerは開発スピードが早く、既存の機能がレガシーとなってしまうこともありますので公式サイトは適宜チェックするようにしましょう。

Docker Documentation

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

ROS複数Docker通信

背景

・開発環境/ランタイムのアプリ依存は完全に排除することは非常に困難。
・ROSアプリによっては特定のversionやpackageに依存する。(例えば、melodic依存など)
・docker使えば、上記は排除できるし、アプリ提供者がシステムを気にしなくてもいい。
・開発環境もランタイムもアプリごとに自由だし、界面もdockerでわかりやすい。

ここで試してみること

  1. ROSノードを複数のdockerで起動して通信できることを確認する。
  2. ROS2ノードを複数のdockerで起動して通信できることを確認する。
  3. ROS/ROS2ノードを複数のdockerで起動し、ros1_bridgeを利用してROS/ROS2間で通信できることを確認する。 (*) ROSのrosmasterはhostで動作させることにする。他のROS/ROS2ノードはすべてdockerでの実行。

環境

Host Linux: Ubuntu16.04.5 LTS
Docker: 18.09.0, build 4d60db4
Host Linux ROS version: kinetic

Docker imageの準備

Host LinuxのROS及びdocker自体のインストール設定は省きます。(ググればOK)

docker pull ros:kinetic
docker pull ros:melodic
docker pull osrf/ros2:bouncy-desktop
docker pull osrf/ros2:bouncy-ros1-bridge

docker images
REPOSITORY          TAG                  IMAGE ID            CREATED             SIZE
ros                 melodic              9425ec5f7a7f        3 days ago          1.27GB
osrf/ros2           bouncy-ros1-bridge   495f9879df9e        2 weeks ago         1.2GB
osrf/ros2           bouncy-desktop       3e9aa775362d        2 weeks ago         2.41GB
ros                 kinetic              6f91828bbf93        4 weeks ago         1.19GB

1. ROSノード複数Docker通信

[Overview]
image.png

[Procedure]
1-1. Host Linuxでroscore起動

# docker networkを利用するので以下の設定でroscoreを起動する。
export ROS_MASTER_URI=http://172.17.0.1:11311
export ROS_IP=172.17.0.1
roscore
...

1-2. ros:kinecit dockerでpublisher起動

# docker ros:kinetic start
docker run -it 6f91828bbf93

# net-tools install (IP addressを念の為確認するため)
apt update
apt install net-tools
ifconfig

# ROS IP setting
export ROS_MASTER_URI=http://172.17.0.1:11311
export ROS_IP=172.17.0.2

# topic publish start
rostopic pub -r 10 /chatter std_msgs/String "this is ros:kinetic"

1-3. ros:melodic dockerでsubscliber起動

# docker ros:melodic start
docker run -it 9425ec5f7a7f

# net-tools install (IP addressを念の為確認するため)
apt update
apt install net-tools
ifconfig

# ROS IP setting
export ROS_MASTER_URI=http://172.17.0.1:11311
export ROS_IP=172.17.0.3

# topic publish start
root@c489bf255877:/# rostopic echo /chatter
data: "this is ros:kinetic"

...

(当然ですが、)ROSノード間でPub/Sub通信できていることが確認できました。

2. ROS2ノード複数Docker通信

[Overview]
image.png

2-1. ros2:bouncy-desktop dockerでpublisher起動

# docker ros2:bouncy-desktop start
docker run -it 3e9aa775362d

# topic publish start
ros2 topic pub /chatter std_msgs/String "data: this is ros2:bouncy-desktop"
publisher: beginning loop
publishing #1: std_msgs.msg.String(data='this is ros2:bouncy-desktop')

2-2. ros2:bouncy-desktop dockerでsubscriber起動

# docker ros2:bouncy-desktop start
docker run -it 3e9aa775362d

# topic subscriber start
ros2 topic echo /chatter std_msgs/String
data: this is ros2:bouncy-desktop

ROS2ノードでdocker間通信ができました。

3. ROS/ROS2ノード複数Docker通信

[Overview]
image.png

3-1. Host Linuxでroscore起動

# docker networkを利用するので以下の設定でroscoreを起動する。
export ROS_MASTER_URI=http://172.17.0.1:11311
export ROS_IP=172.17.0.1
roscore
...

3-2. ros:melodic dockerでpublisher起動

# docker ros:melodic start
docker run -it 9425ec5f7a7f

# net-tools install (IP addressを念の為確認するため)
apt update
apt install net-tools
ifconfig

# ROS IP setting
export ROS_MASTER_URI=http://172.17.0.1:11311
export ROS_IP=172.17.0.2

# topic publish start
rostopic pub /chatter std_msgs/String "this is ros:melodic"

3-3. docker ros2:bouncy-ros1-bridge start

# docker ros2:bouncy-ros1-bridge start
docker run -it 495f9879df9e

# net-tools install (IP addressを念の為確認するため)
apt update
apt install net-tools
ifconfig

# ROS IP setting
export ROS_MASTER_URI=http://172.17.0.1:11311
export ROS_IP=172.17.0.5

# ROS/ROS2 bridge start
ros2 run ros1_bridge dynamic_bridge /chatter std_msgs/String
created 1to2 bridge for topic '/chatter' with ROS 1 type 'std_msgs/String' and ROS 2 type 'std_msgs/String'

3-4. ros2:bouncy-desktop dockerでsubscriber起動

# docker ros2:bouncy-desktop start
docker run -it 3e9aa775362d

# topic subscriber start
ros2 topic echo /chatter std_msgs/String
data: this is ros:melodic

ROS bridgeを利用して、docker間でROS/ROS2通信を確認できました。

ということで、dockerを使えばROS分散型開発が簡単にできる。

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

CircleCIがパスしない時にローカルでデバッグする方法

問題

  • CircleCIがパスしない
  • ログを見ても原因がよくわからない

解決策

  • circleci buildでCIをローカル上のDockerコンテナで実行する
  • CIが終わってもコンテナを破棄しないよう.circleci/config.ymlを変更する
  • Dockerコンテナに接続してデバッグする

Docker Desktopのインストール

手順略

circleciコマンドのインストール

Macの場合はHomebrewでインストールします。

brew install circleci

circleci build

以下のコマンドによりCircleCIのタスクをローカルのDockerコンテナで実行します。

circleci build

このままだとCIが成功しても失敗しても終わったらコンテナは終了するため、デバッグすることができません。

CIが終わってもコンテナを破棄しないようにする

正確にはCIプロセスが終わらないようにします。

まず、失敗するstep以降をコメントアウトします。

次に、以下の設定を.circleci/config.ymlのjobs/build/stepsの最後に追加します。

      - run:
          name: for debug
          no_output_timeout: 120m
          command: |
            tail -f /dev/null

.circleci/config.ymlの全体は例えば以下のようになります。

version: 2
jobs:
  build:
    docker:
      - image: circleci/node

    steps:
      - checkout
      - run:
          name: install npm packages
          command: |
            npm install --verbose
      ...
#      - run:
#          name: unit test
#          command: |
#            npm run test
      - run:
          name: for debug
          no_output_timeout: 120m
          command: |
            tail -f /dev/null

Dockerコンテナに接続する

上記設定を加えた後にcircleci buildを実行すると、CIの実行コンテナが残り続けます。

docker psコマンドでコンテナ名を確認し、コンテナに接続します。

$ docker ps
$ docker exec -it [container] bash

以降、リモート実行時に失敗したコマンドを手動で実行するなどしてデバッグします。

タイムアウトを設定する

上記の設定ではno_output_timeoutの指定により120分後にコンテナは自動停止します。
デバッグに必要な時間を余裕を持って設定しましょう。

別の方法

リモートのCircleCIにはRun job with SSHボタンにより、
SSHを有効にした状態でビルドを走らせることができます。
こちらの方法もデバッグに使えますが、SSH接続中は実行時間が消費される点に注意しましょう。

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

docker-composeでシンプルにvue.js環境構築

はじめに

今回はdocker-composeでvue.jsの開発環境をシンプルに構築してみます。

環境

Dockerとdocker-composeは用意できている前提です。
Docker version 18.06.0-ce
docker-compose version 1.22.0

構成

以下の構成を想定しています。
server/ 以下にvue.jsのプロジェクトが作成されます。

project
├── docker
│   └── Dockerfile
├── docker-compose.yml
└── server

構築

環境構築の手順を解説を簡単に交えながら紹介していきます。

1. docker-compose.yml作成

docker-compose.yml
version: '3'

services:
  web:
    container_name: web
    build: ./docker
    ports:
      - 8080:8080
    privileged: true
    volumes:
      - ./server:/app
    tty: true
    stdin_open: true
    command: /bin/sh

【備考】
vue.jsはデフォルトでポート8080を使用するようになっているため、それに合わせてます。
必要な方は以下のように変更することもできます。

docker-compose.yml
ports:
 - 9000:9000

2. Dockerfileの作成

Dockerfile
FROM node:8.11.3-alpine

WORKDIR /app

RUN apk update && \
    npm install && \
    npm install -g npm && \
    npm install -g vue-cli

3. Docker起動&コンテナに入る

# Docker構築&起動
docker-compose up -d

# コンテナに入る
docker-compose exec web sh

4. vue.jsプロジェクト作成または更新

新規構築と更新(gitで共有された場合など)でコマンドが変わりますのでご注意ください。

新規作成の場合

/app # vue init webpack
# y/nで質問されますが、こだわりなければ基本yesまたはEnterでOKです。

環境設定
hostやポートを変更しましょう。
今回は、hostを'localhost'から'0.0.0.0'に変更します。

server/config/index.js
// Various Dev Server settings
host: '0.0.0.0', // can be overwritten by process.env.HOST

更新の場合

/app # npm update

npm実行(共通)

/app # npm run dev

5. 確認

http://0.0.0.0:8080 にアクセスしましょう。
下記の画面が表示されればOKです。

スクリーンショット 2019-01-27 2.10.15.png

参考
https://qiita.com/rh_taro/items/ca08b930f704275286a4

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