- 投稿日:2020-04-02T21:53:54+09:00
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 80Dokerfileの細かな内容については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へようこそ」画面が出るはず。ここまでくれば、この記事のゴールです。
ここまでたどり着くまでいろいろ調べまくりました。
もともとあるコンテナを使えばもっと手軽にできたと思いますが、勉強がてらDockerfileを作るところから始めたので思いの外時間がかかりましたが、勉強になりましたね。こうやって記事にすることで後で見直すこともできるので一石二鳥です。Dockerfileの設定の補足
docker-hubからOSのイメージ引込
FROM centos:centos8.1.1191OSコンテナの引き込みですね。latestでも良かったのですが、一旦執筆時点の最新のバージョンを指定しています。最終的にはlatestにするかもしれません。
サーバの日付合わせ
RUN /bin/cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtimeコンテナの時刻を日本時間に合わせるコマンドです。
ログなどを保管する際、時刻がおかしなことになっていると色々と面倒なので、必要な設定となりますね。epel-releaseのインストール
RUN yum install -y epel-release &&\ yum clean allremiのインストール
RUN rpm -ivh http://ftp.riken.jp/Linux/remi/enterprise/remi-release-8.rpmphp7.4をインストールするためにremiレポジトリをインストールする必要がありますが、まずここにたどり着くまで苦労しました。
CentOS8用のrpmをインストールしないと当然動かないのですが、ネットではremi-release-7.rpmでしか記事が見つからず、適当に7→8に書き換えたらインストールできました。remiのインストールのに結構手こずりました。
yumのアップデート
RUN yum update -y &&\ yum clean allyumのアップデートは必須作業なので、apache、php7.4のインストール前に実行しておきます。
必要なモジュールのインストール(apache)
RUN yum -y install httpd &&\ yum clean allapacheのインストールはyum経由ですので特に何も設定は必要ありませんね。
必要なモジュールのインストール(php7.4)
RUN yum -y install php74-php php74-php-mysqli php74-php-gd php74-php-mbstring php74-php-opcache php74-php-xmlphpのモジュールのインストールはphp74でもインストールされますが、動作させるにはphp74-php-xxx といったphp74とモジュールの間にーphpを入れる必要があるというところに行き着くまでにまた手こずりました。
phpコマンドを作成
RUN ln /usr/bin/php74 /usr/bin/phpphp7.4を入れた後、phpとコマンドを実行しても何も反応がなく、いろいろ調べた結果、php74がphpのコマンドであることが判明。
このままだと、phpとしてコマンドが実行できないので、リンクを張ってphpでもコマンドが実行できるようにしました。wordpressインストールディレクトリの所有者をapacheユーザに変更
RUN chown -R apache:apache /var/www/htmlapacheサーバの起動ユーザに合わせてwordpress配置ディレクトリのオーナーを変更。
php74-php-fpmのサービス永続化
RUN systemctl enable php74-php-fpmapacheをインストールしてもwordpresの画面が立ち上がらず何故かと調べていたらphp-fpmがサービスとして起動している費強があるということがわかりました。
コンテナ起動時に自動でサービスが起動するようにサービスを永続化させるようにしました。apache サーバのサービス永続化
RUN systemctl enable httpdapacheもphp-fpm同様サービスとして常に起動するように設定しました。
接続用ポートの穴あけ
EXPOSE 80http接続できるように80番のポートを開けます。https化を狙って443も開けておく必要がありますが、それはこれからGWまでの課題ですね。
今後の課題
- https化
- mysqlとの接続
といったところでしょうか。wordpressの画面は起動しましたがwordpressまではインストールできていないです。
なので、GWまでにはこのあたりを解決したいですね。
- 投稿日:2020-04-02T20:47:19+09:00
【Docker】コンテナ内のデータベース閲覧(ローカル,EC2)
はじめに
ローカル環境/本番環境(EC2)の其々でコンテナを起動させた際のデータベース閲覧方法と
環境による閲覧方法の違いがあるのか気になったので、調べてみました。環境
- Rails:5.0.7
- MySQL:5.6
- Docker:19.03.8
- EC2(AMI):Amazon Linux AMI
ソースコード
DockerfileFROM 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/socketsdocker-compose.ymlversion: '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
- 投稿日:2020-04-02T14:56:30+09:00
Rails_MySQL_Docker_Vue.jsの環境をシェル一発で始められるようしてみた
■ 何これ?
$ rails new
する機会が久々にあって、諸々込みでもっと簡単に環境構築出来たら良いなと思ったので、@azul915さんの記事のshellを参考にちょっと改変して使えるようにしてみました。Githubにもありますので好きなだけいじってください。
ご指摘などありましたらお気軽に。
■ 最終的なディレクトリ構成
【app_name】 ∟ Dockerfile ∟ docker-compose.yml ∟ src ∟ [rails new で生成されたファイル群]■ Special Thanks
- 丁寧すぎるDocker-composeによるrails5 + MySQL on Dockerの環境構築(Docker for Mac)
- https://qiita.com/azul915/items/5b7063cbc80192343fc0
- このサイトのshellからスタートしてます。大感謝。
■ 使い方
1. docker / docker-composeが入っている前提
2. 任意のディレクトリを作成
ex. $ mkdir sample_app $ cd sample_app3. 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/tcp5. 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■ エラーとか
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使いましょう。
■ 他参考サイト様
■ この後やること
- vue入ってるのにまだ使ってない件
- この辺りとか参考に↓
- Ruby on Rails, Vue.js で始めるモダン WEB アプリケーション入門
- webpackerじゃなくてwebpackで良い感じにしたい件
- docker image 最適化(マルチステージビルド)したい件
- 投稿日:2020-04-02T14:50:43+09:00
supervisor+cron環境でログをdocker logsで確認する方法
目的
コンテナ内のcrondログをdocker logs <コンテナID>で確認する。
必要ソフトウェア
- docker
- centos7
- cron
- supervisor
環境作成
DockerfileFROM 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/testSHELL=/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
- 投稿日:2020-04-02T14:46:04+09:00
dockerメモ
■docker hub
https://hub.docker.com/Windowsの場合、相性が悪いかもしれない。
■
Docker hub?にあるイメージをローカルに持ってくる
docker pull mysql:5.6イメージ一覧
docker image lsdocker 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 コンテナIDdocker 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入ったコンテナから出る
exitdocker-compose.ymlが見えるところで
docker-compose up -ddocker 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
- 投稿日:2020-04-02T11:50:47+09:00
GoとDockerとHerokuでLINEBOTをためしてみる
はじめに
上記の組み合わせのQiitaの記事がなかったのでまとめてみました。
Git, Docker, Herokuの最低限の知識を前提にしています。ディレクトリ構成
linebot_go
| -- Dockerfile
| -- heroku.yml
| -- main.goGoと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.ymlbuild: 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.gopackage 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
DockerfileFROM 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 $PORTHerokuにpush
git push heroku master
でpush。LINE DevelopersのWebhookにHerokuのURLを設定
LINE Developers>Messaging API設定>Webhook設定
にHerokuのURLを入力します。
BOTを友だち追加しておためし!
- 投稿日:2020-04-02T10:58:27+09:00
【Wordpress】【Docker】【環境構築】Dockerでwordpressのローカル環境構築
メモです
※Dockerはインストールしてあるとします。
適当なファイルの作成
$ mkdir wp $ cd wp $ vi docker-compose.ymldocker-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 -ddocker-compose.ymlに記載されているイメージをダウンロードして、コンテナの起動までやってくれます。
すでにイメージがある場合は、起動だけをしてくれます。http://localhost:8080にアクセスして、ブラウザで確認
wordpressの初期画面が表示されるはず。