20200518のdockerに関する記事は10件です。

Docker内でMySQLにPythonで接続する

DocekrもMySQLも初心者用のメモ

github url: https://github.com/kenjiSpecial/docker_mysql_python_beginner

docker-compose.yml

docker-compose.yml
version: "3"

services:
  mysql_db:
    container_name: "mysql_db"
    image: mysql:5.7
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    volumes:
      - db_volume:/var/lib/mysql
    environment: # Set up mysql database name and password
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: employees
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    networks:
      - app-tier

  python3:
    restart: always
    build: ./python
    container_name: "python3"
    working_dir: "/root/"
    tty: true
    depends_on:
      - mysql_db
    networks:
      - app-tier
    volumes:
      - ./python:/root
      - pycache_volume:/root/.cache

networks:
  app-tier:
    driver: bridge

volumes:
  db_volume:
  pycache_volume:

DockerfileにPythonのコンテナ情報を入力する

Dockerfile
FROM python:3.7


# ADD . /root
COPY . /opt
WORKDIR /opt

RUN pip install -r requirements.txt

main.py

main.py
import mysql.connector as mysql
user_name = "user"
password = "password"
host = "mysql_db"  # docker-composeで定義したMySQLのサービス名
database_name = "employees"


conn = mysql.connect(
    host="mysql_db",
    user="user",
    passwd="password",
    port=3306,
    database="employees"
)

conn.ping(reconnect=True)

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

docker-compose buildで、The following signatures were invalid: KEYEXPIRED ~ と出た時の対処

[メモ]

RUN apt-get update && apt-get install -y ~~~~

の前に以下を記載して再build

RUN sed -i 's;http://archive.debian.org/debian/;http://deb.debian.org/debian/;' /etc/apt/sources.list

参考:https://github.com/confluentinc/cp-docker-images/issues/849

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

Docker / ECR / ECS コンテナ入門まとめ 〜Docker編〜

参考文献

Docker 基本コマンド

イメージの取得

$ docker images [リポジトリ名]  ※リポジトリ名:DockerHubアカウントで作成

<例>
$ docker images username/sample

タグ設定

$ docker tag [イメージ名]:タグ名 ユーザ名/[イメージ名]:タグ名

<例>
$ docker tag testimage:1.0 username/testimage:1.0

DockerHubアップロード

$ docker login   ※DockerHubログイン

$ docker push ユーザ名/[イメージ名]:タグ名

<例>
$ docker push username/testimage:1.0

コンテナ作成/起動

$ docker run [オプション] イメージ名[:タグ名] [引数]

<例>
$ docker run -it --name "sample" testimage /bin/bash

稼働中のコンテナに接続

$ docker attach コンテナ名

<例>
$ docker attach sample   ※プロセス終了:ctrl + P,Q

AWS上でDockerを使用する場合

Dockerインストール

$ sudo yum update -y

$ sudo amazon-linux-extras install docker

Docker起動

$ sudo service docker start
         or
$ sudo systemctl start docker

dockerグループにユーザ追加

$ sudo usermod -a -G docker ec2-user

dockerアクセス確認

$ docker info

"No space left on device" エラー対処

ファイル数の消費量を表示

$ sudo find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n

未使用のコンテナ/イメージ/ボリュームの一括削除

$ docker system prune -af --volumes
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker / ECR / ECS コンテナ入門まとめ① 〜Docker編〜

参考文献

Docker 基本コマンド

イメージの取得

$ docker images [リポジトリ名]  ※リポジトリ名:DockerHubアカウントで作成

<例>
$ docker images username/sample

タグ設定

$ docker tag [イメージ名]:タグ名 ユーザ名/[イメージ名]:タグ名

<例>
$ docker tag testimage:1.0 username/testimage:1.0

DockerHubアップロード

$ docker login   ※DockerHubログイン

$ docker push ユーザ名/[イメージ名]:タグ名

<例>
$ docker push username/testimage:1.0

コンテナ作成/起動

$ docker run [オプション] イメージ名[:タグ名] [引数]

<例>
$ docker run -it --name "sample" testimage /bin/bash

稼働中のコンテナに接続

$ docker attach コンテナ名

<例>
$ docker attach sample   ※プロセス終了:ctrl + P,Q

AWS上でDockerを使用する場合

Dockerインストール

$ sudo yum update -y

$ sudo amazon-linux-extras install docker

Docker起動

$ sudo service docker start
         or
$ sudo systemctl start docker

dockerグループにユーザ追加

$ sudo usermod -a -G docker ec2-user

dockerアクセス確認

$ docker info

"No space left on device" エラー対処

ファイル数の消費量を表示

$ sudo find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n

未使用のコンテナ/イメージ/ボリュームの一括削除

$ docker system prune -af --volumes
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker / ECR / ECS コンテナ入門まとめ①

後編

参考文献

Docker 基本コマンド

イメージの取得

$ docker images [リポジトリ名]  ※リポジトリ名:DockerHubアカウントで作成

<例>
$ docker images username/sample

タグ設定

$ docker tag [イメージ名]:タグ名 ユーザ名/[イメージ名]:タグ名

<例>
$ docker tag testimage:1.0 username/testimage:1.0

DockerHubアップロード

$ docker login   ※DockerHubログイン

$ docker push ユーザ名/[イメージ名]:タグ名

<例>
$ docker push username/testimage:1.0

コンテナ作成/起動

$ docker run [オプション] イメージ名[:タグ名] [引数]

<例>
$ docker run -it --name "sample" testimage /bin/bash

稼働中のコンテナに接続

$ docker attach コンテナ名

<例>
$ docker attach sample   ※プロセス終了:ctrl + P,Q

AWS上でDockerを使用する場合

Dockerインストール

$ sudo yum update -y

$ sudo amazon-linux-extras install docker

Docker起動

$ sudo service docker start
         or
$ sudo systemctl start docker

dockerグループにユーザ追加

$ sudo usermod -a -G docker ec2-user

dockerアクセス確認

$ docker info

"No space left on device" エラー対処

ファイル数の消費量を表示

$ sudo find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n

未使用のコンテナ/イメージ/ボリュームの一括削除

$ docker system prune -af --volumes
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker Desktop for mac をターミナルから起動・終了

普段から Docker を使っているわけではないので必要なときだけ起動、不要になったら止める、というのをターミナルでやりたかった訳です。

頻繁に使いそうなので備忘として & 他にそう思っている人もいるかも、と思って記事にしました。

試した環境

  • macOS Catalina (10.15.4)
  • Docker Desktop for Mac ver. 2.2.0.5 (43884)

起動

/Applications/Docker.app/Contents/MacOS/Docker &

ここでバックグラウンドで起動した Docker.appPID が出てくるので、終了のときに使うのもいいかもですね。

終了

ps | grep "/Applications/Docker.app/Contents/MacOS/Docker" \
| grep -v grep | perl -lane 'print $F[0]' | xargs kill -s QUIT

Macに乗り換えてまだ2ヶ月ぐらいですが、macOSはUNIX系の知識を活かせるのがいいですなあ。

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

Docker Desktop for Mac をターミナルから起動・終了

普段から Docker を使っているわけではないので必要なときだけ起動、不要になったら止める、というのをターミナルでやりたかった訳です。

頻繁に使いそうなので備忘として & 他にそう思っている人もいるかも、と思って記事にしました。

試した環境

  • macOS Catalina (10.15.4)
  • Docker Desktop for Mac ver. 2.2.0.5 (43884)

起動

/Applications/Docker.app/Contents/MacOS/Docker &

ここでバックグラウンドで起動した Docker.appPID が出てくるので、終了のときに使うのもいいかもですね。

終了

ps axww | grep "/Applications/Docker.app/Contents/MacOS/Docker" \
| grep -v grep | perl -lane 'print $F[0]' | xargs kill

感想

Macに乗り換えてまだ2ヶ月ぐらいですが、macOSはUNIX系の知識を活かせるのがよかですなあ。

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

doc2vecでredmineのチケット(csv)を学習させてみる

やったこと

問い合わせ履歴(redmineのチケット)を機械学習し
検索ワードに対して、類似する過去チケットをリコメンドするPoCを作ってみました。

背景

私はコールセンター的な業務をすることがあり、問い合わせの記録をredmineにチケットとして記録してます。

そんな中、最近流行りの機械学習を使った検索で、業務の効率化をできそうかを試してみたく、doc2vecでPoC作ってみました。

結論

結論としては、作りが雑すぎたためか、使い物にならない精度でした。
しかし、前処理とかもう少し頑張れば実運用でも使えるかもしれない可能性は感じました。

実装の流れ

大きく3段階あります。
① docker上のubuntuでjupyter-notebookを起動し、機械学習&チケットの検索の環境を用意
② doc2vecでチケット(csv)を機械学習させ、モデルを作成
③ 検索ワードを入力し、類似するチケットをリコメンド

環境

  • docker (windows10)
    • ubuntu:16.04
    • jupyter-notebook
      • python
      • doc2vec
  • redmineのチケット(csvファイル)

全体的に、すぐに使える!業務で実践できる!Pythonによる AI・機械学習・深層学習アプリのつくり方を参考にさせて頂いております。

作り方

※環境構築関連は、ありがちだけどPythonでチャットボット作ってみたでもう少し詳しく説明してます

1. dockerを起動し、Dockerfilebuildする

2. イメージをrunする

docker run -it -p 8888:8888 -v //c/Users/xxx/xxx:/xxx book-mlearn-image

xxxの部分にパスを入力して、ホストのディレクトリをマウントする

3. issues.csv(問い合わせ対応のcsv)をマウント済みのディレクトリに格納する

4. jupyter-notebookを起動する

jupyter notebook --no-browser --ip=0.0.0.0 --allow-root --NotebookApp.iopub_data_rate_limit=100000000

実行すると、http://127.0.0.1:8888/?token=xxxにアクセスしてね、と表示されますが、docker上で動いてるのでdocker-machine envで出てくるipアドレスに置き換えてアクセスしてください。

例:http://192.168.99.100:8888/id=xxx

5. 新規でpython3のファイルを作成する

6. 必要なものをインストールする

以下をコピペし実行します。時間かかります。

!curl -kL https://bootstrap.pypa.io/get-pip.py | python3

!apt-get update -y
!apt-get upgrade -y
# ?について、十分な空き容量がないとエラーになる場合がある。エラーメッセージでググったら解決法でる。

!apt-get -yV install swig-doc
!apt-get -yV install swig-examples
!apt-get -yV install swig2.0-doc
!apt-get -yV install swig2.0-
!apt-get -yV install swig2.0 
!apt-get -yV install swig

!apt-get install mecab libmecab-dev mecab-ipadic-utf8 -y

!git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git /tmp/work/
# ?のclone先をホストOSとの共有ディレクトリにしているとエラーとなる場合がある。
# そのためtmp/workに保存している

!mkdir /var/lib/mecab/dic/mecab-ipadic-neologd

!apt-get install file -y

!/tmp/work/bin/install-mecab-ipadic-neologd -n -p /var/lib/mecab/dic/mecab-ipadic-neologd -y
# ?はdockerのVM VirtualMachineのメモリ割り当てが1024MBの場合エラーが出ることがある。1.5GB(1538MB)くらいに増やすと私はエラー出なくなりました。

!pip install mecab-python3

import MeCab
import sys
import MeCab
m = MeCab.Tagger ("-d /var/lib/mecab/dic/mecab-ipadic-neologd")
# mecabの稼働確認
print(m.parse ("すもももももももものうち"))

# word2vecの準備
!pip install gensim

7. チケットを学習しモデルを作成

以下を実行します。

import pandas as pd
import zipfile
import os.path
import urllib.request as req
import MeCab
from gensim import models
from gensim.models.doc2vec import TaggedDocument

# ここの/xxx/はissues.csvのパスに修正してください
df = pd.read_csv("/xxx/issues.csv", encoding='cp932')

list =[] # リストへの格納方法が冗長な感じがしますがお許しください

#Mecabの初期化
mecab = MeCab.Tagger()
mecab.parse("")

for i in range(len(df["No"])):
    list.append(
        {"ticket":{
            "No":str(df["No"][i]), # No・・・チケットのナンバー(#)
            },
        "content":[
            {"title":str(df["題名"][i]),  # 題名・・・チケットのタイトル
            # csvの学習させたい項目を単純に連結させる
            # 担当者/内容/システム名/機能名/ページ名/説明・・・チケットの各項目名のサンプルです
            "detail":str(df["担当者"][i]) + str(df["内容"][i]) + str(df["システム名"][i]) + str(df["ページ名"][i]) + str(df["説明"][i])},
        ]},
    )

def ticket_list():
    for ticketlist in list:
        ticket = ticketlist["ticket"]
        for content in ticketlist["content"]:
            yield ticket, content

#引数のテキストを分かち書きして配列にする
def split_words(text):
    text = text.replace('\n','')
    text = text.replace('\r','')
    text = text.replace('\u3000','')
    node = mecab.parseToNode(text)
    wakati_words = []
    while node is not None:
        hinshi = node.feature.split(",")[0]
        if  hinshi in ["名詞"]:
            wakati_words.append(node.surface)
        elif hinshi in ["動詞", "形容詞"]:
            wakati_words.append(node.feature.split(",")[6])
        node = node.next
    return wakati_words

#リストをDoc2Vecが読めるTaggedDocument形式にし、配列に追加する
documents = []
#チケットリストをループで回す
for ticket, content in ticket_list():
    #文字列を取得
    words = content["detail"]
    #文字列を分かち書きに
    wakati_words = split_words(words)
    #TaggedDocumentの作成 文書=分かち書きにしたチケット詳細 タグ=No:題名
    document = TaggedDocument(
        wakati_words, [ticket["No"] + " : " + content["title"]])
    documents.append(document)

#TaggedDocumentの配列を使ってDoc2Vecの学習モデルを作成
model = models.Doc2Vec(
    documents, dm=1, vector_size=300, window=5, min_count=1)

#Doc2Vecの学習モデルを保存
model.save('redmine.model')

print("モデル作成完了")

8. 検索ワードを入れ、類似するチケットを表示させる

以下を実行します。

import urllib.request as req
import zipfile
import os.path 
import MeCab
from gensim import models

#Mecabの初期化
mecab = MeCab.Tagger()
mecab.parse("")

#保存したDoc2Vec学習モデルを読み込み
model = models.Doc2Vec.load('redmine.model')

#引数のテキストを分かち書きして配列にする
def split_words(text):
    node = mecab.parseToNode(text)
    wakati_words = []
    while node is not None:
        hinshi = node.feature.split(",")[0]
        if  hinshi in ["名詞"]:
            wakati_words.append(node.surface)
        elif hinshi in ["動詞", "形容詞"]:
            wakati_words.append(node.feature.split(",")[6])
        node = node.next
    return wakati_words

def similar(search_word):
    words = search_word
    wakati_words = split_words(words)
    vector = model.infer_vector(wakati_words)
    print("--- 「" + search_word + '」に類似するチケットは? ---')
    print(model.docvecs.most_similar([vector],topn=3))
    print("")

#
similar("ここに検索したい文章を入れる")

すると...

--- 「aaaしたいがbbbできない」に類似するチケットは? ---
[('1234 : cccしたいができない', 0.9499524831771851), ('2345 : dddする方法を教えて欲しい', 0.9499462246894836), ('3456 : eeeでエラーが発生した', 0.9499049782752991)]

と、類似するチケットが表示されます。

ここでいう、1234のような数字はチケットのNo、
cccしたいができないはチケットの題名、
0.9499524831771851はチケットの詳細と、similar("~")に入れた文章との類似度です。

類似度は1に近いほど似てるという意味です。
ここでは類似度が高い上位3件を表示させています。


以上です。

リコメンド精度が低い理由は、いろいろ考えられますが、一番の問題は前処理がテキトウすぎることかなと思ってます。
さすがに雑すぎでしたかね...。

ちなみに、redmineのチケットをcsv形式で出力して使っている理由は、DBにアクセスするコードを書くのが面倒だったためです。

また、問い合わせ履歴をいい感じに処理してくれる機械学習として、watson discoveryも少し触ってみたのですが、色々と覚えるのに時間がかかりそうだったためすぐ作れそうなdoc2vecで実装しました。

何か間違いやアドバイスあればコメントください。

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

Dockerの構成とコンテナ生成について

はじめに

この記事ではDockerの仕組みについて説明します。

対象

Docker初心者で、Dockerの仕組みを知りたい方向け。
コマンド等具体的な手順、Dockerファイルについて説明していません。
また、かみ砕いた表現をしているため、正確性には欠けているかもしれません。

参考資料

主に「15Stepで習得 Dockerから入るKubernetes コンテナ開発からK8s本番運用まで」を参考に書いています。

1.コンテナとは

Dockerはコンテナ技術の一種です。
Dockerの説明の前に、まずはコンテナについて説明していきます。

コンテナとは、アプリケーションを起動する際に必要なミドルウェア、ライブラリ、設定ファイル等をひとまとめにしたものです。
複数のコンテナがある場合もそれぞれ独立しているため、別のマシンが動いているかのように扱うことができます。
コンテナと物理マシン.png

コンテナのメリットには以下のようなメリットがあります。

(1)利用するリソースを削減

以前から仮想環境を構築する方法がありましたがリソースの消費が大きいことが課題でした。
ここでコンテナとの比較のため、従来までの仮想マシンを用いた仮想化環境の説明をします。
仮想マシンを用いた場合以下の構成になります。
仮想マシンを用いた仮想化環境の構成.png

ゲストOSが必要なためリソース消費が大きくなります。

一方、コンテナは以下の図のように構成されています。
ゲストOSがないためリソースの消費量を削減できます。
コンテナ構成.png

ハードウェアやCPUの利用率を高めることができ、ハードウェアを効率よく利用することができます。

(2)アプリケーションを異なる環境へ移行しやすい

コンテナの中には、アプリケーション等を実行するために必要なミドルウェア、ライブラリなどがひとまとめになっています。
例えばローカル環境で動作確認し、商用環境に移行するときもコンテナごと移動できるので、
ローカル環境と商用環境で実行構成を変更することなく移行できます。

(3)環境の構築、設定のしやすさ

コンテナは環境がコード化されているため、構成管理がしやすくなっています。
同様の環境を作る際には、ファイルをビルドするだけで環境構築できます。

参考リンク
https://knowledge.sakura.ad.jp/13265/

2.Dockerについて

では本題のDockerについて説明します。
Dockerはコンテナの作成、実行、イメージ管理を支援するツールです。
「Dockerイメージ」とは、読み取り専用のコンテナテンプレートで、
コンテナを起動するための実行形式や設定ファイルのかたまりです。
Dockerの構成は下の図のようになります。
Dockerの構造 (1).png

矢印(1)~(3)はdocke runコマンドを実行した際の処理の流れになります。

(1)Dockerコマンドを入力

クライアントはDockerコマンド(コマンドラインユーザーインターフェース)です。
DockerデーモンがDockerコマンドの要求を受け取り、Dockerオブジェクトを管理しています。
この図では「docker run app: 1.0」という要求を受け取り、
イメージ名「app」でタグ名「1.0」がついたイメージからコンテナを生成する処理を実行します。

(2)レジストリからローカルリポジトリにイメージをコピーする。

Dockerイメージはレジストリに保管されています。
レジストリには以下の3種類あります。
【1】パブリックレジストリ
・Docker Hub
・Quay
誰でも無料で利用できる一般公開されているレジストリです。
docker runコマンドはデフォルトでDocker Hubからイメージをとってくるように指定されています。
参考リンク:https://knowledge.sakura.ad.jp/2210/

【2】クラウドのレジストリ
・Amazon Elastic Container Service
・Azure Container Registry
・Google Container Registry
レジストリの利用者をクラウドのユーザーアカウントに限定することができます。

【3】プライベートレジストリ
・Harbor
・GitLab
・registry
リポジトリ利用者のアクセス元を制限することができます。

レジストリは複数のリポジトリから構成されています。
リポジトリとは、イメージ名にタグをつけてバージョン等を識別して保管しています。

この図ではイメージ名「app」、タグ名「1.0」がついたイメージをレジストリから探し、
ローカルリポジトリにコピーします。

(3)ローカルレジストリからDockerコンテナを生成

ローカルレジストリに持ってきたイメージ名「app」、タグ名「0.1」のイメージからコンテナを作り出します。
このことを「インスタンス化する」とよく表現されますが、
「イメージ」というひな形からコンテナの「物体」を作り出している、
と想像するとわかりやすいと思います。

これでdocker runの処理は完了し、コンテナが生成されます。

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

Dockerコンテナ内外でファイルコピーする方法

Dockerコンテナ外から docker cp を使う場合

(例)コンテナ名がzen_allenの場合
$ docker ps
CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS              PORTS                  NAMES
843b51320bda        ct2034/vnc-ros-kinetic-full   "/startup.sh"       12 hours ago        Up 12 hours         0.0.0.0:6080->80/tcp   zen_allen
Dockerコンテナ外のファイルをDockerコンテナ内へコピー
$ docker cp test.txt zen_allen:/.
Dockerコンテナ内のファイルをDockerコンテナ外へコピー
$ docker cp zen_allen:/test.txt .

Dockerコンテナ内から scp を使う場合

dockerコンテナ内だとdocker cpが使えないので代わりにscpを使用する

まずはdockerコンテナに入る

(例)コンテナ名を確認
$ docker ps
CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS              PORTS                  NAMES
843b51320bda        ct2034/vnc-ros-kinetic-full   "/startup.sh"       12 hours ago        Up 12 hours         0.0.0.0:6080->80/tcp   zen_allen
(例)確認したコンテナ名がzen_allenの場合
$ docker exec -it zen_allen /bin/bash

dockerコンテナでscpを使用する

(例)IPアドレス192.168.2.100, ユーザ名:pi, パスワード:pi へtest.txtをコピーする場合
# scp test.txt pi@192.168.2.100:~/.
pi@192.168.2.100's password: 
test.txt    100%    0     0.0KB/s   00:00 
(例)IPアドレス192.168.2.100, ユーザ名:pi, パスワード:pi からtest.txtをコピーする場合
# scp pi@192.168.2.100:~/test.txt .
pi@192.168.2.100's password: 
test.txt    100%    0     0.0KB/s   00:00    

参考

cp — Docker-docs-ja 17.06.Beta ドキュメント
scp — Docker-docs-ja 17.06.Beta ドキュメント

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