ラベル Docker の投稿を表示しています。 すべての投稿を表示
ラベル Docker の投稿を表示しています。 すべての投稿を表示

2020/05/07

Dockerコンテナ内でnpm installをした場合のエラー(EAI_AGAIN)に対する対処法(Linux編)

背景


プロキシ下のPC上でDockerを使用し、コンテナ上でnpm installを行った時、下記のエラーが発生した。
$ npm install
npm ERR! code EAI_AGAIN
npm ERR! errno  EAI_AGAIN

記事の目的


DockerにDNSアドレスを設定し、コンテナ内でホスト名を解決できるようにする

原因と対策


エラー原因

DockerがDNSを見つけられないため、コンテナ内でホスト名をIPアドレスに変換できない。
社内プロキシ内などプロキシ下のPCである場合、プロキシサーバーのホスト名を解決できない。

対策

DockerにDNSのアドレスを登録する。
  1. /etc/docker/daemon.jsonを作成する
  2. {
        "dns": ["DNSアドレス1","DNSアドレス2"]
    }
    DNSアドレスは、8.8.8.8(GoogleのDNS)や社内ネットワーク内のDNSアドレスを設定する。
  3. dockerを再起動する
  4. $ sudo ststemctl docker restart

まとめ


  • Dockerコンテナ内でnpm installを行った際、EAI_AGAINと表示されインストールできない問題を修正する方法について調査、記載した

参考文献



変更履歴


  1. 2020/05/07: 新規作成

2020/04/14

Dockerのコンテナとホスト間でメモリ共有

背景


仕事で、複数のエッジコンピュータにデプロイを行うにあたり、Dockerイメージを利用する必要があった。
複数コンテナ間でプロセス間通信を行うにあたり、メモリ共有を行う必要があった。

記事の目的


Dockerでメモリ共有を行う

メモリ共有コマンドについて


ここでは、Dockerでメモリ共有する方法について記載する。

ホストとコンテナ間で共有

コンテナとホスト間でメモリ共有する手順は、下記の通りである。
  1. --ipcオプション付きでdocker run を実行
  2. $ sudo docker run --ipc="host" nvidia/cuda:10.0-cudnn7-devel-ubuntu16.04 
動作確認
  1. /run/shm(メモリ)にデータを保存
  2. $ mkdir /run/shm/test
  3. オプションなしでdocker run を実行
  4. $ sudo docker run nvidia/cuda:10.0-cudnn7-devel-ubuntu16.04 ls /run/shm
    
  5. --ipcオプション付きでdocker run を実行
  6. $ sudo docker run --ipc="host" nvidia/cuda:10.0-cudnn7-devel-ubuntu16.04 ls /run/shm
    

コンテナ間で共有

コンテナ間でメモリ共有する手順は、下記の通りである。
  1. --ipcオプション付きでdocker run を実行
  2. $ sudo docker run --ipc="container:<名前|id>" nvidia/cuda:10.0-cudnn7-devel-ubuntu16.04 


まとめ


  • Dockerでメモリ共有する方法について調査、記載した


参考文献




変更履歴


  1. 2020/04/14: 新規作成

2020/04/11

DockerでGPUを使用する

背景


仕事で、複数のエッジコンピュータにデプロイを行うにあたり、Dockerイメージを利用する必要があった


記事の目的


DockerでGPUを使用する


DockerでGPU


ここでは、DockerでGPUを使用する方法について記載する。


DockerでGPUを使用する手順

DockerでGPUを使用する手順は、下記の通りである。
  1. CUDAイメージをpull
  2. $ sudo docker pull nvidia/cuda:10.0-cudnn7-devel-ubuntu16.04
  3. GPUオプション(--gpus all)付きで実行
  4. $ sudo docker run --gpus all nvidia/cuda:10.0-cudnn7-devel-ubuntu16.04 nvidia-smi
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 430.26       Driver Version: 430.26       CUDA Version: 10.2     |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |===============================+======================+======================|
    |   0  GeForce GTX 108...  Off  | 00000000:17:00.0 Off |                  N/A |
    | 23%   30C    P8     9W / 250W |      2MiB /  8192MiB |      0%      Default |
    +-------------------------------+----------------------+----------------------+
    


備考

  • エラーが出る場合
  • 実行時に下記のようなエラーが出る場合がある。
    $ sudo docker run --gpus all nvidia/cuda:10.0-cudnn7-devel-ubuntu16.04 nvidia-smi
    docker: Error response from daemon: linux runtime spec devices: could not select device driver "" with capabilities: [[gpu]].
    ERROR[0000] error waiting for container: context canceled
    対処法
    1. 対策スクリプトの作成
    2. $ nano ./nvidia-container-runtime-script.sh
      nvidia-container-runtime-script.sh
      curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | \
      sudo apt-key add -
        distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
      curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | \
        sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list
      sudo apt-get update
      sudo apt-get install nvidia-container-runtime
    3. 対策スクリプトの実行
    4. $ chmod 777 ./nvidia-container-runtime-script.sh
      $ sudo ../nvidia-container-runtime-script.sh
    5. dockerサービスの再起動
    6. $ sudo systemctl restart docker
    7. 動作テスト
    8. $ sudo docker run --gpus all nvidia/cuda:10.0-cudnn7-devel-ubuntu16.04 nvidia-smi


まとめ


  • DockerでGPUを使用する方法について調査、記載した


参考文献




変更履歴


  1. 2020/04/11: 新規作成

2020/04/08

Dockerfileの作成

背景


仕事で、複数のエッジコンピュータにデプロイを行うにあたり、Dockerイメージを利用する必要があった

記事の目的


DockerfileでDockerコンテナを自動ビルドする

Dockerfileの導入


ここでは、Dockerfileの使用方法について記載する。

Dockerfile作成手順

Dockerfileの作成手順は、下記の通りである。
  1. Dockerfileを作成
  2. $ vim Dockerfile
    Dockerfile
    FROM nvidia/cuda
    MAINTAINER emptySet
    # ENV: 環境変数の設定
    ENV http_proxy http://your.proxy.com:8080
    ENV https_proxy http://your.proxy.com:8080
    # RUN: buildするときに実行されるもの
    RUN apt update
    # ADD: ホスト側のファイル(tar)をコンテナに移動し、展開する
    ADD sample.tar.gz /home/
    # COPY: ホスト側のファイルをコンテナにコピーする
    COPY sample.sh /home/
    # ENTRYPOINT: コンテナ実行時に最初に実行される
    ENTRYPOINT: /bin/bash
    # CMD: runするときに実行されるもの
    CMD ["echo", "now running..."]]
    
  3. bildを実行(カレントディレクトリのDockerfileを使用)
  4. $ sudo docker build -t emptySet/sampleImage .
    
  5. 動作確認
  6. $ sudo docker run -i -t emptySet/sampleImage
    ...
    now running...
    ...

備考

  • Dockerfikeのコマンド一覧
    • FROM
    • ベースイメージを指定する(必須)
    • MAINTAINER
    • イメージの作成者を記述できる
    • RUN
    • コマンドを実行する
    • CMD
    • docker run時に実行されるコマンド
    • EXPOSE
    • 外部に公開するポートを指定する
    • ENV
    • 環境変数を設定する
    • ADD
    • 指定したファイル・ディレクトリをコンテナ内にコピーする URLの指定が可能。tarファイルは自動解凍する。
    • COPY
    • 指定したファイル・ディレクトリをコンテナ内にコピーする URLの指定不可。自動解凍もしない。
    • ENTRYPOINT
    • docker run時に最初に実行されるコマンド
    • VOLUME
    • 外部からマウント可能なボリュームを指定する データの永続化が可能となる
    • USER
    • コンテナで使用されるユーザ名/UIDを設定する
    • WORKDIR
    • 作業ディレクトリを変更する
    • ONBUILD
    • 次のビルドの最後に実行されるコマンドを設定する

まとめ


  • Dockerfileの作成方法について調査、記載した

参考文献



変更履歴


  1. 2020/04/08: 新規作成

2020/04/06

Dockerの導入方法

背景


仕事で、複数のエッジコンピュータにデプロイを行うにあたり、Dockerイメージを利用する必要があった

記事の目的


UbuntuにDockerを導入する

Dockerの導入


ここでは、Dockerの導入方法と使用方法について記載する。

Dockerとは


Dockerはコンテナ仮想化を用いてアプリケーションを開発・配置・実行するためのオープンソースソフトウェアあるいはオープンプラットフォームである。 Dockerはコンテナ仮想化を用いたOSレベルの仮想化(英語版)によりアプリケーションを開発・実行環境から隔離し、アプリケーションの素早い提供を可能にする。かつその環境自体をアプリケーションと同じようにコード(イメージ)として管理可能にする。Dockerを開発・テスト・デプロイに用いることで「コードを書く」と「コードが製品として実行される」間の時間的ギャップを大きく短縮できる。

利点

  • コンテナに再現性があり、どの環境下でも同じ動作をする
  • コンテナイメージはリポジトリ管理できるため、ロールバックが容易
  • イメージ内で環境が出来上がっているため、環境構築が容易になる


導入方法

Dockerの導入手順は、下記の通りである。ここを参照
  1. Dockerをインストールする(Ubuntuの場合)
  2. $ sudo apt update
    $ sudo apt install \
        apt-transport-https \
        ca-certificates \
        curl \
        gnupg-agent \
        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 update
    $ sudo apt install docker-ce docker-ce-cli containerd.io
    
  3. プロキシ設定(オプション)
  4. $ sudo mkdir -p /etc/systemd/system/docker.service.d/
    $ sudo nano /etc/systemd/system/docker.service.d/10_docker_proxy.conf
    
    10_docker_proxy.conf
    [service]
    Environment=HTTP_PROXY=http://your.proxy.com:8080
    Environment=HTTPS_PROXY=http://your.proxy.com:8080
    
    $ sudo systemctl daemon-reload
    $ sudo systemctl restart docker
    
  5. 動作確認
  6. $ sudo docker run hello-world
    ...
    Hello from docker
    ...

使用方法

Dockerの使用手順は、下記の通りである。
  1. DockerイメージをDocker Hubで探す
  2. 以下のコマンドでも検索可能(nvidiaを検索)
    $ sudo docker search nvidia | more
  3. Dockerイメージをpullする
  4. $ sudo docker pull nvidia/cuda
  5. Dockerイメージを確認する
  6. $ sudo docker images
  7. Dockerイメージの詳細を確認する
  8. $ sudo docker inspect nvidia/cuda
  9. Dockerイメージを起動する
  10. $ sudo docker run nvidia/cuda:latest echo "Hello World"
    $ sudo docker run nvidia/cuda:latest -d echo "Hello World" #バックグラウンド実行
    $ sudo docker attach --sig-proxy=false id(コンテナID) #フォアグラウンド実行に変更
  11. 実行中のコンテナを確認する
  12. $ sudo docker ps
  13. 実行中のコンテナ一時中断、再開
  14. $ sudo docker kill id(コンテナID) #中断
    $ sudo docker start id(コンテナID) #再開
  15. 実行中のコンテナを削除する
  16. $ sudo docker rm id(コンテナID)
  17. コンテナの中で作業する
  18. $ sudo docker run -i -t nvidia/cuda /bin/bash
  19. コンテナからイメージを作成する
  20. $ sudo docker run -i -t nvidia/cuda /bin/bash #コンテナに入る
    $ root@7432974# 作業をする
    ...
    $ root@7432974# exit
    $ sudo docker ps -a #先ほどのコンテナを探す
    $ sudo docker commit id(コンテナID) emptySet/sample
  21. Dockerイメージを削除する
  22. $ sudo docker rmi nvidia/cuda

アンインストール方法

Dockerのアンインストール手順は、下記の通りである。
  1. docker docker-engine containerd.ioを削除する
  2. $ sudo apt remove docker docker-engine containerd.io
  3. イメージ・コンテナを削除する
  4. # Docker CEを削除
    $ sudo apt-get purge docker-ce docker-ce-cli
    # dockerイメージやコンテナも削除
    sudo rm -rf /var/lib/docker
    # 不要なパッケージの削除
    sudo apt autoremove
    

備考


  • Dockerコマンド一覧
  • Dockerコマンド
    # コンテナ作成
    run image - コンテナを作成する(起動状態で)
    create image - コンテナを作成する(停止状態で)
    
    # コンテナ一覧
    ps - コンテナの一覧を表示する
    stats - コンテナのリソース使用状況一覧を表示する
    
    # コンテナ操作(1)
    rm container - コンテナを削除する
    start container - コンテナを開始する
    stop container - コンテナを停止する
    kill container - コンテナを強制停止する
    restart container - コンテナを再起動する
    pause container - コンテナ上のプロセスを一時停止する
    unpause container - コンテナ上のプロセスを再開始する
    
    # コンテナ操作(2)
    exec container - コンテナ内でプロセスを起動する
    attach container - コンテナに標準入出力をアタッチする
    
    # コンテナ操作(3)
    cp srcfile dstfile - コンテナに(から)ファイルをコピーする
    rename container newname - コンテナ名を変更する
    update container - コンテナの設定(CPU数等)を変更する
    
    # コンテナ詳細
    logs container - コンテナのログを表示する
    port container - コンテナのポートマッピングを表示する
    top container - コンテナ内のプロセスの一覧を表示する
    
    # Dockerレジストリ関連
    pull name - レジストリからイメージをダウンロードする
    push name - レジストリにイメージをアップロードする
    search term - Dockerレジストリからイメージを検索する
    login - Dockerレジストリにログインする
    logout - Dockerレジストリからログアウトする
    
    # イメージ管理
    images - イメージの一覧を表示する
    rmi images - イメージを削除する
    history image - イメージのヒストリを表示する
    commit container - コンテナからイメージを作成する
    tag image NEWimage - イメージにタグをつける
    build dockerfile - イメージをビルドする
    trust - イメージに署名する
    
    # ボリューム管理
    volume - Dockerボリュームを管理する
    
    # ネットワーク管理
    network - Dockerネットワークを管理する
    
    # インポート/エクスポート/セーブ/ロード
    export container - コンテナをファイルにエクスポートする
    import file - エクスポートファイルをイメージとしてインポートする
    save image - イメージをファイルにセーブする
    load file - セーブファイルをイメージとしてロードする
    
    # Docker Swarm(クラスタリング)関連
    swarm - Swarmを管理する
    node - Swarmノードを管理する
    stack - Swarmスタックを管理する
    secret - Swarmシークレットを管理する
    service - Swarmサービスを管理する
    
    # その他
    version - バージョンを表示する
    help - ヘルプを表示する
    info - Dockerに関するシステム情報を表示する
    inspect - 様々なDockerオブジェクトの詳細情報を表示する
    diff container - コンテナ生成後の更新ファイルを表示する
    wait container - コンテナの停止を待ち合わせる
    events - Dockerエンジンのイベントを監視・表示する
    image - イメージ管理系コマンドを実行する
    container - コンテナ管理系コマンドを実行する
    builder - イメージビルド系コマンドを実行する
    system - システム管理系コマンドを実行する
    config - コンフィグを管理する
    context - ビルド時のコンテキストを管理する
    engine - Dockerエンジンを管理する
    plugin - プラグインを管理する
    オプション(OPTIONS)
    --config string
    -c, --context string
    -D, --debug
    -H, --host list
    -l, --log-level string
    -v, --version
    --tls
    --tlscacert string
    --tlscert string
    --tlskey string
    --tlsverify
  • コンテナの一括削除コマンド
  • $ sudo docker rm $(sudo docker ps -aq)
  • イメージの一括削除コマンド
  • $ sudo docker rmi $(sudo docker images -aq)


まとめ


  • Dockerの導入方法について調査、記載した


参考文献




変更履歴


  1. 2020/04/08: 新規作成
  2. 2020/05/04: アンインストール方法追記
  3. 2020/05/13: Dockerイメージの一括削除方法追記

MQTTの導入

背景 IoTデバイスの接続環境構築のため、MQTT(mosquitto)の導入を行った。 記事の目的 MQTT(mosquitto)をUbuntuに導入する mosquitto ここではmosquittoについて記載する。 MQTT MQTT(Message Qu...