もろもろの基礎的な理解のために。
今回はpythonコンテナからmysqlコンテナのデータを取ってきます。
networkについてはこれがわかりやすかった。
自分的要点
- 同じネットワーク内のコンテナ同士なら通信できる。
- コンテナは複数のネットワークに所属できる。
- ネットワーク内のコンテナにはIPが振られる。
- ネットワーク内のIPの代わりに
--network-alias
で接続できる。
network作成
コンテナが所属するためのネットワークを作成する。
docker network create test-network
MySQL
mysqlコンテナを作成、起動する。
docker run --name test-mysql --network test-network --network-alias n-mysql -e MYSQL_ROOT_PASSWORD=password -d mysql
--network
にtest-network
を指定して、作成するコンテナをtest-network
に所属させる。
MySQLのパスワードは「password」
pythonから指定するためのエイリアス--network-alias
にn-mysql
を指定している。
レコード追加
コンテナに入って適当なレコードを追加。
docker exec -it test-mysql bash
mysql -u root -p
パスワードを聞かれるのでコンテナ作成時に指定した「password」を入れる。
そうするとmysqlに入る。
「Potato Head」というレコードを追加しておく。
create database test_db;
use test_db;
create table users(id int auto_increment not null primary key, name varchar(100));
insert into users(name) values("Potato Head");
exit
mysqlを抜けてbashに戻ってくるので再度exit
でローカルPCに戻る。
exit
Python
プロジェクト用にmain.py
、requirements.txt
を作成。
+ PROJECT_FOLDER
- main.py
- requirements.txt
main.py
でDB接続、データ取得のコードを書く。
MySQLのエイリアスで指定したn-mysql
をhost
に指定する。
import mysql.connector
print('hello')
cnx = mysql.connector.connect(
user='root',
password='password',
host='n-mysql',
port='3306'
)
cursor = cnx.cursor()
cursor.execute('select * from test_db.users')
for id, name in cursor:
print(f'{id}: {name}')
Python実行
プロジェクトのディレクトに移動して下のコマンドを実行。
MySQLに追加した「Potato Head」が出ればOK。
docker run -it --rm -v "$(pwd):/usr/src/myapp" --network test-network -w /usr/src/myapp python:3 bash -c "pip install -r requirements.txt && python main.py"
解説
test-network
に所属させてコンテナを実行する。
すると、先ほど作成したtest-mysql
コンテナと通信ができるようになる。
後ろの方のbash -c "~~"
はコンテナ起動時にコンテナ内で実行するコマンド。
-c
で複数のコマンドを同時に実行させられるらしい。
Pythonのコードでhost
にn-mysql
を指定しているのでtest-network
内のn-mysql
、つまりtest-mysql
コンテナに接続するようになる。
あとはSELECT文が流れて出力されるという流れ。