はじめに
友人に「やっぱ時代はフロントエンドだよな」とぼやいたら、
「うちのサーバーのCentOS6とかいう化石をちょうどなんかしようかなと思ってたところだからUbuntuにしてSSH接続で好きに使っていいよ」
とありがたいお言葉を頂戴しましたのでイチからサーバーを再構築しています。
環境的にはVPSなど外部のサーバーに対して作業を行ってると思っていただけたら良いです。
追記:
「やってることフロントじゃなくない?」
はいすいません、まずは開発環境の構築かなって… 土台が肝心かなって…
そしてフロントエンドいうからには色々新しいことやるかと思い、
「Ubuntu+Docker+SSL+リバースプロキシ+WordPress」
といった環境を作りました。
半ば無理やりDockerを使おうとしている節もあるので「この構成まずいよ」という指摘があればぜひ教えて下さい。
(私はフロントの知識ゼロです。バックの知識も大してないです。)
参考記事
5年前の記事になりますが、@y_hokkey さんの記事が大変参考になりました。ありがとうございます。
Vagrant・CoreOS・Dockerでインフラ素人が自宅サーバを立てた話 - Qiita
対象とする読者
前提として以下の方を対象としています。
- 基本的なLinuxの操作を知っている
-
仮想化・コンテナ技術とは何かを一応知っている
私もここ1週間くらいで情報収集したので、それくらいの方 -
まだDockerを触ったことのない方
知っている人からは話が長いかもしれませんご了承ください -
本番環境(サーバー)で構築したい方
「ローカル環境で開発してデプロイ」とは違う運用をしています
記事一覧
かなり長くなると想定し、各作業別に記事を分けて投稿する予定です。
他の記事も投稿次第リンク化します。
- (0) UbuntuにSSH接続環境構築 (すいませんここは各自で)
- ▶ (1) Dockerとは + Dockerインストール 🐳<今ココ
- (2) Dockerで"WordPress+Apache+PHP" + "MySQL"を立ち上げる
- (3) Dockerでリバースプロキシ(nginx)構築+SSL対応
環境
- 自宅サーバー
- OS: Ubuntu 20.04.2 LTS
- Docker
- verison: 20.10.5, build 55c4c88
- Docker Compose
- version: 1.28.5, build c4eb3a1
- ファイルフォーマット: 3.9
本題
長いと思った方はDockerのインストールまで飛ばしてください。
まずDockerとは
Dockerの流れ
基本的なDockerの流れが上の図です。
Dockerfileをbuild
し、Docker Imageが作成されます。
Docker Imageをrun
し、Dockerコンテナが立ち上がります。
Dockerfileは図のようにFROM ***
と他のDockerfileを継承して作られています。
WordPressのDockerfileなら php:apache
を、
PHPのDockerfileはdebian
を・・・
最後はscratch
に行き着きますが、これがDockerfileの基本となります。
しかし個人開発の実態としては次の図のとおりでしょう。
Docker Hubに既にビルドされたイメージが配布されているので、使いたいイメージをローカル環境にpull
し、それら複数のイメージをdocker-compose
で立ち上げます。
Docker Hubには基となっているDockefileがGitHub上で公開されています。これを個人でカスタマイズでbuild
して利用することも可能です。
run
コマンドではなく、Docker Composeを利用するメリットは複数のコンテナを簡単に管理できることです。
一つ一つdocker run
で立ち上げることも可能ですが、実際には
docker run -it --rm mysql mysql -hsome.mysql.host -usome-mysql-user -p
といった長いコマンドを複数打たなければいけません。これは現実的ではないのでDocker Composeといったツールが必要になってきます。また様々な設定も可能です。
この様なツールを 「コンテナオーケストレーションツール」 といいます。
Docker ComposeはDockerが公式で用意している簡易的なツールですが、
現在はGoogleが開発した「Kubernetes(クーベネティス)」を代表に様々なツールが開発されています。
個人利用ではDocker Composeで十分といったところでしょうか。
ローカル環境でDockerを使って開発した人はそれをイメージ化しデプロイとなります。(あってる?)
Dockerの構成図
上記がスタンダードな構成になるかと思います。
- ホスト - 今回のUbuntuサーバーです。
- Docker Engine - この中でコンテナを動かします。
- Docker Compose - 複数のコンテナを管理してくれるものです。
- Docker Hub - イメージリポジトリです。(ユーザーが投稿したものもあります)
そして次に示すのが、本記事の完成図です。
概念は伝わりましたでしょうか。まだ掴めてないかもしれませんが、次のWordPressを立ち上げる記事でもう少し詳しく説明する予定ですので、実際に動かしてみてわかるかと思います。
次におおまかなディレクトリ構成を下記に示します。
コンテナは終了してもう一度開始するとデータが初期化されます。そのため**「データの永続化」**が必要となります。
永続化させることによって、次回起動時もそのファイル群がコンテナ内にマウントされます。
なんとなくイメージは掴んでいただけたでしょうか。
Dockerに関する用語の説明
他にも用語はたくさんありますが、@rawHamさんが「冷凍チャーハン」を例にわかりやすく解説されていますので紹介します。
Dockerについてなるべくわかりやすく説明する - Qiita
また個人的に疑問となったところも紹介します。
-
イメージとコンテナの違い
初心者向け!docker image(イメージ)とは?コンテナとの違いは何?
Dockerのイメージとコンテナの違い | CodeCampus -
"Docker"と"Docker-CE"の違い
DockerとDocker-CEの違いについて - Qiita
Dockerを導入するメリット
ここまでDockerの説明をしましたが、開発環境で導入するメリットは最小単位でコンテナの中で開発できそれを簡単にAWS等にデプロイできるという点です。
では個人の自宅サーバーでDockerを導入するメリットは何でしょうか。
正直ブログともう1個のサービスしかない程度のサーバーでは大したメリットはないように感じます。
「他環境に移行が容易になりそうなこと」「割とトレンド技術であるDockerを学べる」「バックアップが簡単そう」ぐらいしか思いつきません。
もしかしたら知らないうちにメリットを享受しているのかもしれません。
しかしそんなメリットより、初期導入コストが高いように感じます。
まずDockerについて学習しなければならないのと、最初はやたら設定することが多いですし恐らくつまづきます。1回設定したら後はメンテナンス・保守するだけなのでそこは簡単そうですが…。(素人意見です。)
コメントでもいいので自宅鯖でのメリットを誰か教えて下さい😊
(参考)
- Dockerが日本で流行らない理由、あるいは本番環境へ導入されない理由:「企業のためのDocker実践ガイド」セミナーレポート - @IT
- 自宅サーバーでこそDockerは活躍する | Cosnomi Blog
- Docker - "おうちDocker"のベストプラクティスを教えてください|teratail
- 「個人開発でDockerいらないじゃん」が大きな勘違いだった理由 – 35からのプログラミング
- 事例から考えるDockerの本番利用に必要なこと | Think IT(シンクイット)
- AWS(Amazon Web Services) - Dockerを本番環境で使用するケースについて|teratail
以上でDockerの説明を終わります。
Dockerのインストール
公式のドキュメントは英語ですが、最新は公式ドキュメントになりますのでそちらを読み進めていただいたほうがよろしいかと思います。
https://docs.docker.com/engine/install/
インストールの方法は3つあります。
- Docker公式リポジトリを追加してそこからインストール
- 手動でDEBパッケージをダウンロードしてインストール
- スクリプトを利用してインストール
今回は公式リポジトリからのインストールで進めます。
また、使用しているOSやディストリビューションでも異なりますので、自分にあったドキュメントをお読みください。
以下はUbuntu環境での説明になります。
必要なパッケージのインストール
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
-
apt-transport-https
: aptコマンドをHTTPS対応させる -
ca-certificates
: SSL接続に必要 -
curl
: URLからファイルを転送するコマンド -
gnupg
: 「Gnu Privacy Guard (GPG)」。公開鍵認証で使う。署名等に使うツール。 -
lsb-release
: "lsb = Linux Standard Base" Linuxのバージョン等を表示してくれるツール。
上記パッケージがなければインストール、あればアップデートをします。
リポジトリ追加
DockerのGPG鍵を入手します。
GPGとは・・・リポジトリの正当性を確かめる手段・技術
(参考)GNU Privacy Guard - Wikipedia
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
次にリポジトリを追加します。
⚠ x86_64 / amd64版です。他のアーキテクチャを利用している方は公式ドキュメントをお読みください。
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
パッケージインストール
最後に各種Docker関連パッケージをインストールします。
※Docker Composeは含まれておりません。
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
Hello World
sudo docker run hello-world
$ sudo docker run hello-world
[sudo] user のパスワード:
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
hello world 実行できたらOKです。
Q. Hello Worldイメージはどこからきたの?
A. インストール時に自動的にDocker Hubからダウンロードされています。
Docker Composeインストール
続いてDocker Composeのインストールです。
docker用のユーザの追加
dockerをsudoなしでroot権限で利用するために以下の作業をします。必須ではないようですが、作業が簡単になります。
※root権限なし版(ルートレス)のDockerもあります。
(公式)Post-installation steps for Linux | Docker Documentation
既にある作業用ユーザを流用してもいいですが、Docker用のユーザーを作っても構いません。
まず、dockerグループを作ります。
sudo groupadd docker
次にユーザーをdockerグループに追加します。
<USER>
は各人のユーザー名を入れてください。
sudo usermod -aG docker <USER>
sudoなしでdockerを実行できることを確認します。(ユーザーは切り替えてください)
docker run hello-world
実行できればOKです。
Docker Composeのダウンロード
公式ドキュメント↓
Install Docker Compose | Docker Documentation
Docker Compose本体をダウンロードします。
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
実行権限をつけます。
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
を実行してバージョンが出ればOKです。
$ docker-compose --version
docker-compose version 1.28.5, build c4eb3a1f
おわり
次回はWordPress等を立ち上げます。
来週あたりに書きます。
3/27 書きました↓
自宅鯖のDocker内でWordPressを構築する - Qiita