20211012のdockerに関する記事は11件です。

Drupal8環境構築(Docker)

こちらの記事の書き直しというか、インストールしなおした記録。 どうも、Drupal9 は時期尚早な気がする。 Drush10 はさらに素人が手を出すには早すぎる。 Drupal9.2.5 をインストールしたのち、9.2.7 が出ているということで、アップする前にバックアップをしようとしましたが、Drush コマンドが違いすぎてよく分からない。 その前にも、こちら のようなことをやってみようと思ったのですが、機能拡張が対応していないものがいろいろありできないとか。 ただ、 の話があるので、着いて行っておきたいのと、ヘッドレスCMSの可能性を探りたい、その場合に、コンテントタイプを柔軟に作れる強みはやはりある、ということで、Drupal8 で再挑戦します。 DockerCompose構成 前回は、Docker ファイルの中で Drushインストールを走らせる、など挑戦したのですが、そこも分かりにくいので、素直に、公式に書いてある記述をベースとします。 ただ、 DBは別途立てているものに接続する 別途立てているnginx-proxyを経由 という構成にしています。 こんな感じ。 /home/mariadb/docker-compose.yml version: '3' services: mariadb: container_name: mariadb image: mariadb:latest environment: MYSQL_ROOT_PASSWORD: xxx MYSQL_USER: xxx MYSQL_PASSWORD: xxx MYSQL_DATABASE: xxx volumes: - ./mariadb:/var/lib/mysql - ./initdb:/docker-entrypoint-initdb.d ports: - "3336:3306" restart: always /home/proxy/docker-compose.yml version: '3' services: nginx-proxy: image: jwilder/nginx-proxy restart: on-failure labels: - com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=jwilder/nginx-proxy ports: - 80:80 - 443:443 volumes: - proxy:/etc/nginx/vhost.d - proxy:/usr/share/nginx/html - /var/run/docker.sock:/tmp/docker.sock:ro - ./certs:/etc/nginx/certs:ro network_mode: bridge letsencrypt: image: jrcs/letsencrypt-nginx-proxy-companion restart: on-failure depends_on: - nginx-proxy volumes: - proxy:/etc/nginx/vhost.d - proxy:/usr/share/nginx/html - /var/run/docker.sock:/var/run/docker.sock:ro - ./certs:/etc/nginx/certs:rw network_mode: bridge volumes: proxy: /home/drupal8/docker-compose.yml version: '3.1' services: drupal: image: drupal:8-apache # ports: # - 8080:80 volumes: - /var/www/html/modules - /var/www/html/profiles - /var/www/html/themes # this takes advantage of the feature in Docker that a new anonymous # volume (which is what we're creating here) will be initialized with the # existing content of the image at the same location - /var/www/html/sites restart: always network_mode: bridge environment: PROFILE: "minimal" VIRTUAL_HOST: www.xxx.com VIRTUAL_PORT: 80 LETSENCRYPT_HOST: www.xxx.com LETSENCRYPT_EMAIL: xxx@xxx.com volumes の設定も前回構成では苦労しました。なかなか、settings.php を扱えない・・・ 今回はその部分は公式のままにして、匿名volumesにしています。 本当は直下においた方がわかりやすいかなと思いつつ、まあ、場所は docker network inspect bridge で確認できるので良いとします。  インストール DB と nginx は立ち上げておきます。 そして、drupal のイメージを上げる前に、データベースを作っておきます。 mysql -u root -p xxx CREATE DATABASE drupal8_db DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; grant all privileges on drupal8_db.* to 'xxx'@'%' with grant option; show grants for 'xxx'@'%'; Drupal のイメージを上げて、サイトにアクセスすると、rupal のインストーラが起動します。 前回は、sites/default への書き込みができないとか苦労しましたが、問題なく進みました。 テーマ 前回書きませんでしたが、まずはやはりテーマを設定したい。 見た目が良いとテンション上がりますから。 使用するのは、TARA。 有料のProじゃないとあまり設定ができないので面白みがないという気もしつつ、その中でもいろいろできることもあるので、使ってみます。 テーマのインストールは、 サイト/admin/theme/install の「次のURLからインストールする」に https://ftp.drupal.org/files/projects/tara-8.3.3.tar.gz を指定。 ポイントとしては、管理用テーマには指定しない方が良い、という感じでしょうか。 (Bootstrapテーマよりは普通に動くので問題なさそうですが、若干くどい気が・・・) バックアップ(しようと思ったら・・・) 定期バックアップは、Backup and Migrate を使うのが一般的なように感じられます。 そもそも、Durupal9 を諦めたきっかけは、これを上手く動かせなかったからですが・・・ 機能拡張 サイト/admin/modules から、「新しいモジュールをインストール」で サイト/admin/modules/install に移動し、 「次のURLからインストールする」に https://ftp.drupal.org/files/projects/backup_migrate-5.0.1.tar.gz を指定して「インストール」。 終わったら、機能拡張 サイト/admin/modules に戻って、Backup and Migrate が追加されているので、チェックして「インストール」。 ここの流れがイマイチな気がする・・・ 終わったら、Backup and Migrate のエリアが開けるようになり、その中に「構成」があるのでクリック。 ここで各種設定をするのでしょうが、まずは、「今すぐバックアップ」をしてみようかと・・・ だめでした。 これだけで、一つのテーマになりそうな気がするので、本投稿はここまで。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker × rails6 × mysql8.0 環境構築

windowsで開発進めていたがMacbook(intel)買ったので改めて環境構築した。 ファイルを作る dockerfile docker-compose.yml entrypoint.sh Gemfile Gemfile.lock(空) ファイルの書き方は公式ドキュメントを参考。 新しい技術にチャレンジする時ってqiitaに頼りがちだけど、とりあえず公式ドキュメント見てみる事を最近覚えました。 https://docs.docker.com/samples/rails/ ↓ railsアプリを作成 ターミナルで docker-compose run web rails new . --force --database=mysql (— force は既存のGemfileを上書きする) 実行。 railsアプリができる。 ↓ Gemfileやdocckerfileが更新されているので、 docker-compose build  (Gemfileやdocckerfileが更新されるたびにビルドする必要有) database.yml を修正 データベースの設定ファイルだよ default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: password host: db 下線部を追加、修正。 下線部はcompose.ymlで記載したやつと同じものにする↓ environment: MYSQL_ROOT_PASSWORD: password データベース作成 docker-compose run web rails db:create コンテナ起動 docker-compose up -d (-d はデタッチド・モード: バックグラウンドでコンテナを実行) ローカルサーバー立ち上がれば終わり。 デプロイはまた今度。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[memo] smooth docker stop, exec, run

docker run docker images | peco | awk '{print $1}' | read image_name && docker run $image_name docker stop docker ps | peco | awk '{print $1}' | xargs docker stop docker exec docker ps | peco | awk '{print $1}' | read process_id && docker exec -it $process_id /bin/bash
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CentOSでMySQLを動かせるようにするまで ~docker docker-compose~

以下の記事を参照して頂ければと思います ※Qiitaの記事は全て個人的な記載であり、所属する組織団体とは無関係です
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker-compose upでアホみたいに時間がかかる問題

背景 機械学習に関心を持って、とりあえずGitHubでよさげなチュートリアルを見つけてgit clone。そして指示のままにDockerをインストールしてJupyterを起動することに。 知識レベルとしては、コンテナって何?とりあえずJupyter使いたいだけなんだけど、みたいな状況。 問題 OSはwindows10Home、環境設定はVScodeのターミナルから。パソコン自体は10年以上前の型でかなり古い。だが5年前に買ったノーパソでも同様の問題が起こっているので、パソコンスペックの問題でもないような気がする(5年前もかなり古い気がするが…)。 問題の順序。 まずDockerをインストールし、WSL2をアップデートしたりして使用準備を整えた。 そして目的のディレクトリにていざ、docker-compose up -dを入力すると、問題なくBuildingし始めたように見える。 しかし、一向にBuiltが終わらない。 他のことをして時間を潰すか、と暫く目を離して画面に戻ってみると、まだ終わっていない。かかっている時間を見てみると、なんと3777s(60分ちょっと)かかっている。 い、1時間!? どこにもそんなに時間がかかるなんて書いてないんだけど……。仕様かと思ったが、一々ディレクトリを仮想に入れる時にそんなかかっていたら仕事なんてちっとも進まないような気がする。 恐らく何か問題が起こっているのだと思うが、どうすればいいか分からない。 対策と解決方法 とりあえず、データ容量が多いから遅いのだ、という仮説を立ててみた。そこで、以下の記事を参考にし、DockerからJupyterだけを引っ張ってくることにする。 https://qiita.com/fuku_tech/items/6752b00770552bf4f46b だがやっぱりこれも遅い……。しかし10分か20分程度でプロセスは終了することができた。 だがその後どうやってJupyterを開けばいいのかが分からない。ポート番号を指定してローカルホストを開けばいいのだろうか? まあそれは本記事の趣旨に外れるのであまり深くは書かない(詳しい人どうか教えてください!) 結局、なぜこんなにcomposeに時間がかかるのかは分からない。ちなみに、自分がJupyterだけを引っ張って来ている間もdocker-composeはまだ続いている……(なおJupyterを引っ張ってきていたのは別のパソコン)。 どうすれば早くBuildできるのか。 情報求む。 (3時間後追記)  ようやくcomposeが終わった。結局、5500秒(90分)かかっていた。ずっとパソコンの前でスタンバってたので長い長いと感じていたが、こんなものなのだろうか……。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

WSL2(Ubuntu)環境下でのDockerを使ったRailsの開発環境構築

概要 初投稿です。 WSL2(Ubuntu)の環境下でDockerを使ったRailsの開発環境の記事が無くて、構築が面倒だったので作りました。 作成する開発環境 Ruby 3.0.2 Rails 6.1.4 MySQL 8.0 ソースコード ソースコードは下記のとおりです。 docker-rails.sh 使い方 前提条件 WSL2(Ubuntu) Docker version 20.10.8以降 Docker Compose v2.0.0-rc.1以降 shellの実行 ディレクトリを作成しdocker-rails.shを配置します。 mkdir sample_app mv docker-rails.sh ./sample_app/ 作成したディレクトリへ移動し、docker-rails.shを実行します。 cd sample_app bash docker-rails.sh -n {project_name} -p {mysql_password} {project_name}は作成するRailsプロジェクトの名前になります。 {mysql_password}は作成するMySQLのrootパスワードになります。 ディレクトリ構成 shellを実行すると下記のようなディレクトリ構成が作成されます。 sample_app ──| ├── README.md ├── docker-compose.yml ├── docker-rails.sh ├── mysql │ ├── Dockerfile | ├── .dockerignore │ ├── data │ ├── docker-entrypoint-initdb.d │ └── mysql-confd ├── rails │ ├── Dockerfile | ├── .dockerignore │ └── entrypoint.sh └── {project_name} ├── Gemfile ├── Gemfile.lock ├── README.md ├── Rakefile ├── app ├── babel.config.js ├── bin ├── config ├── config.ru ├── db ├── lib ├── log ├── node_modules ├── package.json ├── postcss.config.js ├── public ├── storage ├── test ├── tmp ├── vendor └── yarn.lock 個人的なこだわりですが、Docker関連のファイルをプロジェクトのソースコードと 同じディレクトリに置きたくないので分けました。 また、rootもあまり使いたくないので、可能な限り使わない形にしました。 解説 shellで何をやっているか学びたい人向けに解説していきます。 shellの作成方針 Mac環境だとDockerの権限などを自動で上手くやってくれますが、 WSL2(Ubuntu)やLinux環境はDocker Deamonが全てrootで動くため権限で引っかかったりします。 このような場合、Rootless Dockerを使うといいのですがWSL2には対応していませんでした。 権限設定など手動で開発環境を構築するのが面倒だったのもあったので、自動構築するshellを作成しました。 1.Rails環境用entrypoint.sh,Gemfile,Dockerfileの作成 DockerにRails環境を作成するにあたり、下記のファイルを作成します entrypoint.sh Gemfile & Gemfile.lock Dockerfile entrypoint.sh gosuを使ってroot以外の任意のユーザーでRailsを実行するshellファイルです。 今回は「rails」というユーザーを作成しています。ユーザーIDはLinuxデフォルトの1000を設定しています。 cat <<'EOF' > entrypoint.sh #!/bin/bash # Railsの仕様でDocker上だと余分なserver.pidが残り続けてエラーになるため、 # Railsを実行するたびに削除する rm -f /$project_name/tmp/pids/server.pid # デフォルトUID&GIDを設定 USER_ID=${LOCAL_UID:-1000} GROUP_ID=${LOCAL_GID:-1000} # Railsを実行するユーザーを作成 groupadd -r --gid $GROUP_ID rails useradd -u $USER_ID -o -m -g $GROUP_ID -G sudo rails export HOME=/home/rails # ユーザーrailsに/usr/srcへの権限を付与 chown -R rails:rails /usr/src # Railsはsudo以上の権限でないとインストールできないため、 # 作成したユーザーrailsにsudo権限の付与 echo "rails ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers # 作成したユーザーrailsでDockerを実行 exec /usr/sbin/gosu rails "$@" EOF こちらはほぼDocker公式のRails Quickstartのとおりです。 Gemfile & Gemfile.lock RailsをインストールするためのGemfileです。 Rubyがこれらを参照してRailsをインストールします。 cat <<EOF > Gemfile source 'https://rubygems.org' gem 'rails', "~>6.1.4" EOF Gemfile.lockは空で作成します。 こちらもほぼDocker公式のRails Quickstartのとおりです。 Dockerfile Rails環境のDockerfileです。 こちらもほぼDocker公式のRails Quickstartのとおりです。 cat <<EOF > Dockerfile FROM ruby:3.0.2 ENV LANG C.UTF-8 ENV TZ Asia/Tokyo WORKDIR $app_root # gosuなど必要なライブラリのインストール RUN set -ex && \ apt-get update -qq && \ apt-get install -y sudo && \ : "Install node.js" && \ curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash - && \ apt-get update -qq && \ apt-get install -y nodejs && \ : "Install yarn" && \ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list && \ apt-get update -qq && \ apt-get install -y yarn && \ apt-get -y install gosu # ローカルのGemfileおよびGemfile.lockをDockerコンテナにコピー COPY ./$project_name/Gemfile $app_root/Gemfile COPY ./$project_name/Gemfile.lock $app_root/Gemfile.lock # 上記のGemfileを元にDockerコンテナへRailsをインストール RUN bundle install # ローカルのentrypoint.shをDockerコンテナへコピーし、 # Dockerコンテナ上で実行できるように権限を付与。 # DcokerコンテナのENTRYPOINTで実行するように設定。 COPY ./rails/entrypoint.sh /usr/bin/entrypoint.sh RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["/usr/bin/entrypoint.sh"] EXPOSE 3000 CMD ["rails", "server", "-b", "0.0.0.0"] EOF 2.MySQL用のlocale.gen,my.cnf,init_mysql.sql,Dockerfileを作成 DockerにMySQL環境を作成するにあたり、下記のファイルを作成します locale.gen my.cnf init_mysql.sql Dockerfile locale.gen,my.cnfの作成 locale.gen cat <<EOF > locale.gen ja_JP.UTF-8 UTF-8 EOF my.cnf cat <<EOF > my.cnf [mysqld] default_authentication_plugin=mysql_native_password character-set-server=utf8mb4 collation-server=utf8mb4_general_ci [client] default-character-set=utf8mb4 EOF locale.genとmy.cnfはmysqlの設定ファイルです。 init_mysql.sqlの作成 init_mysql.sql cat <<EOF > init_mysql.sql # ユーザーが存在しない場合のみ、新規ユーザーを作成するsql SET @sql_found='SELECT 1 INTO @x'; SET @sql_fresh='GRANT ALL ON *.* TO "$project_name"@''%'''; SELECT COUNT(1) INTO @found_count FROM mysql.user WHERE user='"$project_name"' AND host='%'; SET @sql=IF(@found_count=1,@sql_found,@sql_fresh); PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s; EOF init_mysql.sqlはmysqlで最初に実行されるsqlです。 これでmysqlユーザーを作成します。 Dockerfileの作成 cat <<EOF > Dockerfile FROM mysql:8.0 # ユーザーmysqlのUID,GIDをLinuxのUID,GIDと合わせる RUN groupmod -g 1000 mysql && usermod -u 1000 -g 1000 mysql # ユーザーrailsにsudo権限を付与します。 # ユーザーrailsにsudo権限を付与していないと、rails db:createコマンドでエラーになります。 RUN echo "rails ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers COPY ./mysql/mysql-confd/locale.gen /etc/locale.gen RUN sed -i 's@archive.ubuntu.com@ftp.jaist.ac.jp/pub/Linux@g' /etc/apt/sources.list RUN set -ex && \ apt-get update -qq && \ : "Install locales" && \ apt-get install -y --no-install-recommends locales && \ : "Cleaning..." && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* && \ locale-gen ja_JP.UTF-8 ENV LC_ALL ja_JP.UTF-8 COPY ./mysql/mysql-confd/my.cnf /etc/mysql/conf.d/my.cnf COPY ./mysql/docker-entrypoint-initdb.d/init_mysql.sql /docker-entrypoint-initdb.d/init_mysql.sql EOF mysqlのDockerファイルです。 MySQL Daemonもrootユーザーで動作するので、 Dockerファイルでsudo権限を付与します。 プロジェクトの作成&docker-composeの起動 Dockerコンテナでrails newを実行し、プロジェクトを作成します。 その後、docker-compose buildを行うことでbundle installが実行されます。 docker-compose run --no-deps web rails new . --force --database=mysql docker-compose build --no-cache 続いて、下記のコマンドでrailsプロジェクトのdatabase.ymlの内容を書き換えます。 docker-compose run web /bin/sh -c "sed -ie '0,/password:/ s/password:/password: <%= ENV.fetch('\"'MYSQL_PASSWORD'\"') { '\"'$root_password'\"' } %>/g' ./config/database.yml" docker-compose run web /bin/sh -c "sed -ie 's/host: localhost/host: <%= ENV.fetch('\"'MYSQL_HOST'\"') { '\"'db'\"' } %>/g' ./config/database.yml" docker-compose run web /bin/sh -c "sed -ie 's/username: root/username: <%= ENV.fetch('\"'MYSQL_USER'\"') { '\"'$project_name'\"' } %>/g' ./config/database.yml" docker-compose run web /bin/sh -c "sed -ie 's/username: $project_name/username: <%= ENV.fetch('\"'MYSQL_USER'\"') { '\"'$project_name'\"' } %>/g' ./config/database.yml" その後、db:createを実行DBを作成します。 docker-compose run web rails db:create 最後にdocker-compose buildをもう一度行なったあとに コンテナを起動すると、完了です。 docker-compose build --no-cache docker-compose up -d 以上が完了後、localhost:3000へアクセスすると、RailsのTOP画面へ遷移します。 参考 参考にした記事は下記のとおりです。作者様からは許可をいただいております。 丁寧すぎるDocker-composeによるrails5 + MySQL on Dockerの環境構築(Docker for Mac)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

WSL2(Ubuntu)環境下でのDockerを使ったRailsの開発環境構築するshellを作った

概要 初投稿です。 WSL2(Ubuntu)の環境下でDockerを使ったRailsの開発環境の記事が無くて、構築が面倒だったのでshellを作りました。 作成する開発環境 Ruby 3.0.2 Rails 6.1.4 MySQL 8.0 ソースコード ソースコードは下記のとおりです。 docker-rails.sh 使い方 前提条件 WSL2(Ubuntu) Docker version 20.10.8以降 Docker Compose v2.0.0-rc.1以降 shellの実行 ディレクトリを作成しdocker-rails.shを配置します。 mkdir sample_app mv docker-rails.sh ./sample_app/ 作成したディレクトリへ移動し、docker-rails.shを実行します。 cd sample_app bash docker-rails.sh -n {project_name} -p {mysql_password} {project_name}は作成するRailsプロジェクトの名前になります。 {mysql_password}は作成するMySQLのrootパスワードになります。 ディレクトリ構成 shellを実行すると下記のようなディレクトリ構成が作成されます。 sample_app ──| ├── README.md ├── docker-compose.yml ├── docker-rails.sh ├── mysql │ ├── Dockerfile | ├── .dockerignore │ ├── data │ ├── docker-entrypoint-initdb.d │ └── mysql-confd ├── rails │ ├── Dockerfile | ├── .dockerignore │ └── entrypoint.sh └── {project_name} ├── Gemfile ├── Gemfile.lock ├── README.md ├── Rakefile ├── app ├── babel.config.js ├── bin ├── config ├── config.ru ├── db ├── lib ├── log ├── node_modules ├── package.json ├── postcss.config.js ├── public ├── storage ├── test ├── tmp ├── vendor └── yarn.lock 個人的なこだわりですが、Docker関連のファイルをプロジェクトのソースコードと 同じディレクトリに置きたくないので分けました。 また、rootもあまり使いたくないので、可能な限り使わない形にしました。 解説 shellで何をやっているか学びたい人向けに解説していきます。 shellの作成方針 Mac環境だとDockerの権限などを自動で上手くやってくれますが、 WSL2(Ubuntu)やLinux環境はDocker Deamonが全てrootで動くため権限で引っかかったりします。 このような場合、Rootless Dockerを使うといいのですがWSL2には対応していませんでした。 権限設定など手動で開発環境を構築するのが面倒だったのもあったので、自動構築するshellを作成しました。 1.Rails環境用entrypoint.sh,Gemfile,Dockerfileの作成 DockerにRails環境を作成するにあたり、下記のファイルを作成します entrypoint.sh Gemfile & Gemfile.lock Dockerfile entrypoint.sh gosuを使ってroot以外の任意のユーザーでRailsを実行するshellファイルです。 今回は「rails」というユーザーを作成しています。ユーザーIDはLinuxデフォルトの1000を設定しています。 cat <<'EOF' > entrypoint.sh #!/bin/bash # Railsの仕様でDocker上だと余分なserver.pidが残り続けてエラーになるため、 # Railsを実行するたびに削除する rm -f /$project_name/tmp/pids/server.pid # デフォルトUID&GIDを設定 USER_ID=${LOCAL_UID:-1000} GROUP_ID=${LOCAL_GID:-1000} # Railsを実行するユーザーを作成 groupadd -r --gid $GROUP_ID rails useradd -u $USER_ID -o -m -g $GROUP_ID -G sudo rails export HOME=/home/rails # ユーザーrailsに/usr/srcへの権限を付与 chown -R rails:rails /usr/src # Railsはsudo以上の権限でないとインストールできないため、 # 作成したユーザーrailsにsudo権限の付与 echo "rails ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers # 作成したユーザーrailsでDockerを実行 exec /usr/sbin/gosu rails "$@" EOF こちらはほぼDocker公式のRails Quickstartのとおりです。 Gemfile & Gemfile.lock RailsをインストールするためのGemfileです。 Rubyがこれらを参照してRailsをインストールします。 cat <<EOF > Gemfile source 'https://rubygems.org' gem 'rails', "~>6.1.4" EOF Gemfile.lockは空で作成します。 こちらもほぼDocker公式のRails Quickstartのとおりです。 Dockerfile Rails環境のDockerfileです。 こちらもほぼDocker公式のRails Quickstartのとおりです。 cat <<EOF > Dockerfile FROM ruby:3.0.2 ENV LANG C.UTF-8 ENV TZ Asia/Tokyo WORKDIR $app_root # gosuなど必要なライブラリのインストール RUN set -ex && \ apt-get update -qq && \ apt-get install -y sudo && \ : "Install node.js" && \ curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash - && \ apt-get update -qq && \ apt-get install -y nodejs && \ : "Install yarn" && \ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list && \ apt-get update -qq && \ apt-get install -y yarn && \ apt-get -y install gosu # ローカルのGemfileおよびGemfile.lockをDockerコンテナにコピー COPY ./$project_name/Gemfile $app_root/Gemfile COPY ./$project_name/Gemfile.lock $app_root/Gemfile.lock # 上記のGemfileを元にDockerコンテナへRailsをインストール RUN bundle install # ローカルのentrypoint.shをDockerコンテナへコピーし、 # Dockerコンテナ上で実行できるように権限を付与。 # DcokerコンテナのENTRYPOINTで実行するように設定。 COPY ./rails/entrypoint.sh /usr/bin/entrypoint.sh RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["/usr/bin/entrypoint.sh"] EXPOSE 3000 CMD ["rails", "server", "-b", "0.0.0.0"] EOF 2.MySQL用のlocale.gen,my.cnf,init_mysql.sql,Dockerfileを作成 DockerにMySQL環境を作成するにあたり、下記のファイルを作成します locale.gen my.cnf init_mysql.sql Dockerfile locale.gen,my.cnfの作成 locale.gen cat <<EOF > locale.gen ja_JP.UTF-8 UTF-8 EOF my.cnf cat <<EOF > my.cnf [mysqld] default_authentication_plugin=mysql_native_password character-set-server=utf8mb4 collation-server=utf8mb4_general_ci [client] default-character-set=utf8mb4 EOF locale.genとmy.cnfはmysqlの設定ファイルです。 init_mysql.sqlの作成 init_mysql.sql cat <<EOF > init_mysql.sql # ユーザーが存在しない場合のみ、新規ユーザーを作成するsql SET @sql_found='SELECT 1 INTO @x'; SET @sql_fresh='GRANT ALL ON *.* TO "$project_name"@''%'''; SELECT COUNT(1) INTO @found_count FROM mysql.user WHERE user='"$project_name"' AND host='%'; SET @sql=IF(@found_count=1,@sql_found,@sql_fresh); PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s; EOF init_mysql.sqlはmysqlで最初に実行されるsqlです。 これでmysqlユーザーを作成します。 Dockerfileの作成 cat <<EOF > Dockerfile FROM mysql:8.0 # ユーザーmysqlのUID,GIDをLinuxのUID,GIDと合わせる RUN groupmod -g 1000 mysql && usermod -u 1000 -g 1000 mysql # ユーザーrailsにsudo権限を付与します。 # ユーザーrailsにsudo権限を付与していないと、rails db:createコマンドでエラーになります。 RUN echo "rails ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers COPY ./mysql/mysql-confd/locale.gen /etc/locale.gen RUN sed -i 's@archive.ubuntu.com@ftp.jaist.ac.jp/pub/Linux@g' /etc/apt/sources.list RUN set -ex && \ apt-get update -qq && \ : "Install locales" && \ apt-get install -y --no-install-recommends locales && \ : "Cleaning..." && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* && \ locale-gen ja_JP.UTF-8 ENV LC_ALL ja_JP.UTF-8 COPY ./mysql/mysql-confd/my.cnf /etc/mysql/conf.d/my.cnf COPY ./mysql/docker-entrypoint-initdb.d/init_mysql.sql /docker-entrypoint-initdb.d/init_mysql.sql EOF mysqlのDockerファイルです。 MySQL Daemonもrootユーザーで動作するので、 Dockerファイルでsudo権限を付与します。 3.プロジェクトの作成&docker-composeの起動 Dockerコンテナでrails newを実行し、プロジェクトを作成します。 その後、docker-compose buildを行うことでbundle installが実行されます。 docker-compose run --no-deps web rails new . --force --database=mysql docker-compose build --no-cache 続いて、下記のコマンドでrailsプロジェクトのdatabase.ymlの内容を書き換えます。 docker-compose run web /bin/sh -c "sed -ie '0,/password:/ s/password:/password: <%= ENV.fetch('\"'MYSQL_PASSWORD'\"') { '\"'$root_password'\"' } %>/g' ./config/database.yml" docker-compose run web /bin/sh -c "sed -ie 's/host: localhost/host: <%= ENV.fetch('\"'MYSQL_HOST'\"') { '\"'db'\"' } %>/g' ./config/database.yml" docker-compose run web /bin/sh -c "sed -ie 's/username: root/username: <%= ENV.fetch('\"'MYSQL_USER'\"') { '\"'$project_name'\"' } %>/g' ./config/database.yml" docker-compose run web /bin/sh -c "sed -ie 's/username: $project_name/username: <%= ENV.fetch('\"'MYSQL_USER'\"') { '\"'$project_name'\"' } %>/g' ./config/database.yml" その後、db:createを実行DBを作成します。 docker-compose run web rails db:create 最後にdocker-compose buildをもう一度行なったあとに コンテナを起動すると、完了です。 docker-compose build --no-cache docker-compose up -d 以上が完了後、localhost:3000へアクセスすると、RailsのTOP画面へ遷移します。 参考 参考にした記事は下記のとおりです。作者様からは許可をいただいております。 丁寧すぎるDocker-composeによるrails5 + MySQL on Dockerの環境構築(Docker for Mac)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerを使ってGolangでHello,World!(超初心者向け)

Dockerでgolangを動かしてみます。 Dockerを触ったことがない人でもわかるように意識して書きました。 事前準備 ・Dockerのインストールが済んでいること ・Vimの基本的な操作(編集、保存、閉じる)ができること 本題 下記のコマンドを実行します。 docker run -it --name="任意の名前" -p 8080:80 golang:1.15 bash コマンドオプションの意味 -i :ホストの入力をコンテナの標準出力をつなげる -t :コンテナの標準出力とホストの出力をつなげる -i,-tオプションを付けないとコンテナの中で入力できない -iオプションと合わせて-itと記述可能 --name=" " :コンテナ名に任意の名前を付ける #付けなくても動きます -p 8080:80 :ポートマッピング  書き方:-p [ホスト側のポート番号]:[コンテナのポート番号]  -p 8080:80で localhost:8080 への接続が、コンテナ内のポート 80 へ送られます。 golang:1.15 :構築するイメージを指定 bash :コンテナ内で Bash シェルを起動 ローカルマシン ❯❯❯ docker run -it --name="first_app" -p 8080:80 golang:1.15 bash dockerコンテナの中にはいる Docker #Vimを使いたいのでupdate実行 root@51c29f39210b:/go# apt update Get:1 http://deb.debian.org/debian buster InRelease [122 kB] Get:2 http://security.debian.org/debian-security buster/updates InRelease [65.4 kB] ... #Vimをインストール root@51c29f39210b:/go# apt install vim Reading package lists... Done ... #Vimでmain.goファイルを作成 root@51c29f39210b:/go# vim main.go main.goファイル内に下記のような簡単なコードを書いてみる main.go package main import "fmt" func main() { fmt.Println("Hello, World!") } Vimを閉じてmain.goを実行する。 Docker root@51c29f39210b:/go# go run main.go Hello, World! Hello, World!を表示することができました。 おまけ  Dockerから出てもう一度接続する Dockerから出る Docker root@51c29f39210b:/go# exit 接続する ローカルマシン #コンテナの状態を確認する ❯❯❯ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 51c29f39210b golang:1.15 "bash" About an hour ago Exited (127) 3 seconds ago first_app #コンテナを起動する docker start <CONTAINER IDまたはNAME> ❯❯❯ docker start 51c29f39210b #コンテナに接続するdocker attach <CONTAINER IDまたはNAME> ❯❯❯ docker attach 51c29f39210b docker exec <CONTAINER IDまたはNAME>コマンドでも接続できる。 attachで接続した場合、exitコマンドで抜けるとコンテナが停止しますが、execで接続した場合、exitコマンドで抜けるてもコンテナが停止しないという違いがあります。 詳しくはこちらの記事に記載してあります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

WSL2上のDockerで名前解決がうまく行かない場合の対処法

Docker Desktop問題をこちらの記事を参考に対応してました。 https://qiita.com/ohtsuka1317/items/617a865b8a9d4fb67989 私の環境だけかもしれませんが、Dockerコンテナ内で名前解決がうまくいきませんでしたので応急処置的な対処方法です。 Dockerデーモン起動 WSL2 sudo /etc/init.d/docker start Ubuntuイメージを取得して起動、Bashに接続 WSL2 docker run -it ubuntu:latest bash apt updateしてみる Ubuntuコンテナ root@6babda3e1bb7:/# apt update Err:1 http://archive.ubuntu.com/ubuntu focal InRelease Temporary failure resolving 'archive.ubuntu.com' Err:2 http://security.ubuntu.com/ubuntu focal-security InRelease Temporary failure resolving 'security.ubuntu.com' Err:3 http://archive.ubuntu.com/ubuntu focal-updates InRelease Temporary failure resolving 'archive.ubuntu.com' Err:4 http://archive.ubuntu.com/ubuntu focal-backports InRelease Temporary failure resolving 'archive.ubuntu.com' Reading package lists... Done Building dependency tree Reading state information... Done All packages are up to date. W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/focal/InRelease Temporary failure resolving 'archive.ubuntu.com' W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/focal-updates/InRelease Temporary failure resolving 'archive.ubuntu.com' W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/focal-backports/InRelease Temporary failure resolving 'archive.ubuntu.com' W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/focal-security/InRelease Temporary failure resolving 'security.ubuntu.com' W: Some index files failed to download. They have been ignored, or old ones used instead. root@6babda3e1bb7:/# 名前解決ができてない模様 Ubuntuコンテナ root@6babda3e1bb7:/# cat /etc/resolv.conf # This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf: # [network] # generateResolvConf = false nameserver 172.17.48.1 root@6babda3e1bb7:/# 172.17.48.1はWSLのホストであるWindowsのIPアドレスです。 解決方法 resolv.confを上書きしちゃう Ubuntuコンテナ echo 'nameserver 8.8.8.8' | tee /etc/resolv.conf root@6babda3e1bb7:/# apt update Get:1 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB] Get:2 http://archive.ubuntu.com/ubuntu focal InRelease [265 kB] Get:3 http://security.ubuntu.com/ubuntu focal-security/universe amd64 Packages [796 kB] Get:4 http://archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB] Get:5 http://security.ubuntu.com/ubuntu focal-security/restricted amd64 Packages [581 kB] Get:6 http://security.ubuntu.com/ubuntu focal-security/multiverse amd64 Packages [30.1 kB] Get:7 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages [1135 kB] Get:8 http://archive.ubuntu.com/ubuntu focal-backports InRelease [101 kB] Get:9 http://archive.ubuntu.com/ubuntu focal/universe amd64 Packages [11.3 MB] Get:10 http://archive.ubuntu.com/ubuntu focal/multiverse amd64 Packages [177 kB] Get:11 http://archive.ubuntu.com/ubuntu focal/restricted amd64 Packages [33.4 kB] Get:12 http://archive.ubuntu.com/ubuntu focal/main amd64 Packages [1275 kB] Get:13 http://archive.ubuntu.com/ubuntu focal-updates/multiverse amd64 Packages [33.4 kB] Get:14 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages [1582 kB] Get:15 http://archive.ubuntu.com/ubuntu focal-updates/universe amd64 Packages [1084 kB] Get:16 http://archive.ubuntu.com/ubuntu focal-updates/restricted amd64 Packages [632 kB] Get:17 http://archive.ubuntu.com/ubuntu focal-backports/universe amd64 Packages [6310 B] Get:18 http://archive.ubuntu.com/ubuntu focal-backports/main amd64 Packages [2668 B] Fetched 19.3 MB in 6s (3008 kB/s) Reading package lists... Done Building dependency tree Reading state information... Done 4 packages can be upgraded. Run 'apt list --upgradable' to see them. root@6babda3e1bb7:/# 正しいやり方かどうかはわかりません。 おまけ VSCodeのRemote - Containers拡張を使う場合は、devcontainer.jsonのpostCreateCommandにでも書いておきましょう devcontainer.json // For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: // https://github.com/microsoft/vscode-dev-containers/tree/v0.202.1/containers/ubuntu { "name": "Ubuntu", "runArgs": ["--init"], "build": { "dockerfile": "Dockerfile", // Update 'VARIANT' to pick an Ubuntu version: hirsute, focal, bionic // Use hirsute or bionic on local arm64/Apple Silicon. "args": { "VARIANT": "focal" } }, // Set *default* container specific settings.json values on container create. "settings": {}, // Add the IDs of extensions you want installed when the container is created. "extensions": [], // Use 'forwardPorts' to make a list of ports inside the container available locally. // "forwardPorts": [], // Use 'postCreateCommand' to run commands after the container is created. "postCreateCommand": "echo 'nameserver 8.8.8.8' | sudo tee /etc/resolv.conf", // Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. "remoteUser": "vscode", "features": { } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker】起動してもすぐ落ちるときの解決法

環境 Docker version 20.10.7 docker-compose version 1.29.2 状況 Dockerを起動してもすぐに落ちる % docker-compose up -d Creating XXXXX_db_1 ... done Creating XXXXX_redis_1 ... done Creating XXXXX_worker_1 ... done Creating XXXXX_app_1 ... done Creating XXXXX_webpacker_1 ... done Creating XXXXX_web_1 ... done % docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES XXXXXXXXXXXX XXXXX_web "/docker-entrypoint.…" 4 seconds ago Up 2 seconds 80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp XXXXX_web_1 XXXXXXXXXXXX XXXXX_webpacker "/bin/bash -c 'rm -r…" 4 seconds ago Exited (7) 2 seconds ago XXXXX_webpacker_1 XXXXXXXXXXXX XXXXX_app "/bin/bash -c 'rm tm…" 5 seconds ago Exited (7) 2 seconds ago XXXXX_app_1 XXXXXXXXXXXX XXXXX_worker "/bin/bash -c 'bundl…" 5 seconds ago Exited (7) 2 seconds ago XXXXX_worker_1 解決法 Docker Desktopでログを確認すると下記のエラー Could not find  XXXXX in any of the sources Run `bundle install` to install missing gems. 指示どおりbundle install実行 次のコマンドでbundle installしようとするので、Gemfileを更新したらbuildし直す % docker-compose build 次のエラー出現 The git source https://github.com/XXX/XXXXXXXXXXXXX.git is not yet checked out. Please run `bundle install` before trying to start your application Gemfile修正 gem 'XXXXXXXXXXXXX', github: 'XXX/XXXXXXXXXXXXX' ↓ gem 'XXXXXXXXXXXXX', git: "https://github.com/XXX/XXXXXXXXXXXXX" ここでDockerfile内でbundle installしないと意味ないことに気づく… % docker-compose run app bundle install もう一度buildしてupしてみる % docker-compose build % docker-compose up -d 成功!! 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker Desktop 4.1.0 (69386)】docker-compose up でエラーが出た場合の対処法

各種バージョン Docker 20.10.8 Docker Desktop 4.1.0 (69386) docker-compose version 1.29.2 エラー内容 今日、いつも通りの手順で、docker-compose upを行うと下記のようなエラーが出ました。 docker-compose unexpected character “-” in variable name near “-p default_grace=3600 or unexpected character “\”" in variable name near “\”thumbor.filters.contrast\” or key cannot contain a space 原因 私の場合、赤枠で囲んでいるDocker Desktopの設定項目にチェックが入っていたのでエラーが出ていました。 このチェックを外して、設定適用、Docker desktopの再起動を行えば、無事コンテナを立ち上げることができました。 誰か困っている方の助けになれば幸いです。 もし、他の方法で解決したという方がいれば、コメント欄にて教えていただけますと幸いです。 そろそろ、docker-compose卒業して、docker composeにしないとですかね。 参考サイト
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む