Kuzunoha-NEのブログ

プログラミングなどの勉強をしてます

DockerComposeでContainerのIPアドレスの固定化をするかー

こんばんは、葛の葉です。

久しぶりにDockerのことを書こうと思いました。

今回はDocker-ComposeでcontainerのIPアドレスを固定化を行いました。

        networks:
            aplication_net:
                ipv4_address: 172.19.x.x

DockerComposeで各コンテナの設定部分に上記の部分を記載すればよいです。

aplication_netはDockerNetworkの名称になります。

ipv4_address: 172.19.x.xは使用するIPアドレスです。


また、コンテナ間にDockerNetworkを構成する記述を行います。

networks:
    aplication_net:
        driver: bridge
        ipam:
            driver: default 
            config: 
            - subnet: 172.19.0.0/24

aplication_net:部分はDockerNetwork名を記載します。

subnet: 172.19.0.0/24は使用したいネットワークアドレスとそのサブネットマスクをプレフィックス長で記載します。

なお、cofig:下ではgateway:というプロパティ、デフォルトゲートウェイの設定もあるそうなのですか、v3では出来ないようです。

デフォルトゲートウェイがどういうIPアドレスであるかが不明なため、今回は172.19.0.1を想定しています。


docker-compose.ymlは以下の通りになります。

services:
    mysql:
        image: ./mysql
~~~~~~~~~~~中略~~~~~~~~~~~~~~~~~~
        networks:
            aplication_net:
                ipv4_address: 172.19.0.2

    app:
        build: ./app
~~~~~~~~~~~中略~~~~~~~~~~~~~~~~~~
        networks:
            aplication_net:
                ipv4_address: 172.19.0.3

    nginx:
        image: nginx
~~~~~~~~~~~中略~~~~~~~~~~~~~~~~~~
        networks:
            aplication_net:
                ipv4_address: 172.19.0.4

networks:
    aplication_net: 
        driver: bridge
        ipam:
            driver: default 
            config: 
            - subnet: 172.19.0.0/24

docker-compose upでコンテナを起動しましょう。

docker exec -it コンテナ名 /bin/bashでコンテナ内に入り、hostname -iIPアドレスを確認してみましょう。

root@xxxxxxxxxxxx:/# hostname -i
172.19.0.3 

IPアドレスが表示されました!

GSSとGASとDiscordで遊んじゃおう

GSSとGASとDiscordで遊んじゃおう

こんにちは、葛の葉です。

GoogleSpreadSheetってあるじゃあないですか。

このGoogleSpreadSheetにscriptを実装できるようになっていて

それがGoogleAppsScriptっていうやつになります。

developers.google.com

さらに、そのGoogleAppsScriptを使ってDiscordと連携できるようになります。

今回はGoogleSpreadSheetのセルの中身をGASで取得してDiscordに発信するbot

作りたいと思います。


必要な材料

  • Googleアカウント
  • Discordアカウント
  • Discordのノリにそれなりについていける心

好きなシートを作るんだ

好きなシートを作りましょう。

A1セルに好きな言葉も入れておきましょう。

ちなみに私葛の葉って名前だけど、これ元は雌の狐の名前なので

よーく考えたら男なのに女性の名前使ってましたね。

まぁ…いいか…

f:id:Kuzunoha-NE:20180720194400p:plain

スクリプトエディタ起動

右上に[ツール]タブがあって、そのメニューにスクリプトエディタっていうのがありますので

クリックすると別画面が開いて、それがスクリプトエディタが表示されます。

f:id:Kuzunoha-NE:20180720194810p:plain

こんな画面がスクリプトエディタです。

f:id:Kuzunoha-NE:20180720195159p:plain


DiscordのWebhookを起動

botとして出力させたいDiscordのチャンネルで歯車のボタンを押します。

f:id:Kuzunoha-NE:20180720195519p:plain

そこから画面左側の[Webhooks][Webhooks作成]をクリックします。

出てきた画面には好きなbotの名前やアイコンを設定して保存しましょう。

f:id:Kuzunoha-NE:20180720200655p:plain

そうしたら画面右側に作ったbotが表示されていると思うので[編集]を押します。

さっきbotを作った画面に似たようなものが出てきますが、その下にスクロールすると

URL[画面の赤い四角部分]が表示されていますので、これをコピーします。

f:id:Kuzunoha-NE:20180720201250p:plain

コピーしたURLをブラウザーで開くと何やらいろいろ書かれたものが出てきますが、

"token: "の右側の色んな文字数字をコピーしておいてください。


スクリプトエディタでコードを書く

function submit(){
  discord(get_value())
};

function get_value() {
  var sheet = get_sheet('自分の作ったシートのURL',0);
  var range = sheet.getRange(1,1); //ここの(1,1)は座標です。第一引数が行、第二引数が列です。
  var value = range.getValue();
  return value;
};

function get_sheet(gss_url,sheet_num) {
  var ss = SpreadsheetApp.openByUrl(gss_url);
  var sheet = ss.getSheets()[sheet_num];
  return sheet;
};

function discord(message) {
    const url        = 'さっきコピーしたwebhooksのURL';
    const token      = 'さっきのURLの中のtokenの文字列';
    const channel    = '#general';
    const text       = message;
    const username   = 'bot';
    const parse      = 'full';
    const method     = 'post';

    const payload = {
        'token'      : token,
        'channel'    : channel,
        "content"    : text,
        'username'   : username,
        'parse'      : parse,
    };

    const params = {
        'method' : method,
        'payload' : payload,
        'muteHttpExceptions': true

    };

   response = UrlFetchApp.fetch(url, params);
}

関数の実行

関数を選択を押すとプルダウンがでてきますのでsubmitを押してください。

実行ボタンを押すとスクリプトエディタの上部になんかメッセージが出てきます。

権限がどうのって聞いてきますが、ポチポチ押せばOKです。

f:id:Kuzunoha-NE:20180720204152p:plain

そしたら、葛の葉ってメッセージが#generalに表示されるはず!


A1の値を変えてもいいですし、sheet.getRange(1,1)(1,1)の値を変えてみるのも面白いですよ!

Pythonで1から6の数字出すDiscordbot作ったよの巻

PythonでDiscordbot作ったよの巻

こんばんは、葛の葉です。

なんかDiscordっていうチャットアプリがあるんですよ、知ってますか?

discordapp.com

ゲームで使う用のボイスチャットアプリなんですけど、普通にチャットするだけでもずいぶん使えるんですよね。

そのDiscordにbotを追加することができるんです。


pipでモジュールを追加

pipでdiscordのbot用のモジュールを追加します。

pip install discord.py

discord用のモジュールの追加はこんな感じ。

他にも

pip install asyncioとかも必要かもしれない。(僕は使ったことないのに入ってたけどね)


公式サイトからトークンを取得

discordapp.com

Web版のdiscordにログインした状態でここで色々とあれこれやるとbotトークンが手に入ります。


pythonで書いてみよう

pythonコードは以下の感じ。

import asyncio #なんか必要らしい
import discord #さっきpipで取り入れたやつだぞ!
import random #ランダムな数字を作るモジュールだぞ!

client = discord.Client()

@client.event #コマンドラインに出力されるぞ。printのところが出ないなら何かが間違ってるぞ
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')

@client.event
async def on_message(message):
    if message.content.startswith("!dice"): #ここの!diceは好きなのにしていいぞ
        if client.user != message.author:
            num_random = random.randrange(1,6)
            m = str(num_random)
            await client.send_message(message.channel, m)

client.run("[手に入れたトークンを記入しよう]")

!diceって書き込むと1-6の値を返してくれるぞ!!!!

f:id:Kuzunoha-NE:20180712203051j:plain

色々と改造して遊ぼうかな。

DockerCompose で コンテナの名前を作るのだ

葛の葉です。

Dockerの話が続いていきますよ~

DockerComposeではコンテナに名前を付けることが出来ます。

docker-composer.ymlは以下の感じ!

version: "3"
services:
    ubuntu1:
        image: ubuntu:18.04        
        container_name: lion
        stdin_open: true
        tty: true

    ubuntu2:
        image: ubuntu:18.04        
        container_name: albatross
        stdin_open: true
        tty: true      

container_name: ***** の ところがcontainerネームになりますですね。

76ad******fdc        ubuntu:18.04        "/bin/bash"         2 minutes ago       Up 2 minutes                            lion
7991******f1b        ubuntu:18.04        "/bin/bash"         2 minutes ago       Up 2 minutes                            albatross

こんな感じになります。


docker exec -it [containerネーム] /bin/bashでcontainerの中を覗けますよ!docker-compose.yml内で一緒に立ち上げたcontainerなら名前解決もしているのでpingも通ります!

pingが打てるようにするためのパッケージをinstallする。

apt update
apt install iputils-ping

ping -c 5 [containerネーム]5pingを打つ。

ping -c 5 lion
ping -c 5 albatross

どっちのcontainerに入っていても、pingが通るはずです!

DockerのubuntuイメージにMySQL-Client8.0.11をインストール。

DockerのubuntuイメージにMySQL-Client8.0.11をインストール。

こんにちは葛の葉です。

DockerのubuntuのコンテナにMySQL-Client8.0.11をインストールする機会があったのですが、

apt install mysql-clientと打ってもMySQL 5.7.22のインストールが始まってしまうんですね。

それを頑張ってMySQL 8.0.11でインストールできるようにしてみました。


公式からapt更新用のファイルを持ってくればよい

wget https://dev.mysql.com/get/mysql-apt-config_0.8.10-1_all.deb

これでダウンロードしてきたものをdpkg -iでインストールする。

dpkg -i mysql-apt-config_0.8.10-1_all.deb

これを実行すると…対話型にてaptのリポジトリの設定変更が発生する。

しかし、対話型はDockerfileで自動化するには向いていない。

コマンドが載ってるテキストをリダイレクトして対話型を終わらせる

設定画面では標準入力で1を押して2を押して4を押せばいいので、

text.txt

1
2
4

のテキストファイルをリダイレクトで渡せばよいです。

dpkg -i mysql-apt-config_0.8.10-1_all.deb < text.txt

また、これからapt updateを行い、その後apt install mysql-clientを実施します。

要するにDockerfileはこうである

Hostマシン

echo "1
2
4" > text.txt

mv text.txt [dockerfileのあるディレクトリ]/cmdfile/text.txt

Dockerfile

# ディストリビューションの指定
FROM ubuntu:18.04

# wgetやdpkgを使うためのpackageのインストール
RUN apt -y update 
RUN apt install -y wget lsb-release gnupg

# 公式サイトから設定ファイルのダウンロードをwgetで実施
RUN wget https://dev.mysql.com/get/mysql-apt-config_0.8.10-1_all.deb

# Hostマシンからコンテナへ、リダイレクト用の[text.txt]を渡す
COPY ./cmdfile/text.txt /tmp/text.txt

# 設定ファイルの実行
RUN dpkg -i mysql-apt-config_0.8.10-1_all.deb < /tmp/text.txt

# 設定ファイルが実行され、aptの内容が更新されたため、改めてupdateの実施
RUN apt -y update 

# mysql-clientのインストールの実行
RUN apt install -y mysql-client

あとはDockerfileでbuildしよう!

2018/6/30 10:05追記

Docker Composeでupするんや

Docker Composeでupするんや

こんばんは、葛の葉です。

前回、前々回と続きDockerの話になります。前回は、ホストOSと共有が出来なかったという問題があったかなと思いますが、 docker-compose.ymlファイルを使うことで、その共有もできるようになります。

kuzunoha-ne.hateblo.jp

kuzunoha-ne.hateblo.jp

そして、今回はDockerfileを使って作ったimageを元にcontainerを立ち上げてみましょう。


環境

Windows10 home

Docker Toolbox


まず、docker- compose.ymlというファイルをメモ帳とかvscodeとかvimで作ります。

そして、以下のように記載しましょう。

 

version: '3'

services:

    myapp:

        image: atarashiiimage:latest

        volumes: 

                - c:¥Users¥*****¥www:/project/www

        command:python /project/www/test.py

ついでに、試験用にpythonプログラムも作りましょうか。 

test.pyのコードはいつものhelloworld。

print("Hello World!!")

 

このtest.pyc:¥Users¥*****¥www フォルダに入れておきましょう。


さて、Dockerを起動させます。そして、作業しているディレクトリをdocker-compose.ymlの置いてある場所に移動します。

そしたら、以下のコマンドをたたいてみましょう。

docker-compose up

 

を叩けばカリカリ動いて…test.pyが動くはず!!

Hello World!!

って出てれば成功です。やったぜ!!!!

DockerfileでホストOSのディレクトリをマウントしようとしてできなかったお話

DockerfileでホストOSのディレクトリをマウントしようとしてできなかったお話

Docker勉強中の葛の葉でス。

前回、Dockerfileを使ったほうがかしこいって話を少ししたかなと思っています。

kuzunoha-ne.hateblo.jp

Dockerでimageを生成するときはDockerfileを使ったほうがコマンドが作れるし、みんなで共有できていいねってことでカリカリ書いていました。しかし、ホストOSのディレクトリをマウントしようとしてやってもやってもうまくいかない!っていうことがありましたので共有をばと。

やったこと

環境

Windows10 home

Docker Toolbox

Dockerfileを打ち込み候

FROM ubuntu:18.04

RUN apt install update
RUN apt install upgrade ; apt install python3

VOLUME ["/c/Users/*******/www","/pytest"]

CMD python /pytest/helloworld.py
ビルドしてみる
docker build -t atarashiiimage .
~~~~~~~~~
ビルド画面は中略
~~~~~~~~~
docker run atarashiiimage
Pythonがエラー吐く
python //helloworld.py うんちゃらかんちゃら…

なんかホストOSのディレクトリ がうまく読み込めてないみたい

期待した値は python /pytest/helloworld.py だったんだけど

コンテナ内に入ってみる
docker run -it atarashiiimage /bin/bash
lsコマンドで中身をみる
root@1234567890^ $ls /pytest

しーん…

えええええええええええええええ

なんにも入ってないの!?

原因1 DockerfileではホストOSのディレクトリをマウントできんらしい

詳しくはこちら コンテナでデータを管理 — Docker-docs-ja 17.06.Beta ドキュメント

Dockerfileはあくまでimageを作ることが目的っぽいねんな…

containerとして稼働させるときはDocker Composeを使いましょう…

Compose ファイル・リファレンス — Docker-docs-ja 17.06.Beta ドキュメント

原因2 Docker Toolboxでは/ディレクトリ直下にマウントできんらしい

docker runでcontainerを作るときに-vを使えばマウントできます。

docker run -v /c/Users/*****/www:/pytest -it atarashiiimage

でも/pytestのところがよくないみたい

docker run -v /c/Users/*****/www:/pytest/www -it atarashiiimage

こんな感じで/pytest/wwwみたいに/直下じゃなくて一個ディレクトリを挟むといいらしい

原因X 共有場所の問題

その他にもルールはあるみたいで、Docker Toolboxでは/c/Users以下じゃないとだめみたい。

Virtualboxあたりの関連かな?

とりいそぎ