20201127のdockerに関する記事は12件です。

第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)を使用します。

目標・やりたいこと

  1. AWSでEC2インスタンス(後述)3つを立てて、その中でDockerを使用して、Nginx(Webサーバ)puma(APサーバ)MySQL(DBサーバ)それぞれの本番環境を構築する。
  2. また、GithubCircleCICapistranoを利用して、AWSのEC2に自動でテスト&デプロイしてくれる(所謂、『CI/CDパイプラインの構築』)よう設定する。

Dockerとは?

 終わる前にDockerについて一言。
 
 近年流行っている仮想化技術の一つ。
 コンテナを作成し、その中で、ローカルの環境とは別の、独立した環境で開発等々を行う技術。

↓参考になったサイト・記事

Dockerとは何か、何が良いのか
Docker超入門①〜Dockerってなに?〜【初心者向け】

⬇️このツール群で唯一参考にしたudemyの講座。すごく助かりました。
米国AI開発者がゼロから教えるDocker講座

最後に、筆者について

 とあるSI系の会社でインターンとして働いており、これまではふんわりと『普通にどこかの企業に就職するかな〜っ』て考えていました。
 ですが、休学を機に、自分は何をやりたいか?と考えた結果、IT系に進もうと決心しました。
 そして、『このままではダメだ!基礎から勉強しよう!』と思い、基礎情報処理応用情報処理ネットワーク周りを勉強し始めました(ちょっとネットワーク周りは勉強しすぎた感ありますが)。
 一通り、基礎固めが終了し、言語の習得もそこそこにして(元々インターンで培っているので、他の人よりはプログラミング言語の習得は早いと思います)、次はインフラ周りの勉強するぞ!という段階です。
 まだ本腰入れて勉強し始めて3ヶ月ほどなので、間違ったことを書いていれば、コメントで指摘していただければ有難い限りです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DebianにDockerをインストールする

目的

DebianにDockerをインストールする。インターネッツに色々やり方あったけど、結局公式がうまくいったので備忘として残しておきます。

必要なパッケージを追加

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

gpgキーを追加

取得

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_BIT

Dockerのインストール

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose

※どうせ使うのでdocker-composeもいれます。

インストール確認

sudo docker run hello-world

dockerの自動起動と再起動

sudo systemctl enable docker
sudo systemctl restart docker

参考手順

https://docs.docker.com/engine/install/debian/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerで始めるDjango生活(2日目)

初めに

2日目です。
1日目はこちら
今回はdjangoの設定などを見ながら日本語化してアプリケーションを作成するのがゴールになります。

目次

  1. 前回の復習
  2. settings.pyについて
  3. アプリについて
    1. アプリを作成する
    2. アプリの中身について
  4. 最後に

1. 前回の復習

まずはコンテナを起動しましょう!

# docker exec -it c9b27b34be02 /bin/sh

開発ディレクトリに遷移します。

# cd /root/projects/myproject/myproject

サーバーを起動します。

# python3 manage.py runserver

http://127.0.0.1:8000/
に遷移して以下の画面が出れば大丈夫です!
image.png

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の起動画面が日本語化されたと思います。image.png

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. 最後に

今回はファイルやファイルの中身についての紹介がメインになりました。
次回は実際にモデルを作成していこうと思います。
お疲れ様でした!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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サーバー構築

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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コンテナの名前を入れてください
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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のこと

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker pオプションによるポートマッピングとは?

ポートマッピングとは

ポートマッピング 【 port mapping 】

ポートマッピングとは、ブロードバンドルータなどが持つ機能の一つで、グローバルIPアドレスの特定のポートを、特定のプライベートIPアドレスの特定のポートに固定的に対応付けて転送するもの。内部ネットワークの機器に外部から着信することができる。

ポートマッピングとは - IT用語辞典 e-Words

ポートフォワーディングという言葉で使われている場合もあるよう。
ポートフォワーディング - ネットワークエンジニアを目指して

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/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker でphp8とlaravel8を動かす

はじめに

php8が公開されたので触ってみたい興味でDockerでの環境を作ってみました。
公式のDocker hubにはまだrc版しかなかったので、今回はrc版で作ってます。

github

使い方

↑のgithubからソースをクローンして、ディレクトリに移動してください。
入ったディレクトリで

make set-up

を入力したら環境が出来上がると思います。
終わったらhttp://127.0.0.1:8000/ にアクセスして↓の様になっていれば完成です。
スクリーンショット 2020-11-27 10.24.49.png

詳しい説明はそのうち書くかもしれません

おわりに

今回の記事を参考にphp8をどんどん触っていけたらいいなと思います。
間違いが合ったりしたら、コメントやPRお願いします!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker サーバーの起動状態を監視するコマンド watch "docker ps"

watchコマンドを使った監視方法

2秒ごとにコマンドを入力してくれるので、フォアグラウンドでリアルタイム更新される。
使っているTerminalを画面分割して、監視用の画面を作るとやりやすい。

watch "docker ps"

# ヘッダを表示しない。よりスッキリした画面になる
watch -t "docker ps"

# 時間間隔指定
watch -n 1 "docker ps" 

【 watch 】コマンド――コマンドを一定間隔で繰り返し実行する:Linux基本コマンドTips(220) - @IT

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker サーバーの起動状態をリアルタイムで表示するコマンド watch "docker ps"

watchコマンドを使った監視方法

2秒ごとにコマンドを入力してくれるので、フォアグラウンドでリアルタイム更新される。
使っているTerminalを画面分割して、監視用の画面を作るとやりやすい。

watch "docker ps"

# ヘッダを表示しない。よりスッキリした画面になる
watch -t "docker ps"

# 時間間隔指定
watch -n 1 "docker ps" 

【 watch 】コマンド――コマンドを一定間隔で繰り返し実行する:Linux基本コマンドTips(220) - @IT

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerで始めるDjango生活(1日目)

初めに

DjangoとはPythonベースのフレームワークです。
今回はdockerを用いていきたいと思います。
OSはWindows 10を想定しています。
dockerが使えればOSは特に関係無いかと思います。

目次

  1. 環境を整える
    1. dockerのイメージをプルしてくる
    2. プルしてきたイメージを元にコンテナを作成する
    3. コンテナに入りpythonやdjangoをインストールする
  2. プロジェクトを作成してみる
    1. プロジェクトを作成する
    2. プロジェクトの中身を見る
    3. プロジェクトを動かしてみる
    4. サーバーを起動してみる
  3. 最後に

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.9MB

2. プルしてきたイメージを元にコンテナを作成する

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-ubuntu

3. コンテナに入り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を設定することができています!
image.png
お疲れ様でした!
今後も連載していこうと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.yml
version : '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: true
Dockerfile
FROM 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=0

smb.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 = no

user.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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む