[docker] docker-composeとapache

$ pwd
/home/vagrant/dev/docker/basic

$ sudo docker run –rm -v /home/vagrant/dev/docker/basic/:/tmp/ -it httpd /bin/bash
$ cp /usr/local/apache2/conf/httpd.conf /tmp/

httpd.conf

    # CustomLog "logs/access_log" combined
    CustomLog "logs/access_log" combined
</IfModule>

$ echo “Hello World!” > index.html

docker-compose.yml

version: "2"
services:
  web-container:
    image: httpd
    volumes:
      - ./index.html:/usr/local/apache2/htdocs/index.html
      - ./httpd.conf:/usr/local/apache2/conf/httpd.conf
    ports:
      - 8080:80
    expose:
      - 80

バックグラウンドで指定する場合は -d をつける
$ sudo docker-compose up -d
http://192.168.56.10:8080/

$ sudo docker-compose exec web-container /bin/bash
# more /usr/local/apache2/logs/access_log
$ sudo docker-compose stop
$ sudo docker-compose rm

docker-comoseの停止や削除はdocker-compose.ymlで指示している
docker-composeでdockerfileで起動する場合は image: httpd としていたところを build: ./rproxy などとする

なるほど、buildとimageのところやdocker-compose.ymlが何を見ているかなどが明確になった。

[docker] docker-composeを始める

version: "2"
services:
  ub-test:
    image: ubuntu

$ sudo docker-compose up
$ sudo docker compose logs
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7d08f238d9f1 ubuntu “bash” About a minute ago Exited (0) About a minute ago basic_ub-test_1

version: "2"
services:
  ub-test:
    image: ubuntu
    tty: true
    stdin_open: true

    command: /bin/bash

$ sudo docker-compose run ub-test
root@dfbf7a227bd6:/# exit

[Docker] MySQLのコンテナ構築

$ sudo docker network create mysql-nw

データボリュームコンテナを作成する
データディレクトリは/var/lib/mysql/ とする
$ sudo docker run -v db-volume:/var/lib/mysql/ –name=db-container busybox

mysql/Dockerfile

FROM mysql:8

ENV MYSQL_ROOT_PASSWORD=dbpass01

CMD ["mysqld", \
"--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci",\
"--default-authentication-plugin=mysql_native_password"]

$ sudo docker build -t mysql-image .
※DockerfileのポートはEXPOSEで3306

$ sudo docker run –volumes-from=db-container –name=mysql-container –net=mysql-nw -d mysql-image
$ sudo docker exec -it mysql-container /bin/bash
root@ae32b7c17975:/# mysql -uroot -pdbpass01
mysql> status
————–
mysql Ver 8.0.28 for Linux on x86_64 (MySQL Community Server – GPL)

$ sudo docker run –rm –volumes-from db-container -it ubuntu /bin/bash
root@6a77206db029:/# ls -l /var/lib/mysql/

Dockerfile

#phpmyadminのイメージ取得
FROM phpmyadmin/phpmyadmin

ENV PMA_HOST=mysql-container \
	PMA_USER=root \
	PMA_PASSWORD=dbpass01

$ sudo docker build -t pma-image .
$ sudo docker run –net=mysql-nw –name=pma-container -p 8080:80 -d pma-image

[Docker] nginxをリバースプロキシにしたApache

中継役としてリバースプロキシが間に立ってリクエストを受け、Webサーバにデータを取りに行く仕組み
Webサーバに接続できるのがリバースプロキシに限定できることから、セキュリティ上の理由でよく使われる
nginxは大量アクセスを処理するのに強みがある
nginxはhtmlなど軽量なリクエストの処理に対応させ、PHPやデータベース処理などはApacheにリクエストを回して処理をする

$ sudo docker pull nginx
$ sudo docker run –rm -p 8080:80 -d nginx
$ sudo docker stop sad_edison

### nginxをリバースプロキシとしたApacheを作る
ホストOS側でポートを利用できるのは1つのポートにつき1つのコンテナのみ
nginxにホストOSの80番ポートを割り当てる

$ tree
.
├── rproxy
│   ├── Dockerfile
│   └── default.conf
└── web
├── Dockerfile
└── index.html

nginxには幾つかconfファイルがある
nginxのプロキシ部分のconfファイルは /etc/nginx/conf.d/default.conf

$ sudo docker run –rm -v /home/vagrant/dev/docker/basic/rproxy:/tmp -it nginx /bin/bash
$ cp /etc/nginx/conf.d/default.conf /tmp/
$ ls rproxy/
Dockerfile default.conf

rproxy/default.conf

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        proxy_pass http://web-container/;
    }

$ sudo docker build -t rproxy-image .

### httpdのDockerfile作成
$ echo “hello world” > index.html

Dockerfile

FROM httpd

COPY ./index.html /usr/local/apache2/htdocs/

EXPOSE 80

$ sudo docker build -t web-image .

### Docker上でnetworkを作成する
$ sudo docker network create web-network
$ sudo docker run –name=rproxy-container –net=web-network -p 8080:80 -d rproxy-image

なるほどー

[Docker] apache-logをvolumeに吐き出すコンテナ

dockerfile, httpd.conf, index.htmlを作る
httpd: apache
busybox: apache-log
volume: apache-volume

httpd.confは /usr/local/apache2/confにある

### httpd.confを取り出す
$ sudo docker run –rm -v /home/vagrant/dev/docker/basic/:/tmp/ -it httpd /bin/bash

httpd.confを編集します
L 先頭のコメント記号である「#」を削除して保存

    CustomLog "logs/access_log" combined

Dockerfile

FROM httpd

COPY ./index.html /usr/local/apache2/htdocs/

COPY ./httpd.conf /usr/local/apache2/conf/httpd.conf

EXPOSE 80

$ sudo docker build -t apache-image .
$ sudo docker run -v apachelog-volume:/usr/local/apache2/logs –name=apachelog-container busybox
$ sudo docker run –volumes-from apachelog-container -p 8080:80 -d –name=apache-container apache-image
$ sudo docker run –rm –volumes-from apachelog-container -it ubuntu /bin/bash
root@09bd68cd89e8:/# cd /usr/local/apache2/logs
root@09bd68cd89e8:/usr/local/apache2/logs# tail access_log

なるほど、httpd.confを編集できることはわかってたけど、複数のコンテナをvolumeで連携することなども出来るのか
結構面白い

[Docker] dockerを活用する

FROM ubuntu

RUN apt-get update && apt-get install -y iputils-ping

$ sudo docker build -t ping-image .
$ sudo docker run -it ping-image /bin/bash
root@14dd91924193:/# ping localhost

FROM ubuntu

RUN apt-get update && apt-get install -y iputils-ping

### Shell形式とExec形式
Shell(/bin/sh): RUN apt-get update
Exec形式: RUN [“/bin/sh”, “-c”, ” apt-get update”]

LABEL

LABEL imageversion=1.0 maintainer=sho\ asai

EXPOSE 80
ENV KEY VALUE

ENV WORDPRESS_DB_HOST=mysql-container \
WORDPRESS_DB_USER=root \
WORDPRESS_DB_PASSWORD=dbpass01

COPY & ADD

COPY "httpd.conf /usr/local/apache2/conf/httpd.conf"
COPY ["httpd.conf", "/usr/local/apache2/conf/httpd.conf"]

docker build -t ${imageName} . –no-cache=true
-> キャッシュを使わない
COPY/ADD命令以降はキャッシュを使わずに新kイメージが再作成される

[docker] 基本を学習する

$ sudo docker pull httpd

docker engineがアクセスを受けたポート番号をもとに、受信対象のコンテナが待ち受けているポート番号に通信を送る
$ sudo docker run -p 8080:80 -d httpd

nginxのリバースプロキシを使って外部からのアクセスをnginxが一次受けし、対応するapacheに振り分ける方法がよく使われる
$ sudo docker run -v /home/vagrant/dev/docker/basic/webcontents/:/usr/local/apache2/htdocs/ -p 8080:80 -d httpd

### データボリュームを操作
$ sudo docker volume create –name=datavolume
$ sudo docker volume ls
$ sudo docker run -it -v datavolume:/tmp/ ubuntu /bin/bash
root@e428992c764c:/# touch /tmp/data.txt
$ sudo docker rm e428992c764c
$ sudo docker run -it -v datavolume:/tmp/ ubuntu /bin/bash
root@8f091764ad1d:/# ls /tmp/
data.txt

### データボリュームコンテナ
$ sudo docker volume create –name=datavolume
$ sudo docker run –name=data-container -v datavolue:/tmp ubuntu
$ sudo docker run –volumes-from data-container -it ubuntu /bin/bash

なるほど、コンテナをボリュームとしてattachする方法があるのか
とはいえ、頭の中はCI/CDのところで一杯だが…

[docker] container基礎

$ sudo docker run -it –name=ping_in_ubuntu ubuntu /bin/bash
# ping localhost
bash: ping: command not found
# apt update
# apt install iputils-ping
# ping localhost
PING localhost (127.0.0.1) 56(84) bytes of data.

インストールした後は削除してコンテナサイズを小さくする
# apt clean
# rm -rf /var/lib/apt/lists/*

### アタッチとデタッチ
アタッチはコンテナを前面で動かし、デタッチはバックグラウンドで動かす
ctl + p, clt + q でデタッチすることができる
$ sudo docker attach 22b3765372ae

### コンテナをイメージ化
$ sudo docker commit 22b3765372ae ping_in_ubuntu
$ sudo docker images;
$ sudo docker tag ping_in_ubuntu:latest ping_in_ubuntu:Ver.1.00

### docker saveとdocker export
docker saveはベースイメージと各レイヤー情報をそのままtarファイルとして保存
docker exportは差分のレイヤー情報は持たずに最終的なコンテナの内部構成をtarファイルにする

LAMP環境を構築してexportしてレイヤーを作るなどはよくある
$ sudo docker save ping_in_ubuntu:latest > ping_save.tar
$ sudo docker export 22b3765372ae > ping_export.tar
$ sudo docker rmi ping_in_ubuntu:latest ping_in_ubuntu:Ver.1.00
$ sudo docker load < ping_save.tar $ sudo docker import ping_export.tar なるほど、やればやるほど周辺知識は付いてくるな

Kubernetesとは

k8sはコンテナのオーケストレーションツール
複数の物理マシンに複数のコンテナがあることが前提
1台1台の物理マシンの中に複数のコンテナがある
定義ファイル(マニュフェストファイル)を作成すれば、コンテナを作成管理してくる
 L etcd(データベース)に書き込まれる
docker-composeは作って終わりだが、k8sはその状態を維持する。監視も行う

### マスターノードとワーカーノード
クラスターは定義ファイルに基づいて自立して動く
k8sは仮想ネットワークドライバであるCNIをインストールする必要がある
マスターノードではコントロールプレーンでワーカーノードを管理

### 用語
Pod: コンテナとボリュームがセットになったもの
Service: Podをまとめて管理する
ReplicaSet: Podの数を管理

### 定義ファイル

apiVersion: v1
kind: Pod
metadata:
  name: apa000pod
  labels:
    app: apa000kube
spec:
  containers:
    - name: apa000ex91
      image: httpd
      ports:
        - containerPort: 80

apa000dep.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: apa000dep
spec:
  selector:
    matchLabels:
      app: apa000kube
  replicas: 3
  template:
    metadata:
      labels:
        app: apa000kube
    spec:
      containers:
      - name: apa000ex91
        image: httpd
        ports:
        - containerPort: 80

service

apiVersion: v1
kind: Service
metadata:
  name: apa000ser
spec:
  type: NodePort
  ports:
  - port: 8099
    targetPort: 80
    protocol: TCP
    nodePort: 30080
  selector:
    app: apa000kube

### kubernetsコマンド
$ kubectl ${command} ${option}
create, edit, delete, get, set, apply, describe, diff, expose, scale, autoscale, rollout, exec, run, attach, cp, logs, cluster-info, top

$ kubectl apply -f *.yml
$ kubectl get pods
$ kubectl apply -f *.yml
$ kubectl get services

OK、さー仕事するぞー

[Docker] docker-compose基礎

コンテナ、ネットワーク、ボリュームなどのコマンドをまとめて定義ファイルを書く 、イメージはdockerfile
docker-compose up: 定義ファイルに書かれた内容に従ってイメージをダウンロードしたり、コンテナを作成起動したりする
docker-compose down: コンテナとネットワークを停止・削除、停止のみの場合はstopコマンド

version: "3"

services:
  apa000ex2:
    image: httpd
    ports:
      - 8080:80
    restart: always
version: "3"

services:
  wordpress000ex12:
    depends_on:
      - mysql000ex11
    image: wordpress
    networks:
      - wordpress000net1
    ports:
      - 8085:80
    restart: always
    environment:
      WORDPRESS_DB_HOST=mysql000ex11
      WORDPRESS_DB_NAME=wordpress000db
      WORDPRESS_DB_USER=wordpress000kun
      WORDPRESS_DB_PASSWORD=wkunpass

services, networks, volumesについて定義する
servicesはコンテナのこと
restartはコンテナが停止した時の再試行ポリシー、no, always, on-failure, unless-stoppedがある
depend_onは作る順番、連動して作成したか

version: "3"

services:
  mysql000ex11:
    image: mysql:5.7
    networks:
      - wordpress000net1
    volumes:
      - mysql000vol11:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: myrootpass
      MYSQL_DATABASE: wordpress000db
      MYSQL_USER: wordpress000kun
      MYSQL_PASSWORD: wkunpass
  wordpress000e12:
    depends_on:
      - mysql000ex11
    image: wordpress
    networks:
      - wordpress000net1
    volumes:
      - wordpress000vol12:/var/www/html
    ports:
      - 8085:80
    restart: always
    environment:
      WORDPRESS_DB_HOST: mysql000ex11
      WORDPRESS_DB_NAME: mysql000db
      WORDPRESS_DB_USER: mysql000kun
      WORDPRESS_DB_PASSWORD: wkunpass
networks:
  wordpress000net1:
volumes:
  mysql000vol11:
  wordpress000vol12:

ふむふむ やりながら慣れるしかないな