- 投稿日:2020-05-18T22:17:03+09:00
Docker内でMySQLにPythonで接続する
DocekrもMySQLも初心者用のメモ
github url: https://github.com/kenjiSpecial/docker_mysql_python_beginner
docker-compose.yml
docker-compose.ymlversion: "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のコンテナ情報を入力する
DockerfileFROM python:3.7 # ADD . /root COPY . /opt WORKDIR /opt RUN pip install -r requirements.txtmain.py
main.pyimport 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())
- 投稿日:2020-05-18T21:15:15+09:00
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
- 投稿日:2020-05-18T20:45:22+09:00
Docker / ECR / ECS コンテナ入門まとめ 〜Docker編〜
参考文献
- AWS ECSでDockerコンテナ管理入門(基本的な使い方、Blue/Green Deployment、AutoScalingなどいろいろ試してみた)
- Dockerコマンド一覧
- 【備忘録】docker pushしたら拒否された
- ECS+ECR環境でDockerコンテナをデプロイする
- Dockerイメージの作り方
- 【Docker】イメージ名とタグ名を変更する方法
- 「Got permission denied while trying to connect to the Docker daemon socket」への対応
- Amazon ECS における Docker の基本
- No space left on device とエラーが出るときの対処法
- 未使用のコンテナ、volumeなどを一括削除
Docker 基本コマンド
イメージの取得
$ docker images [リポジトリ名] ※リポジトリ名:DockerHubアカウントで作成 <例> $ docker images username/sampleタグ設定
$ docker tag [イメージ名]:タグ名 ユーザ名/[イメージ名]:タグ名 <例> $ docker tag testimage:1.0 username/testimage:1.0DockerHubアップロード
$ 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,QAWS上でDockerを使用する場合
Dockerインストール
$ sudo yum update -y $ sudo amazon-linux-extras install dockerDocker起動
$ sudo service docker start or $ sudo systemctl start dockerdockerグループにユーザ追加
$ sudo usermod -a -G docker ec2-userdockerアクセス確認
$ 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
- 投稿日:2020-05-18T20:45:22+09:00
Docker / ECR / ECS コンテナ入門まとめ① 〜Docker編〜
参考文献
- AWS ECSでDockerコンテナ管理入門(基本的な使い方、Blue/Green Deployment、AutoScalingなどいろいろ試してみた)
- Dockerコマンド一覧
- 【備忘録】docker pushしたら拒否された
- ECS+ECR環境でDockerコンテナをデプロイする
- Dockerイメージの作り方
- 【Docker】イメージ名とタグ名を変更する方法
- 「Got permission denied while trying to connect to the Docker daemon socket」への対応
- Amazon ECS における Docker の基本
- No space left on device とエラーが出るときの対処法
- 未使用のコンテナ、volumeなどを一括削除
Docker 基本コマンド
イメージの取得
$ docker images [リポジトリ名] ※リポジトリ名:DockerHubアカウントで作成 <例> $ docker images username/sampleタグ設定
$ docker tag [イメージ名]:タグ名 ユーザ名/[イメージ名]:タグ名 <例> $ docker tag testimage:1.0 username/testimage:1.0DockerHubアップロード
$ 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,QAWS上でDockerを使用する場合
Dockerインストール
$ sudo yum update -y $ sudo amazon-linux-extras install dockerDocker起動
$ sudo service docker start or $ sudo systemctl start dockerdockerグループにユーザ追加
$ sudo usermod -a -G docker ec2-userdockerアクセス確認
$ 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
- 投稿日:2020-05-18T20:45:22+09:00
Docker / ECR / ECS コンテナ入門まとめ①
後編
参考文献
- AWS ECSでDockerコンテナ管理入門(基本的な使い方、Blue/Green Deployment、AutoScalingなどいろいろ試してみた)
- Dockerコマンド一覧
- 【備忘録】docker pushしたら拒否された
- ECS+ECR環境でDockerコンテナをデプロイする
- Dockerイメージの作り方
- 【Docker】イメージ名とタグ名を変更する方法
- 「Got permission denied while trying to connect to the Docker daemon socket」への対応
- Amazon ECS における Docker の基本
- No space left on device とエラーが出るときの対処法
- 未使用のコンテナ、volumeなどを一括削除
Docker 基本コマンド
イメージの取得
$ docker images [リポジトリ名] ※リポジトリ名:DockerHubアカウントで作成 <例> $ docker images username/sampleタグ設定
$ docker tag [イメージ名]:タグ名 ユーザ名/[イメージ名]:タグ名 <例> $ docker tag testimage:1.0 username/testimage:1.0DockerHubアップロード
$ 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,QAWS上でDockerを使用する場合
Dockerインストール
$ sudo yum update -y $ sudo amazon-linux-extras install dockerDocker起動
$ sudo service docker start or $ sudo systemctl start dockerdockerグループにユーザ追加
$ sudo usermod -a -G docker ec2-userdockerアクセス確認
$ 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
- 投稿日:2020-05-18T19:02:11+09:00
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.app
のPID
が出てくるので、終了のときに使うのもいいかもですね。終了
ps | grep "/Applications/Docker.app/Contents/MacOS/Docker" \ | grep -v grep | perl -lane 'print $F[0]' | xargs kill -s QUITMacに乗り換えてまだ2ヶ月ぐらいですが、macOSはUNIX系の知識を活かせるのがいいですなあ。
- 投稿日:2020-05-18T19:02:11+09:00
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.app
のPID
が出てくるので、終了のときに使うのもいいかもですね。終了
ps axww | grep "/Applications/Docker.app/Contents/MacOS/Docker" \ | grep -v grep | perl -lane 'print $F[0]' | xargs kill感想
Macに乗り換えてまだ2ヶ月ぐらいですが、macOSはUNIX系の知識を活かせるのがよかですなあ。
- 投稿日:2020-05-18T18:18:32+09:00
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を起動し、Dockerfileを
build
する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 gensim7. チケットを学習しモデルを作成
以下を実行します。
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で実装しました。
何か間違いやアドバイスあればコメントください。
- 投稿日:2020-05-18T04:51:28+09:00
Dockerの構成とコンテナ生成について
はじめに
この記事ではDockerの仕組みについて説明します。
対象
Docker初心者で、Dockerの仕組みを知りたい方向け。
コマンド等具体的な手順、Dockerファイルについて説明していません。
また、かみ砕いた表現をしているため、正確性には欠けているかもしれません。参考資料
主に「15Stepで習得 Dockerから入るKubernetes コンテナ開発からK8s本番運用まで」を参考に書いています。
1.コンテナとは
Dockerはコンテナ技術の一種です。
Dockerの説明の前に、まずはコンテナについて説明していきます。コンテナとは、アプリケーションを起動する際に必要なミドルウェア、ライブラリ、設定ファイル等をひとまとめにしたものです。
複数のコンテナがある場合もそれぞれ独立しているため、別のマシンが動いているかのように扱うことができます。
コンテナのメリットには以下のようなメリットがあります。
(1)利用するリソースを削減
以前から仮想環境を構築する方法がありましたがリソースの消費が大きいことが課題でした。
ここでコンテナとの比較のため、従来までの仮想マシンを用いた仮想化環境の説明をします。
仮想マシンを用いた場合以下の構成になります。
ゲストOSが必要なためリソース消費が大きくなります。
一方、コンテナは以下の図のように構成されています。
ゲストOSがないためリソースの消費量を削減できます。
ハードウェアやCPUの利用率を高めることができ、ハードウェアを効率よく利用することができます。
(2)アプリケーションを異なる環境へ移行しやすい
コンテナの中には、アプリケーション等を実行するために必要なミドルウェア、ライブラリなどがひとまとめになっています。
例えばローカル環境で動作確認し、商用環境に移行するときもコンテナごと移動できるので、
ローカル環境と商用環境で実行構成を変更することなく移行できます。(3)環境の構築、設定のしやすさ
コンテナは環境がコード化されているため、構成管理がしやすくなっています。
同様の環境を作る際には、ファイルをビルドするだけで環境構築できます。参考リンク
https://knowledge.sakura.ad.jp/13265/2.Dockerについて
では本題のDockerについて説明します。
Dockerはコンテナの作成、実行、イメージ管理を支援するツールです。
「Dockerイメージ」とは、読み取り専用のコンテナテンプレートで、
コンテナを起動するための実行形式や設定ファイルのかたまりです。
Dockerの構成は下の図のようになります。
矢印(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の処理は完了し、コンテナが生成されます。
- 投稿日:2020-05-18T00:02:14+09:00
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_allenDockerコンテナ外のファイルを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/bashdockerコンテナで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 ドキュメント