- 投稿日:2020-11-27T23:37:07+09:00
第0回 AWSに自動でテスト/デプロイしてくれるインフラの設定・構築(目標・やりたいこと)
はじめに
都内某所に住む大学院生です!
休学しているということもあり、空いてる時間が多いので、今のうちにインフラ周りであるテスト・デプロイの自動化(CI/CDパイプラインの構築)方法について学ぼうと思ったので勉強し、その結果をまとめました!ちなみに初投稿なんで優しい目で見ていただけるとありがたいですm(_ _)m
(あと、本記事はまだ本編スタートしないので読まなくていいです。ブログ的な感じで書き始めました。)前提知識
この記事を読む上で、知っておいて欲しいこと一覧。(というか、各ツールの詳細部分までは説明しないので、詳細を知りたい方は、他の記事を参考にして欲しい。)(付け足すかも)
〜ネットワーク編〜
・ サブネット
・ ルートテーブル
・ CIDR
〜Docker(docker-compose)編〜
・run
/exec
等基本コマンド
〜CircleCI編〜
・YAML(.yml)ファイルの記法本シリーズ集
この『AWSに自動でテスト/デプロイしてくれるインフラの設定・構築』シリーズは、今のところは6回くらいほど続く予定
タイトル 0 目標・やりたいこと 1 AWS編 2 rails開発環境構築編(未) 3 Nginx・MySQL編(未) 4 Capistrano編(未) 5 CircleCI編(未) 6 総集編(未) 使用するツール
- AWS
- CircleCI(version-2.1)
- Docker(version-19.03.5, docker-compose: version-1.24.1)
- Github
- Nginx(version-1.19.5(Dockerのlatestタグ))
- Rails (rubyのgem。 version-6.0.3.4)
- Capistrano(gem。 version-3.14.1)
- puma (gem。 version-4.3.6)
- MySQL(version-5.7。 Docker)
rails などのgemも基本はDocker(docker-compose)を使用します。
目標・やりたいこと
- AWSでEC2インスタンス(後述)3つを立てて、その中でDockerを使用して、Nginx(Webサーバ)・puma(APサーバ)・MySQL(DBサーバ)それぞれの本番環境を構築する。
- また、GithubとCircleCI・Capistranoを利用して、AWSのEC2に自動でテスト&デプロイしてくれる(所謂、『CI/CDパイプラインの構築』)よう設定する。
Dockerとは?
終わる前にDockerについて一言。
近年流行っている仮想化技術の一つ。
コンテナを作成し、その中で、ローカルの環境とは別の、独立した環境で開発等々を行う技術。↓参考になったサイト・記事
・Dockerとは何か、何が良いのか
・Docker超入門①〜Dockerってなに?〜【初心者向け】⬇️このツール群で唯一参考にしたudemyの講座。すごく助かりました。
・米国AI開発者がゼロから教えるDocker講座最後に、筆者について
とあるSI系の会社でインターンとして働いており、これまではふんわりと『普通にどこかの企業に就職するかな〜っ』て考えていました。
ですが、休学を機に、自分は何をやりたいか?と考えた結果、IT系に進もうと決心しました。
そして、『このままではダメだ!基礎から勉強しよう!』と思い、基礎情報処理や応用情報処理、ネットワーク周りを勉強し始めました(ちょっとネットワーク周りは勉強しすぎた感ありますが)。
一通り、基礎固めが終了し、言語の習得もそこそこにして(元々インターンで培っているので、他の人よりはプログラミング言語の習得は早いと思います)、次はインフラ周りの勉強するぞ!という段階です。
まだ本腰入れて勉強し始めて3ヶ月ほどなので、間違ったことを書いていれば、コメントで指摘していただければ有難い限りです。
- 投稿日:2020-11-27T19:37:52+09:00
DebianにDockerをインストールする
目的
DebianにDockerをインストールする。インターネッツに色々やり方あったけど、結局公式がうまくいったので備忘として残しておきます。
必要なパッケージを追加
sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-commongpgキーを追加
取得
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -鍵の確認
sudo apt-key fingerprint 0EBFCD88以下が出力されること
pub rsa4096 2017-02-22 [SCEA] 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 uid [ unknown] Docker Release (CE deb) <docker@docker.com> sub rsa4096 2017-02-22 [S]リポジトリの追加
sudo add-apt-repository \ "deb [arch=arm64] https://download.docker.com/linux/debian \ $(lsb_release -cs) \ stable"CPUの確認は以下のコマンド
上から
- CPU情報
- CPUの種類
- CPU情報詳細
- CPUのBit数
です。lscpu uname -m cat /proc/cpuinfo getconf LONG_BITDockerのインストール
sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose※どうせ使うのでdocker-composeもいれます。
インストール確認
sudo docker run hello-worlddockerの自動起動と再起動
sudo systemctl enable docker sudo systemctl restart docker参考手順
- 投稿日:2020-11-27T18:50:22+09:00
Dockerで始めるDjango生活(2日目)
初めに
2日目です。
1日目はこちら
今回はdjangoの設定などを見ながら日本語化してアプリケーションを作成するのがゴールになります。目次
- 前回の復習
- settings.pyについて
- アプリについて
- アプリを作成する
- アプリの中身について
- 最後に
1. 前回の復習
まずはコンテナを起動しましょう!
# docker exec -it c9b27b34be02 /bin/sh開発ディレクトリに遷移します。
# cd /root/projects/myproject/myprojectサーバーを起動します。
# python3 manage.py runserverhttp://127.0.0.1:8000/
に遷移して以下の画面が出れば大丈夫です!
2. settings.pyについて
まずは、settings.pyの中身を見ていきます。
さすがに全部を見ると長いのでいくつかを紹介します。DEBUG
DEBUGはブール値になっています。
デフォルトではTrueになっています。
Djangoのデバッグモードのオンオフの切り替えを行います。True
アプリケーションによってキャッチできないエクセプションが起こるとエクセプションの詳細ページを表示します。
False
Trueで表示されていた詳細ページを表示しないようにします。
本番環境では必ずFalseにしてください。機密データが漏れたりするので!!!ALLOWED_HOSTS
デバッグモードがオンの時、テストの実行中には適用されません。
ドメインやホストはここに追加します。INSTALLED_APPS
Djangoにインストールされているアプリを追加します。
アプリを新たにインストールした場合はここに追加する必要があります。
以下ではデフォルトでインストールされているアプリを書いておきます。django.contrib.admin
管理サイト
django.contrib.auth
認証のためのアプリ
django.contrib.contenttypes
コンテンツタイプを処理するためのアプリ
django.contrib.sessions
セッションのためのアプリ
django.contrib.messages
メッセージのためのアプリ
django.contrib.staticfiles
静的ファイルを管理するためのアプリ
DATABASES
djangoで使用するデータベースの情報を書きます。
デフォルトではSQLite3が設定されています。LANGUAGE_CODE
djangoで使用する言語を書きます。
デフォルトではen-usになっているのでjaに変更しておきます。TIME_ZONE
djangoで使用するタイムゾーンを書きます。
デフォルトではUTCになっているのでAsia/Tokyoに変更しておきます。ここまでくると以下のようにdjangoの起動画面が日本語化されたと思います。
3. アプリについて
djangoにはプロジェクトとアプリと言う概念があります。
イメージとしてはプロジェクトが親でアプリが子になります。
1つのプロジェクトに対して同じ設定を持つアプリを複数作成する事が可能です。1. アプリを作成する
これからブログアプリを作成してみようと思います。
# ls db.sqlite3 manage.py myproject # python3 manage.py startapp blog # ls blog db.sqlite3 manage.py myproject # tree blog blog |-- __init__.py |-- admin.py |-- apps.py |-- migrations | `-- __init__.py |-- models.py |-- tests.py `-- views.py 1 directory, 7 files #新たにblogディレクトリが作成されました。
2. アプリの中身について
上で作成したblogディレクトリの中身を紹介していきます。
admin.py
ここでモデルを登録します。
apps.py
blogアプリケーションの構成が書かれています。
migrations
blogアプリケーションのモデルの変更を追跡してデータベースを同期します。
models.py
blogアプリケーションのデータモデルです。
tests.py
blogアプリケーションのテストを追加することができます。
views.py
blogアプリケーションのビューです。
4. 最後に
今回はファイルやファイルの中身についての紹介がメインになりました。
次回は実際にモデルを作成していこうと思います。
お疲れ様でした!
- 投稿日:2020-11-27T15:09:23+09:00
Windows10 homeに開発環境としてのDockerを構築【構築中です】
目的
windows10 homeでWebアプリ開発を実施。現在はMAMPを開発環境にしようしている。
マイクロサービス、CD/CIなどを見据えてdockerで開発環境を構築する環境構築はそれなりに大変そう
MAMPは『バーチャルホスト』を使って簡単に複数の環境を構築できる
続けるにはdockerのメリットを考えておく必要ありそうdocker toolboxのインストール
インストーラ
以下のgithubからexeをダウンロード
https://github.com/docker/toolbox/releases参考
Windows10 にDocker Toolboxをインストールしてみた
手順
下記を参考に実施
Windows10 にDockerをインストールする方法初期設定
作成されたショートカット"Docker Quickstart Terminal"を実行する
cmdで"docker run hello-world"を実行する
以下参考の動作確認の画面が表示されることを確認する参考
windows 10 home で docker を導入するメモ
参考
Windows10 HomeでDocker環境を導入する
DockerアプリケーションをHerokuにデプロイしてWebサーバー構築
- 投稿日:2020-11-27T15:00:28+09:00
DockerでGolang+mysqlの環境を立ち上げようとしたときに発生したミス&対処法
環境構築で8時間程度溶かしてしまったわけなのですが(8時間はもしかしたらいいほうかもしれない?)、そのときの対処法についてまとめておきます。結局対処するのに必要だったのはコード2行分の編集だったのはちょっと辛いですね、、、
net::ERR_EMPTY_RESPONSE
に対してmain.go
での編集
net::ERR_EMPTY_RESPONSE
がひたすら帰ってきていたのを、main.goで以下のように編集したら直りました。
HTTP_HOST
,HTTP_PORT
などは.env
から読み出している環境変数です。失敗:
r.Run(os.Getenv("HTTP_HOST") + ":" + os.Getenv("HTTP_PORT")) // for local成功:
HTTP_HOSTの部分がどうやらいらなかったらしいです、どうしてかはわかりません、、、
こちらの方の記事を参考にさせていただきました。Dockerコンテナ上で動くGinサーバーにアクセスできないエラーの解決法r.Run(":" + os.Getenv("HTTP_PORT")) // for local or r.RUN(":8080")mysqlのpanicに対しての
sql_handler.go
の編集こちらのstackoverflowが役に立ちました:panic: dial tcp 127.0.0.1:3306: connect: connection refused
失敗:
db, err = gorm.Open("mysql", user+":"+password+"@tcp("+host+":"+port+")/"+database+"?parseTime=true&loc=Asia%2FTokyo")成功:
dockerコンテナのホストとポートではなく、名前で指定してあげると見事にデータベースにつながりました。docker-composeはdockerが生成したネットワークを使用するため、コンテナの名前をそのまま利用できるらしいです。でもどうして上記だと失敗するのかはよくわかりません、、、db, err = gorm.Open("mysql", user+":"+password+"@tcp(mysql_docker_container_name)/"+database+"?parseTime=true&loc=Asia%2FTokyo") # mysql_docker_container_nameのところをクオテーションなしでそのまま自分のdockerコンテナの名前を入れてください
- 投稿日:2020-11-27T13:37:22+09:00
Docker コマンド早見表
イメージ
イメージの一覧を表示
docker imagesイメージの消去
docker rmi IMAGE_IDコンテナ
コンテナの起動
docker run --name nginx -p 80:80 nginxコンテナをバックグラウンドで起動
バックグラウンドで起動する(Detachする)ので、inputができない、outputが表示されなくなる。
docker run --name nginx -p 80:80 --detach nginx docker run --name nginx -p 80:80 -d nginx作動中のコンテナを停止する
docker stop CONTAINTER_NAMEコンテナのログを表示する
outputを表示できる
docker logs CONTAINER_ID作動中のコンテナ一覧を表示
docker ps作動中のコンテナをリアルタイムで表示
watch "docker ps" # ヘッダを表示しない。よりスッキリした画面になる watch -t "docker ps" # 時間間隔指定 watch -n 1 "docker ps"停止中のコンテナもすべて表示
docker ps --all docker ps -a停まったコンテナを消去
dokcer rm CONTAINER_IDアクセス
ポートの80にアクセス
curl http://localhost:80作動中のコンテナの中にシェルで入る
docker exec -it CONTAINER_ID bash
- exec
- Run a command in a running container
- exec -i (--interactive)
- Keep STDIN open even if not attached
- exec -t (--tty)
- Allocate a pseudo-TTY
execution 実行、 interactive 対話形式、 tty テレタイプライター => terminalのこと
- 投稿日:2020-11-27T11:30:38+09:00
Docker pオプションによるポートマッピングとは?
ポートマッピングとは
ポートマッピング 【 port mapping 】
ポートマッピングとは、ブロードバンドルータなどが持つ機能の一つで、グローバルIPアドレスの特定のポートを、特定のプライベートIPアドレスの特定のポートに固定的に対応付けて転送するもの。内部ネットワークの機器に外部から着信することができる。
ポートフォワーディングという言葉で使われている場合もあるよう。
ポートフォワーディング - ネットワークエンジニアを目指してDockerでポートマッピングをしないと、アクセスすることが出来ないため、コンテナを起動する際にポートマッピングをして起動させます。
-pオプション
- ポートのマッピングを設定する
docker run --name nginx -p <ホストのポート>:<コンテナのポート> nginx
docker run --name nginx -p 80:80 nginx
これでnginxのデフォルトのポート80とローカルのポート80が繋がりました。
アクセスしてみる。
ブラウザに
http://127.0.0.1:80/
もしくはhttp://localhost:80/
を入力すると立ち上げたサーバにアクセス出来ます。もしくはterminalからcurlコマンドでも確認が出来ます。
curl http://localhost:80/
- 投稿日:2020-11-27T10:54:10+09:00
Docker でphp8とlaravel8を動かす
はじめに
php8が公開されたので触ってみたい興味でDockerでの環境を作ってみました。
公式のDocker hubにはまだrc版しかなかったので、今回はrc版で作ってます。使い方
↑のgithubからソースをクローンして、ディレクトリに移動してください。
入ったディレクトリでmake set-up
を入力したら環境が出来上がると思います。
終わったらhttp://127.0.0.1:8000/ にアクセスして↓の様になっていれば完成です。
詳しい説明はそのうち書くかもしれません
おわりに
今回の記事を参考にphp8をどんどん触っていけたらいいなと思います。
間違いが合ったりしたら、コメントやPRお願いします!
- 投稿日:2020-11-27T10:32:15+09:00
Docker サーバーの起動状態を監視するコマンド watch "docker ps"
watchコマンドを使った監視方法
2秒ごとにコマンドを入力してくれるので、フォアグラウンドでリアルタイム更新される。
使っているTerminalを画面分割して、監視用の画面を作るとやりやすい。watch "docker ps" # ヘッダを表示しない。よりスッキリした画面になる watch -t "docker ps" # 時間間隔指定 watch -n 1 "docker ps"【 watch 】コマンド――コマンドを一定間隔で繰り返し実行する:Linux基本コマンドTips(220) - @IT
- 投稿日:2020-11-27T10:32:15+09:00
Docker サーバーの起動状態をリアルタイムで表示するコマンド watch "docker ps"
watchコマンドを使った監視方法
2秒ごとにコマンドを入力してくれるので、フォアグラウンドでリアルタイム更新される。
使っているTerminalを画面分割して、監視用の画面を作るとやりやすい。watch "docker ps" # ヘッダを表示しない。よりスッキリした画面になる watch -t "docker ps" # 時間間隔指定 watch -n 1 "docker ps"【 watch 】コマンド――コマンドを一定間隔で繰り返し実行する:Linux基本コマンドTips(220) - @IT
- 投稿日:2020-11-27T01:46:21+09:00
Dockerで始めるDjango生活(1日目)
初めに
DjangoとはPythonベースのフレームワークです。
今回はdockerを用いていきたいと思います。
OSはWindows 10を想定しています。
dockerが使えればOSは特に関係無いかと思います。目次
- 環境を整える
- dockerのイメージをプルしてくる
- プルしてきたイメージを元にコンテナを作成する
- コンテナに入りpythonやdjangoをインストールする
- プロジェクトを作成してみる
- プロジェクトを作成する
- プロジェクトの中身を見る
- プロジェクトを動かしてみる
- サーバーを起動してみる
- 最後に
1. 環境を整える
まずは、入門するために開発環境を整えていこうと思います。
1. dockerのイメージをプルしてくる
まずはcmdを開きます。
今回開発したいフォルダを作成します。今回はCドライブ配下のデスクトップ上のdjangoフォルダで開発を行いたいと思います。> cd C:\Users\USER-NAME\Desktop > mkdir django > cd django今回の開発ではubuntuの最新版を用いようと思います。
> docker images REPOSITORY TAG IMAGE ID CREATED SIZE > docker pull ubuntu:latest > docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest f643c72bc252 16 hours ago 72.9MB2. プルしてきたイメージを元にコンテナを作成する
1で作成したイメージを元にコンテナを作成します。
> docker run --name django-ubuntu -p 127.0.0.1:8000:8000 -v %cd%:/root -u 0 -itd f643c72bc252 /bin/shオプションの説明をします。
--name <NAME> ・・・ コンテナの名前をNAMEに設定する。 -p <ポート>:<コンテナのポート> ・・・ コンテナのポートをポートに割り当てる。 -v <フォルダ>:<コンテナのフォルダ> ・・・ フォルダにコンテナのフォルダをマウントする。(%cd%はcmdで現在のディレクトリを指す) -u 0 ・・・ コンテナにrootユーザーとしてログインする。 -itd ・・・ /bin/shを疑似端末に割り当ててバックグラウンドで実行状態にする。 f643c72bc252 ・・・ イメージのID(docker imagesで表示されたIMAGE IDの値)作成されたコンテナを確認します。
> docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c9b27b34be02 f643c72bc252 "/bin/sh" 51 seconds ago Up 48 seconds 0.0.0.0:8000->8000/tcp django-ubuntu3. コンテナに入りpythonやdjangoをインストールする
まずはコンテナに入ってみます。
docker exec -it c9b27b34be02 /bin/shここでc9b27b34be02はdockerpsで表示されたCONTAINER IDの値です。
それではpythonがコンテナ内に存在しているかを確認しようと思います。# python3 -V /bin/sh: 2: python3: not found #ここでなぜ「python」ではなくて「python3」かと言うとubuntuの設定で元から入っているpythonと競合を起こして最悪の場合ubuntu自体を壊してしまうかもしれないからです。(今回のイメージの様に入っていない場合もあります。)
それではインストールしていこうと思います。# apt-get update // apt-getの最新化 ・・・ # apt-get install -y python3 // python3のインストール -yで聞かれる選択肢を全てyesで返してくれます ・・・ # python3 -V Python 3.8.5 #これでpythonがインストールされました。
試しに計算してみようと思います。# python3 Python 3.8.5 (default, Jul 28 2020, 12:59:40) [GCC 9.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> 1+1 2 >>> 2*2 4 >>> 4-2 2 >>> 2/2 1.0 >>> #次にpythonのパッケージを管理するpipをインストールする。
# apt-get install -y python3-pip ・・・ # pip3 -V pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8) #djangoをインストールする
# pip3 install django以上でインストールができました。
2. プロジェクトを作成してみる
1. プロジェクトを作成する
開発したいディレクトリに遷移します。
今回だとdjangoフォルダとマウントした/root配下に作成する。# cd root # mkdir projects # cd projects # mkdir myproject # cd myproject # pwd /root/projects/myproject # django-admin.py startproject myproject # ls myprojectそれでは作成されたmyprojectの中身を見てみます。
2. プロジェクトの中身を見る
# tree myproject myproject |-- manage.py `-- myproject |-- __init__.py |-- asgi.py |-- settings.py |-- urls.py `-- wsgi.py 1 directory, 6 files #manage.py
プロジェクトを操作するためのファイルです。
特に触る必要はありません。myproject
これはプロジェクトのディレクトリです。
init.py
myprojectディレクトリをPythonモジュールとして扱うようにpythonに指示する空ファイルです。
asgi.py
非同期Webサーバーおよびアプリケーションの新しいPython標準であるASGIとしてプロジェクトを実行するためのファイルです。
settings.py
プロジェクトの設定と構成を示し、初期のデフォルト設定が含まれています。
urls.py
ルーティングを行うファイルです。
wsgi.py
プロジェクトをWSGIとして実行するためのファイルです。
3. プロジェクトを動かしてみる
まずはマイグレーションを行います。
# cd myproject # ls manage.py myproject # python3 manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying admin.0003_logentry_add_action_flag_choices... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying auth.0010_alter_group_name_max_length... OK Applying auth.0011_update_proxy_permissions... OK Applying auth.0012_alter_user_first_name_max_length... OK Applying sessions.0001_initial... OK #マイグレーションを行うと下記の様にいくつかフォルダが作成されます。(pycacheはキャッシュ)
# tree myproject myproject |-- db.sqlite3 |-- manage.py `-- myproject |-- __init__.py |-- __pycache__ | |-- __init__.cpython-38.pyc | |-- settings.cpython-38.pyc | `-- urls.cpython-38.pyc |-- asgi.py |-- settings.py |-- urls.py `-- wsgi.py 2 directories, 10 files #db.sqlite3
djangoではデフォルトでDBがsqliteに設定されています。
マイグレーションを行う事でsqliteの設定が行われます。4.サーバーを起動してみる
いよいよサーバーが起動できるようになったので起動してみます。
# pwd /root/projects/myproject/myproject # ls db.sqlite3 manage.py myproject # python3 manage.py runserver Watching for file changes with StatReloader Performing system checks... System check identified no issues (0 silenced). November 26, 2020 - 16:25:28 Django version 3.1.3, using settings 'myproject.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.3.最後に
http://127.0.0.1:8000/
に遷移してみて以下の画像の様にdjangoのwelcome画面が表示されれば正しくdjangoを設定することができています!
お疲れ様でした!
今後も連載していこうと思います。
- 投稿日:2020-11-27T00:05:47+09:00
Dockerと戯れる(第一幕/dockerでsambaを構築する)
はじめに
背景として、サーバPCを入手したため、サーバ化したくなった。ただ、WordPressとか作成して遊びたいので、Dockerで作りたい。(OSはクリーンのままにしたい。)
余談
本当はWindowsPC上にDocker for Windows経由でsambaサーバを作成したかった。が…どうやらポート445がWindowsのSMBポートに割り当てられており、競合してしまうため使用できかったorz
下記URLを参照。
https://aquasoftware.net/blog/?p=1259
(ちなみに、URLのServerサービスを停止すると、Docker for Windowsも止まるっぽい。。)純正Linux最高ということで、128GBの少ない容量にUbuntu20.04をぶち込んだ。
ということで、方針を変えて、「せめてDocker学習のために、UNIXベースのOSをコンテナ化して、Dockerfileを記載し、0からsambaサーバをくみ上げてみよう」という方針を掲げたというオチになったとさ。
環境
- Ubuntu20.04にDockerをinstallして使用
調理材料
まず全体のファイル構成から。
. ├── build │ ├── Dockerfile │ ├── smb.conf │ ├── start.sh │ ├── supervisord.conf │ ├── user.list │ └── user_add.sh └── docker-compose.yml役割を順に説明すると、
- Dockerfileとdocker-compose.yml…言わずもがなDockerのビルド素材と周辺設定のファイル。
- smb.conf…sambaのコンフィグ
- start.sh…CMDまたはENTRYPOINTで指定するコマンド(と思ったが使用していないので本稿では記載しない。)
- user.list…sambaにアクセスするユーザリスト
- user_add.sh…user.listを吸い上げて、linuxのユーザ追加とsambaのユーザ追加をするシェル。
- supervisord.conf…supervisorのコンフィグ
ここからは、各ファイルのソースを張り付ける。
docker-compose.ymlversion : '3' services: samba: build: context: . dockerfile: ./build/Dockerfile image: alpine_samba container_name: samba ports: - "139:139" - "445:445" volumes: - "<マウントするドライブ>:/media/share/" restart: always tty: trueDockerfileFROM alpine:latest # ルートユーザ指定 USER root # ポート解放 EXPOSE 139 EXPOSE 445 # パッケージ管理アップデート RUN apk update # samba、システム管理ソフト(openrc)のinstall RUN apk add --no-cache samba RUN apk add --no-cache supervisor # RUN apk add --no-cache openrc # openrcの初期設定 # RUN sed -i 's/#rc_sys=""/rc_sys="lxc"/g' /etc/rc.conf # RUN echo 'rc_provide="loopback net"' >> /etc/rc.conf # RUN sed -i 's/^#\(rc_logger="YES"\)$/\1/' /etc/rc.conf # RUN sed -i '/tty/d' /etc/inittab # RUN sed -i 's/hostname $opts/# hostname $opts/g' /etc/init.d/hostname # RUN sed -i 's/mount -t tmpfs/# mount -t tmpfs/g' /lib/rc/sh/init.sh # RUN sed -i 's/cgroup_add_service /# cgroup_add_service /g' /lib/rc/sh/openrc-run.sh # RUN mkdir /run/openrc # RUN touch /run/openrc/softlevel # RUN rc-status # sambaを起動時に自動起動するようにする # RUN rc-update add samba # RUN rc-service samba start # supervisor初期設定 COPY ./build/supervisord.conf /etc/supervisord.conf # sambaコンフィグコピー COPY ./build/smb.conf /etc/samba/smb.conf # ユーザ登録用シェル + ユーザリストコピー RUN mkdir /org COPY ./build/user.list /org/user.list COPY ./build/user_add.sh /org/user_add.sh # シェルの権限変更 RUN chmod 777 /org/user_add.sh # リスト登録シェル実行 WORKDIR /org RUN ./user_add.sh # ワーキングディレクトリをrootへ WORKDIR / # シェル起動 # CMD ["/bin/sh" , "-c" , "while :; do sleep 10; done"] ENTRYPOINT ["/usr/bin/supervisord" , "-c" , "/etc/supervisord.conf"]supervisord.conf[unix_http_server] file=/dev/shm/supervisor.sock [supervisord] logfile=/tmp/supervisord.log logfile_maxbytes=50MB logfile_backups=10 loglevel=info pidfile=/tmp/supervisord.pid nodaemon=true minfds=1024 minprocs=200 [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl=unix:///dev/shm/supervisor.sock [program:smbd] command=smbd --foreground --no-process-group --log-stdout --configfile /etc/samba/smb.conf stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 [program:nmbd] command=nmbd --foreground --no-process-group --log-stdout --configfile /etc/samba/smb.conf stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0smb.conf#======================= Global Settings ===================================== [global] # workgroup(Setting group name) workgroup = WORKGROUP # servername(Free typing) server string = Samba Server # server role("AUTO" is stable) server role = AUTO # Allow IP address ; hosts allow = 192.168.1. 192.168.2. 127. # Uncomment this if you want a guest account, you must add this to /etc/passwd # otherwise the user "nobody" is used ; guest account = pcguest # Save log file log file = /log/samba_log.%m # Put a capping on the size of the log files (in Kb). max log size = 50 # DNS Proxy - tells Samba whether or not to try to resolve NetBIOS names # via DNS nslookups. The default is NO. dns proxy = no # security(default:user) security = user #============================ Share Definitions ============================== [homes] comment = Home Directories browseable = no writable = yes # NOTE: If you have a BSD-style print system there is no need to # specifically define each individual printer [printers] comment = All Printers path = /usr/spool/samba browseable = no # Set public = yes to allow user 'guest account' to print guest ok = no writable = no printable = yes # A publicly accessible directory, but read only, except for people in # the "staff" group [share] comment = share directory path = /media/share writable = no read only = nouser.list<ID> <PASS>user_add.sh#!/bin/sh while read line do #echo $line #リストを1行ずつ読み込んでIDとパスワードを変数に格納 usrname=`echo $line | awk '{print $1}'` passwd=`echo $line | awk '{print $2}'` #既存のユーザでないか確認するための1行 pdbedit -L -w | egrep "^""$usrname"":" >> /dev/null #既存ユーザの場合は登録処理をスキップ、未登録の場合はワンライナーで登録 if [ $? == 0 ] ; then echo "$usrname is already registered." else echo "Set $usrname registration and password" adduser --disabled-password --gecos "" "$usrname" echo "${usrname}:${passwd}" | chpasswd echo -e "$passwd\n$passwd" | pdbedit -a -t -u $usrname fi done < ./user.list # 変数初期化 usrname=0 passwd=0 # リスト消去 rm ./user.list echo "Delete the contents of the file!!!"※https://qiita.com/goriggg/items/513721a53de6e331eda9 を参考にして利用しています。
一応全行程終わったらlistは削除しています。セキュリティ的にも残したくない。これらのファイル構成を行ったら、
docker-compose build docker-compose -d upで、立ち上がっちゃう。素敵。
詳細説明
これは後程。
終わりに
- supervisorはかゆいところに手が届く。
- WinのDockerは使用しないと決めました。
Next...
VPNサーバを立ててみよう
参考資料
https://blog.adachin.me/archives/4177
https://aquasoftware.net/blog/?p=1259
https://qiita.com/nukokoi/items/4f60124e30080d91d846