- 投稿日:2019-07-27T21:17:33+09:00
Vagrant Docker Docker-compose で オンプレミスのビジネスチャット RocketChat 導入
Vagrant Docker Docker-compose で オンプレミスのビジネスチャット RocketChat 導入
Qiita内でも調べてみたけど、1つの記事ですべて解決できなかったので投稿。
具体的に詰まったのは、
* http://localhost:3000 につながらない
* ERROR: OPLOG / REPLICASET IS REQUIRED TO RUN ROCKET.CHAT, MORE INFORMATION AT: | ➔ | https://go.rocket.chat/i/oplog-required と出てうまくDocker-composeが起動できてない以下、自分用のOnenoteよりコピペなので見づらいですが
vagrant, docker, docker-compose, windows10, install, rocketchat
試したのはWindows10で
Vagrant install
VirtualBox+Vagrantで楽々Docker環境構築(Windows)
2019/7現在:上記のままやるとエラー。http://localhost:3000 で繋がらない
mongo replica の設定が必要らしいので、このノートページの最下部を参照に!VirtualBox install
https://www.virtualbox.org/wiki/Downloads
Vagrant install
https://www.vagrantup.com/downloads.htmlVagrantプラグインのインストール
// Guest Additions の手動再インストールの手間をなくすプラグイン おすすめとのこと PS C:\dokoka> vagrant plugin install vagrant-vbguest // プロキシ使う場合はこれも PS C:\dokoka> agrant plugin install vagrant-proxyconfdockerVM @ vagrant
Dockerコンテナ導入
PS C:\dokoka> cd <適当なフォルダ> PS C:\dokoka> git clone https://github.com/sesela/vagrant-ubuntu-for-docker.git PS C:\dokoka> cd vagrant-ubuntu-for-docker PS C:\dokoka\vagrant-ubuntu-for-docker> vagrant up // SSH接続 PS C:\dokoka\vagrant-ubuntu-for-docker> vagrant ssh // USER/PWD は vagrant:vagrant // サービス終了 PS C:\dokoka\vagrant-ubuntu-for-docker> vagrant haltsetup Docker Compose & RocketChat @ dockerVM
Instead of using the standard Docker commands, you may wish for a bit more automated management of the deployment. This is where the use of Docker-compose may come in handy.
• Make sure you have Docker and Docker-compose installed and operational.
• Create docker-compose.yml based on our example. This is the ONLY file you will need. You can create this file on your own machine by copy and pasting the content.
• Edit image: rocketchat/rocket.chat:develop to specify which image you wish to use (see section Docker Images Available )
• Edit ROOT_URL to match your domain name or IP addressYou can download our docker-compose.yaml:
curl -L https://raw.githubusercontent.com/RocketChat/Rocket.Chat/develop/docker-compose.yml -o docker-compose.ymlStart the mongodb server by:
docker-compose up -d mongoThe first time you start mongo, you’ll also need to initialize it before being able to use Rocket.Chat. Ensure that mongo is in the running state, then:
docker-compose up -d mongo-init-replicaMongo supports 24 x 7 operations and live backup. You should not need to restart it too frequently. See mongodb documentations for proper operation and management of a mongo server.
Once you’re sure that mongodb is up and running:docker-compose up -d rocketchatOptionally, if you want to manage your messages and configuration information, edit the file again to uncomment the volume mounts. Make sure you have a datasubdirectory to mount and store the data.
Optionally, if you want a bot, so you don’t have to talk to yourself, after you’ve created an admin user and also a bot user, edit the file docker-compose.yml again to change the variables ROCKETCHAT_USER and ROCKETCHAT_PASSWORD in the hubot section and then start up hubot:docker-compose up -d hubotTo update the rocketchat docker image to the latest version, you can use the following commands. Your data should not be affected by this, since it’s located in the mongo image.
docker pull rocketchat/rocket.chat:develop docker-compose stop rocketchat docker-compose rm rocketchat docker-compose up -d rocketchat貼り付け元 https://rocket.chat/docs/installation/docker-containers/docker-compose/
- 投稿日:2019-07-27T20:20:35+09:00
docker expose プラグイン便利そうなので試す
Docker 19.03 から Dockerコマンドをプラグインで拡張できるようになったとのこと。
https://github.com/docker/docker-ce/releases/tag/v19.03.0
Basic framework for writing and running CLI plugins. docker/cli#1564 docker/cli#1898
lukaszlach 氏の「expose」が便利そうなので使ってみることにした。
expose plugin とは
簡単にいうと手元で動かしているコンテナ(HTTPサービス)を外部公開するため、パブリックなHTTPエンドポイントを払い出す。ngrokクラウドサービスを介してプロキシするような仕組みをとっている。ngrokを導入する方法はネット上にすでにあるし、それでも簡単なんだけど、最近はきっとコンテナ使って開発する人も多いだろうからそん時に便利に使えるものとしてこのプラグインが活用できる。
既存のオンプレ、Dockerホストで試してみる。
- Docker の 19.03へのアップデート
- Clip のインストールとセットアップ
- expose plugin のインストール
Update Docker
19.03へアップデート割愛
Clipインストール&セットアップ
ここでは、docker コマンドが実行できる一般ユーザにインストール&セットアップする。
$ mkdir -p ~/.docker/cli-plugins $ curl -sf https://raw.githubusercontent.com/lukaszlach/clip/master/docker-clip -o ~/.docker/cli-plugins/docker-clip $ chmod +x ~/.docker/cli-plugins/docker-clip $ ls -ltr ~/.docker/cli-plugins $ docker info |grep clip clip: Docker Client Plugins Manager (Łukasz Lach, v19.06.0) $ docker clip --help Usage: docker clip COMMAND Commands: add Install a new plugin by an image name build Build a new plugin ls List installed plugins push Push local plugin to a Docker registry rm Remove an installed plugin search Search plugins from the remote catalog update Reinstall a plugin to its latest versionexpose plugin を使う
インストール
docker clip add lukaszlach/clips:expose Installing client plugin from lukaszlach/clips:expose expose: Pulling from lukaszlach/clips dfe3f328527c: Pull complete Digest: sha256:ab4eb409ef77cdbec1769d5b2b3e6af8741cb9988d05456394b5f25558b7c83e Status: Downloaded newer image for lukaszlach/clips:expose docker.io/lukaszlach/clips:expose tar: manifest.json: 恐らく古いタイムスタンプ 1970-01-01 09:00:00 tar: repositories: 恐らく古いタイムスタンプ 1970-01-01 09:00:00 Successfully installed lukaszlach/clips:expose client plugin New client command available: 'docker expose'
テスト
ここでは適当にnginxのWebサービスを立ち上げる、この時、ポート公開をせずに動かす。
$ docker run --name nginx -d nginx$ docker expose nginx 80 Error: No such network: clip-expose-network Creating network Error: No such container: clip-expose Starting proxy for nginx:80 Unable to find image 'lukaszlach/ngrok:latest' locally latest: Pulling from lukaszlach/ngrok 8e402f1a9c57: Pulling fs layer fe0b84b4b7fe: Pulling fs layer 438fed729a8a: Pulling fs layer 7f5e7bf8b582: Pulling fs layer b625a16fdacc: Pulling fs layer 7f5e7bf8b582: Waiting b625a16fdacc: Waiting fe0b84b4b7fe: Verifying Checksum fe0b84b4b7fe: Download complete 8e402f1a9c57: Download complete 8e402f1a9c57: Pull complete fe0b84b4b7fe: Pull complete 7f5e7bf8b582: Verifying Checksum 7f5e7bf8b582: Download complete b625a16fdacc: Verifying Checksum b625a16fdacc: Download complete 438fed729a8a: Verifying Checksum 438fed729a8a: Download complete 438fed729a8a: Pull complete 7f5e7bf8b582: Pull complete b625a16fdacc: Pull complete Digest: sha256:4dfe86dc145edf6b4b2b8d92fabf43f931a7c9192d76bcd53657abb34e5b4183 Status: Downloaded newer image for lukaszlach/ngrok:latest Proxy is running, fetching public address details http://5c7b4d08.ngrok.io https://5c7b4d08.ngrok.io Successfully exposed nginx:80 $ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 640c1230bd65 lukaszlach/ngrok "ngrok http --log /d…" About a minute ago Up About a minute 4040/tcp clip-expose b4c03ce4e87c nginx "nginx -g 'daemon of…" 2 minutes ago Up About a minute 80/tcp nginx
- clip-expose-network なければ作ってくれる
- clip-expose コンテナが作られる
- clip-expose には ngrok client が入っていてこいつがプロキシする
- lukaszlach/ngrok がpullされてexpose用コンテナが起動する 上記例でいうと「 http://5c7b4d08.ngrok.io or https://5c7b4d08.ngrok.io 」にアクセスするとnginxのトップページが表示される。
もう、いらないよ、ということであれば下記のコマンドで停止できる。
コマンドというかngrokとの仲介している「clip-expose」コンテナを停止するというだけ。$ docker stop clip-expose $ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b4c03ce4e87c nginx "nginx -g 'daemon of…" 4 minutes ago Up 4 minutes 80/tcp nginx実用
自分で提供している、HTTPサービスにも同じようにやってみた。
=>結論、まんま公開可能$ docker pull <private image> $ docker run -d --name venn <private image> $ docker expose venn 80当たり前だが、HTTPサービスを提供しているコンテナは80をLISTENしていないとだめ。
感想
- 手元のサービスがすぐに公開でき、停止もできるので相当に簡単
- https がすぐに払い出せるのもよい(これまでhttpsで独自に作りこんだ苦労はなんだったんだ・・・まぁそれは常時提供する場合にはしなきゃなんないんだけど、今のところの使い方だとこれで十分)
- 最大コネクション数に制限があるため、一時的なサイト利用には重宝するが、いわゆるサービスのプロダクション利用にはちょっと不向きか
- 投稿日:2019-07-27T18:25:48+09:00
底辺プログラマがサーバ管理者を目指す その2
今回のテーマ:サーバをどうやって立てるか?
まずは最低限の環境で作成してその後問題点の改善やツールなどの追加を行っていこうと思います。
手っ取り早くサーバを立てるにはDockerが早いと思いDockerでまずサーバを立ててみようと思います。そもそもDockerとはなんぞや?
wikipediaから引用
Docker(ドッカー[2])は、コンテナと呼ばれるOSレベルの仮想化(英語版)環境を提供するオープンソースソフトウェアである[3]。VMware製品などの完全仮想化を行うハイパーバイザ型製品と比べて、ディスク使用量は少なく、仮想環境 (インスタンス) 作成や起動は速く、性能劣化がほとんどないという利点を持つ。
書籍やサイトなどで概要をふわっと理解している感じだとホストOSであるLinuxのディストリビューションの中にコンテナ(VM)を作ってその中でプロセスを実施する仮想化技術。
環境をDockerfileのスクリプトによって構築できるため、環境構築や破棄など色々試すのに便利だったり、他のマシンへの移植性が高い。Dockerのインストール
早速試していく、まずはパッケージマネージャからdockerをインストール
# Dockerのインストール $ sudo apt install docker # Dockerのバージョン確認 sudo docker version # 実行結果 Client: Version: 18.09.6 API version: 1.39 Go version: go1.10.8 Git commit: 481bc77156 Built: Sat May 4 02:35:29 2019 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 18.09.6 API version: 1.39 (minimum version 1.12) Go version: go1.10.8 Git commit: 481bc77 Built: Sat May 4 01:59:36 2019 OS/Arch: linux/amd64 Experimental: false適当なディレクトリを作成して、そこで作業を行う
$ mkdir docker $ cd dockerhello world!
dockerのコンテナを動かすにはまずイメージが必要になる。
イメージはコンテナを作成するにあたって必要なデータで、コンテナはイメージの情報をもとにコンテナを作成する。ここではまず触りとしてすでに作成済みの”hello-world”イメージを使用してコンテナを作成する。
といっても自分で作成したわけではなく既に他の人がイメージを作成していて、Docker Hubというイメージ公開サイトがありそこから取得する。(イメージ版のgithubみたいな感じ)# hello-wolrdのタグlatestを取得する $ sudo docker image pull hello-world:latest # 実行結果 latest: Pulling from library/hello-world sha256:6540fc08ee6e6b7b63468dc3317e3303aae178cb8a45ed3123180328bcc1d20f Status: Image is up to date for hello-world:latest # イメージが追加されているか確認 $ sudo docker image ls # 実行結果 REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest fce289e99eb9 6 months ago 1.84kBイメージの取得に成功すればあとは実行するだけ
# hello-worldイメージからコンテナを作成し実行 sudo docker container run hello-world # 実行結果 Hello from Docker! This message shows that your installation appears to be working correctly. ... # コンテナの状態を確認する $ sudo docker container ps -a # 実行結果 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 18ac55f80a9a hello-world "/hello" 26 seconds ago Exited (0) 25 seconds ago determined_snyderこれでhello world!ができた次回は自分でイメージを作成しているパターンを
実施してみようと思う。
- 投稿日:2019-07-27T17:33:14+09:00
Docker基本コマンド
はじめに
以下Dockerコマンドについてまとめていく。覚えたコマンドは随時追加予定。
Dockerとは何か。従来の仮想化とコンテナ型仮想化
コンテナがホストOSのカーネルを使用するということは、カーネルを共有できないOSはコンテナで動作させることができないということ。
従来の仮想化とDockerのメリットデメリット
分離レベル
・従来の仮想化 ハードウェアレベルで仮想化されており、ホストOSや仮想マシン間の分離レベルが高く、それぞれが影響を受けにくい。
・コンテナ型仮想化 OSの機能を使用した仮想化は、従来の仮想化に比べて分離レベルは低い。ホストOSの1プロセスとして動作するため。hello-worldコンテナの実行と動作の解説
docker run hello-world # コマンドを分割した場合 docker pull:イメージの取得 docker create:コンテナの作成 docker start:コンテナの起動
ローカル上のDockerイメージの管理
# イメージにタグ付けするコマンド docker tag docker/whalesay my_whalesay
tag #タグ付けするサブコマンド
docker/whalesay #元となるイメージ名
my_walesay #新しいイメージ名# イメージの詳細情報を表示するコマンド docker inspect my_whalesay
inspect #イメージの詳細情報を表示するサブコマンド
my_whalesay #対象のイメージ名もしくはイメージID# ローカルのイメージを削除するコマンド(矯正削除する場合は-f) docker rmi docker/whelsay
rmi #ローカル上のイメージ名を削除するサブコマンド
docker/whelsay #対象のイメージ名もしくはイメージIDDockerfileを使用したイメージビルド
# Dockerfileからイメージをビルドするコマンド docker build -t docker-whale .
build #イメージをビルドするサブコマンド
-t docker-whale #タグ名の指定
. #ビルドコンテキストの指定Docker Hubへのイメージのプッシュ
Docker Hubにおけるタグ付けルール
/<イメージ名>:<タグ名>nginxコンテナの実行とデタッチモード
# nginxのコンテナを立ち上げるコマンド docker run --name <コンテナ名> -d -p <ホスト側のポート番号>:<コンテナ側のポート番号> <イメージ名>
バインドマウントの解説
# nginxのコンテナを立ち上げるコマンド~バインドマウントを使用するケース~ docker run --name <コンテナ名> -d ¥ -v <ホスト側のディレクトリ>:<コンテナ側のマウントポイント>:<オプション> ¥ -p <ホスト側のポート番号>:<コンテナ側のポート番号> <イメージ名> # nginxリポジトリの説明に書かれていたコマンド docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx
DockerfileのCOPY命令、ADD命令
docker cpコマンドの説明
# ホストマシンのファイルをコンテナ内にコピーする場合 docker cp <ホスト上のコピーしたいファイルのパス> <コンテナ名orID>:<コピー先のパス>
# コンテナ内のファイルをホストマシンにコピーする場合 docker cp <コンテナ名orID>:<コンテナ上のコピーしたいファイルのパス> <コピー先のパス>
コンテナのシェルへの接続
コンテナのシェルに接続するコマンド
# docker attachを使用する場合 # exitで抜けた場合PID1のプロセスが終了してコンテナも停止する。-itオプションをつけておくとControl p qと連続して入力することでコンテナを停止させることなく抜けることができる。 docker attach <コンテナ名またはコンテナID># docker execを使用する場合 # 立ち上がったシェルの標準入出力に接続することができる。exitで抜けてもコンテナを停止させることがないため、こちらの方が安全。 docker exec -it <コンテナ名またはコンテナID> /bin/bashDockerコミットの解説
# docker commitコマンド # コンテナの状態をイメージとして保存することができる。 docker commit <コンテナ名またはコンテナID> <イメージ名>:<タグ名>Docker Machineとは
Docker Engineを搭載した仮想マシンの作成、起動、停止、再起動などをコマンドラインから実行できるツール
- 投稿日:2019-07-27T16:45:38+09:00
REST風にコマンドを呼び出せる(例えばhttp://localhost/bin/date な)command-as-a-serviceのコンテナを作ってみた
概要
このエントリでは、REST風にOS上のコマンドを呼び出せるcommand-as-a-serviceのコンテナを作ってみたときに作業した内容について紹介します。
対象読者
以下の方を対象とします
- ネタが嫌いではない方
- 厳格なREST主義以外でもネタとして受け付けられる方
- お仕事でそのまま使ってやろう、と思う前にいろいろ自分で確認できる心の余裕がある方動機
「http://localhost/bin/grep」とかでコマンド呼び出せたら、意味もなく面白いのでは、と思ったので。
関連
限られた1つのコマンドだけを実行したいときには、「Goで外部コマンドを呼び出すのをHTTPリクエスト越しに実行してみる(Ginを使って)」も参照ください。Ginが対応しているものがいろいろ使えるので、カタく使うならおすすめです。
TL;DR; 一言で言ってこういうものです
様子だけ知りたい方
コンテナを実行しておいて、
$ docker run -p 8080:8080 hrkt/command-as-a-service:latestcurlでアクセスすると、こんな感じになります。
$ curl "http://localhost:8080/bin/date" Sat Jul 27 07:08:47 UTC 2019標準入力にはPOSTのbodyを渡して、コマンドのオプションはクエリパラメーターで与えます。
$ curl "http://localhost:8080/usr/bin/sort?-r&-n" --data-binary @testdata/test.txt hello goodbye(補足)上記の例でのデータの内容
$ cat testdata/test.txt goodbye helloご自身でも動かしてみたい方
Dockerhubで公開しておりますので、上記のコマンドの通り起動してみて、(デフォルトではWhitelistで制限された)コマンドを試してみてください。
何をやっているか
URLのハンドル
Go-langのnet/httpを使い、自分でハンドラを書いています。
以下を行いました。
- リクエストのディレクトリをOSのコマンドへのパスに読み替えるために利用したい。一般的な用途に対して使いやすい、パスを固定的に関数にバインドしてくれるルータを使うと帰って大変になるので、一つのハンドラで足りるように書く
- OSのコマンドへのオプションとして利用するため、クエリパラメータを解析。goのモジュールのお便利関数を使うと解析結果がmapになってしまうので、そこを実装
- コマンドの実行は、別エントリで書いたものを踏襲。ただし、コマンド実行時のエラーハンドルを少しできるようにし、httpのリターンコードとして表現できるようにする
コードは↓な感じです。
func MyServer() http.Handler { return &myHandler{} } type myHandler struct { } func (f *myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { log.Println("called:" + r.URL.Path) buffer, err := ioutil.ReadAll(r.Body) if err != nil { log.Printf(err.Error()) } unescaped, _ := url.QueryUnescape(r.URL.RawQuery) params := strings.Split(unescaped, "&") log.Println(params) code, res := executeIt(r.URL.Path, string(buffer), params) if code == 400 { http.Error(w, res, http.StatusBadRequest) return } w.Write([]byte(res)) }OSコマンドの実行
OSのコマンド実行を全部できるようにしてしまうと、流石にイマイチではないかと考え、実行可能なコマンドは、設定ファイルでホワイトリストとして与えるようにしました。
(が、細かいことはいいんだよ、という目的も考え、設定ファイルで「DangerousMode」を有効化すると、何でもかんでも実行できるようにしてあります)
func executeIt(path string, requestBody string, params []string) (int, string) { if !appConfig.DangerousMode { _, ok := whitelistMap[path] if !ok { return 400, string("ERROR: command " + path + " not in the whitelist") } } var cmd *exec.Cmd if len(params) > 0 && params[0] == "" { cmd = exec.Command(path) } else { cmd = exec.Command(path, params[:]...) } cmd.Stdin = strings.NewReader(requestBody) var stdout bytes.Buffer cmd.Stdout = &stdout err := cmd.Run() if err != nil { log.Printf(err.Error()) return 400, string("ERROR: command execution failed. reason: " + err.Error()) } log.Println(stdout.String()) return 0, string(stdout.String()) }まとめ
このエントリでは、REST風にコマンドを呼び出せるcommand-as-a-serviceのコンテナを作ってみるにあたり、あれこれ試してみた結果について紹介しました。
参照
- GitHub: https://github.com/hrkt/command-as-a-service
- DockerHub: https://cloud.docker.com/repository/registry-1.docker.io/hrkt/command-as-a-service
(参考)開発スタイル
以下でやってます。
- GitHub使う
- GitHubの「Project」を使って、タスクをIssueとして書く
- コード書くのはmacOSでVScode、GitHub Desktopを併用
- CIは、CircleCI使う。PRのMerge時にテストこけないようにする
- 出来上がったコンテナは、DockerHubの自分のアカウントで公開する
この作業をやっていた2019/7/27は、Fuji Rockの中継をYoutubeでやっていたので、BGMとして楽しみました。
- 投稿日:2019-07-27T14:56:28+09:00
Dockerについて調べながら勉強したやつを書いてみました
こんにちは!
未来電子テクノロジーでインターンをしているものです。
今回はDockerについて全く理解していないなぁと感じたので、勉強をした結果学んだことを書いていこうかと思います。そもそもDockerって何?
Dockerとは
コンテナと呼ばれるOSレベルの仮想化環境を提供するオープンソースソフトウェアである。
(wikipediaより)らしいです。これでは正直よくわかりません。
分かりやすい説明やすくいうと、Dockerを使用するとOSとアプリがインストールされた環境を閉じ込めて保存しておき、いつでもその環境を立ちあげることができるそうです。(今から説明することはこちらを参考にしました)
用語の説明
Dockerイメージ
OSとアプリがインストールされた環境を閉じ込めたファイル
コンテナ
解放されたOSとアプリの環境
Dockerfile
Dockerイメージ作成時に実行するコマンド等を列挙したファイル
上記のような感じなります
そして上記の説明はDockerについてなるべくわかりやすく説明するをコピペしただけなので、こちらをご覧ください。Dockerの特徴
1.システム導入の高速化
Dockerを利用することです
ぐにプログラムを適用し導入スピードを高速化できます。これの理由としてはOSを共有しているので、それに関する設定を省略することができるからです。2.起動時間の短縮化と多くの処理実装が可能
DockerではすでにOSが立ち上がっているので、その分サーバーの起動時間を短くでき、サーバーへの負荷が低く、一度に多くのプログラム処理を実装できるそうです。3.コンテナ設定の再利用が可能
一度作成したコンテナは、Dockerイメージを作成して、他のコンテナに適用することで再利用が可能です。参考文献
- 投稿日:2019-07-27T12:14:48+09:00
IBM Cloud の 仮想サーバー(RHEL v7.0) に Docker CEを インストールする
IBM Cloud の 仮想サーバー(VSI)(OS RHEL v7.0)にdocker をインストールするコマンドをまとめました。
0.前提事項
- Redhat EL 7.0-64 を前提に記載しています。
- SSHはMacのデフォルトのターミナルを使用しています。
1. IBM Cloud の 仮想サーバー(VSI)にSSHで接続する
IPアドレスとパスワードの確認方法はこちらをご覧ください。
2. Dockerをインストールする
2-1.yum-utilsをインストールします。
yum install -y yum-utils
2-2.yumリポジトリを追加します。
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
2-3.subscription-managerを有効化します。
subscription-manager repos --enable=rhel-7-server-extras-rpms
2-4.Docker-ceをインストールをインストールします。
yum install -y docker-ce
2-5.Dockerを起動します。
systemctl start docker
2-5.バージョンを確認します。
docker version
[root@xxxxxx ~]# systemctl start docker [root@xxxxxx ~]# docker version Client: Docker Engine - Community Version: 19.03.1 API version: 1.40 Go version: go1.12.5 Git commit: 74b1e89 Built: Thu Jul 25 21:21:07 2019 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 19.03.1 API version: 1.40 (minimum version 1.12) Go version: go1.12.5 Git commit: 74b1e89 Built: Thu Jul 25 21:19:36 2019 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.2.6 GitCommit: 894b81a4b802e4eb2a91d1ce216b8817763c29fb runc: Version: 1.0.0-rc8 GitCommit: 425e105d5a03fabd737a126ad93d62a9eeede87f docker-init: Version: 0.18.0 GitCommit: fec3683 [root@xxxxxx ~]#以上、IBM Cloud の 仮想サーバー(RHEL v7.0) に Docker CEを インストールする方法でした。
![]()
- 投稿日:2019-07-27T06:41:32+09:00
GHDLとVunitでVHDLのテスト環境を構築する[Docker版]
はじめに
「GHDLとVunitでVHDLのテスト環境を構築する」のDocker版です
波形確認用にGTKWaveを追加しています開発環境
- Windows10 Pro 64bit
- Docker for Windows Community Edition Version 2.0.0.3
- VcXsrv X Server Version "1.20.1.4"
- ghdl/ext:ls-vunit-gtkwave
- GHDL : 0.37-dev
- vunit-hdl : 4.0.9rc0
- GTKWave Analyzer v3.3.102
- X11 libraries
環境構築
Windows上でテストおよび波形確認を行うためVcXsrvのインストールとDockerイメージの作成を行います
VcXsrv
VcXsrvのインストール
VcXsrvをインストールします
今回はchocolateyからインストールしましたchoco install vcxsrv -yVcXsrvの起動
VcXsrvを起動します
設定はすべてデフォルトでOKですDocker
Docker for Windowsのインストールについては他の記事を参考にしてください
ディレクトリ構成
下記のようなディレクトリ構成を想定しています
ディレクトリ構成C:. ├─docker-compose.yml ├─ghdl │ └─Dockerfile └─project ├─run.py # テスト実行ファイル ├─src │ └─*.vhd ├─test │ └─*.vhd └─vunit_out # テスト結果出力フォルダDockerfileの作成
自動テストおよび波形確認を行うため
ghdl/ext:ls-vunit-gtkwave
を使用します
VcXsrvでgtkwaveの波形を確認するためENV DISPLAY host.docker.internal:0.0
を設定しますDockerfileFROM ghdl/ext:ls-vunit-gtkwave # VcXsrvでWindows上にGUIを表示するための設定 ENV DISPLAY host.docker.internal:0.0docker-compose.ymlの作成
volumesを使用するため、事前にDocker for WindowsのShared Drivesを設定しておくようにしてください
docker-compose.ymlversion: '3' services: ghdl: restart: always build: ./ghdl working_dir: "/project" volumes: - ./project:/project tty: trueテスト実行ファイルrun.pyの作成
Vunitの例にあるVHDL User Guideを元にテスト実行ファイルを作成します
run.pyfrom os.path import join, dirname from vunit import VUnit root = dirname(__file__) project = VUnit.from_argv() lib = project.add_library("lib") lib.add_source_files(join(root, "src", "*.vhd"), "lib") lib.add_source_files(join(root, "test", "*.vhd"), "lib") project.main()dockerイメージの作成
docker-composeでghdlイメージを作成します
docker-compose build ghdlテストの実行
GUIなしでテスト実行
srcおよびtestフォルダにファイルを入れて
docker-composeからrun.pyを実行するとテストが実行され結果が表示されますdocker-compose run --rm ghdl python run.py
実行結果(省略) ==== Summary =============================================== pass lib.tb_uartreceiver_0.o_EN (0.6 seconds) pass lib.tb_uartreceiver_0.normal (0.5 seconds) pass lib.tb_uartreceiver_0.parity error (0.8 seconds) pass lib.tb_uartreceiver_0.framing error (0.7 seconds) ============================================================ pass 4 of 4 ============================================================ Total time was 2.7 seconds Elapsed time was 2.7 seconds ============================================================ All passed!GUIありでテスト実行
-g
オプションをつけるとVcXsrvでGTKWaveの波形もあわせて確認することができますdocker-compose run --rm ghdl python run.py -g参考
GHDL
ghdl/docker
ghdl/docker usecase.md
Vunit
VcXsrv
GTKWave
Docker for windowsのコンテナ内でGUIアプリを実行
GHDLとVunitでVHDLのテスト環境を構築する
- 投稿日:2019-07-27T02:11:33+09:00
Visual Studio Code Remote を使って快適にGoの環境構築
Visual Studio Code Remote とは
Mozyです。
みなさんVSCode使ってますか〜。
自分は、最近VimからVSCodeに本格的に乗り換えてエディタのカスタマイズにハマってます。
そこで、おおっと思うVSCodeのエクステンションを発見しました。
これを使うといきなりDockerコンテナ内で開発が行えます。便利〜〜Developing inside a Container
https://code.visualstudio.com/docs/remote/containers経緯
Goの開発環境つくるのってめんどい(気がする)
GOPATHはどうするんだっけとか考えていて、調べてたところ発見して触ってみたらめっちゃ便利だったので紹介します。何が嬉しいか。
手元の開発環境と、Dockerコンテナ内部との違いなど、アレこれってどっちだっけと意識せずに開発が行えます。
便利〜〜やっていく
前提として: 手元マシンにDockerがインストールされているとかの前提が必要です。
お品書き
- エクステンションのインストール
- リポジトリをクローン
- エクステンションの機能から開く
- 環境がすでに整ってる!!
1. エクステンションのインストール
以下のリンクからインストールできます。
もちろんVSCodeの拡張画面から「Visual Studio Code Remote」と検索してインストールしてもおっけい。
https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers2. リポジトリをクローン
サンプルをシュシュっとクローン
git clone https://github.com/Microsoft/vscode-remote-try-go
3. リポジトリをエクステンションの機能から開く
画面左下のアイコンをクリックするとこんな感じの画面が出るので Openからクローンしてきたリポジトリを開く
4. 環境がすでに整ってる!!
ちょっと待つと、、
でもさ、ポートとか変えたいんだよね。って時ありますよね。
もちろん対応してます。
その他の細かい設定はjsonファイルをいじれば良いようです。
.devcontainer/devcontainer.json{ "name": "Go", "dockerFile": "Dockerfile", "appPort": 9000, "extensions": [ "ms-vscode.go" ], "runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined" ], "settings": { "go.gopath": "/go", "go.inferGopath": true, "go.useLanguageServer": true } }通常のVSCodeとの差など
コンテナ上のエクステンションと、ローカルのエクステンションは別に管理される
まとめ
Visual Studio Code Remote を使うとGOPATHとかDockerfileとか何も考えなくても、エディタ側でよしなにしてくれるので、快適に環境構築ができます。
それではみなさん快適なVSCodeライフを〜。