0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Docker】networkとかの基礎的な理解

Posted at

もろもろの基礎的な理解のために。
今回は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

--networktest-networkを指定して、作成するコンテナをtest-networkに所属させる。
MySQLのパスワードは「password」
pythonから指定するためのエイリアス--network-aliasn-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.pyrequirements.txtを作成。

+ PROJECT_FOLDER
  - main.py
  - requirements.txt

main.pyでDB接続、データ取得のコードを書く。
MySQLのエイリアスで指定したn-mysqlhostに指定する。

main.py
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のコードでhostn-mysqlを指定しているのでtest-network内のn-mysql、つまりtest-mysqlコンテナに接続するようになる。

あとはSELECT文が流れて出力されるという流れ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?