20200402のdockerに関する記事は7件です。

DockerでCentOS8+apache2.4+php7.4環境を作りwordpressを動かす環境を作る

現在借りているVPSサーバのスペックが低くく、過去にはGoogleさんに100点満点中2点という、あまりにひどい点を頂いたので、それを改善すべく奮闘中です。

GWにはVPSのサーバの乗り換えもしくはスケールアップを行いますが、その際、上モノ(Apahce+php)はいつでもバージョンを上げていけるよう。Dockerを使ってコンテナ化してみようと画策。

まずはタイトルに挙げた環境で環境を作ろうとしてみました。

DockerでCentOS8+apache2.4+php7.4環境を作る

Dockerfileについて

DockerFleとして用意したのは下記のとおりです。

# docker-hubからOSのイメージ引込
FROM centos:centos8.1.1911

# サーバの日付合わせ
RUN /bin/cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# epel-releaseのインストール
RUN yum install -y epel-release &&\
    yum clean all

# remiのインストール
RUN rpm -ivh http://ftp.riken.jp/Linux/remi/enterprise/remi-release-8.rpm

# yumのアップデート
RUN yum update -y &&\
    yum clean all

# 必要なモジュールのインストール(apache)
RUN yum -y install httpd &&\
    yum clean all

# 必要なモジュールのインストール(php7.4)
RUN yum -y install php74-php php74-php-mysqli php74-php-gd php74-php-mbstring php74-php-opcache php74-php-xml

# phpコマンドを作成
RUN ln /usr/bin/php74 /usr/bin/php

# wordpressインストールディレクトリの所有者をapacheユーザに変更                                              
RUN chown -R apache:apache /var/www/html

# php74−php−fpmのサービス永続化
RUN systemctl enable php74-php-fpm

# apache サーバのサービス永続化
RUN systemctl enable httpd 

# 接続用ポートの穴あけ
EXPOSE 80

Dokerfileの細かな内容についてはDockerfileの補足で説明していますのでそちらもご覧ください。

dockerイメージの作成

Dockerfileの保存ディレクトリで下記のコマンドを実行

docker build -t wordpress:0.0.1 ./

-tのあとはタグ名なので、wordpressで動かすことを考えてwordpress:0.0.1としました。けど、翌々考えたらwordpressは今回インストールしていないので、名前は変えても良さそうですね。

dockerコンテナの起動

イメージができたらコンテナを起動。

 docker run --privileged --name wordpress -p 80:80 -v [localhostのディレクトリ]:/var/www/html -itd wordpress:0.0.1 /sbin/init

ブラウザで起動確認

dockerコンテナ起動時に指定した「localhostのディレクトリ」にwordpressのモジュールを入れておくと下記のように「wordpressへようこそ」画面が出るはず。ここまでくれば、この記事のゴールです。

スクリーンショット 2020-04-02 21.19.17.png

ここまでたどり着くまでいろいろ調べまくりました。
もともとあるコンテナを使えばもっと手軽にできたと思いますが、勉強がてらDockerfileを作るところから始めたので思いの外時間がかかりましたが、勉強になりましたね。こうやって記事にすることで後で見直すこともできるので一石二鳥です。

Dockerfileの設定の補足

docker-hubからOSのイメージ引込

FROM centos:centos8.1.1191

OSコンテナの引き込みですね。latestでも良かったのですが、一旦執筆時点の最新のバージョンを指定しています。最終的にはlatestにするかもしれません。

サーバの日付合わせ

RUN /bin/cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

コンテナの時刻を日本時間に合わせるコマンドです。
ログなどを保管する際、時刻がおかしなことになっていると色々と面倒なので、必要な設定となりますね。

epel-releaseのインストール

RUN yum install -y epel-release &&\
    yum clean all

remiのインストール

RUN rpm -ivh http://ftp.riken.jp/Linux/remi/enterprise/remi-release-8.rpm

php7.4をインストールするためにremiレポジトリをインストールする必要がありますが、まずここにたどり着くまで苦労しました。
CentOS8用のrpmをインストールしないと当然動かないのですが、ネットではremi-release-7.rpmでしか記事が見つからず、適当に7→8に書き換えたらインストールできました。

remiのインストールのに結構手こずりました。

yumのアップデート

RUN yum update -y &&\
    yum clean all

yumのアップデートは必須作業なので、apache、php7.4のインストール前に実行しておきます。

必要なモジュールのインストール(apache)

RUN yum -y install httpd &&\
    yum clean all

apacheのインストールはyum経由ですので特に何も設定は必要ありませんね。

必要なモジュールのインストール(php7.4)

RUN yum -y install php74-php php74-php-mysqli php74-php-gd php74-php-mbstring php74-php-opcache php74-php-xml

phpのモジュールのインストールはphp74でもインストールされますが、動作させるにはphp74-php-xxx といったphp74とモジュールの間にーphpを入れる必要があるというところに行き着くまでにまた手こずりました。

phpコマンドを作成

RUN ln /usr/bin/php74 /usr/bin/php

php7.4を入れた後、phpとコマンドを実行しても何も反応がなく、いろいろ調べた結果、php74がphpのコマンドであることが判明。
このままだと、phpとしてコマンドが実行できないので、リンクを張ってphpでもコマンドが実行できるようにしました。

wordpressインストールディレクトリの所有者をapacheユーザに変更

RUN chown -R apache:apache /var/www/html

apacheサーバの起動ユーザに合わせてwordpress配置ディレクトリのオーナーを変更。

php74-php-fpmのサービス永続化

RUN systemctl enable php74-php-fpm

apacheをインストールしてもwordpresの画面が立ち上がらず何故かと調べていたらphp-fpmがサービスとして起動している費強があるということがわかりました。
コンテナ起動時に自動でサービスが起動するようにサービスを永続化させるようにしました。

apache サーバのサービス永続化

RUN systemctl enable httpd 

apacheもphp-fpm同様サービスとして常に起動するように設定しました。

接続用ポートの穴あけ

EXPOSE 80

http接続できるように80番のポートを開けます。https化を狙って443も開けておく必要がありますが、それはこれからGWまでの課題ですね。

今後の課題

  • https化
  • mysqlとの接続

といったところでしょうか。wordpressの画面は起動しましたがwordpressまではインストールできていないです。
なので、GWまでにはこのあたりを解決したいですね。

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

【Docker】コンテナ内のデータベース閲覧(ローカル,EC2)

はじめに

ローカル環境/本番環境(EC2)の其々でコンテナを起動させた際のデータベース閲覧方法と
環境による閲覧方法の違いがあるのか気になったので、調べてみました。

環境

  • Rails:5.0.7
  • MySQL:5.6
  • Docker:19.03.8
  • EC2(AMI):Amazon Linux AMI

ソースコード

Dockerfile
FROM ruby:2.5.1

RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - && apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/*

RUN mkdir /app

WORKDIR /app

COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock

RUN gem install bundler
RUN bundle install

COPY . /app

RUN mkdir -p tmp/sockets
docker-compose.yml
version: '2'
services:
  db:
    image: mysql:5.6
    environment:
      MYSQL_ROOT_USER: root
      MYSQL_ROOT_PASSWORD: password
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    volumes:
      - mysql-data:/var/lib/mysql
      - ./mysql/init:/docker-entrypoint-initdb.d
    ports:
      - "3306:3306"

  app:
    build:
      context: .  
    command: bundle exec puma -C config/puma.rb
    volumes:
      - .:/app
      - public-data:/app/public
      - tmp-data:/app/tmp
      - log-data:/app/log
    depends_on:
      - db
    depends_on:
      - web

  web:
    build:
      context: containers/nginx
    volumes:
      - public-data:/app/public
      - tmp-data:/app/tmp
    ports:
      - 80:80

データベース接続

ローカル、EC2共通
#起動中のコンテナ名確認
docker-compose ps
#DBコンテナに入る
docker exec -it DBコンテナNAME  bash
#mysqlへ接続(パスワードはdocker-compose.ymlに記載したもの)
mysql -u root -p
Enter password: 
EC2
#DBコンテナのPORT確認
docker ps
#確認結果(例)
0.0.0.0:3306->3306/tcp
#mysqlへ接続(パスワードはdocker-compose.ymlに記載したもの)
mysql -h 0.0.0.0 -P 3306 -u root -p
Enter password: 

データベースの中身閲覧

ターミナル
#データベース接続
mysql -u root -p
#どんなデータベースがあるか
show databases;
#使用したいデータベースに切り替え
use データベ-ス名;
#テーブル一覧
show tables;
#テーブルの構造確認
describe テーブル名複数系;
#テーブルの中身確認 
select * from テーブル名複数系;

おわりに

今回ローカルとEC2でそれぞれ起動したコンテナにどのような違いがあるのか、データベースの観点から調べてみました。間違ってる点があれば指摘していただけると幸いです。
同じポート3306で起動しているはずが、ローカルではmysql -h 0.0.0.0 -P 3306 -u root -pのコマンドが効かなかったので引き続き調査します。。

参考URL

https://qiita.com/hayabusa3703/items/9893a53c21ddc3c2403a
https://qiita.com/hot_study_man/items/4e129dacb7c3cab4b568

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

Rails_MySQL_Docker_Vue.jsの環境をシェル一発で始められるようしてみた

■ 何これ?

$ rails newする機会が久々にあって、諸々込みでもっと簡単に環境構築出来たら良いなと思ったので、@azul915さんの記事のshellを参考にちょっと改変して使えるようにしてみました。

Githubにもありますので好きなだけいじってください。

ご指摘などありましたらお気軽に。

■ 最終的なディレクトリ構成

【app_name】
  ∟ Dockerfile
  ∟ docker-compose.yml
  ∟ src
    ∟ [rails new で生成されたファイル群]

■ Special Thanks

■ 使い方

1. docker / docker-composeが入っている前提

2. 任意のディレクトリを作成

ex.
$ mkdir sample_app
$ cd sample_app

3. shellを配置して実行

   $ bash docker-rails-vue.sh

4. 起動確認して接続

   $ docker-compose ps
         Name                   Command             State                 Ports              
   ------------------------------------------------------------------------------------------
   sample_app_db_1    docker-entrypoint.sh mysqld   Up      0.0.0.0:3306->3306/tcp, 33060/tcp
   sample_app_web_1   rails s -p 3000 -b 0.0.0.0    Up      0.0.0.0:3000->3000/tcp

5. http://localhost:3000/に接続

6. 生成されたファイル群をGitにあげて開発スタートすれば良かろうもん

■docker-rails-vue.sh

#!/bin/bash

echo "----- 1. docker pull ruby:2.7.0 -----"
docker pull ruby:2.7.0

echo "-----2. docker pull mysql:5.7 -----"
docker pull mysql:5.7
docker images

echo "----- 3. create Dockerfile -----"
APP_ROOT="/`pwd | xargs basename`"
cat <<EOF > Dockerfile
FROM ruby:2.7.0
ENV LANG C.UTF-8

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
    apt-get update && \
    apt-get install -y build-essential \
    libpq-dev \
    nodejs \
    yarn \
    && rm -rf /var/lib/apt/lists/* \
    && yarn install --check-files

RUN mkdir $APP_ROOT
WORKDIR $APP_ROOT
ADD ./src/Gemfile $APP_ROOT/Gemfile
ADD ./src/Gemfile.lock $APP_ROOT/Gemfile.lock
RUN bundle install
ADD ./src/ $APP_ROOT
EOF

echo "----- 4. create Gemfile -----"
mkdir src && cd src
cat <<'EOF' > Gemfile
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '2.7.0'

gem 'rails', '~> 6.0.2', '>= 6.0.2.1'
gem 'mysql2', '>= 0.4.4', '< 0.6.0'
gem 'puma', '~> 4.1'
gem 'sass-rails', '>= 6'
gem 'webpacker', '~> 4.0'
gem 'turbolinks', '~> 5'
gem 'jbuilder', '~> 2.7'
gem 'bootsnap', '>= 1.4.2', require: false
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

group :development, :test do
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end

group :development do
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '>= 3.0.5', '< 3.2'
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

group :test do
  gem 'capybara', '>= 2.15'
  gem 'selenium-webdriver'
  gem 'webdrivers'
end
EOF
touch Gemfile.lock
cd ../

echo "----- 5. create docker-compose.yml -----"
cat <<EOF > docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.7
    volumes:
      - ./src/db/mysql_data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=password
    ports:
      - "3306:3306"
  web:
    build: .
    command: rails s -p 3000 -b '0.0.0.0'
    volumes:
      - ./src:$APP_ROOT
    environment:
      RAILS_ENV: development
      MYSQL_DATABASE: db_dev
      MYSQL_USERNAME: root
      MYSQL_PASSWORD: password
      MYSQL_HOST: db
    ports:
      - "3000:3000"
    links:
      - db
EOF

echo "----- 6. create Rails new app -----"
docker-compose build
docker-compose run web rails new . --force --database=mysql --webpack=vue --skip-bundle --skip-turbolinks

echo "----- 7. fix config/database.yml -----"
cd src
echo "fix config/database.yml"
cd config
rm database.yml
cat <<'EOF' > database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  socket: /var/run/mysqld/mysqld.sock
  database: <%= ENV.fetch("MYSQL_DATABASE") %>
  username: <%= ENV.fetch("MYSQL_USERNAME") %>
  password: <%= ENV.fetch("MYSQL_PASSWORD") %>
  host: <%= ENV.fetch("MYSQL_HOST") %>

development:
  <<: *default

production:
  <<: *default
EOF
cd ../

echo "----- 8. create database -----"
docker-compose run web rake db:create

echo "----- 9. docker-compose up -d -----"
docker-compose up -d

スクリーンショット 2020-04-02 14.38.01.png

■ エラーとか

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

https://wp.tekapo.com/2019/07/15/difference-between-apt-and-apt-get/

aptじゃなくてapt-get使いましょう。

■ 他参考サイト様

■ この後やること

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

supervisor+cron環境でログをdocker logsで確認する方法

目的

コンテナ内のcrondログをdocker logs <コンテナID>で確認する。

必要ソフトウェア

  • docker
  • centos7
  • cron
  • supervisor

環境作成

Dockerfile
FROM centos:7
WORKDIR /root
RUN set -x && \
    yum install -y initscripts && \
    yum install -y rsyslog && \
    yum install -y logrotate && \
    yum install -y cronie && \
    yum install -y supervisor && \
    localedef -f UTF-8 -i ja_JP ja_JP
CMD ["/usr/bin/supervisord", "-n"]

crondログをpid1の標準出力にリダイレクト

/etc/cron.d/test
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
*/1 * * * * root echo "aaaaaaaaaaaa" > /proc/1/fd/1 2>/proc/1/fd/2
/etc/supervisord.d/test.ini
[program:crond]
command=crond -n
user=root
autostart=true
autorestart=true
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

dockerメモ

■docker hub
https://hub.docker.com/

Windowsの場合、相性が悪いかもしれない。


Docker hub?にあるイメージをローカルに持ってくる
docker pull mysql:5.6

イメージ一覧
docker image ls

docker run -d -e MYSQL_ROOT_PASSWORD=password --name mysql5.6 mysql:5.6

docker ps

docker stop コンテナID

docker ps -a

docker start コンテナID

docker restart コンテナID

設定情報確認
docker inspect コンテナID

フォーマットオプションをつけて、IPアドレスを抜き出す方法
docker inspect コンテナID --format '{{ .NetworkSettings.IPAddress }}'

docker inspect 0f2d9adec7e4 --format '{{ .NetworkSettings.IPAddress }}'

Docker コンテナ削除 
docker rm コンテナID

docker rmi イメージID

ビルド
docker build -t php .

docker run -d -p 80:80 --name php php:latest

docker exec -it コンテナID /bin/bash
docker exec -it 4c241c04f1b3 /bin/bash

入ったコンテナから出る
exit

docker-compose.ymlが見えるところで
docker-compose up -d

docker rm $(docker ps -aq)
Image 全消し
docker rmi docker images -q

$ docker cp dump.sql mydocker_db_1:/tmp/dump.sql
$ docker exec -it mydocker_db_1 /bin/bash
$ mysql -u USER_NAME -p -h HOST_NAME DB_NAME < /tmp/dump.sql
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GoとDockerとHerokuでLINEBOTをためしてみる

はじめに

上記の組み合わせのQiitaの記事がなかったのでまとめてみました。
Git, Docker, Herokuの最低限の知識を前提にしています。

ディレクトリ構成

linebot_go
| -- Dockerfile
| -- heroku.yml
| -- main.go

GoとDockerとHerokuの環境を準備する

LINEBOTを導入する前に、まずはこちらの記事を参考にして準備します。
Goで書いたサーバーをHerokuにDocker Deployする

pushしたらHerokuに自動デプロイされるようにする

上記の記事だと毎回デプロイするのに2コマンドを打たなければいけないので、1コマンドでデプロイできるようにします。

・上記記事(2コマンド)

$ heroku container:push web
$ heroku container:release web

・1コマンド

$ git push heroku master

ルートディレクトリにheroku.ymlを追加します。
内容は以下です。

heroku.yml
build:
  docker:
    web: Dockerfile

参考:Building Docker Images with heroku.yml

LINEBOTを導入する

LINEアカウント作成、SDKインストール

こちらの記事を参考にして、アカウント作成とSDKのインストールをする。
Go入門!?LineAPIとGOでオウム返しbotを作る
⇒Lineアカウントの準備、Line SDKのインストール

main.goを修正

SDKにある以下のサンプルを参考にしてmain.goを修正します。
line-bot-sdk-go/examples/echo_bot/server.go

main.go
package main

import (
    "fmt"
    "log"
    "net/http"
    "os"
    "strconv"

    "github.com/line/line-bot-sdk-go/linebot"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello world!\n")
}

func lineHandler(w http.ResponseWriter, r *http.Request) {
    bot, err := linebot.New(
        "(自分のシークレットを入力)",
        "(自分のアクセストークンを入力)",
    )
    if err != nil {
        log.Fatal(err)
    }

    events, err := bot.ParseRequest(r)
    if err != nil {
        if err == linebot.ErrInvalidSignature {
            w.WriteHeader(400)
        } else {
            w.WriteHeader(500)
        }
        return
    }
    for _, event := range events {
        if event.Type == linebot.EventTypeMessage {
            switch message := event.Message.(type) {
            case *linebot.TextMessage:
                replyMessage := message.Text
                if replyMessage == "ぶりぶり" {
                    replyMessage = fmt.Sprintf("あああああああああああああああああああああああああああああああ!!!!!!!!!!!(ブリブリブリブリュリュリュリュリュリュ!!!!!!ブツチチブブブチチチチブリリイリブブブブゥゥゥゥッッッ!!!!!!!)")
                }
                if _, err = bot.ReplyMessage(event.ReplyToken, linebot.NewTextMessage(replyMessage)).Do(); err != nil {
                    log.Print(err)
                }
            case *linebot.StickerMessage:
                replyMessage := fmt.Sprintf(
                    "sticker id is %s, stickerResourceType is %s", message.StickerID, message.StickerResourceType)
                if _, err = bot.ReplyMessage(event.ReplyToken, linebot.NewTextMessage(replyMessage)).Do(); err != nil {
                    log.Print(err)
                }
            }
        }
    }
}

func main() {
    port, _ := strconv.Atoi(os.Args[1])
    fmt.Printf("Starting server at Port %d", port)
    http.HandleFunc("/", handler)
    http.HandleFunc("/callback", lineHandler)
    http.ListenAndServe(fmt.Sprintf(":%d", port), nil)
}

Dockerfileを修正

そのままのDockerfileだとLINEのSDKがHerokuにインストールされないので以下のコマンドを追記します。
RUN go get github.com/line/line-bot-sdk-go/linebot

Dockerfile
FROM golang:latest as builder

ENV CGO_ENABLED=0
ENV GOOS=linux
ENV GOARCH=amd64
WORKDIR /go/src/github.com/yokoe/go-server-example
COPY . .
RUN go get github.com/line/line-bot-sdk-go/linebot
RUN go build main.go

# runtime image
FROM alpine
COPY --from=builder /go/src/github.com/yokoe/go-server-example /app

CMD /app/main $PORT

Herokuにpush

git push heroku masterでpush。

LINE DevelopersのWebhookにHerokuのURLを設定

LINE Developers>Messaging API設定>Webhook設定
にHerokuのURLを入力します。
linedev.PNG

BOTを友だち追加しておためし!

30656.jpg

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

【Wordpress】【Docker】【環境構築】Dockerでwordpressのローカル環境構築

メモです

※Dockerはインストールしてあるとします。

適当なファイルの作成

$ mkdir wp
$ cd wp
$ vi docker-compose.yml

docker-compose.ymlの編集(書き込み)

version: '2'

services:
  db:
    image: mysql:5.6///←ここは自分でチェックしてね
    volumes:
     - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
  wordpress:
    image: wordpress:latest
    depends_on:
     - db
    ports:
     - "8080:80"
    restart: always
    volumes:
     - ./wp-content:/var/www/html/wp-content
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
volumes:
  db_data:

上記の内容をコピペして「:wq」で内容を保存

起動

docker-compose up -d

docker-compose.ymlに記載されているイメージをダウンロードして、コンテナの起動までやってくれます。
すでにイメージがある場合は、起動だけをしてくれます。

http://localhost:8080にアクセスして、ブラウザで確認

wordpressの初期画面が表示されるはず。

参考
Docker Compose でWordPress環境を作ってみる

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