5分でできる!超実践Doker入門
はじめに
この記事は駆け出し、伸び悩みエンジニア向けの記事です。
しかも超実践なので、細かい理論とかは説明しません。
(かくいう私もさして理解していないのでね)
- Dockerの理解を深めたい!
- 仕組みを知って、商用環境で使いたい!
みたいな人は、お帰りいただくほうが身のためです。
ということで、Dokerで「LAMP環境 + α」を爆速で作ってみましょう。
なお、コピペで環境作成は可能ですが、コピペして「やったー」は良くないです。
環境が作れただけで、あなたのスキルにはなりません。
その理由は、なぜコピペコードがダメなのかを読んでみてください。
前提
環境
- macOS Catalina 10.15.7
- Docker version 19.03.13, build 4484c46
- docker desktop 2.4.0.0(48506) stable
ちなみに、インストールはしておいてください。
「 docker インストール mac」とかで調べればそれくらいすぐわかるっしょ。
答え
全体像
ディレクトリ構成
.
├── ap
│ ├── Dockerfile
│ ├── httpd
│ │ ├── conf
│ │ │ └── httpd.conf
│ │ └── conf.d
│ │ └── 877-example-ap.conf
│ └── www
│ └── index.php
├── docker-compose.yml
└── lb
└── nginx.conf
各種ファイル内容
Dockerfile
個人的に入れておきたいものは入れています
単にPHP動かすだけなら、もう少し絞ってもいいかと
FROM centos:7
RUN yum install -y iproute \
net-tools \
bind-utils \
vim-enhanced \
epel-release http://rpms.famillecollet.com/enterprise/remi-release-7.rpm \
httpd \
mysql \
zip \
unzip \
&& yum install -y --enablerepo=remi-php72 \
php72 \
php72-php \
&& ln -s /usr/bin/php72 /usr/bin/php \
&& sed -i -e '/override_install_langs/s/$/,ja_JP.utf8/g' /etc/yum.conf \
&& yum update -y \
&& echo 'LANG="ja_JP.UTF-8"' > /etc/locale.conf
ENV LANG="ja_JP.UTF-8" \
LANGUAGE="ja_JP:ja"
RUN rm -f /etc/localtime \
&& ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN useradd -u 1000 -m -d /home/mr.877 mr.877 \
&& chmod 755 /home/mr.877 \
&& mkdir -p /home/mr.877/www
EXPOSE 80
CMD /usr/sbin/httpd -D FOREGROUND
LB設定
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
upstream 877-docker-example.m877778m-example.com {
server 877-docker-example-ap:80;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://877-docker-example.m877778m-example.com;
}
}
include /etc/nginx/conf.d/*.conf;
}
AP設定(apache)
httpd.conf
ほぼデフォルトなので、読み飛ばしてもOK
ServerRoot "/etc/httpd"
Listen 80
Include conf.modules.d/*.conf
User apache
Group apache
ServerAdmin root@localhost
ServerName 877-docker-sample-ap.m877778m-example.com
<Directory />
AllowOverride none
Require all denied
</Directory>
DocumentRoot "/var/www/html"
<Directory "/var/www">
AllowOverride None
Require all denied
</Directory>
<Directory "/var/www/html">
AllowOverride None
Require all denied
</Directory>
<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>
<Files ".ht*">
Require all denied
</Files>
ErrorLog "logs/error_log"
LogLevel warn
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "logs/access_log" combined
</IfModule>
<IfModule alias_module>
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
<Directory "/var/www/cgi-bin">
Require all denied
</Directory>
<IfModule mime_module>
TypesConfig /etc/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
</IfModule>
AddDefaultCharset UTF-8
<IfModule mime_magic_module>
MIMEMagicFile conf/magic
</IfModule>
EnableSendfile on
IncludeOptional conf.d/*.conf
conf.d/*.conf
Dockerfileで作成したディレクトリ(マウントするところ)にドキュメントルートを変更
<VirtualHost *:80>
ServerName 877-docker-sample-ap.m877778m-example.com
DocumentRoot /home/mr.877/www/
<Directory "/home/mr.877/www/">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
DirectoryIndex index.html index.php
<LimitExcept GET POST>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>
</VirtualHost>
docker-compose.yml
version: '3.8'
services:
#
# LB container(Nginx)
#
877-docker-example-lb:
image: nginx
container_name: 877-docker-example-lb
ports:
- "10080:80"
volumes:
- ./lb/nginx.conf:/etc/nginx/nginx.conf
depends_on:
- 877-docker-example-ap
#
# AP container(apache)
#
877-docker-example-ap:
build:
context: .
dockerfile: ./ap/Dockerfile
container_name: 877-docker-example-ap
volumes:
- ./ap/httpd/conf/httpd.conf:/etc/httpd/conf/httpd.conf
- ./ap/httpd/conf.d/877-example-ap.conf:/etc/httpd/conf.d/877-example-ap.conf
- ./ap/www:/home/mr.877/www
depends_on:
- 877-docker-example-db
#
# DataBase container(MariaDB)
#
877-docker-example-db:
image: mariadb
container_name: 877-docker-example-db
environment:
MYSQL_ROOT_PASSWORD: 877877877
ports:
- "13306:3306"
コマンド実行で、はいできました〜〜
起動(docker-compose up)
バックグラウンドでコンテナの起動を行います
問題なく起動できれば、「どん!ど !!どん!!!」ってなるはずです
$ docker-compose up -d
Creating 877-docker-example-db ... done
Creating 877-docker-example-ap ... done
Creating 877-docker-example-lb ... done
確認(docker-compose ps)
$ docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------
877-docker-example-ap /bin/sh -c /usr/sbin/httpd ... Up 80/tcp
877-docker-example-db docker-entrypoint.sh mysqld Up 0.0.0.0:13306->3306/tcp
877-docker-example-lb /docker-entrypoint.sh ngin ... Up 0.0.0.0:10080->80/tcp
めちゃくちゃ雑に解説
まずDockerって何?
説明すると長くなる(はず、知らんけど)ので、ここでは3点のみ押さえておけばとりあえずOKです。
- コンテナ技術のデファクトスタンダード
- VM(仮想マシン)とことなり、ゲストOSを必要としない
- 特定のアプリケーションを実行する環境を提供するもの
ついでと言ってはなんですが、これも覚えておきましょう。
1つのコンテナにつき、サービスは1つまで
複数サービスの起動も、やろうと思えばできると思いますが、このルールを守って環境を作っておいたほうがいいと思います。
DockerFileって何!?
イメージの定義ファイルです。
いやいやいや、それDockerHubからpullしてくればいいじゃない。
うん、そうだよ。
うん、そうだよ??
でも実際は、動作環境とぴったり合うとは限りません。
なので、自分の会社のいつもの設定みたいなのを定義しておきたいなーというときに使います。
docker-compose.ymlってなんなんだよぉぉぉぉ!!!
複数コンテナを一元管理するための設定ファイルです。
そうですか。
そうです。
システムというのは、APがあって、DBがあって、あれがあって、これがあって...
というのが普通です。
「マイクロサービス化してますから!!」と言っても、連携先は必ず存在するので、それを一元管理したほうがいいですよね。
そういうとき、docker-composeで管理できると楽です。
GithHubにアップしておきました。
m877778m/877-samples-for-blogにサンプルを転がしておきます。
(いろいろなサンプルをここに転がしていきたいが、できるんだろうか...)
最後に
TL;DR書かなかったことに感動。
ってかこういう記事では書けねぇか!!
Discussion