20210511のdockerに関する記事は12件です。

NginxをProxyサーバとして動かす

はじめに ※ 以下の記事をほぼほぼ参考に試してみた備忘録記事です。 https://qiita.com/hana_shin/items/31232789f4a6510e936b 準備 proxy兼webサーバーの役割を担うコンテナを作成 nginxがproxyの役割を、apache(httpd)がwebサーバの役割を担う想定。 $ docker run -it -d --privileged --name nginx_proxy_and_httpd_server centos:centos7 /sbin/init nginxとhttpdをインストールする。 $ docker exec -it nginx_proxy_and_httpd_server /bin/bash # vi /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1 # yum -y install nginx # yum -y install httpd webサーバーだけの役割を担うコンテナを作成 $ docker run -it -d --privileged --name httpd_server centos:centos7 /sbin/init httpdをインストールする。 $ docker exec -it httpd_server /bin/bash # yum -y install httpd NginxのProxyとしての設定 各コンテナのIPだけ調べておく。 Nginxが入ったProxy兼務のコンテナ側 # hostname -i 172.17.0.2 httpdだけ入ったwebサーバとしての役割だけのコンテナ側 # hostname -i 172.17.0.3 nginx設定ファイル作成。 proxyの設定。 ※ /etc/nginx/conf.d/ 配下に「*.conf」の名前でファイルを置いておくと、 元の/etc/nginx/nginx.confファイルから読み込んでもらえるので便利。 # vi /etc/nginx/conf.d/backend.conf upstream backend { server 172.17.0.2:80 weight=1; server 172.17.0.3:80 weight=1; } server { listen 8888; server_name 172.17.0.2; location / { proxy_pass http://backend; } } その他の設定 nginx(Proxy)のポート番号の変更。 # vi /etc/nginx/conf.d/default.conf server { #listen 80; listen 8888; 各ソフトの起動 # systemctl start httpd # systemctl start nginx ※webサーバーだけのコンテナではhttpdだけ起動する。 # systemctl start httpd 各ソフト起動状態確認 proxy兼webサーバー側コンテナのソフト起動状態確認。 # yum -y install lsof # lsof -i:8888 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 358 root 6u IPv4 339580 0t0 TCP *:ddi-tcp-1 (LISTEN) nginx 359 nginx 6u IPv4 339580 0t0 TCP *:ddi-tcp-1 (LISTEN) nginx 360 nginx 6u IPv4 339580 0t0 TCP *:ddi-tcp-1 (LISTEN) # lsof -i:80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME httpd 261 root 3u IPv4 656260 0t0 TCP *:http (LISTEN) httpd 262 apache 3u IPv4 656260 0t0 TCP *:http (LISTEN) httpd 263 apache 3u IPv4 656260 0t0 TCP *:http (LISTEN) httpd 264 apache 3u IPv4 656260 0t0 TCP *:http (LISTEN) httpd 265 apache 3u IPv4 656260 0t0 TCP *:http (LISTEN) httpd 266 apache 3u IPv4 656260 0t0 TCP *:http (LISTEN) webサーバーのみのコンテナのソフト起動状態確認。 # yum -y install lsof # lsof -i:80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME httpd 176 root 3u IPv4 657417 0t0 TCP *:http (LISTEN) httpd 177 apache 3u IPv4 657417 0t0 TCP *:http (LISTEN) httpd 178 apache 3u IPv4 657417 0t0 TCP *:http (LISTEN) httpd 179 apache 3u IPv4 657417 0t0 TCP *:http (LISTEN) httpd 180 apache 3u IPv4 657417 0t0 TCP *:http (LISTEN) httpd 181 apache 3u IPv4 657417 0t0 TCP *:http (LISTEN) 動作確認 proxy兼webサーバー側コンテナのログ確認 # cat /var/log/nginx/access.log # cat /var/log/httpd/access_log webサーバーのみのコンテナのログ確認 # cat /var/log/httpd/access_log proxy兼webサーバー側コンテナからproxyへアクセス curl http://172.17.0.2:8888 proxy兼webサーバー側コンテナのログ確認 # cat /var/log/nginx/access.log 172.17.0.2 - - [11/May/2021:14:49:35 +0000] "GET / HTTP/1.1" 403 4897 "-" "curl/7.29.0" "-" # cat /var/log/httpd/access_log 172.17.0.2 - - [11/May/2021:14:49:35 +0000] "GET / HTTP/1.0" 403 4897 "-" "curl/7.29.0" webサーバーのみのコンテナのログ確認 # cat /var/log/httpd/access_log つまりは、今回のアクセスではproxy兼webサーバー側コンテナのwebサーバーへアクセスがいったということ。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Windows10 Pro の Windows PowerShell コンソールでdockerコンテナ操作時にBackspaceキーを押すと発生する音を消す

実現したいこと Windows10 Pro の Windows PowerShell コンソールで dockerコンテナ操作時にBackspaceキーを押すと私にとって不快な音が発生する。(発生する音が心地よい方にはあまり関係ない) 不快な音を発生させないようにしたい。 これは、Windows Terminalでも発生する。 一番簡単な解決方法:パターン1 解決方法がたくさんあるが、簡単な方法はこれだった。 VSCode(Visual Stdio Code)をインストール VSCodeを起動する VSCodeのターミナルを開く ショートカットキーで [Ctrl] + [Shift] + [@] でも開ける VScodeのターミナルで操作する 一番簡単な解決方法:パターン2 スピーカーをOFFにする。 言われるまでもなく、あまり良い解決方法ではない。 情報源 思い付きでVScodeで試したところ、解決に至った。 注意 ただしExtentionや、設定には注意
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails (apiモード)+ Docker + mysql 環境構築(メモ)

はじめに 学習したことのメモとして書いていきます。 ディレクトリ構造 api/  ├ Gemfile  ├ Gemfile.lock  ├ Dockerfile  ├ docker-compose.yml  ├ entrypoint.sh  Dockerfile dockercompose.yml Gemfile entrypoint.sh Dockerfile FROM ruby:2.7.3-buster RUN apt-get update #最新版のyarnをインストールできるように設定 RUN set -x && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo 'deb http://dl.yarnpkg.com/debian/ stable main' > /etc/apt/sources.list.d/yarn.list #nodeのバージョンを指定 RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - && \ apt-get install nodejs RUN apt-get install -y \ build-essential \ libpq-dev \ nodejs \ yarn RUN mkdir /api WORKDIR /api COPY Gemfile /api/ COPY Gemfile.lock /api/ RUN bundle install COPY entrypoint.sh /usr/bin/ #entrypoint.shの権限を付与 RUN chmod +x /usr/bin/entrypoint.sh #entrypoint.shを毎回実行 ENTRYPOINT ["entrypoint.sh"] #ポートを3000にする EXPOSE 3000 CMD ["rails", "server", "-b", "0.0.0.0"] docker-compose.yml version: '3' volumes: db-data: api: build: context: . dockerfile: Dockerfile volumes: - './api:/api' ports: - '8000:3000' tty: true stdin_open: true depends_on: - db links: - db db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: root ports: - '3306:3306' volumes: db-data: でdockervolumeを作成してコンテナ内のデータベースにマウント。詳しくはこちらのブログ。 volumeの場所についてはこちら entrypoint.sh #!/bin/bash set -e # Remove a potentially pre-existing server.pid for Rails. rm -f /myapp/tmp/pids/server.pid # Then exec the container's main process (what's set as CMD in the Dockerfile). exec "$@" Gemfile source 'https://rubygems.org' gem 'rails', '~>6' docker-compose run の実行 この状態でdocker-compose upしてもわたしコンテナはアクティブになりませんでした。 次にコマンドを実行します docker-compose run api rails new . --api --force --database=mysql --skip-bundle --skip-test --skip-bundle : Dockerfileでbundle install するのでbundleをスキップ --force : rails new で作られるファイルがすでに存在する場合上書き --skip-test : rspecを使うのでスキップ この後 docker-compose up を実行します。 database.ymlの編集 またdatabase.ymlのデフォルトの部分を以下のように編集する datbase.yml default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: password host: db 最後にコンテナ内でrails db:create これでdocker-compose up を行った後、指定したポート(今回は8000)でURL(localhost:8000)を入力すればよく見るrails の画面が現れる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

dockerでsymfony & mysql & phpmyAdminのローカル開発環境を作る。

概要 dockerでsymfonyの構築ができたので、動いた時点のファイルをメモしています。 このページは参考ページをもとにしているため、合わせて読むとわかりやすいです。 環境 M1チップMac BigSur 2021/5/11時点で動作。 前提 Docker-syncがインストールされている。 まだの場合、一番下の参考ページにコマンドがあるのでコピペして実行してください。 Dockerは知っている。 コンテナ、イメージ、ボリュームは知っている。 apacheのconfや.htaccessはどういうものかわかる。 MAMPや簡易サーバでなら構築できる。 Linuxの基本はわかる。 参考ページと同じディレクトリ構成を作る。 任意の空のフォルダに移動して、下記のコマンド。 touch create_docker_dir.sh できたファイルに以下をコピペ。 docker-sync.yaml だと この後の工程でエラーになったので拡張子に注意(aが余分)。 docker-comopseは逆にyamlなので紛らわしいです。 また、DockerfileはDockerFileとかくとエラーになります。 ハマるポイントが多いので手でタイプするのはやめた方がいいです。 create_docker_dir.sh #!/bin/bash mkdir app mkdir -p docker/apache docker/php touch docker/apache/my_app.conf touch docker/php/php.ini touch docker/Dockerfile touch .env docker-compose.yaml docker-sync.yml シェルを実行。 sh create_docker_dir.sh DockerFileにコピペする。 DockerFileの内容 参考ページのままだとドライバがないというエラーが起きた。 MySQLを使う場合は以下を追記。 なぜか書かないとsqlLigteのドライバしかない。 他は丸写しだったと思う。 RUN docker-php-ext-install pdo_mysql mysqli ./docker/DockerFile FROM php:7.4-apache RUN cd /etc/apache2/mods-enabled \ && ln -s ../mods-available/rewrite.load RUN a2dissite 000-default WORKDIR /var/www/html RUN apt-get update && apt-get install -y git zip unzip RUN apt-get install -y wget libjpeg-dev libfreetype6-dev RUN apt-get install -y libmagick++-dev \ libmagickwand-dev \ libpq-dev \ libfreetype6-dev \ libjpeg62-turbo-dev \ libpng-dev \ libwebp-dev \ libxpm-dev RUN docker-php-ext-configure gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/ RUN docker-php-ext-install -j$(nproc) gd RUN docker-php-ext-install pdo_mysql mysqli RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && mv /usr/bin/composer.phar /usr/bin/composer docker-composeにコピペする ./docker-comose.yml version: '3' volumes: mysql-database: driver: local my_app_symfony: external: true services: app: container_name: my_app build: ./docker ports: - 8901:80 volumes: - my_app_symfony:/var/www/html - ./docker/php/php.ini:/usr/local/etc/php/php.ini - ./docker/apache/my_app.conf:/etc/apache2/sites-enabled/my_app.conf depends_on: - mysql environment: DATABASE_URL: "mysql://root:root@mysql/app_db" DATABASE_SERVER_VERSION: 10 mysql: image: mysql:5.7 container_name: my_app_app_mysql environment: MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD MYSQL_DATABASE: $DB_NAME TZ: 'Asia/Tokyo' command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci ports: - 13306:3306 platform: linux/x86_64 volumes: - mysql-database:/var/lib/mysql phpmyadmin: image: phpmyadmin/phpmyadmin environment: - PMA_ARBITRARY=1 - PMA_HOST=mysql - PMA_USER=root - PMA_PASSWORD=$DB_ROOT_PASSWORD links: - mysql ports: - 8902:80 volumes: - /sessions docker-syncにコピペする my_app_symfonyの部分は、プロジェクトごとに別の名前をつけないと同じソースコードを参照してしまうので注意。 変更した場合、docker-composeも同じ名前に揃える。 ./docker-sync.yml version: '2' syncs: my_app_symfony: src: './app' sync_host_ip: '127.0.0.1' sync_host_port: '5000' sync_strategy: 'native_osx' sync_excludes: ['.git', '.gitignore', 'node_modules'] .envにコピペする ./.env DB_ROOT_PASSWORD=root DB_NAME=app_db my_app.confにコピペする 参考ページからDirectoryタグの中を追記しました。 公開ディレクトリにAllowOverride Allの記述がないとSymfonyのルーティングが弾かれます。 対象フォルダの.htaccessを有効化する記述みたいです。 ./docker/apache/my_app.conf <VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html/my_app/public ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> <Directory /var/www/html/my_app/public> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> php.iniにコピペする ./docker/php/php.ini memory_limit = 2048M date.timezone = "Asia/Tokyo" mbstring.internal_encoding = "UTF-8" mbstring.language = "Japanese" docker-syncを起動する コンテナから切り離して永続させるフォルダをマウントする。 docker-sync start success Sync container started success Starting Docker-Sync in the background が出て、 .docker-syncディレクトリが新たに出現していたら成功。 コンテナを立ち上げる -d をつけるとバックで処理してくれる。 --build をつけるとDockerFileをコンパイルしてimageを生成しなおす(多分)。 なのでDockerFileを編集したら--buildオプションをつける。 止めるときはdocker-compose down docker-compose up -d --build この時点でこうなっている。 appフォルダの中はまだ空。 Symfonyをインストール コンテナの中に入る symfony/skeletonだとweb関連のファイルがインストールされない。 docker-compose exec app /bin/bash composer create-project symfony/website-skeleton my_app 今、こうなっている。 /app配下がsymfonyプロジェクトになっているようです。 アクセスする。 ここまで合っていれば、以下のページが表示されるはず。 symfony http://localhost:8901/ phpMyAdmin http://localhost:8902/ Symfonyからルーティングできるようにする。 このままの状態では、welcomeページしか表示できません。 他のページにアクセスすると全て404 not found エラーでapacheに弾かれます。 そこでプロジェクトフォルダのpublicフォルダ内に.htaccessを置いて許可設定を記述します。 cd ./app/my_app/public touch .htaccess できたファイルに以下をコピペする。 何か専用のコマンドを打つとできたような気がしますけど、どこで見たか忘れました。 自分で貼り付けても動いているので問題ないと思います。 ./app/my_app/public/.htaccess # Use the front controller as index file. It serves as a fallback solution when # every other rewrite/redirect fails (e.g. in an aliased environment without # mod_rewrite). Additionally, this reduces the matching process for the # start page (path "/") because otherwise Apache will apply the rewriting rules # to each configured DirectoryIndex file (e.g. index.php, index.html, index.pl). DirectoryIndex index.php # By default, Apache does not evaluate symbolic links if you did not enable this # feature in your server configuration. Uncomment the following line if you # install assets as symlinks or if you experience problems related to symlinks # when compiling LESS/Sass/CoffeScript assets. # Options +FollowSymlinks # Disabling MultiViews prevents unwanted negotiation, e.g. "/index" should not resolve # to the front controller "/index.php" but be rewritten to "/index.php/index". <IfModule mod_negotiation.c> Options -MultiViews </IfModule> <IfModule mod_rewrite.c> RewriteEngine On # Determine the RewriteBase automatically and set it as environment variable. # If you are using Apache aliases to do mass virtual hosting or installed the # project in a subdirectory, the base path will be prepended to allow proper # resolution of the index.php file and to redirect to the correct URI. It will # work in environments without path prefix as well, providing a safe, one-size # fits all solution. But as you do not need it in this case, you can comment # the following 2 lines to eliminate the overhead. RewriteCond %{REQUEST_URI}::$0 ^(/.+)/(.*)::\2$ RewriteRule .* - [E=BASE:%1] # Sets the HTTP_AUTHORIZATION header removed by Apache RewriteCond %{HTTP:Authorization} .+ RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0] # Redirect to URI without front controller to prevent duplicate content # (with and without `/index.php`). Only do this redirect on the initial # rewrite by Apache and not on subsequent cycles. Otherwise we would get an # endless redirect loop (request -> rewrite to front controller -> # redirect -> request -> ...). # So in case you get a "too many redirects" error or you always get redirected # to the start page because your Apache does not expose the REDIRECT_STATUS # environment variable, you have 2 choices: # - disable this feature by commenting the following 2 lines or # - use Apache >= 2.3.9 and replace all L flags by END flags and remove the # following RewriteCond (best solution) RewriteCond %{ENV:REDIRECT_STATUS} ="" RewriteRule ^index\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L] # If the requested filename exists, simply serve it. # We only want to let Apache serve files and not directories. # Rewrite all other queries to the front controller. RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ %{ENV:BASE}/index.php [L] </IfModule> <IfModule !mod_rewrite.c> <IfModule mod_alias.c> # When mod_rewrite is not available, we instruct a temporary redirect of # the start page to the front controller explicitly so that the website # and the generated links can still be used. RedirectMatch 307 ^/$ /index.php/ # RedirectTemp cannot be used instead </IfModule> </IfModule> トップページ以外アクセスできるか試す。 テストコントローラを作る。symfonyはアノテーションでルーティングできるので同時にルートが生成されている。 cd ./my_app/ php bin/console make:controller HelloController ここで、composerのphpバージョンが古いというようなエラーが出ました。 以下のコマンドを打ってからもう一度make:controllerしたら動きました。 composer update symfony側からルーティングできているか確認。 php bin/console debug:route apacheにブロックされないことを確認する。 http://localhost:8901/hello 以上 お疲れ様でした。 参考 主に以下のページをもとに、自分の環境で動かなかったところを編集しました。 他にも色々なページをググりまくりましたが、どれをどこでみたか覚えていません。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

dockerでsymfony & mysql & phpmyAdminのローカル開発環境を作る。①

概要 dockerでsymfonyの構築ができたので、動いた時点のファイルをメモしています。 このページは参考ページをもとにしているため、合わせて読むとわかりやすいです。 環境 M1チップMac BigSur 2021/5/11時点で動作。 前提 Docker-syncがインストールされている。 まだの場合、一番下の参考ページにコマンドがあるのでコピペして実行してください。 Dockerは知っている。 コンテナ、イメージ、ボリュームは知っている。 apacheのconfや.htaccessはどういうものかわかる。 MAMPや簡易サーバでなら構築できる。 Linuxの基本はわかる。 参考ページと同じディレクトリ構成を作る。 任意の空のフォルダに移動して、下記のコマンド。 touch create_docker_dir.sh できたファイルに以下をコピペ。 docker-sync.yaml だと この後の工程でエラーになったので拡張子に注意(aが余分)。 docker-comopseは逆にyamlなので紛らわしいです。 また、DockerfileはDockerFileとかくとエラーになります。 ハマるポイントが多いので手でタイプするのはやめた方がいいです。 create_docker_dir.sh #!/bin/bash mkdir app mkdir -p docker/apache docker/php touch docker/apache/my_app.conf touch docker/php/php.ini touch docker/Dockerfile touch .env docker-compose.yaml docker-sync.yml シェルを実行。 sh create_docker_dir.sh DockerFileにコピペする。 DockerFileの内容 参考ページのままだとドライバがないというエラーが起きた。 MySQLを使う場合は以下を追記。 なぜか書かないとsqlLigteのドライバしかない。 他は丸写しだったと思う。 RUN docker-php-ext-install pdo_mysql mysqli ./docker/DockerFile FROM php:7.4-apache RUN cd /etc/apache2/mods-enabled \ && ln -s ../mods-available/rewrite.load RUN a2dissite 000-default WORKDIR /var/www/html RUN apt-get update && apt-get install -y git zip unzip RUN apt-get install -y wget libjpeg-dev libfreetype6-dev RUN apt-get install -y libmagick++-dev \ libmagickwand-dev \ libpq-dev \ libfreetype6-dev \ libjpeg62-turbo-dev \ libpng-dev \ libwebp-dev \ libxpm-dev RUN docker-php-ext-configure gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/ RUN docker-php-ext-install -j$(nproc) gd RUN docker-php-ext-install pdo_mysql mysqli RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && mv /usr/bin/composer.phar /usr/bin/composer docker-composeにコピペする ./docker-comose.yml version: '3' volumes: mysql-database: driver: local my_app_symfony: external: true services: app: container_name: my_app build: ./docker ports: - 8901:80 volumes: - my_app_symfony:/var/www/html - ./docker/php/php.ini:/usr/local/etc/php/php.ini - ./docker/apache/my_app.conf:/etc/apache2/sites-enabled/my_app.conf depends_on: - mysql environment: DATABASE_URL: "mysql://root:root@mysql/app_db" DATABASE_SERVER_VERSION: 10 mysql: image: mysql:5.7 container_name: my_app_app_mysql environment: MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD MYSQL_DATABASE: $DB_NAME TZ: 'Asia/Tokyo' command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci ports: - 13306:3306 platform: linux/x86_64 volumes: - mysql-database:/var/lib/mysql phpmyadmin: image: phpmyadmin/phpmyadmin environment: - PMA_ARBITRARY=1 - PMA_HOST=mysql - PMA_USER=root - PMA_PASSWORD=$DB_ROOT_PASSWORD links: - mysql ports: - 8902:80 volumes: - /sessions docker-syncにコピペする my_app_symfonyの部分は、プロジェクトごとに別の名前をつけないと同じソースコードを参照してしまうので注意。 変更した場合、docker-composeも同じ名前に揃える。 ./docker-sync.yml version: '2' syncs: my_app_symfony: src: './app' sync_host_ip: '127.0.0.1' sync_host_port: '5000' sync_strategy: 'native_osx' sync_excludes: ['.git', '.gitignore', 'node_modules'] .envにコピペする ./.env DB_ROOT_PASSWORD=root DB_NAME=app_db my_app.confにコピペする 参考ページからDirectoryタグの中を追記しました。 公開ディレクトリにAllowOverride Allの記述がないとSymfonyのルーティングが弾かれます。 対象フォルダの.htaccessを有効化する記述みたいです。 ./docker/apache/my_app.conf <VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html/my_app/public ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> <Directory /var/www/html/my_app/public> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> php.iniにコピペする ./docker/php/php.ini memory_limit = 2048M date.timezone = "Asia/Tokyo" mbstring.internal_encoding = "UTF-8" mbstring.language = "Japanese" docker-syncを起動する コンテナから切り離して永続させるフォルダをマウントする。 docker-sync start success Sync container started success Starting Docker-Sync in the background が出て、 .docker-syncディレクトリが新たに出現していたら成功。 コンテナを立ち上げる -d をつけるとバックで処理してくれる。 --build をつけるとDockerFileをコンパイルしてimageを生成しなおす(多分)。 なのでDockerFileを編集したら--buildオプションをつける。 止めるときはdocker-compose down docker-compose up -d --build この時点でこうなっている。 appフォルダの中はまだ空。 Symfonyをインストール コンテナの中に入る symfony/skeletonだとweb関連のファイルがインストールされない。 docker-compose exec app /bin/bash composer create-project symfony/website-skeleton my_app 今、こうなっている。 /app配下がsymfonyプロジェクトになっているようです。 アクセスする。 ここまで合っていれば、以下のページが表示されるはず。 symfony http://localhost:8901/ phpMyAdmin http://localhost:8902/ Symfonyからルーティングできるようにする。 このままの状態では、welcomeページしか表示できません。 他のページにアクセスすると全て404 not found エラーでapacheに弾かれます。 そこでプロジェクトフォルダのpublicフォルダ内に.htaccessを置いて許可設定を記述します。 cd ./app/my_app/public touch .htaccess できたファイルに以下をコピペする。 何か専用のコマンドを打つとできたような気がしますけど、どこで見たか忘れました。 自分で貼り付けても動いているので問題ないと思います。 ./app/my_app/public/.htaccess # Use the front controller as index file. It serves as a fallback solution when # every other rewrite/redirect fails (e.g. in an aliased environment without # mod_rewrite). Additionally, this reduces the matching process for the # start page (path "/") because otherwise Apache will apply the rewriting rules # to each configured DirectoryIndex file (e.g. index.php, index.html, index.pl). DirectoryIndex index.php # By default, Apache does not evaluate symbolic links if you did not enable this # feature in your server configuration. Uncomment the following line if you # install assets as symlinks or if you experience problems related to symlinks # when compiling LESS/Sass/CoffeScript assets. # Options +FollowSymlinks # Disabling MultiViews prevents unwanted negotiation, e.g. "/index" should not resolve # to the front controller "/index.php" but be rewritten to "/index.php/index". <IfModule mod_negotiation.c> Options -MultiViews </IfModule> <IfModule mod_rewrite.c> RewriteEngine On # Determine the RewriteBase automatically and set it as environment variable. # If you are using Apache aliases to do mass virtual hosting or installed the # project in a subdirectory, the base path will be prepended to allow proper # resolution of the index.php file and to redirect to the correct URI. It will # work in environments without path prefix as well, providing a safe, one-size # fits all solution. But as you do not need it in this case, you can comment # the following 2 lines to eliminate the overhead. RewriteCond %{REQUEST_URI}::$0 ^(/.+)/(.*)::\2$ RewriteRule .* - [E=BASE:%1] # Sets the HTTP_AUTHORIZATION header removed by Apache RewriteCond %{HTTP:Authorization} .+ RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0] # Redirect to URI without front controller to prevent duplicate content # (with and without `/index.php`). Only do this redirect on the initial # rewrite by Apache and not on subsequent cycles. Otherwise we would get an # endless redirect loop (request -> rewrite to front controller -> # redirect -> request -> ...). # So in case you get a "too many redirects" error or you always get redirected # to the start page because your Apache does not expose the REDIRECT_STATUS # environment variable, you have 2 choices: # - disable this feature by commenting the following 2 lines or # - use Apache >= 2.3.9 and replace all L flags by END flags and remove the # following RewriteCond (best solution) RewriteCond %{ENV:REDIRECT_STATUS} ="" RewriteRule ^index\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L] # If the requested filename exists, simply serve it. # We only want to let Apache serve files and not directories. # Rewrite all other queries to the front controller. RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ %{ENV:BASE}/index.php [L] </IfModule> <IfModule !mod_rewrite.c> <IfModule mod_alias.c> # When mod_rewrite is not available, we instruct a temporary redirect of # the start page to the front controller explicitly so that the website # and the generated links can still be used. RedirectMatch 307 ^/$ /index.php/ # RedirectTemp cannot be used instead </IfModule> </IfModule> トップページ以外アクセスできるか試す。 テストコントローラを作る。symfonyはアノテーションでルーティングできるので同時にルートが生成されている。 cd ./my_app/ php bin/console make:controller HelloController ここで、composerのphpバージョンが古いというようなエラーが出ました。 以下のコマンドを打ってからもう一度make:controllerしたら動きました。 composer update symfony側からルーティングできているか確認。 php bin/console debug:route apacheにブロックされないことを確認する。 http://localhost:8901/hello 続き この後、symfonyでエンティティ作ってマイグレーションしたらエラーでつまづいたので、 その対処法を以下に書きました。 参考 主に以下のページをもとに、自分の環境で動かなかったところを編集しました。 他にも色々なページをググりまくりましたが、どれをどこでみたか覚えていません。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

dockerでsymfonyのローカル開発環境を作る。(編集中)

概要 dockerでsymfonyの構築ができたので、動いた時点のファイルをメモしています。 このページは参考ページをもとにしているため、合わせて読むとわかりやすいです。 環境 M1チップMac BigSur 2021/5/11時点で動作。 前提 Docker-syncがインストールされている。 まだの場合、一番下の参考ページにコマンドがあるのでコピペして実行してください。 Dockerは知っている。 コンテナ、イメージ、ボリュームは知っている。 apacheのconfや.htaccessはどういうものかわかる。 MAMPや簡易サーバでなら構築できる。 Linuxの基本はわかる。 参考ページと同じディレクトリ構成を作る。 任意の空のフォルダに移動して、下記のコマンド。 touch create_docker_dir.sh できたファイルに以下をコピペ。 docker-sync.yaml だと この後の工程でエラーになったので拡張子に注意(aが余分)。 docker-comopseは逆にyamlなので紛らわしいです。 また、DockerfileはDockerFileとかくとエラーになります。 ハマるポイントが多いので手でタイプするのはやめた方がいいです。 create_docker_dir.sh #!/bin/bash mkdir app mkdir -p docker/apache docker/php touch docker/apache/my_app.conf touch docker/php/php.ini touch docker/Dockerfile touch .env docker-compose.yaml docker-sync.yml シェルを実行。 sh create_docker_dir.sh DockerFileにコピペする。 DockerFileの内容 参考ページのままだとドライバがないというエラーが起きた。 MySQLを使う場合は以下を追記。 なぜか書かないとsqlLigteのドライバしかない。 他は丸写しだったと思う。 RUN docker-php-ext-install pdo_mysql mysqli ./docker/DockerFile FROM php:7.4-apache RUN cd /etc/apache2/mods-enabled \ && ln -s ../mods-available/rewrite.load RUN a2dissite 000-default WORKDIR /var/www/html RUN apt-get update && apt-get install -y git zip unzip RUN apt-get install -y wget libjpeg-dev libfreetype6-dev RUN apt-get install -y libmagick++-dev \ libmagickwand-dev \ libpq-dev \ libfreetype6-dev \ libjpeg62-turbo-dev \ libpng-dev \ libwebp-dev \ libxpm-dev RUN docker-php-ext-configure gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/ RUN docker-php-ext-install -j$(nproc) gd RUN docker-php-ext-install pdo_mysql mysqli RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && mv /usr/bin/composer.phar /usr/bin/composer docker-composeにコピペする ./docker-comose.yml version: '3' volumes: mysql-database: driver: local my_app_symfony: external: true services: app: container_name: my_app build: ./docker ports: - 8901:80 volumes: - my_app_symfony:/var/www/html - ./docker/php/php.ini:/usr/local/etc/php/php.ini - ./docker/apache/my_app.conf:/etc/apache2/sites-enabled/my_app.conf depends_on: - mysql environment: DATABASE_URL: "mysql://root:root@mysql/app_db" DATABASE_SERVER_VERSION: 10 mysql: image: mysql:5.7 container_name: my_app_app_mysql environment: MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD MYSQL_DATABASE: $DB_NAME TZ: 'Asia/Tokyo' command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci ports: - 13306:3306 platform: linux/x86_64 volumes: - mysql-database:/var/lib/mysql phpmyadmin: image: phpmyadmin/phpmyadmin environment: - PMA_ARBITRARY=1 - PMA_HOST=mysql - PMA_USER=root - PMA_PASSWORD=$DB_ROOT_PASSWORD links: - mysql ports: - 8902:80 volumes: - /sessions docker-syncにコピペする my_app_symfonyの部分は、プロジェクトごとに別の名前をつけないと同じソースコードを参照してしまうので注意。 変更した場合、docker-composeも同じ名前に揃える。 ./docker-sync.yml version: '2' syncs: my_app_symfony: src: './app' sync_host_ip: '127.0.0.1' sync_host_port: '5000' sync_strategy: 'native_osx' sync_excludes: ['.git', '.gitignore', 'node_modules'] .envにコピペする ./.env DB_ROOT_PASSWORD=root DB_NAME=app_db my_app.confにコピペする ./docker/apache/my_app.conf <VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html/my_app/public ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> <Directory /var/www/html/my_app/public> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> php.iniにコピペする ./docker/php/php.ini memory_limit = 2048M date.timezone = "Asia/Tokyo" mbstring.internal_encoding = "UTF-8" mbstring.language = "Japanese" docker-syncを起動する コンテナから切り離して永続させるフォルダをマウントする。 docker-sync start success Sync container started success Starting Docker-Sync in the background が出て、 .docker-syncディレクトリが新たに出現していたら成功。 コンテナを立ち上げる -d をつけるとバックで処理してくれる。 --build をつけるとDockerFileをコンパイルしてimageを生成しなおす(多分)。 なのでDockerFileを編集したら--buildオプションをつける。 止めるときはdocker-compose down docker-compose up -d --build この時点でこうなっている。 appフォルダの中はまだ空。 Symfonyをインストール コンテナの中に入る symfony/skeletonだとweb関連のファイルがインストールされない。 docker-compose exec app /bin/bash composer create-project symfony/website-skeleton my_app 今、こうなっている。 /app配下がsymfonyプロジェクトになっているようです。 アクセスする。 ここまで合っていれば、以下のページが表示されるはず。 symfony http://localhost:8901/ phpMyAdmin http://localhost:8902/ Symfonyからルーティングできるようにする。 このままの状態では、welcomeページしか表示できません。 他のページにアクセスすると全て404 not found エラーでapacheに弾かれます。 そこでプロジェクトフォルダのpublicフォルダ内に.htaccessを置いて許可設定を記述します。 cd ./app/my_app/public touch .htaccess できたファイルに以下をコピペする。 何か専用のコマンドを打つとできたような気がしますけど、どこで見たか忘れました。 自分で貼り付けても動いているので問題ないと思います。 ./app/my_app/public/.htaccess # Use the front controller as index file. It serves as a fallback solution when # every other rewrite/redirect fails (e.g. in an aliased environment without # mod_rewrite). Additionally, this reduces the matching process for the # start page (path "/") because otherwise Apache will apply the rewriting rules # to each configured DirectoryIndex file (e.g. index.php, index.html, index.pl). DirectoryIndex index.php # By default, Apache does not evaluate symbolic links if you did not enable this # feature in your server configuration. Uncomment the following line if you # install assets as symlinks or if you experience problems related to symlinks # when compiling LESS/Sass/CoffeScript assets. # Options +FollowSymlinks # Disabling MultiViews prevents unwanted negotiation, e.g. "/index" should not resolve # to the front controller "/index.php" but be rewritten to "/index.php/index". <IfModule mod_negotiation.c> Options -MultiViews </IfModule> <IfModule mod_rewrite.c> RewriteEngine On # Determine the RewriteBase automatically and set it as environment variable. # If you are using Apache aliases to do mass virtual hosting or installed the # project in a subdirectory, the base path will be prepended to allow proper # resolution of the index.php file and to redirect to the correct URI. It will # work in environments without path prefix as well, providing a safe, one-size # fits all solution. But as you do not need it in this case, you can comment # the following 2 lines to eliminate the overhead. RewriteCond %{REQUEST_URI}::$0 ^(/.+)/(.*)::\2$ RewriteRule .* - [E=BASE:%1] # Sets the HTTP_AUTHORIZATION header removed by Apache RewriteCond %{HTTP:Authorization} .+ RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0] # Redirect to URI without front controller to prevent duplicate content # (with and without `/index.php`). Only do this redirect on the initial # rewrite by Apache and not on subsequent cycles. Otherwise we would get an # endless redirect loop (request -> rewrite to front controller -> # redirect -> request -> ...). # So in case you get a "too many redirects" error or you always get redirected # to the start page because your Apache does not expose the REDIRECT_STATUS # environment variable, you have 2 choices: # - disable this feature by commenting the following 2 lines or # - use Apache >= 2.3.9 and replace all L flags by END flags and remove the # following RewriteCond (best solution) RewriteCond %{ENV:REDIRECT_STATUS} ="" RewriteRule ^index\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L] # If the requested filename exists, simply serve it. # We only want to let Apache serve files and not directories. # Rewrite all other queries to the front controller. RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ %{ENV:BASE}/index.php [L] </IfModule> <IfModule !mod_rewrite.c> <IfModule mod_alias.c> # When mod_rewrite is not available, we instruct a temporary redirect of # the start page to the front controller explicitly so that the website # and the generated links can still be used. RedirectMatch 307 ^/$ /index.php/ # RedirectTemp cannot be used instead </IfModule> </IfModule> トップページ以外アクセスできるか試す。 テストコントローラを作る。symfonyはアノテーションでルーティングできるので同時にルートが生成されている。 cd ./my_app/ php bin/console make:controller HelloController ここで、composerのphpバージョンが古いというようなエラーが出ました。 以下のコマンドを打ってからもう一度make:controllerしたら動きました。 composer update symfony側からルーティングできているか確認。 php bin/console debug:route apacheにブロックされないことを確認する。 http://localhost:8901/hello 以上 お疲れ様でした。 参考 主に以下のページをもとに、自分の環境で動かなかったところを編集しました。 他にも色々なページをググりまくりましたが、どれをどこでみたか覚えていません。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Rspec]未解決:Dockerを導入後、Rspecでエラーが発生

はじめに dockerとdocker-composeを導入したはいいが、テストでめちゃくちゃエラーがでたので備忘として記録する エラー内容 結合テストのみ例外なくエラーが発生 (一部抜粋) 47) Practices 投稿編集 投稿編集できないとき ログイン後、編集ページで、誤った情報が入力されているとエラー Failure/Error: url: ENV.fetch("SELENIUM_DRIVER_URL"), KeyError: key not found: "SELENIUM_DRIVER_URL" # ./spec/support/capybara.rb:7:in `fetch' # ./spec/support/capybara.rb:7:in `block (2 levels) in <main>' 試したこと おそらく自分が知らない知識として、「Docker上で結合テストを行うには環境構築が必要のなのだろう」と仮説を立てて、情報収集をおこなう。 こちらの記事に行き着くも,一向に変化はなし。 なお、ローカル上では間違いなくテストは成功していたことを考えると、間違いなくDockerを導入したことが影響していると考えられるので、ここらへんを疑って引き続き考えていきたい コード FROM ruby:2.6.5 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 RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs yarn WORKDIR /soccer_app COPY Gemfile /soccer_app/Gemfile COPY Gemfile.lock /soccer_app/Gemfile.lock RUN gem install bundler RUN bundle install COPY . /soccer_app RUN yarn install --check-files RUN bundle exec rails webpacker:compile docker-compose.yml version: "3" services: db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: "password" ports: - "4306:3306" selenium_chrome: image: selenium/standalone-chrome-debug logging: driver: none web: build: . command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" volumes: - .:/soccer_app ports: - "3000:3000" depends_on: - db stdin_open: true tty: true environment: BASIC_AUTH_USER: ${BASIC_AUTH_USER:-default} BASIC_AUTH_PASSWORD: ${BASIC_AUTH_PASSWORD-default} Gemfile. source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby '2.6.5' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '~> 6.0.0' # Use mysql as the database for Active Record gem 'mysql2', '>= 0.4.4' # Use Puma as the app server gem 'puma', '~> 3.11' # Use SCSS for stylesheets gem 'sass-rails', '~> 5' # Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker gem 'webpacker', '~> 4.0' # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks gem 'turbolinks', '~> 5' # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder gem 'jbuilder', '~> 2.7' # Use Redis adapter to run Action Cable in production # gem 'redis', '~> 4.0' # Use Active Model has_secure_password # gem 'bcrypt', '~> 3.1.7' # Use Active Storage variant # gem 'image_processing', '~> 1.2' # Reduces boot times through caching; required in config/boot.rb gem 'bootsnap', '>= 1.4.2', require: false group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] gem 'rspec-rails', '~> 4.0.0' gem 'factory_bot_rails' gem 'faker' gem 'rubocop', require: false end group :development do # Access an interactive console on exception pages or by calling 'console' anywhere in the code. gem 'web-console', '>= 3.3.0' gem 'listen', '>= 3.0.5', '< 3.2' gem 'rubocop', require: false # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring gem 'spring' gem 'spring-watcher-listen', '~> 2.0.0' end group :test do # Adds support for Capybara system testing and selenium driver gem 'capybara', '>= 2.15' gem 'selenium-webdriver' # Easy installation and use of web drivers to run system tests with browsers gem 'webdrivers' end # Windows does not include zoneinfo files, so bundle the tzinfo-data gem gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] gem 'devise' gem 'pry-rails' gem 'active_hash' gem 'carrierwave', '~> 1.3', '>= 1.3.1' gem 'mini_magick' gem 'image_processing', '~> 1.2' gem 'rails-i18n' gem 'kaminari' gem "gretel" gem 'simple_calendar', '~> 2.0' gem "aws-sdk-s3", require: false capybara.rb require 'capybara/rspec' RSpec.configure do |config| config.before(:each, type: :system) do driven_by :selenium, using: :headless_chrome, options: { browser: :remote, url: ENV.fetch("SELENIUM_DRIVER_URL"), desired_capabilities: :chrome } Capybara.server_host = 'web' Capybara.app_host='http://web' end end おわりに 今回はまじで解決しなさそうな匂いがぷんぷんしますが、諦めず、前向きに取り組んでいきます! はやくこの記事を解決済みに更新したいな〜
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerでOracleのデータをCSVに出力する

クエリを与えたら、結果をCSVに出力するDockerです。 Dockerfile と query.py を同じディレクトリに配置してビルドします。 $ docker build -t ora_export . Dockerfile FROM oraclelinux:7-slim # Proxy必要の場合 # ENV https_proxy=http://proxy.hoge.com RUN yum -y install oracle-release-el7 && \ yum -y install oracle-instantclient19.3-basiclite && \ yum -y install vim && \ yum -y install python36 && \ python3.6 -m pip install cx_Oracle pandas && \ rm -rf /var/cache/yum WORKDIR /myapp ADD query.py /myapp ENTRYPOINT ["python3.6", "query.py"] query.py import sys import cx_Oracle as cxo import pandas as pd args = sys.argv user = args[1] password = args[2] dsn = args[3] connection = cxo.connect(user=user, password=password, dsn=dsn) query = sys.stdin.read() pd_data_frame = pd.read_sql(query, con=connection) pd_data_frame.to_csv(sys.stdout, index=False, encoding="utf-8") connection.close() 使い方のサンプルです。 query.sql を作成してコマンドを実行すると、export.csv が出力されます。 query.sql select systimestamp from dual コマンド $ cat query.sql | docker run --rm -i ora_export username password 192.168.1.103:1521/ORCL > export.csv export.csv SYSTIMESTAMP 2021-05-11 17:56:07.044225 参考にした記事
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

OCIでNginxのDockerイメージを利用する

初めに OCI(Oracle Cloud Infrastructure)で、簡単にNginxのDockerイメージを利用できます。今回は、以下のことをご紹介します。 OCIのComputeインスタンスに、Dockerをインストールする Nginxの利用方法 (HTTP/HTTPS) 実行中のコンテナーよりDockerイメージを作成 DockerイメージをOCI Registryにプッシュ 事前準備 Computeインスタンスを用意しておきます。(Oracle Linux 7.9を例に) 今回の例は、インターネットからのアクセスは必要で、Computeインスタンスをパブリック・サブネットに配置し、Internet GWを設定します。 セキュリティ・リストのIngress Ruleに、TCP 8080/8081ポートを許可します。 OCI Registryを利用するため、認証トークン(Auth Token)を事前に用意してください。作成方法は、ドキュメントをご参考ください。ここで省略します。 Dockerのインストール Computeインスタンスにログインした後、以下のコマンドでDockerをインストールします。 [opc@linux7-9 ~]$ sudo yum -y update <省略> [opc@linux7-9 ~]$ sudo yum install -y docker-engine <省略> Dockerの起動 [opc@linux7-9 ~]$ sudo systemctl start docker [opc@linux7-9 ~]$ sudo systemctl enable docker Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service. Nginxの利用方法 (HTTP/HTTPS) Nginxのイメージをダウンロードする コマンド例:docker pull nginx [opc@linux7-9 ~]$ sudo docker pull nginx Using default tag: latest Trying to pull repository docker.io/library/nginx ... latest: Pulling from docker.io/library/nginx 75646c2fb410: Pull complete 6128033c842f: Pull complete 71a81b5270eb: Pull complete b5fc821c48a1: Pull complete da3f514a6428: Pull complete 3be359fed358: Pull complete Digest: sha256:bae781e7f518e0fb02245140c97e6ddc9f5fcf6aecc043dd9d17e33aec81c832 Status: Downloaded newer image for nginx:latest nginx:latest [opc@linux7-9 ~]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 7ce4f91ef623 2 days ago 133MB [opc@linux7-9 ~]$ Nginxの起動 (HTTP) コマンド例:docker run --rm -d -p 8080:80 --name web nginx パラメータの意味: --rm 終了時にコンテナーを自動的に削除 -d バックグラウンド実行 -p ホストに対してコンテナーのポートを公開 (外部から8080ポートを利用) --name コンテナーに名前を割り当てる [opc@linux7-9 ~]$ sudo docker run --rm -d -p 8080:80 --name web nginx 90c2d54d7522af4e8be268640eccd1da65fa1be93210327c885b02bad9c226bc [opc@linux7-9 ~]$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 90c2d54d7522 nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:8080->80/tcp web [opc@linux7-9 ~]$ WEBブラウザでComputeインスタンスのURLを入力し、Nginxの動作を確認します。 http://<IP Address>:8080 Nginxを停止します。(停止後、コンテナーが削除されます。) コマンド例:docker stop nginx [opc@linux7-9 ~]$ sudo docker stop web web [opc@linux7-9 ~]$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [opc@linux7-9 ~]$ デモ用ページを作成します。 [opc@linux7-9 ~]$ pwd /home/opc [opc@linux7-9 ~]$ mkdir -p nginx-demo/html [opc@linux7-9 ~]$ echo "<h1>Hello Nginx</h1>" > nginx-demo/html/index.html [opc@linux7-9 ~]$ Nginxを起動する時、"-v"のパラメータを利用し、ロカールのデモページをマウントします。 [opc@linux7-9 ~]$ sudo docker run --rm -d -p 8080:80 -v /home/opc/nginx-demo/html:/usr/share/nginx/html --name web nginx 416decd04916337009b030dbaaf67c749a86a4c5dafa62003901774abc2a2c1d [opc@linux7-9 ~]$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 416decd04916 nginx "/docker-entrypoint.…" 10 seconds ago Up 8 seconds 0.0.0.0:8080->80/tcp web [opc@linux7-9 ~]$ ページが置き換えられるのを確認します。 curlコマンドでの確認 [opc@linux7-9 ~]$ curl localhost:8080 <h1>Hello Nginx</h1> [opc@linux7-9 ~]$ HTTPSの利用 Nginxの設定をコンテナーからコピーします。 [opc@linux7-9 ~]$ pwd /home/opc [opc@linux7-9 ~]$ sudo docker cp web:/etc/nginx . [opc@linux7-9 ~]$ ll total 4 drwxr-xr-x. 3 root root 4096 Mar 31 05:24 nginx drwxrwxr-x. 3 opc opc 18 Apr 7 08:37 nginx-demo [opc@linux7-9 ~]$ コピー後、Nginxを停止します。 [opc@linux7-9 ~]$ sudo docker stop web web [opc@linux7-9 ~]$ HTTPSを利用するため、OpenSSLで証明書を作成します。  -keyout: 秘密鍵ファイル  -out: 証明書ファイル 下記OpenSSLコマンドを実施した後、nginx.keyとnginx.crtが作成されます。 [opc@linux7-9 nginx]$ pwd /home/opc/nginx [opc@linux7-9 nginx]$ sudo mkdir cert [opc@linux7-9 nginx]$ cd cert [opc@linux7-9 cert]$ sudo openssl req -x509 -nodes -newkey rsa:2048 -keyout nginx.key -out nginx.crt Generating a 2048 bit RSA private key .........................................................................+++ ....+++ writing new private key to 'nginx.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]: State or Province Name (full name) []: Locality Name (eg, city) [Default City]: Organization Name (eg, company) [Default Company Ltd]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []: Email Address []: [opc@linux7-9 cert]$ pwd /home/opc/nginx/cert [opc@linux7-9 cert]$ ll total 8 -rw-r--r--. 1 root root 1281 Apr 7 09:37 nginx.crt -rw-r--r--. 1 root root 1704 Apr 7 09:37 nginx.key [opc@linux7-9 cert]$ 設定ファイル(nginx/conf.d/default.conf)を編集します。 [opc@linux7-9 conf.d]$ pwd /home/opc/nginx/conf.d [opc@linux7-9 conf.d]$ sudo vi default.conf 以下の内容を最後に追加します。 server { listen 443 ssl; server_name localhost; ssl on; ssl_certificate /etc/nginx/cert/nginx.crt; ssl_certificate_key /etc/nginx/cert/nginx.key; ssl_session_timeout 3m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location / { root /usr/share/nginx/html; index index.html index.htm; } } 新しいコンテナーでNginxを再起動します。 追加したパラメータの意味: HTTPSポートを公開 (8081->443) ロカールのファイルをマウント [opc@linux7-9 conf.d]$ sudo docker run --rm -d -p 8080:80 -p 8081:443 \ \> -v /home/opc/nginx-demo/html:/usr/share/nginx/html -v /home/opc/nginx:/etc/nginx \ \> --name web nginx e7024bb33c29f1fd99f77586b443d4597eb4784d569f43b5cc83a7fcb60d41da [opc@linux7-9 conf.d]$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e7024bb33c29 nginx "/docker-entrypoint.…" 12 seconds ago Up 11 seconds 0.0.0.0:8080->80/tcp, 0.0.0.0:8081->443/tcp web [opc@linux7-9 conf.d]$ HTTPSのURLを入力し、Nginxの動作を確認します。警告のメッセージが表示されたら、"Advanced"をクリックし、進んでください。 https://<IP Address>:8081 デモ用ページが表示されます。 curlコマンドでの確認 [opc@linux7-9 ~]$ curl https://localhost:8081 -k <h1>Hello Nginx</h1> [opc@linux7-9 ~]$ 実行中のコンテナーよりDockerイメージを作成 上記の例で利用したコンテナーを停止し、新しいコンテナーを作成します。 [opc@linux7-9 ~]$ sudo docker stop web web [opc@linux7-9 ~]$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [opc@linux7-9 ~]$ 今回、新しいコンテナーを作成する時、"-v"(マウント)を利用しません。(HTTP/HTTPSポートの公開は上記と同様。) [opc@linux7-9 ~]$ sudo docker run --name web --rm -d -p 8080:80 -p 8081:443 nginx 210f4ef2decf4460ab882e20136ade6d1c2aa962e8350fd1a86afa702cea4890 [opc@linux7-9 ~]$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 210f4ef2decf nginx "/docker-entrypoint.…" 11 seconds ago Up 10 seconds 0.0.0.0:8080->80/tcp, 0.0.0.0:8081->443/tcp web [opc@linux7-9 ~]$ 新しいイメージを作成するのに、以下のファイルをコピーします。 1) コンテナー内のファイルをロカールのindex.htmlに置き換えます。 [opc@linux7-9 ~]$ cat /home/opc/nginx-demo/html/index.html <h1>Hello Nginx</h1> [opc@linux7-9 ~]$ sudo docker cp /home/opc/nginx-demo/html/index.html web:/usr/share/nginx/html/index.html [opc@linux7-9 ~]$ 2) default.confと証明書ファイルをコンテナーにコピーします。 [opc@linux7-9 ~]$ sudo docker cp /home/opc/nginx/conf.d/default.conf web:/etc/nginx/conf.d/default.conf [opc@linux7-9 ~]$ sudo docker cp /home/opc/nginx/cert web:/etc/nginx/cert [opc@linux7-9 ~]$ コピー後、コンテナーを再起動します。 (注意:再起動しないと、HTTPSの修正箇所が反映されません。) [opc@linux7-9 ~]$ sudo docker restart web web [opc@linux7-9 ~]$ 新しいイメージを作成 コマンド例:docker commit <CONTAINER> <REPOSITORY>:<TAG> 例:docker commit web nginx_demo:latest [opc@linux7-9 ~]$ sudo docker commit web nginx_demo:latest sha256:1a6774abd5a84528de51462acbd7ebc58d0e17e3048a24f46f5909cdeaceed7b [opc@linux7-9 ~]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx_demo latest 1a6774abd5a8 10 seconds ago 133MB nginx latest 7ce4f91ef623 5 weeks ago 133MB [opc@linux7-9 ~]$ 実行中のコンテナーを停止し、新しいイメージ(nginx_demo)よりコンテナーを作成します。 [opc@linux7-9 ~]$ sudo docker stop web web [opc@linux7-9 ~]$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [opc@linux7-9 ~]$ sudo docker run --name web --rm -d -p 8080:80 -p 8081:443 nginx_demo c50b3c43f45c96e7a5429eebda2d05042e293051a5693ae8978d982412da3a1a [opc@linux7-9 ~]$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c50b3c43f45c nginx_demo "/docker-entrypoint.…" 25 seconds ago Up 23 seconds 0.0.0.0:8080->80/tcp, 0.0.0.0:8081->443/tcp web [opc@linux7-9 ~]$ curlコマンドで確認します。 (Webブラウザでもよい) [opc@linux7-9 ~]$ curl localhost:8080 <h1>Hello Nginx</h1> [opc@linux7-9 ~]$ curl https://localhost:8081 -k <h1>Hello Nginx</h1> [opc@linux7-9 ~]$ ここまで、新しいイメージの作成は完了です。 DockerイメージをOCI Registryにプッシュ レポジトリの作成 OCI Registryに、レポジトリを作成します。 MENU->Developer Services->Containers->Container Registry レポジトリの名前には、大文字の入力ができません。 作成後: ポリシーの作成 管理者以外のユーザで実施した場合、以下のようなポリシーを作成します。 ポリシー名:任意 Compartment: root/PoC (例) ステートメント: Allow group OCIR-Repo-Group to use repos in compartment PoC (実施ユーザは、OCIR-Repo-Groupに追加) OCI Registryにログイン コマンド:docker login <region-key>.ocir.io <region-key>: 東京リージョンの場合、nrtとなります。 確認方法は、一覧表をご参照ください。 コマンド実施後、ユーザ名とパスワードの入力が要求されます。 ユーザ名: <tenancy-namespace>/<user-name> <tenancy-namespace>は、上記の"Container Registry"画面に表示された値です。 <user-name>は、IDCSユーザかOCIユーザの名前です。 IDCSユーザの場合、"oracleidentitycloudservice/xxxxxx"という形式で入力してください。 パスワード: 事前に作成した認証トークン(Auth Token)の値です。 注意:一部の古いテナンシーの場合、Namepspaceの名前とテナンシーの名前は同じですけど、そもそも別物なので、間違いようにNamespaceの値を確認してください。 [opc@linux7-9 ~]$ sudo docker login nrt.ocir.io Username: tenancy-namespace/oracleidentitycloudservice/username Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded [opc@linux7-9 ~]$ イメージにタグを付ける プッシュしようとしているイメージにタグを付けます。 コマンド:docker tag <image-identifier> <target-tag> <target-tag>のフォーマット: <region-key>.ocir.io/<tenancy-namespace>/<repo-name>:<tag> 例:docker tag 1a6774abd5a8 nrt.ocir.io/<tenancy-namespace>/repo-nginx:latest [opc@linux7-9 ~]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx_demo latest 1a6774abd5a8 13 hours ago 133MB nginx latest 7ce4f91ef623 5 weeks ago 133MB [opc@linux7-9 ~]$ sudo docker tag 1a6774abd5a8 nrt.ocir.io/namespace/repo-nginx:latest [opc@linux7-9 ~]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx_demo latest 1a6774abd5a8 16 hours ago 133MB nrt.ocir.io/namespace/repo-nginx latest 1a6774abd5a8 16 hours ago 133MB nginx latest 7ce4f91ef623 5 weeks ago 133MB [opc@linux7-9 ~]$ Dockerイメージをプッシュ コマンド:docker push <target-tag> 例:docker push nrt.ocir.io/<namespace>/repo-nginx:latest [opc@linux7-9 ~]$ sudo docker push nrt.ocir.io/namespace/repo-nginx The push refers to repository [nrt.ocir.io/namespace/repo-nginx] 70a619e5ea7e: Pushed 1914a564711c: Pushed db765d5bf9f8: Pushed 903ae422d007: Pushed 66f88fdd699b: Pushed 2ba086d0a00c: Pushed 346fddbbb0ff: Pushed latest: digest: sha256:18984c2de84daf6e8f95f4dc40806428f6a7b2919845b90c14fe13e82c97e1da size: 1778 [opc@linux7-9 ~]$ もし、以下のエラーが発生しましたら、実施ユーザがOCI Registryにログインしているかどうかをご確認ください。 "denied: Anonymous users are only allowed read access on public repos" OCI Registryでの確認 以上 オフィシャル・ドキュメント Pushing Images Using the Docker CLI
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

pyenvのインストール周りの仕様が変わっていたので

出会ったエラー いつものDockerfileを新しいサーバーでbuildしていたら、pipがnot foundになってこけた。 こんなwarningも出ていた。 WARNING: `pyenv init -` no longer sets PATH. Dockerfileの仕様 ubuntu18.04, cuda10.2, zsh pyenv 1.2.27 fix 旧仕様でのDockerfile(pyenv部分の一部) RUN curl https://pyenv.run | zsh && \ echo '' >> /root/.zshrc && \ echo 'export PATH="/root/.pyenv/bin:$PATH"' >> /root/.zshrc && \ echo 'eval "$(pyenv init -)"' >> /root/.zshrc && \ echo 'eval "$(pyenv virtualenv-init -)"' >> /root/.zshrc 新しい仕様 実質 pyenv init - ⇨ pyenv init --path ? (.profileをいじれ的なメッセージが出ていたけど従っても動かなかったので、メンテが行き届いてない感がある。) RUN curl https://pyenv.run | zsh && \ echo '' >> /root/.zshrc && \ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> /root/.zshrc && \ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> /root/.zshrc && \ echo 'eval "$(pyenv init --path)"' >> /root/.zshrc && \ echo 'eval "$(pyenv virtualenv-init -)"' >> /root/.zshrc 新しい仕様でのpyenv部分の全体的には RUN curl https://pyenv.run | zsh && \ echo '' >> /root/.zshrc && \ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> /root/.zshrc && \ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> /root/.zshrc && \ echo 'eval "$(pyenv init --path)"' >> /root/.zshrc && \ echo 'eval "$(pyenv virtualenv-init -)"' >> /root/.zshrc RUN source /root/.zshrc && \ pyenv install 3.8.0 && \ pyenv global 3.8.0 && \ pip install -U pip (ところで毎回 source /root/.zshrc 書かずに済む方法はないのかな…?) 参考 (つい2,3日前の記事)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker ComposeでNginx+PHP+MySQL+Redis環境を構築

Docker ComposeでNginx+PHP+MySQL+Redis環境を構築 2021年現在最新のNginx+PHP+MySQL+Redis環境を構築しました 各サービス項目の説明まで Docker構成 コンテナ ミドルウェア Web Nginx PHP PHP8 DB MySQL Redis Redis ディレクトリ構成 docker_lamp/ |-- mysql | |-- dump | | `-- setup.sql | |-- logs | |-- mount | `-- settings | `-- my.cnf |-- php | |-- logs | |-- settings | | |-- php.dev.ini | | |-- php.prod.ini | | |-- www.dev.conf | | `-- www.prod.conf | `-- Dockerfile |-- project | `-- html | `-- public | `-- index.php |-- redis | `-- mount |-- web | |-- logs | `-- settings | |-- default.conf | `-- nginx.conf `-- docker-compose.yml docker-compose.yaml PHPはDockerfileを使って自分でイメージを作成 他は公式イメージを利用 一旦全体 version: '3' services: web: image: nginx:alpine volumes: - "./web/settings/default.conf:/etc/nginx/conf.d/default.conf" - "./web/settings/nginx.conf:/etc/nginx/nginx.conf" - "./project/html:/var/www/html" - "./web/logs:/var/log/nginx" ports: - "8080:80" restart: always depends_on: - php - mysql - redis php: build: ./php volumes: - "./project/html:/var/www/html" restart: always mysql: image: mysql:8.0 ports: - "13306:3306" environment: MYSQL_ROOT_PASSWORD: p@ssw0rd MYSQL_DATABASE: test MYSQL_USER: dev MYSQL_PASSWORD: dev TZ: Asia/Tokyo volumes: - "./mysql/mount:/var/lib/mysql" - "./mysql/settings/my.cnf:/etc/mysql/conf.d/my.cnf" - "./mysql/dump/setup.sql:/docker-entrypoint-initdb.d/dump.sql" - "./mysql/logs:/var/log/mysql" restart: always redis: image: redis:alpine ports: - "16379:6379" volumes: - "./redis/mount:/data" 各項目説明 Nginx 外部アクセス用に8080ポートを公開 設定ファイル、プロジェクト、ログはvolumesで同期 ※ 設定ファイルは後半に紹介 web: image: nginx:alpine volumes: - "./web/settings/default.conf:/etc/nginx/conf.d/default.conf" - "./web/settings/nginx.conf:/etc/nginx/nginx.conf" - "./project/html:/var/www/html" - "./web/logs:/var/log/nginx" ports: - "8080:80" restart: always depends_on: - php - mysql - redis PHP プロジェクトはvolumesで同期 php: build: ./php volumes: - "./project/html:/var/www/html" Dockerfile PHP用イメージ Redis、MySQLを利用するためdocker-php-ext-installを使いPHP拡張をインストール 設定ファイルをCOPYを使い反映 ※ 設定ファイルは後半に紹介 FROM php:8.0-fpm RUN apt-get update && apt-get install -y git RUN git clone https://github.com/phpredis/phpredis.git /usr/src/php/ext/redis RUN docker-php-ext-install mysqli redis COPY settings/php.dev.ini /usr/local/etc/php/conf.d/php.ini COPY settings/www.dev.conf /usr/local/etc/php-fpm.d/www.conf MySQL 外部アクセス用に13306ポートを公開 environmentの設定を行うとコンテナ作成時に自動でパスワード作成、データベース作成などが自動で実行(今回はルートパスワード設定、データベース、ユーザー、タイムゾーンを設定) リソースはvolumesを使いmount以下に同期(Dockerを停止してもデータを残す) 設定ファイル、ログはvolumesで同期 作成時に実行させたいSQLはvolumesで /docker-entrypoint-initdb.d/dump.sql に同期すると自動で実行 mysql: image: mysql:8.0 ports: - "13306:3306" environment: MYSQL_ROOT_PASSWORD: p@ssw0rd MYSQL_DATABASE: test MYSQL_USER: dev MYSQL_PASSWORD: dev TZ: Asia/Tokyo volumes: - "./mysql/mount:/var/lib/mysql" - "./mysql/settings/my.cnf:/etc/mysql/conf.d/my.cnf" - "./mysql/dump/setup.sql:/docker-entrypoint-initdb.d/dump.sql" - "./mysql/logs:/var/log/mysql" restart: always Redis 外部アクセス用に16379ポートを公開 リソースはvolumesを使いmount以下に同期(Dockerを停止してもデータを残す) redis: image: redis:alpine ports: - "16379:6379" volumes: - "./redis/mount:/data" 設定ファイル デフォルトで動かしてもいいですが、ECS運用も考慮して設定ファイルを用意 Nginx default.conf ※ 構築時にCodeigniter, FuelPHP環境の構築を考えていたのでこの形になった ポイントは fastcgi_pass php:9000; ホストをdocker-composeのサービス名(php)に変更 server { listen 80 default; server_name localhost; charset utf-8; root /var/www/html/public; index index.php index.html index.htm; location / { index index.php index.html index.htm; try_files $uri $uri/ /index.php$is_args$args; } location /admin { auth_basic "Restricted"; auth_basic_user_file /etc/nginx/.htpasswd; index index.php index.html index.htm; try_files $uri $uri/ /index.php$is_args$args; } location /reploxy { internal; resolver 8.8.8.8; set $reproxy $upstream_http_x_reproxy_url; proxy_pass $reproxy; proxy_set_header Authorization ""; } location ~ \.php$ { fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_param FUEL_ENV "development"; fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; include fastcgi_params; } } nginx.conf ログの場所など指定 user nginx nginx; worker_processes 2; 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; error_log /var/log/nginx/error.log warn; sendfile off; tcp_nopush on; tcp_nodelay off; keepalive_timeout 30; send_timeout 60; gzip on; gzip_http_version 1.0; gzip_comp_level 6; gzip_proxied any; gzip_min_length 10000; gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript; gzip_disable "MSIE [1-6] \."; include /etc/nginx/conf.d/*.conf; } PHP php.ini、www.conf設定ファイルは以下サイトを参考にさせていただきました MySQL my.cnf 文字コード、ログの場所など指定 [mysqld] # 文字コード/照合順序の設定 character-set-server = utf8mb4 collation-server = utf8mb4_bin # タイムゾーンの設定 default-time-zone = SYSTEM log_timestamps = SYSTEM # デフォルト認証プラグインの設定 default-authentication-plugin = mysql_native_password # エラーログの設定 log-error = /var/log/mysql/mysql-error.log # スロークエリログの設定 slow_query_log = 1 slow_query_log_file = /var/log/mysql/mysql-slow.log long_query_time = 5.0 log_queries_not_using_indexes = 0 # 実行ログの設定 general_log = 1 general_log_file = /var/log/mysql/mysql-query.log [mysql] default-character-set = utf8mb4 [client] default-character-set = utf8mb4 実行ファイル PHP index.php サンプルでMySQLとRedisを使う ポイントは接続ホストにDockerのサービス名を使うmysql redis <?php // MySQLテスト echo "MySQLテスト<br />"; $mysqli = mysqli_connect("mysql", "dev", "dev", "test"); $query = "SELECT * FROM `user`"; $result = $mysqli->query($query); $rows = array(); while ($row = $result->fetch_assoc()) { $rows[] = $row; } var_dump($rows); echo "<hr />"; // Redisテスト echo "Redisテスト<br />"; $redis = new Redis(); $redis->connect("redis", 6379); $redis->set('key', 'value'); echo $redis->get('key'); MySQL setup.sql サンプル用のSQL "./mysql/dump/setup.sql:/docker-entrypoint-initdb.d/dump.sql" の設定でコンテナ作成時にクエリ実行 use test; DROP TABLE IF EXISTS `test`; CREATE TABLE `user` ( `name` VARCHAR(255) NOT NULL COMMENT 'Name', `age` INT(10) unsigned NOT NULL COMMENT 'Age', `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='テスト用'; INSERT INTO `user` VALUES ("TAKASHI", 34, "0000-01-01", "9999-12-31"); docker-compose 実行 ビルドして実行 $ docker-compose up --build 確認 http://127.0.0.1:8080/ にアクセス、表示を確認 次回はこの環境下にComposer、Xdebug、PHPフレームワーク(Codeigniter予定)、UnitTest等を使えるようしていきます。 いいね!と思ったら フォロー、LGTM お願いします 【PR】プログラミング新聞リリースしました! → https://pronichi.com 【PR】週末ハッカソンというイベントやってます! → https://weekend-hackathon.toyscreation.jp/about/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ParallelsとUbuntuとDockerとRemote Containersでリモート開発環境を構築してみた

ParallelsとUbuntuとDockerとRemote Containersでリモート開発環境を構築してみました 先日、MacBook Proを修理しました。修理から戻ってきた時はそのままの環境で利用していた、そんな経験はありませんか? 今回は、せっかくなのでこれをきっかけにクリーンインストールし、開発環境を再構築してみました! 再構築の目的として、ローカル環境をできるだけ汚さずに管理することができないかと思い、Parallels内にUbuntuとDocker環境を構築し、Remote Containersでローカル環境のようにリモート環境に接続する開発環境を構築してみました。 ローカル環境汚したくないユーザーの参考になればと思います 環境構築には、技術書典で以前購入した@74thさんの書籍を参考にしながら構築してみました。Visual Studio CodeのRemote Containers機能のガイドブックなので、興味あるかたはゼヒ購入してみてください VS Code Dev Container Guidebook 事前準備 ParallelsにUbuntu 20.04 LTS Serverの環境構築 macos Catalina上のParallelsにUbuntu 20.04 LTS Serverをインストール UbuntuにParallelsToolsをインストール 他のバージョンのゲストLinuxOSでのParallelsToolsのインストール Ubuntu環境にsshで手軽に接続 ParallelsのUbuntu Linuxにssh接続する 実行環境 ローカル環境 : Mac リモート環境 : Parallels内のUbuntu Server 20.04 今回は、事前準備と実行環境の準備が完了したところから説明していきたいと思います。 はじめに、リモート環境にDockerをインストールします。リンクのステップ1,2,3までをおこない、DockerのインストールとSudoなしでDockerコマンドを実行するまでを設定します。 Ubuntu 20.04へのDockerのインストールおよび使用方法 上記以外に、追加でdocker-conposeもインストールします。 sudo apt install docker-compose インストールされているかを確認します。 docker -v docker-compose -v 次に、ローカル環境にDockerをインストールします。最終的にはリモート環境でDockerを実行するので、今回はDocker Desktop for Macは利用しません。 brew install docker brew install docker-compose インストールされているかを確認します。 docker -v docker-compose -v インストール確認後、ローカル環境からリモート環境にsshでDockerにアクセスできるかを確認します。ssh接続は事前準備で完了済の想定です。 ssh dayjournal@remote-host docker ps docker -H ssh://dayjournal@remote-host ps 次に、docker contextを設定しリモート環境のDockerに直接アクセスできるようにします。 docker context create remote-docker --docker host=ssh://dayjournal@remote-host docker context use remote-docker 直接アクセスができているかを確認します。 docker context ls docker ps ここまででDocker開発環境の構築は完了です 次に、Visual Studio Codeの拡張機能のRemote Containersをインストールします。この拡張機能をインストールすることで、手軽にリモート環境に接続し開発することが可能になります。 Dockerコンテナを起動し開発環境を確認します。下記リポジトリに、サンプル用の設定ファイルを格納したのでクローンします。今回はその中のnodeサンプルを利用してみます。 remote-container-docker-showcase node/docker/docker-compose.yml version: '3' services: node: container_name: dev-node tty: true build: context: . dockerfile: node/Dockerfile volumes: - ../projects:/projects working_dir: /projects volumes: projects: node/docker/node/Dockerfile FROM node:15.5.0 リモート環境で、共有設定(ParallelsToolsインストール済)されたローカル環境のディレクトリを確認します。 df 共有されたクローンしたディレクトリに移動します。 cd /media/psf/Home/Documents/GitHub/remote-container-docker-showcase docker-compose.ymlがあるディレクトリに移動します。 cd node/docker Dockerコンテナを起動します。 docker-compose up --build 最後に、Visual Studio Codeのコマンドパレットで下記を実行し、対象のコンテナを選択します。 「Remote Containers: Attach to Running Container...」 リモート環境に接続されたら、ターミナルでnodeのバージョンを確認してみます。 node -v ParallelsとUbuntuとDockerとRemote Containersでリモート開発環境を構築できました リモート環境で開発環境を構築することで、ローカル環境をできるだけ汚さずに管理することが可能です。また、サンプルではprojectsディレクトリを同期しているので、ローカル環境で作業しているかのように手軽にファイル更新もできます Parallelsは有償ですが、Macを起動したままWindowsやLinuxの環境を起動できて、個人的にもかなり便利で開発に利用しているのでおすすめです! Dockerについて、他にも記事を書いています。よろしければぜひ tags - Docker やってみたシリーズ tags - Try
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む