- 投稿日:2019-01-27T23:55:14+09:00
Dockerとはどういうものか
Dockerを半年くらい前にインターンで使ったが、そのときはどういうものなのかちゃんと理解できていなかった。
最近Dockerを使いたい、と思うことがあって少し調べたので簡単にまとめます。
Docker入門(第一回)~Dockerとは何か、何が良いのか~を参考にさせていただきました。Dockerとは
Dockerは、Docker社が開発している、コンテナ型の仮想環境を作成、配布、実行するためのプラットフォーム
Dockerは、Linuxのコンテナ技術を使ったもので仮想マシンと比較される。
VirtualBoxなどの仮想マシンでは、ホストマシン上でハイパーバイザを利用しゲストOSを動かし、その上でミドルウェアなどを動かす。
それに対し、コンテナはホストマシンのカーネルを利用し、プロセスやユーザなどを隔離することで、あたかも別のマシンが動いているかのように動かすことができる。そのため、軽量で高速に起動、停止などが可能。仮想マシン:
[物理マシン]->[ホストOS]->[ハイパーバイザ]->[ゲストOS, ライブラリ/ミドルウェア, アプリ]コンテナ:
[物理マシン]->[ホストOS]->[Docker Engine]->[ライブラリ/ミドルウェア, アプリ]Dockerfile
また、Dockerはミドルウェアのインストールや各種環境設定をコード化して管理する。これをDockerfileと呼ぶ。
利点
- コード化されたファイルを共有することで、どこでも誰でも同じ環境が作れる。
- 作成した環境を配布しやすい。
- スクラップ&ビルドが容易にできる。
開発環境準備の短縮化、環境のバージョンずれ防止ができるので新規メンバ参加時のコスト削減や、環境依存問題を減らせる。
まとめ
Dockerを使うことで安定した開発を進めたり、リリースサイクルの改善にも役立つ
- 投稿日:2019-01-27T23:10:58+09:00
Docker について
The Layered File System
まずは、Docker image と Dontainer の仕組みを理解。
imageとfileSyatemは読み取り専用だが、Containerはこの上の層に構築されるので、その一番上のContainerにはRWが可能。
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側)
デフォルトでContainer上のデータを半永久的に残す方法
Volumeの場所をカスタマイズ
docker run -p 8080:3000 -v $(pwd):/var/www node
- 現在のディレクトリをマウントディレクトリとする。
実践!
このフォルダをコンテナにリンクして、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)
- 投稿日:2019-01-27T21:49:57+09:00
Datadog+DockerComposeでElixir/Phoenixのログをみる
前回、 DockerCompose使ってElixirの開発環境を作った。基本的に、この環境を使って入れば、どんなOS上で開発を行っていても、エラーは、同じものが出ます。これをAWSなどのインスタンスにアップしてユーザーテストなどをしてもらうんですが、その時のElixir/Phoenixのログを見たい場合、テストする人に、ブラウザのデベロッパツールに出ているものなどを貼ってもらう必要がある。
ただ、送ってもらえない場合は、開発者が自分で、そのエラー状況を再現しないければならない。これは、たまに、難しい・。。環境(動作環境・開発環境=Docker Compose)は同じものでも、テストした人の状況によっては、再現がめんどくさいなど。そんな時は、テストしたテスト環境(AWS)のエラーログをみたくなる。
こんなケースに、ログ収集サービスがある。Datadogは、その機能を有している。ログ収集の方法は、Datadogの方に書いてある通りで、docker-compose.ymlへの記述方法も書かれているが、、なんどか聞かれたので、需要があるのかな?と思い、投稿。
docker-compose.ymllabels: com.datadoghq.ad.logs: '[{"source": "phoenix-test", "service": "phoenix-test"}]'ログを出したいサービスのところにlabelsとして、こんな感じに1つ書いておけばいい。
datadogの方では、上の場合を例にとれば、phoenix-test という文字でフィルタすれば、見やすくなると思います。
- 投稿日:2019-01-27T20:37:56+09:00
ACR(Azure Container Registry)とAKS(Azure Kubernetes Service)関連のAzure CLIコマンドメモ
AKSの環境構築に必要となったAzure CLIコマンドをメモとして残しています。
全般
# リソースグループ作成 az group create # リソースグループ削除 az group deleteACR関連
# レジストリ名確認 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 deleteAKS関連
# クラスタ作成 az aks create # 認証情報取得 az aks get-credentials
- 投稿日:2019-01-27T20:03:34+09:00
Dockerで送信専用メールサーバーなうに使っていいよ。
お手軽な送信専用メールサーバーが欲しい方はどうぞ。
docker pull takeyamajp/postfixhttps://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_NAMEとDOMAIN_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_USERとAUTH_PASSWORDに設定してください。
実際の認証で使用するユーザー名はuser@example.comのようなメールアドレス形式になります。
@の右側(ドメイン名)の部分はDOMAIN_NAMEに設定した値になります。このユーザー名はメールアドレス形式になっていますが、実際に送信されるメールには含まれません。
メール送信の承認だけに使用される情報です。メーラーやメール送信プログラムなどで、任意の送信元アドレスを使用することができます。
(例: シンプルにno-reply@example.comとするか、目的別にwordpress@example.comとかerror-info@example.comなど使い分けても良いでしょう)ポート番号
ポート25と587は同じ設定にしてあるため、どちらを使っても構いません。
もし、コンテナをhostネットワークで動かしたい場合、かつレンタルサーバーでポート25がブロックされている場合は、サブミッションポート587を使ってください。
—
以上です。
それでは良いメールサーバーライフを。
- 投稿日:2019-01-27T20:01:57+09:00
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が推奨。
- 投稿日:2019-01-27T15:43:47+09:00
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/DockerfileFROM 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.ymlversion: '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 uphttp://localhost:3000へアクセス!
Yay! You're on Rails (without Database) !!
Reference
- 投稿日:2019-01-27T13:11:24+09:00
Windows環境にDocker Toolboxをインストールする
はじめに
Docker、非常に便利ですね。Dockerを使用すればローカル環境を汚すことなく、様々なアプリケーションを実行できたりしてしまいます。Dockerに関する記事はネット上に豊富にありますが、いかんせん界隈の技術の進歩も早くすぐに情報が陳腐化してしまいます。
本稿ではDocker/周辺のエコシステムについてインプットして実際に実行したことをアウトプットしたいと思います。
導入環境
- Windows10 Home 64bit
- Intel Core i5-8250U CPU
CPU仮想化を有効にする
インストールの前にCPUの仮想化が有効になっているか確認をします。無効の場合、Virtualization Technologyを有効にします。
1. タスクマネージャ⇒パフォーマンスタブ⇒CPU
2. 右下の[仮想化]が"無効"の場合、BIOSの設定から有効化します。
設定方法については"VT 有効化"等で検索するか、以下のサイトが参考になります。BIOSで設定を有効にしたら、タスクマネージャから確認しておきます。
インストール
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です)。
※一番下のチェックボックスはデフォルトではOFFですが、ONにしてNDIS5 driverを使用するようにします。
※ユニバーサルシリアルバスコントローラーの確認が表示された場合はインストールします。
インストール後、デスクトップにOracle VM VirtualBox、Docker Quickstart Terminal、Kitematic (Alpha)のショートカットが作成されます。
まず、Oracle VM VirtualBoxを実行し、VirtualBoxマネージャーを確認してみると仮想マシンはまだひとつもありません。
次に、Docker Quickstart Terminalを実行します。諸々のセットアップが自動で行われた後、下記のような画面になればセットアップ含めてインストール完了です(途中、VirtualBoxによるコンピュータの変更ウインドウが表示された場合は"はい"を選択します)。
再度、Oracle VM VirtualBoxマネージャーを確認してみます。
defaultという名前の仮想マシンが作成されています。これがDocker(Toolbox)の実行環境になります。VirtualBoxマネージャーで何かを行うということは基本的にはありませんので、仮想マシンの作成後はあまり意識することはないかもしれません。正常にインストールできているか、Dockerコマンドを実行して確認してみます。
$ docker --version Docker version 18.03.0-ce, build 0520e24302version情報が出力され、Dockerが正しくインストールされていることを確認できました。
また、現在ローカルPCに存在する実行環境は以下のコマンドで確認可能です。
$ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS default * virtualbox Running tcp://192.168.99.100:2376 v18.09.1VirtualBoxマネージャーで確認した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.84kBhello-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_swartzhello-worldイメージを元にしたコンテナがひとつ存在しているのが確認できます(hello-worldコンテナは起動後、停止するため、STATUSがExitedとなっています)。
-aオプションは停止しているコンテナも含めて一覧表示します。なお、ローカル上にDockerイメージが存在しない状態で
docker container run ~コマンドを実行した場合、run時にpullを行いコンテナを起動します。また、Dockerコマンドについてはコマンド体系に変更があり、ネットの情報でも新旧コマンドが混在しています。がらりと変更になったわけではなく、現在も旧来のコマンドを使用可能ですが、できる限り新しいコマンドを使用するようにしましょう。
以下のQiitaが非常にまとまっており、参考になります。コンテナは
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は開発スピードが早く、既存の機能がレガシーとなってしまうこともありますので公式サイトは適宜チェックするようにしましょう。
- 投稿日:2019-01-27T12:39:37+09:00
ROS複数Docker通信
背景
・開発環境/ランタイムのアプリ依存は完全に排除することは非常に困難。
・ROSアプリによっては特定のversionやpackageに依存する。(例えば、melodic依存など)
・docker使えば、上記は排除できるし、アプリ提供者がシステムを気にしなくてもいい。
・開発環境もランタイムもアプリごとに自由だし、界面もdockerでわかりやすい。ここで試してみること
- ROSノードを複数のdockerで起動して通信できることを確認する。
- ROS2ノードを複数のdockerで起動して通信できることを確認する。
- 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: kineticDocker 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.19GB1. ROSノード複数Docker通信
[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通信
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-desktopROS2ノードでdocker間通信ができました。
3. ROS/ROS2ノード複数Docker通信
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:melodicROS bridgeを利用して、docker間でROS/ROS2通信を確認できました。
ということで、dockerを使えばROS分散型開発が簡単にできる。
- 投稿日:2019-01-27T11:56:12+09:00
CircleCIがパスしない時にローカルでデバッグする方法
問題
- CircleCIがパスしない
- ログを見ても原因がよくわからない
解決策
circleci buildでCIをローカル上のDockerコンテナで実行する- CIが終わってもコンテナを破棄しないよう
.circleci/config.ymlを変更する- Dockerコンテナに接続してデバッグする
Docker Desktopのインストール
手順略
circleciコマンドのインストール
Macの場合はHomebrewでインストールします。
brew install circlecicircleci 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/nullDockerコンテナに接続する
上記設定を加えた後に
circleci buildを実行すると、CIの実行コンテナが残り続けます。
docker psコマンドでコンテナ名を確認し、コンテナに接続します。$ docker ps $ docker exec -it [container] bash以降、リモート実行時に失敗したコマンドを手動で実行するなどしてデバッグします。
タイムアウトを設定する
上記の設定ではno_output_timeoutの指定により120分後にコンテナは自動停止します。
デバッグに必要な時間を余裕を持って設定しましょう。別の方法
リモートのCircleCIには
Run job with SSHボタンにより、
SSHを有効にした状態でビルドを走らせることができます。
こちらの方法もデバッグに使えますが、SSH接続中は実行時間が消費される点に注意しましょう。
- 投稿日:2019-01-27T02:11:59+09:00
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.ymlversion: '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.ymlports: - 9000:90002. Dockerfileの作成
DockerfileFROM node:8.11.3-alpine WORKDIR /app RUN apk update && \ npm install && \ npm install -g npm && \ npm install -g vue-cli3. Docker起動&コンテナに入る
# Docker構築&起動 docker-compose up -d # コンテナに入る docker-compose exec web sh4. 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 updatenpm実行(共通)
/app # npm run dev5. 確認
http://0.0.0.0:8080 にアクセスしましょう。
下記の画面が表示されればOKです。






















