はじめに
単一行のコメントは#
ですが、
複数行のはよく忘れるのでメモ
どうやるか
<< [任意の文字]
でコメントアウト開始[任意の文字]
でコメントアウト終了
どんな感じか
#!/bin/bash echo "hoge" # がコメントされる << COMMENTOUT echo "fuga" echo "piyo" COMMENTOUT
おわり
ちゃちゃっとやるばあいは
vimのコマンドで複数行の冒頭に#
とやっていた\(^o^)/
単一行のコメントは#
ですが、
複数行のはよく忘れるのでメモ
<< [任意の文字]
でコメントアウト開始[任意の文字]
でコメントアウト終了
#!/bin/bash echo "hoge" # がコメントされる << COMMENTOUT echo "fuga" echo "piyo" COMMENTOUT
ちゃちゃっとやるばあいは
vimのコマンドで複数行の冒頭に#
とやっていた\(^o^)/
最近はManager業に専念しているため
だいぶ技術ブログの更新を怠っていました ><
と、いいながら
ふとしたことからpythonを使いたく
macにデフォルトで入っているのはPython 2.7.10
。
使いたかったのが3.x系だったので切り替えて使えるようにpyenvをいれたメモです。
- XcodeやHomebrewをインストール
- pyenvとは?
- pyenvをインストール
- pyenvでpython3.xをインストール
念の為に書きましたが、ここは割愛します!!
macで開発するには何にしても必要ですしね。
Homebrewとは?的な記事は置いておきます。
pyenvとは?ですが、参考サイトから引用させて頂きます。
rbenvやplenvもあるのでそのあたりを使ったことがあるなら名前からはわかりそうですが..
pythonのバージョンを簡単に切り替えることができるようにしてくれるツールです。2系列と3系列との切り替えに便利です。また、ディレクトリごとにpythonのバージョンを切り替えることができます。
- 複数バージョンのPythonを簡単に切り替えられる
- 色々なバージョンのPythonを~/.pyenv以下に配置している
[参考サイト]- pyenvのインストール、使い方、pythonのバージョン切り替えできない時の対処法
- Pyenvの使い方
ここからが本題ですね。
まずはデフォルトのversionを確認します。
$ python --version Python 2.7.10
おもむろにpyenvをいれます。
versionが確認できればokです。
$ brew install pyenv $ pyenv -v pyenv 1.2.11
次にパスを通しておきます。
# ~/.bash_profileに追記 $ vim ~/.bash_profile -- vi追記 -- export PATH="$HOME/.pyenv/shims:$PATH" ------------ # 反映 $ source ~/.bash_profile
インストール可能のvesionを確認してみます。
めっちゃある...
$ pyenv install -l Available versions: 2.1.3 2.2.3 ~ 省略 ~ stackless-3.4.7 stackless-3.5.4
pyenvを使ってpython3.7.2をインストールします
# 現在installされたversionを確認 # まだsystem pythonしかはいってない $ pyenv versions * system (set by /Users/tweeeety/.pyenv/version) # 3.7.2をインストールj $ pyenv install 3.7.2 # インストールされたことを確認 # *がついてるものが今利用しているversion $ pyenv versions * system (set by /Users/tweeeety/.pyenv/version) 3.7.2 # version確認 $ python --version Python 2.7.10 # 切り替え $ python global 3.7.2 # 確認 $ pyenv versions system * 3.7.2 (set by /Users/tweeeety/.pyenv/version) $ python --version Python 3.7.2
なんとなくpyenvのhelpをみてみる
$ pyenv --help Usage: pyenv <command> [<args>] Some useful pyenv commands are: commands List all available pyenv commands local Set or show the local application-specific Python version global Set or show the global Python version shell Set or show the shell-specific Python version install Install a Python version using python-build uninstall Uninstall a specific Python version rehash Rehash pyenv shims (run this after installing executables) version Show the current Python version and its origin versions List all Python versions available to pyenv which Display the full path to an executable whence List all Python versions that contain the given executable See `pyenv help <command>' for information on a specific command. For full documentation, see: https://github.com/pyenv/pyenv#readme
簡単に切り替え完了ーーー\(^o^)/
新しいmacになったのでvimの設定なんかをやり直してます。
markdownはatomで書いていたのですが、
これを期にmarkdownもvimに移行しようと思ったのでその際の自分用メモ
- pluginを入れる
- plasticboy/vim-markdownの設定する
- kannokanno/previmの設定する
- tyru/open-browser.vimの設定する
- .vimrcの記述
3つのpluginを入れます
Plugin 'plasticboy/vim-markdown' Plugin 'kannokanno/previm' Plugin 'tyru/open-browser.vim'
以下、簡単な説明です
- plasticboy/vim-markdown
- シンタックスハイライトします
- headに応じて折りたたみもできます
- kannokanno/previm
- 保存したMarkdownをブラウザでプレビュー可能にします
- tyru/open-browser.vim
- カーソル下のurlや文字列を開いたり検索したりします
let g:vim_markdown_folding_disabled = 1 let g:vim_markdown_auto_insert_bullets = 0 let g:vim_markdown_new_list_item_indent = 0
let g:vim_markdown_folding_disabled = 1
markdownなファイルを開いたときに
デフォルトで折りたたみになってしまうのでoffにします。
vim_markdown_auto_insert_bullets
は以下を参照ください。
autocmd BufRead,BufNewFile *.md set filetype=markdown let g:previm_open_cmd = 'open -a Google\ Chrome' " ctrl pでプレビュー nnoremap <silent> <C-p> :PrevimOpen<CR>
autocmd BufRead,BufNewFile *.md set filetype=markdown
ちゃんと調べてませんが、
このままだと.mkd
のファイルに対してのハイライトらしいので
.md
もfiletype=markdownとなるようにします。
nnoremap <silent> <C-p> :PrevimOpen<CR>
基本は:PrevimOpen
でプレビューが開きます。
ctrl + p
というショートカットで開くようにします。
let g:netrw_nogx = 1 " disable netrw's gx mapping. nmap gx <Plug>(openbrowser-smart-search) vmap gx <Plug>(openbrowser-smart-search)
nmap gx <Plug>(openbrowser-smart-search)
vmap gx <Plug>(openbrowser-smart-search)
URLや文字列の上でgx
と打つことで、
URLならブラウザでURLが展開され、
文字列なら検索結果が表示されます。
以下、参考サイトです。
以下、.vimrcの記述です。
" " about markdown " Plugin 'plasticboy/vim-markdown' Plugin 'kannokanno/previm' Plugin 'tyru/open-browser.vim' " plasticboy/vim-markdown " 折りたたみの禁止 let g:vim_markdown_folding_disabled = 1 let g:vim_markdown_auto_insert_bullets = 0 let g:vim_markdown_new_list_item_indent = 0 " kannokanno/previm autocmd BufRead,BufNewFile *.md set filetype=markdown let g:previm_open_cmd = 'open -a Google\ Chrome' " ctrl pでプレビュー nnoremap <silent> <C-p> :PrevimOpen<CR> " tyru/open-browser.vim let g:netrw_nogx = 1 " disable netrw's gx mapping. nmap gx <Plug>(openbrowser-smart-search) vmap gx <Plug>(openbrowser-smart-search)
昔に設定したものも、再度vimの設定しなおすとほとんど覚えてないという\(^o^)/
macを新しくしたので.bashrcやら.vimrcも断舎離しつつ新しくしています。
terminalを開いてコマンドラインで入力する時、
tabで補完してくれるわけですが
デフォルトでは大文字小文字を正確に打たないと補完してくれません。
$ ls -1 Fuga.txt Hoge.txt piyo.txt # この状態でtabを打っても補完されない $ cat ho
この補完に大文字/小文字を無視して補完してくれる設定です
- 設定
- .inputrcって?
- readlineって?
設定は簡単で、${HOME}/.inputrc
というファイルに以下の設定を書いて読み込むだけです。
ちなみになければ作成してください
# 設定 $ vim ~/.inputrc -- vim追記 -- $if Bash set completion-ignore-case on $endif ------------ # 読み込み $ source ~/.inputrc
ところで.bashrc
はよく見かけますが.inputrcは
なんでしょうか?
これはreadline
が読み込む設定ファイルです。
では、readlineってなんでしょうか?
参考サイトからの引用になりますがライブラリ
です。
readlineは、CUI アプリケーションにおいてユーザが行を入力する際に便利な
「行頭・行末移動」「ヒストリ機能」などを提供するライブラリである。
readline というコマンドがあるわけではない。
参考: コマンド readline 行入力支援ライブラリ
こちらも参考サイトからの引用ですが、
readlineが提供する機能は以下でして補完・または候補一覧を表示 (TAB)
もこれに含まれます。
- 1文字戻る (Ctrl-b)
- 1文字進む (Ctrl-f)
- 行頭に移動 (Ctrl-a)
- 行末に移動 (Ctrl-e)
- カーソル位置から行末までを削除 (Ctrl-k)
- 1行上 (直前に入力した内容) に移動 (Ctrl-p)
- 1行下に移動 (Ctrl-n)
- 逆方向インクリメンタルサーチ (Ctrl-r)
- 補完・または候補一覧を表示 (TAB)
- エスケープシーケンスを入力 (Ctrl-q・Ctrl-v)
参考: コマンド readline 行入力支援ライブラリ
vimの設定からでも調べると知らない事が増えるのは良いですよね\(^o^)/
ちょこちょこDockerを触っているのですがネットワーク設定まわりについての自分用メモ
以下の書籍を参考にしています。
- やりたいこと
- Dockerコンテナのネットワークのプチ基礎
- ネットワークを作成する
- 複数のContainer同士で繋いでみる
- ネットワークを削除する
やりたい事は以下です
- dockerのネットワークを作成する
- 複数のcontainerを作成した同一ネットワークに接続
- container同士でアクセスする
Dockerはデフォルトでbridge/host/noneの3つのネットワークを作成します
$ docker network ls NETWORK ID NAME DRIVER SCOPE b917ccb08e42 bridge bridge local 45c4f50ef8dd host host local e1785a610499 none null local
明示的にネットワークを指定せずにDockerコンテナを起動すると、
デフォルトのbridge
ネットワークにDockerコンテナを起動します。
# 適当に立ち上げてみる $ docker container run -itd --name=sample ubuntu:latest # .NetworkSettings.Networks}}を確認するとbridgeになっている $ docker container inspect sample --format="{{json .NetworkSettings.Networks}}" {"bridge":{"IPAMConfig":null,"Links":null,"Aliases":null,"NetworkID":"b917ccb08e42a549dd85213c3e705a3ab03295656d760340ab04781ffe8f98da","EndpointID":"9fd096a5ff16be1542c1154baeebce92bc3b5abf6723f9d05ecbc5c36a6ff7c9","Gateway":"172.17.0.1","IPAddress":"172.17.0.2","IPPrefixLen":16,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:11:00:02","DriverOpts":null}}
ネットワークの作成は以下のコマンドで行います
docker network create [オプション] ネットワーク
オプション
は以下が指定可能です。
オプション | 説明 |
---|---|
--driver, d | ネットワークブリッジまたはオーバーレイ(デフォルトはbridge) |
--ip-range | コンテナに割り当てるIPアドレスのレンジを指定 |
--subnet | サブネットをCIDR形式で指定 |
--ipv6 | IPv6ネットワークを有効にするかどうか(true/false) |
-label | ネットワークに設定するラベル |
今回は--driver=bridge
でweb-network
というネットワークを作成してみます。
$ docker network create --driver=bridge web-network fe7f79487aa87cf03e03c857fc0013d3b85656fad9fb4417f9abfb2402f17c60 # 作成したネットワークを確認 $ docker network ls NETWORK ID NAME DRIVER SCOPE b917ccb08e42 bridge bridge local 45c4f50ef8dd host host local e1785a610499 none null local fe7f79487aa8 web-network bridge local $ docker network ls --filter driver=bridge NETWORK ID NAME DRIVER SCOPE b917ccb08e42 bridge bridge local fe7f79487aa8 web-network bridge local
ネットワークへの接続は
docker network
で接続する方法と、
docker run
時に接続する方法があります。
docker network
でcontainerをネットワークに接続するには以下のコマンドを使います
docker network connect [オプション] ネットワーク名 コンテナ名
docker run
で接続するには以下のコマンドを使います
docker container run オプション --name=コンテナ名 --net=ネットワーク名 コンテナイメージ
今回はdocker run
のほうで試します。
バックグラウンドでwebapp
という名前のcontainerを
ネットワークweb-network
につないで立ち上げます。
また、ポートはホストOS:8001からcontainerの80につなげます。
$ docker container run -itd -p 8001:80 --name=webapp --net=web-network nginx 8296c047ebf6e8f7d3755dec287903e5d7afee93cf96a47c7ef4b1c3ef04ded7
ブラウザで確認すると当然こんな感じ
webfront
という名前のcontainerを
ネットワークweb-network
につないで立ち上げてbashで起動。
また、container1 -> container2から繋いでみる際は、curlでポート80で繋ぎます。
$ docker container run -it --name=webfront --net=web-network centos /bin/bash # 1つめのcontainerにcurlしてみる # nginxの結果が帰ってくる [root@c1170773ec3c /]# curl webapp:80 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
うまくいきました!
containerをinspectで確認してみると、
.NetworkSettings.Networks
にてweb-network
に繋がっている事が確認できます。
$ docker container inspect webfront webapp [ { "Id": "e312f6dfd7659b82474dca68f5f991ce3135cd5ab840bb53d998149e79b0dcb2", "Created": "2018-06-23T22:36:49.8513111Z", "Path": "/bin/bash", "Args": [], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 8326, "ExitCode": 0, "Error": "", "StartedAt": "2018-06-23T22:41:17.7127242Z", "FinishedAt": "2018-06-23T22:38:05.4488807Z" }, "Image": "sha256:49f7960eb7e4cb46f1a02c1f8174c6fac07ebf1eb6d8deffbcb5c695f1c9edd5", "ResolvConfPath": "/var/lib/docker/containers/e312f6dfd7659b82474dca68f5f991ce3135cd5ab840bb53d998149e79b0dcb2/resolv.conf", "HostnamePath": "/var/lib/docker/containers/e312f6dfd7659b82474dca68f5f991ce3135cd5ab840bb53d998149e79b0dcb2/hostname", "HostsPath": "/var/lib/docker/containers/e312f6dfd7659b82474dca68f5f991ce3135cd5ab840bb53d998149e79b0dcb2/hosts", "LogPath": "/var/lib/docker/containers/e312f6dfd7659b82474dca68f5f991ce3135cd5ab840bb53d998149e79b0dcb2/e312f6dfd7659b82474dca68f5f991ce3135cd5ab840bb53d998149e79b0dcb2-json.log", "Name": "/webfront", "RestartCount": 0, "Driver": "overlay2", "Platform": "linux", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "", "ExecIDs": null, "HostConfig": { "Binds": null, "ContainerIDFile": "", "LogConfig": { "Type": "json-file", "Config": {} }, "NetworkMode": "web-network", "PortBindings": {}, "RestartPolicy": { "Name": "no", "MaximumRetryCount": 0 }, "AutoRemove": false, "VolumeDriver": "", "VolumesFrom": null, "CapAdd": null, "CapDrop": null, "Dns": [], "DnsOptions": [], "DnsSearch": [], "ExtraHosts": null, "GroupAdd": null, "IpcMode": "shareable", "Cgroup": "", "Links": null, "OomScoreAdj": 0, "PidMode": "", "Privileged": false, "PublishAllPorts": false, "ReadonlyRootfs": false, "SecurityOpt": null, "UTSMode": "", "UsernsMode": "", "ShmSize": 67108864, "Runtime": "runc", "ConsoleSize": [ 0, 0 ], "Isolation": "", "CpuShares": 0, "Memory": 0, "NanoCpus": 0, "CgroupParent": "", "BlkioWeight": 0, "BlkioWeightDevice": [], "BlkioDeviceReadBps": null, "BlkioDeviceWriteBps": null, "BlkioDeviceReadIOps": null, "BlkioDeviceWriteIOps": null, "CpuPeriod": 0, "CpuQuota": 0, "CpuRealtimePeriod": 0, "CpuRealtimeRuntime": 0, "CpusetCpus": "", "CpusetMems": "", "Devices": [], "DeviceCgroupRules": null, "DiskQuota": 0, "KernelMemory": 0, "MemoryReservation": 0, "MemorySwap": 0, "MemorySwappiness": null, "OomKillDisable": false, "PidsLimit": 0, "Ulimits": null, "CpuCount": 0, "CpuPercent": 0, "IOMaximumIOps": 0, "IOMaximumBandwidth": 0 }, "GraphDriver": { "Data": { "LowerDir": "/var/lib/docker/overlay2/df845a28b18ea7627b098493ad76fadf0be29ba2c0ddd6788cf513f878fc0116-init/diff:/var/lib/docker/overlay2/1809e038beecc1e66692da14e5b8028149a73b1566a6f04597889ae8c6d916f4/diff", "MergedDir": "/var/lib/docker/overlay2/df845a28b18ea7627b098493ad76fadf0be29ba2c0ddd6788cf513f878fc0116/merged", "UpperDir": "/var/lib/docker/overlay2/df845a28b18ea7627b098493ad76fadf0be29ba2c0ddd6788cf513f878fc0116/diff", "WorkDir": "/var/lib/docker/overlay2/df845a28b18ea7627b098493ad76fadf0be29ba2c0ddd6788cf513f878fc0116/work" }, "Name": "overlay2" }, "Mounts": [], "Config": { "Hostname": "e312f6dfd765", "Domainname": "", "User": "", "AttachStdin": true, "AttachStdout": true, "AttachStderr": true, "Tty": true, "OpenStdin": true, "StdinOnce": true, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/bash" ], "Image": "centos@sha256:b67d21dfe609ddacf404589e04631d90a342921e81c40aeaf3391f6717fa5322", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": { "org.label-schema.schema-version": "= 1.0 org.label-schema.name=CentOS Base Image org.label-schema.vendor=CentOS org.label-schema.license=GPLv2 org.label-schema.build-date=20180531" } }, "NetworkSettings": { "Bridge": "", "SandboxID": "372311e1ac5caebcc8f4a45c12a2f19437093f6421254c82bcae38ca1bff94dd", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": {}, "SandboxKey": "/var/run/docker/netns/372311e1ac5c", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "", "Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "", "IPPrefixLen": 0, "IPv6Gateway": "", "MacAddress": "", "Networks": { "web-network": { "IPAMConfig": null, "Links": null, "Aliases": [ "e312f6dfd765" ], "NetworkID": "fe7f79487aa87cf03e03c857fc0013d3b85656fad9fb4417f9abfb2402f17c60", "EndpointID": "45f3d2f47b8f4aec8dce2cc70f1d0ca003714ff76a9a28dfac5a332c14b65ad0", "Gateway": "172.18.0.1", "IPAddress": "172.18.0.3", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:12:00:03", "DriverOpts": null } } } }, { "Id": "8296c047ebf6e8f7d3755dec287903e5d7afee93cf96a47c7ef4b1c3ef04ded7", "Created": "2018-06-23T22:33:09.6325018Z", "Path": "nginx", "Args": [ "-g", "daemon off;" ], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 8012, "ExitCode": 0, "Error": "", "StartedAt": "2018-06-23T22:33:10.1810925Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "sha256:cd5239a0906a6ccf0562354852fae04bc5b52d72a2aff9a871ddb6bd57553569", "ResolvConfPath": "/var/lib/docker/containers/8296c047ebf6e8f7d3755dec287903e5d7afee93cf96a47c7ef4b1c3ef04ded7/resolv.conf", "HostnamePath": "/var/lib/docker/containers/8296c047ebf6e8f7d3755dec287903e5d7afee93cf96a47c7ef4b1c3ef04ded7/hostname", "HostsPath": "/var/lib/docker/containers/8296c047ebf6e8f7d3755dec287903e5d7afee93cf96a47c7ef4b1c3ef04ded7/hosts", "LogPath": "/var/lib/docker/containers/8296c047ebf6e8f7d3755dec287903e5d7afee93cf96a47c7ef4b1c3ef04ded7/8296c047ebf6e8f7d3755dec287903e5d7afee93cf96a47c7ef4b1c3ef04ded7-json.log", "Name": "/webapp", "RestartCount": 0, "Driver": "overlay2", "Platform": "linux", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "", "ExecIDs": null, "HostConfig": { "Binds": null, "ContainerIDFile": "", "LogConfig": { "Type": "json-file", "Config": {} }, "NetworkMode": "web-network", "PortBindings": { "80/tcp": [ { "HostIp": "", "HostPort": "8001" } ] }, "RestartPolicy": { "Name": "no", "MaximumRetryCount": 0 }, "AutoRemove": false, "VolumeDriver": "", "VolumesFrom": null, "CapAdd": null, "CapDrop": null, "Dns": [], "DnsOptions": [], "DnsSearch": [], "ExtraHosts": null, "GroupAdd": null, "IpcMode": "shareable", "Cgroup": "", "Links": null, "OomScoreAdj": 0, "PidMode": "", "Privileged": false, "PublishAllPorts": false, "ReadonlyRootfs": false, "SecurityOpt": null, "UTSMode": "", "UsernsMode": "", "ShmSize": 67108864, "Runtime": "runc", "ConsoleSize": [ 0, 0 ], "Isolation": "", "CpuShares": 0, "Memory": 0, "NanoCpus": 0, "CgroupParent": "", "BlkioWeight": 0, "BlkioWeightDevice": [], "BlkioDeviceReadBps": null, "BlkioDeviceWriteBps": null, "BlkioDeviceReadIOps": null, "BlkioDeviceWriteIOps": null, "CpuPeriod": 0, "CpuQuota": 0, "CpuRealtimePeriod": 0, "CpuRealtimeRuntime": 0, "CpusetCpus": "", "CpusetMems": "", "Devices": [], "DeviceCgroupRules": null, "DiskQuota": 0, "KernelMemory": 0, "MemoryReservation": 0, "MemorySwap": 0, "MemorySwappiness": null, "OomKillDisable": false, "PidsLimit": 0, "Ulimits": null, "CpuCount": 0, "CpuPercent": 0, "IOMaximumIOps": 0, "IOMaximumBandwidth": 0 }, "GraphDriver": { "Data": { "LowerDir": "/var/lib/docker/overlay2/feb0bfb05649a7787b78ce5e6134d30a2a7e7555964026c50bfd3a4af1e2a03e-init/diff:/var/lib/docker/overlay2/2ed039f41684788abb90840539ada301341751824b0112729e02b67b196226d7/diff:/var/lib/docker/overlay2/617a2b41e640cd527fdb39453e022b25eb04b5967ec1f4ed74e4b952fffb4005/diff:/var/lib/docker/overlay2/6bd654f2fa5d21d58a7ffcb989da07153dcaf6755e44952114e067baf7ccdba6/diff", "MergedDir": "/var/lib/docker/overlay2/feb0bfb05649a7787b78ce5e6134d30a2a7e7555964026c50bfd3a4af1e2a03e/merged", "UpperDir": "/var/lib/docker/overlay2/feb0bfb05649a7787b78ce5e6134d30a2a7e7555964026c50bfd3a4af1e2a03e/diff", "WorkDir": "/var/lib/docker/overlay2/feb0bfb05649a7787b78ce5e6134d30a2a7e7555964026c50bfd3a4af1e2a03e/work" }, "Name": "overlay2" }, "Mounts": [], "Config": { "Hostname": "8296c047ebf6", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "ExposedPorts": { "80/tcp": {} }, "Tty": true, "OpenStdin": true, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "NGINX_VERSION=1.15.0-1~stretch", "NJS_VERSION=1.15.0.0.2.1-1~stretch" ], "Cmd": [ "nginx", "-g", "daemon off;" ], "ArgsEscaped": true, "Image": "nginx@sha256:3e2ffcf0edca2a4e9b24ca442d227baea7b7f0e33ad654ef1eb806fbd9bedcf0", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": { "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>" }, "StopSignal": "SIGTERM" }, "NetworkSettings": { "Bridge": "", "SandboxID": "aed26e0cedb3000e6bcdf02f2a45446ae2c81eddbd6f53a30d34992e17f01611", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": { "80/tcp": [ { "HostIp": "0.0.0.0", "HostPort": "8001" } ] }, "SandboxKey": "/var/run/docker/netns/aed26e0cedb3", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "", "Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "", "IPPrefixLen": 0, "IPv6Gateway": "", "MacAddress": "", "Networks": { "web-network": { "IPAMConfig": null, "Links": null, "Aliases": [ "8296c047ebf6" ], "NetworkID": "fe7f79487aa87cf03e03c857fc0013d3b85656fad9fb4417f9abfb2402f17c60", "EndpointID": "cfe083931723d5689088deb5869d3caabe9360b22bbef908fb538041e0c58c7c", "Gateway": "172.18.0.1", "IPAddress": "172.18.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:12:00:02", "DriverOpts": null } } } } ]
見にくい場合はformatやjqを使ってみると見やすいです
$ docker container inspect webfront webapp --format "{{json .HostConfig}}" | jq . { "Binds": null, "ContainerIDFile": "", "LogConfig": { "Type": "json-file", "Config": {} }, "NetworkMode": "web-network", "PortBindings": {}, "RestartPolicy": { "Name": "no", "MaximumRetryCount": 0 }, "AutoRemove": false, "VolumeDriver": "", "VolumesFrom": null, "CapAdd": null, "CapDrop": null, "Dns": [], "DnsOptions": [], "DnsSearch": [], "ExtraHosts": null, "GroupAdd": null, "IpcMode": "shareable", "Cgroup": "", "Links": null, "OomScoreAdj": 0, "PidMode": "", "Privileged": false, "PublishAllPorts": false, "ReadonlyRootfs": false, "SecurityOpt": null, "UTSMode": "", "UsernsMode": "", "ShmSize": 67108864, "Runtime": "runc", "ConsoleSize": [ 0, 0 ], "Isolation": "", "CpuShares": 0, "Memory": 0, "NanoCpus": 0, "CgroupParent": "", "BlkioWeight": 0, "BlkioWeightDevice": [], "BlkioDeviceReadBps": null, "BlkioDeviceWriteBps": null, "BlkioDeviceReadIOps": null, "BlkioDeviceWriteIOps": null, "CpuPeriod": 0, "CpuQuota": 0, "CpuRealtimePeriod": 0, "CpuRealtimeRuntime": 0, "CpusetCpus": "", "CpusetMems": "", "Devices": [], "DeviceCgroupRules": null, "DiskQuota": 0, "KernelMemory": 0, "MemoryReservation": 0, "MemorySwap": 0, "MemorySwappiness": null, "OomKillDisable": false, "PidsLimit": 0, "Ulimits": null, "CpuCount": 0, "CpuPercent": 0, "IOMaximumIOps": 0, "IOMaximumBandwidth": 0 } { "Binds": null, "ContainerIDFile": "", "LogConfig": { "Type": "json-file", "Config": {} }, "NetworkMode": "web-network", "PortBindings": { "80/tcp": [ { "HostIp": "", "HostPort": "8001" } ] }, "RestartPolicy": { "Name": "no", "MaximumRetryCount": 0 }, "AutoRemove": false, "VolumeDriver": "", "VolumesFrom": null, "CapAdd": null, "CapDrop": null, "Dns": [], "DnsOptions": [], "DnsSearch": [], "ExtraHosts": null, "GroupAdd": null, "IpcMode": "shareable", "Cgroup": "", "Links": null, "OomScoreAdj": 0, "PidMode": "", "Privileged": false, "PublishAllPorts": false, "ReadonlyRootfs": false, "SecurityOpt": null, "UTSMode": "", "UsernsMode": "", "ShmSize": 67108864, "Runtime": "runc", "ConsoleSize": [ 0, 0 ], "Isolation": "", "CpuShares": 0, "Memory": 0, "NanoCpus": 0, "CgroupParent": "", "BlkioWeight": 0, "BlkioWeightDevice": [], "BlkioDeviceReadBps": null, "BlkioDeviceWriteBps": null, "BlkioDeviceReadIOps": null, "BlkioDeviceWriteIOps": null, "CpuPeriod": 0, "CpuQuota": 0, "CpuRealtimePeriod": 0, "CpuRealtimeRuntime": 0, "CpusetCpus": "", "CpusetMems": "", "Devices": [], "DeviceCgroupRules": null, "DiskQuota": 0, "KernelMemory": 0, "MemoryReservation": 0, "MemorySwap": 0, "MemorySwappiness": null, "OomKillDisable": false, "PidsLimit": 0, "Ulimits": null, "CpuCount": 0, "CpuPercent": 0, "IOMaximumIOps": 0, "IOMaximumBandwidth": 0 }
ネットワークを削除するには以下のコマンドです
docker network rm [オプション] ネットワーク名
containerが起動している状態だとエラーが出るのでstopしてから行います
# ネットワークに接続しているcontainerが起動しいるとエラー $ docker network rm web-network Error response from daemon: network web-network id fe7f79487aa87cf03e03c857fc0013d3b85656fad9fb4417f9abfb2402f17c60 has active endpoints # stopする $ docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e312f6dfd765 centos "/bin/bash" 34 minutes ago Up 30 minutes webfront 8296c047ebf6 nginx "nginx -g 'daemon of…" 38 minutes ago Up 38 minutes 0.0.0.0:8001->80/tcp webapp $ docker container stop e312f6dfd765 8296c047ebf6 e312f6dfd765 8296c047ebf6 # stop後だと消せる $ docker network rm web-network web-network
docker便利だけどまだ使いこなせてない\(^o^)/
VirtualBoxを久しぶりに使ったら全然覚えてない...
特にネットワークまわり。
やりたいことは単純でおおざっぱに言うと以下2点だけ
そんな時の自分メモ
- 今回の環境
- やりたいこと
- 何をすれば良いか
- どうやるか
- ネットワークを確認してみる
$ sw_vers ProductName: Mac OS X ProductVersion: 10.13.5 BuildVersion: 17F77
$ VBoxManage -v 5.2.12r122591
$ cat /etc/redhat-release CentOS release 6.5 (Final)
はじめに
に記載したことがやりたい事ですが再掲です。
2. やりたいこと
を実現するために
VirtualBoxで何をすれば良いか
を文章的にまとめるとこんな感じです。
また、これを図にするとこんなイメージになります。
何をすれば良いか
を実現するために具体的にやることは以下の4stepです。
- ①. VirtualBoxマネージャでネットワークアダプタを作成&設定する
- ②. VirtualBoxマネージャで仮想マシンのネットワーク設定をする
- ③. ゲストOSでネットワークの設定をする
- eth0とeth1を有効にする
- ④. ホストOSからSSHしてみる
VirtualBoxマネージャ
はこのGUIツールです
vboxnet0
というアダプタが作成されます。
vboxnet0
を選択した状態でアダプター
タブを開きアダプターを手動で設定
にチェックが入っている事を確認します。
DHCPサーバ
タブを開きサーバを有効化
にチェックします。
ネットワーク
を開いてアダプター1
にNATが設定されている事を確認します。
アダプター2
を選択してネットワークアダプターを有効化
にチェックをします。
割り当て:
にホストオンンリーアダプター
を選択して名前
にさきほど作成したvboxnet0
を選びます。
また、高度
を押すと設定がさらに開くのでMACアドレス
をメモっておきます。
今回の例でいうとMACアドレスは以下です
080027588378
最後にOK
を押して設定を保存します。
仮想マシンを起動するか、すでに起動していた場合は再起動します。
起動したら仮想マシンのターミナルで設定を行います。
MACアドレス
とeth*
の対応づけを行なっているrulesの設定を綺麗にしておきます。
reboot後にeth0、eth1を元に自動で作成されるので大丈夫です。
$ rm /etc/udev/rules.d/70-persistent-net.rules
この辺のファイルが何かは以下をご参考ください
ifcfg-eth*
を設定vimで/etc/sysconfig/network-scripts/ifcfg-eth0
を設定します。
ファイルを開くともともと書かれてる場合がありますが、
他の行はコメントアウトしました。
DEVICE=eth0 TYPE=Ethernet ONBOOT=yes BOOTPROTO=dhcp PEERDNS=no
vimで/etc/sysconfig/network-scripts/ifcfg-eth1
を設定します。
ファイルがない場合は作成します。
DEVICE=eth1 HWADDR=08:00:27:58:83:78 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=none PEERDNS=no IPADDR=192.168.56.3 NETMASK=255.255.255.0
BOOTPROTO
については気になったので簡単に調べてみました。
$ reboot
以下を確認します。
/etc/udev/rules.d/70-persistent-net.rules
が作成されている- ifconfigで
eth0
、eth1
が設定されている
このように表示されれば設定がされているはずです。
# 確認 # rulesが新しくできている $ cat /etc/udev/rules.d/70-persistent-net.rules # This file was automatically generated by the /lib/udev/write_net_rules # program, run by the persistent-net-generator.rules rules file. # # You can modify it, as long as you keep each rule on a single # line, and change only the value of the NAME= key. # PCI device 0x8086:0x100e (e1000) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:82:03:24", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0" # PCI device 0x8086:0x100e (e1000) (custom name provided by external tool) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:58:83:78", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1" # ネットワークインターフェースの確認 $ ifconfig eth0 Link encap:Ethernet HWaddr 08:00:27:82:03:24 inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fe82:324/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:6 errors:0 dropped:0 overruns:0 frame:0 TX packets:24 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1470 (1.4 KiB) TX bytes:2262 (2.2 KiB) eth1 Link encap:Ethernet HWaddr 08:00:27:58:83:78 inet addr:192.168.56.3 Bcast:192.168.56.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fe58:8378/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:505 errors:0 dropped:0 overruns:0 frame:0 TX packets:318 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:48536 (47.3 KiB) TX bytes:73614 (71.8 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
次に、pingで外向けに通信してNAT(ゲストOS->ホストOSの通信)を確かめます。
packet lossがなければ成功です。
# Google Public DNS(8.8.8.8)に疎通確認 $ ping 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=63 time=4.17 ms 64 bytes from 8.8.8.8: icmp_seq=2 ttl=63 time=5.32 ms 64 bytes from 8.8.8.8: icmp_seq=3 ttl=63 time=5.54 ms 64 bytes from 8.8.8.8: icmp_seq=4 ttl=63 time=4.29 ms ^C --- 8.8.8.8 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3155ms rtt min/avg/max/mdev = 4.179/4.837/5.548/0.611 ms # googleに疎通確認 $ ping google.com PING google.com (172.217.24.142) 56(84) bytes of data. 64 bytes from nrt20s01-in-f14.1e100.net (172.217.24.142): icmp_seq=1 ttl=63 time=2.25 ms 64 bytes from nrt20s01-in-f14.1e100.net (172.217.24.142): icmp_seq=2 ttl=63 time=2.35 ms 64 bytes from nrt20s01-in-f14.1e100.net (172.217.24.142): icmp_seq=3 ttl=63 time=3.61 ms 64 bytes from nrt20s01-in-f14.1e100.net (172.217.24.142): icmp_seq=4 ttl=63 time=2.55 ms ^C --- google.com ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3895ms rtt min/avg/max/mdev = 2.259/2.695/3.612/0.540 ms
ここまでくればmacでsshしてみます。
sshできればホストオンリーアダプタ(ホストOS->ゲストOSの通信)が成功です。
$ ssh root@192.168.65.3 root@192.168.56.3's password: Last login: Thu Jun 21 22:30:49 2018 from 192.168.56.1
念のためもう少しネットワークを確認してみます。
ゲストOS側でroute、netstat、tracerouteでネットワーク設定を確認します。
外に出れていれば以下のようになります。
routeコマンドでルーティングテーブルを確認します
$ route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 10.0.2.0 * 255.255.255.0 U 0 0 0 eth0 192.168.56.0 * 255.255.255.0 U 0 0 0 eth1 link-local * 255.255.0.0 U 1002 0 0 eth0 link-local * 255.255.0.0 U 1003 0 0 eth1 default 10.0.2.2 0.0.0.0 UG 0 0 0 eth0 $ route
- Destination あて先
- Gateway ゲートウェイ
- Genmask あて先ネットマスク
- Flags 経路の状態
- U 有効
- H 対象はホスト
- G ゲートウェイを使用
- ! 無効
- Metric あて先までの距離
netstatでネットワークインターフェース(NIC)の状態を確認します
# netstat $ netstat -rn Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 10.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 192.168.56.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1 0.0.0.0 10.0.2.2 0.0.0.0 UG 0 0 0 eth0
tracerouteでネットワークの経路を確認してみます。
# traceroute $ traceroute -T -q 1 -w 1 google.com traceroute to google.com (172.217.24.142), 30 hops max, 60 byte packets 1 10.0.2.2 (10.0.2.2) 0.127 ms 2 syd09s06-in-f14.1e100.net (172.217.24.142) 24.941 ms
今回利用しているオプションは以下の通りです
また、ホストOS側でifconfigを行うと、
仮想NICのvboxnet0
に付与されたIPアドレスを確認できます。
$ ifconfig | grep vboxnet0 -A 3 -B 3 nd6 options=201<PERFORMNUD,DAD> media: autoselect status: active vboxnet0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500 ether 0a:00:27:00:00:00 inet 192.168.56.1 netmask 0xffffff00 broadcast 192.168.56.255
10.0.2.2
はどこで設定されてるか気になり別途調べてみました。
\(^o^)/
VirtualBoxにCentOS入れて使う場合、
たいてい最初に行うのがネットワークの設定ですよね。
いつもどのファイルだっけ?となるのでそんな自分のためのメモ
以下のファイルがよく見るファイルです
- /etc/sysconfig/network
- /etc/sysconfig/network-scripts/ifcfg-eth0
- /etc/hosts
- /etc/resolv.conf
ネットワーク通信に必要とされる基本的な情報が記述されているファイル。
DHCPの設定例
NETWORKING=yes HOSTNAME=hoge.local
インターフェース設定ファイル。
システムの1番目のイーサネットのネットワークインターフェースカード または、NICを制御する。
NAT/DHCPとしてeth0を設定するときの例
DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes
ホストオンリーアダプタとしてeth1を設定するときの例
DEVICE=eth1 HWADDR=00:00:00:00:00:00 TYPE=Ethernet ONBOOT=yes BOOTPROTO=none IPADDR=192.168.56.3 NETMASK=255.255.255.0
IPアドレスとマシン名(ホスト名)を関連付ける設定ファイル
127.0.0.1 localhost.localdomain localhost 192.168.1.10 test1 192.168.1.20 test2
自分のマシンが利用するDNSサーバの情報(IPアドレス)を記述するファイル
search linux-beginner.com nameserver 192.168.0.1 nameserver 192.168.0.2
以下のサイトが全体的に説明してくれていてわかりやすかったです。
/etc/sysconfig/network-scripts/ifcfg-eth0
の場所がほんとよくどこだっけなーとなる
\(^o^)/