20190727のdockerに関する記事は9件です。

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.html

Vagrantプラグインのインストール

// Guest Additions の手動再インストールの手間をなくすプラグイン おすすめとのこと
PS C:\dokoka> vagrant plugin install vagrant-vbguest
// プロキシ使う場合はこれも
PS C:\dokoka> agrant plugin install vagrant-proxyconf

dockerVM @ 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 halt

setup 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 address

You can download our docker-compose.yaml:

curl -L https://raw.githubusercontent.com/RocketChat/Rocket.Chat/develop/docker-compose.yml -o docker-compose.yml

Start the mongodb server by:

docker-compose up -d mongo

The 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-replica

Mongo 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 rocketchat

Optionally, 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 hubot

To 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/

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

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を導入する方法はネット上にすでにあるし、それでも簡単なんだけど、最近はきっとコンテナ使って開発する人も多いだろうからそん時に便利に使えるものとしてこのプラグインが活用できる。

image.PNG

既存のオンプレ、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 version

expose 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で独自に作りこんだ苦労はなんだったんだ・・・まぁそれは常時提供する場合にはしなきゃなんないんだけど、今のところの使い方だとこれで十分)
  • 最大コネクション数に制限があるため、一時的なサイト利用には重宝するが、いわゆるサービスのプロダクション利用にはちょっと不向きか
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

底辺プログラマがサーバ管理者を目指す その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 docker

hello 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!ができた次回は自分でイメージを作成しているパターンを
実施してみようと思う。

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

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 #対象のイメージ名もしくはイメージID

Dockerfileを使用したイメージビルド

# 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/bash

Dockerコミットの解説

# docker commitコマンド
# コンテナの状態をイメージとして保存することができる。
docker commit <コンテナ名またはコンテナID> <イメージ名>:<タグ名>

Docker Machineとは

Docker Engineを搭載した仮想マシンの作成、起動、停止、再起動などをコマンドラインから実行できるツール

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

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:latest

curlでアクセスすると、こんな感じになります。

$ 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使う
  • GitHubの「Project」を使って、タスクをIssueとして書く
  • コード書くのはmacOSでVScode、GitHub Desktopを併用
  • CIは、CircleCI使う。PRのMerge時にテストこけないようにする
  • 出来上がったコンテナは、DockerHubの自分のアカウントで公開する

この作業をやっていた2019/7/27は、Fuji Rockの中継をYoutubeでやっていたので、BGMとして楽しみました。

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

Dockerについて調べながら勉強したやつを書いてみました

こんにちは!
未来電子テクノロジーでインターンをしているものです。
今回はDockerについて全く理解していないなぁと感じたので、勉強をした結果学んだことを書いていこうかと思います。

そもそもDockerって何?

Dockerとはコンテナと呼ばれるOSレベルの仮想化環境を提供するオープンソースソフトウェアである。(wikipediaより)らしいです。

これでは正直よくわかりません。

分かりやすい説明やすくいうと、Dockerを使用するとOSとアプリがインストールされた環境を閉じ込めて保存しておき、いつでもその環境を立ちあげることができるそうです。(今から説明することはこちらを参考にしました)

用語の説明

Dockerイメージ

OSとアプリがインストールされた環境を閉じ込めたファイル

コンテナ

解放されたOSとアプリの環境

Dockerfile

Dockerイメージ作成時に実行するコマンド等を列挙したファイル

上記のような感じなります
そして上記の説明はDockerについてなるべくわかりやすく説明するをコピペしただけなので、こちらをご覧ください。

Dockerの特徴

1.システム導入の高速化
Dockerを利用することです
ぐにプログラムを適用し導入スピードを高速化できます。これの理由としてはOSを共有しているので、それに関する設定を省略することができるからです。

2.起動時間の短縮化と多くの処理実装が可能
DockerではすでにOSが立ち上がっているので、その分サーバーの起動時間を短くでき、サーバーへの負荷が低く、一度に多くのプログラム処理を実装できるそうです。

3.コンテナ設定の再利用が可能
一度作成したコンテナは、Dockerイメージを作成して、他のコンテナに適用することで再利用が可能です。

参考文献

Dockerとは何かを入門者向けに解説!基本コマンドも

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

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を インストールする方法でした。

:smiley_cat: :smiley_cat:

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

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 -y

VcXsrvの起動

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を設定します

Dockerfile
FROM ghdl/ext:ls-vunit-gtkwave
# VcXsrvでWindows上にGUIを表示するための設定
ENV DISPLAY host.docker.internal:0.0

docker-compose.ymlの作成

volumesを使用するため、事前にDocker for WindowsのShared Drivesを設定しておくようにしてください

docker-compose.yml
version: '3'
services:
  ghdl:
    restart: always
    build: ./ghdl
    working_dir: "/project"
    volumes:
      - ./project:/project
    tty: true

テスト実行ファイルrun.pyの作成

Vunitの例にあるVHDL User Guideを元にテスト実行ファイルを作成します

run.py
from 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

GTKWave_sample.jpg

参考

GHDL
ghdl/docker
ghdl/docker usecase.md
Vunit
VcXsrv
GTKWave
Docker for windowsのコンテナ内でGUIアプリを実行
GHDLとVunitでVHDLのテスト環境を構築する

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

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

Visual Studio Code Remote

経緯

Goの開発環境つくるのってめんどい(気がする)
GOPATHはどうするんだっけとか考えていて、調べてたところ発見して触ってみたらめっちゃ便利だったので紹介します。

何が嬉しいか。

手元の開発環境と、Dockerコンテナ内部との違いなど、アレこれってどっちだっけと意識せずに開発が行えます。
便利〜〜

やっていく

前提として: 手元マシンにDockerがインストールされているとかの前提が必要です。

お品書き

  1. エクステンションのインストール
  2. リポジトリをクローン
  3. エクステンションの機能から開く
  4. 環境がすでに整ってる!!

1. エクステンションのインストール

以下のリンクからインストールできます。
もちろんVSCodeの拡張画面から「Visual Studio Code Remote」と検索してインストールしてもおっけい。
https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers

2. リポジトリをクローン

サンプルをシュシュっとクローン
git clone https://github.com/Microsoft/vscode-remote-try-go

3. リポジトリをエクステンションの機能から開く

画面左下のアイコンをクリックするとこんな感じの画面が出るので Openからクローンしてきたリポジトリを開く

image.png

4. 環境がすでに整ってる!!

ちょっと待つと、、

環境がすでに整った状態になって、
image.png

動かしてみる。9000番で立ち上がったようだな。
image.png

動いてる。すごい。
image.png

でもさ、ポートとか変えたいんだよね。って時ありますよね。
もちろん対応してます。
image.png

その他の細かい設定は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との差など

コンテナ上のエクステンションと、ローカルのエクステンションは別に管理される
image.png

image.png

まとめ

Visual Studio Code Remote を使うとGOPATHとかDockerfileとか何も考えなくても、エディタ側でよしなにしてくれるので、快適に環境構築ができます。
それではみなさん快適なVSCodeライフを〜。

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