20200704のdockerに関する記事は16件です。

AWS App2Container で既存アプリケーションをコンテナ化しよう

はじめに

2020/7/1 に 既存の.NET および Java アプリケーションをコンテナ化するための
AWS App2Container というツールがリリースされました。

AWS App2Container の発表 - アプリケーションをコンテナ化して AWS クラウドに移行する
https://aws.amazon.com/jp/about-aws/whats-new/2020/07/announcing-aws-app2container/

AWS App2Container は、起動中アプリケーションとその依存関係をコンテナイメージに
パッケージ化してECS タスクと Kubernetes ポッド定義を生成します。
またこれらをAWS 上にデプロイするための CloudForamtion テンプレートおよび、
CI/CD パイプライン用のテンプレートまで作成することもできます。

AWS App2Container 自体は無料で利用可能で、デプロイする AWS リソースに対し
通常の利用料金が発生します。
Javaアプリケーションのコンテナ化、ECS on Fargate と EKS のデプロイをそれぞれ実施しました。

前提条件

Java アプリケーションの場合の環境の前提条件は以下の通りです。

サポートされる Java アプリケーションフレームワーク

  • Tomcat
  • Spring Boot
  • JBoss (standalone mode)
  • Weblogic (standalone mode)
  • Websphere (standalone mode)

サポートされる Linux ディストリビューション

  • Ubuntu
  • CentOS
  • RHEL
  • Amazon Linux

また作業環境が以下の条件を満たしている必要があります。
これらのインストール手順や設定手順は割愛します。

  • AWS CLI がインストール済みであること
  • Docker Engine のインストール済みであること
  • サーバーの root アクセス権があること
  • tar コマンドが利用可能であること
  • ストレージに 20GB 以上の空き容量があること

IAM ユーザー必要な権限は以下のドキュメントに記載されています。
コンテナ化したアプリケーションをデプロイする際には、AdministratorAccess が
前提となっているようです。

App2ContainerでのIDおよびアクセス管理
https://docs.aws.amazon.com/app2container/latest/UserGuide/iam-a2c.html

今回は Amazon Linux 2 上に Spring Boot アプリケーションを起動し、検証しました。

アプリケーションの準備

Spring Boot CLI を使用して Hello World アプリケーションを準備します。
手順は以下に記載のある通りです。
https://spring.pleiades.io/spring-boot/docs/current/reference/html/spring-boot-cli.html

hello.groovy
@RestController
class WebApplication {

    @RequestMapping("/")
    String home() {
        "Hello World!"
    }

}

アプリケーションを起動し、

$ spring run hello.groovy

正常に応答することを確認しておきます。

$ curl localhost:8080
Hello World!

App2Container のインストール

インストール

インストールパッケージをダウンロードし、展開します。

$ curl -o AWSApp2Container-installer-linux.tar.gz https://app2container-release-us-east-1.s3.us-east-1.amazonaws.com/latest/linux/AWSApp2Container-installer-linux.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  104M  100  104M    0     0  8360k      0  0:00:12  0:00:12 --:--:-- 9605k

$ sudo tar xvf AWSApp2Container-installer-linux.tar.gz
install.sh
README
termsandconditions.txt
security/
security/app2container.sig
security/app2container.cert
AWSApp2Container.tar.gz

install.sh を実行します。
利用規約への同意が必要です。

$ sudo ./install.sh

Determining user ...
Determining Installer Path ...
The AWS App2Container tool is licensed as "AWS Content" under the terms and conditions of the AWS Customer Agreement, located at https://aws.amazon.com/agreement and the Service Terms, located at https://aws.amazon.com/service-terms. By installing, using or accessing the AWS App2Container tool, you agree to such terms and conditions. The term "AWS Content" does not include software and assets distributed under separate license terms (such as code licensed under an open source license).
Do you accept the terms and conditions above? (y/n): y
Installing AWS App2Container ...
~~以降省略~~
Installation of AWS App2Container completed successfully!
You are currently running version 1.0.0.
To get started, run 'sudo app2container init'
AWS App2Container was installed under /usr/local/app2container/AWSApp2Container.

正常にインストールされたことを確認します。

$ sudo app2container --version
app2container version 1.0.0

初期設定

init コマンドで初期設定を行います。
内容は記載のとおりですが、コンテナ化に関連するアーティファクトの格納ディレクトリや
使用する AWS CLI のプロファイルなどが指定できます。
アーティファクトの格納先 S3 バケット(オプション) は App2Container で AWS 環境への
デプロイを行う場合は指定が必要です。

$ sudo app2container init
Workspace directory path for artifacts[default: /root/app2container]:
AWS Profile (configured using 'aws configure --profile')[default: default]:
Optional S3 bucket for application artifacts: <your_bucket_name>
Report usage metrics to AWS? (Y/N)[default: y]: N
Require images to be signed using Docker Content Trust (DCT)? (Y/N)[default: n]: N
Configuration saved

アプリケーションのコンテナ化

既存アプリケーションの分析

inventory コマンドで実行中のアプリケーションを一覧表示します。
以下の例の場合、java-generic-65424cc9 がアプリケーションIDとなり、
後続のコマンド実行時に指定が必要です。

$ sudo app2container inventory
{
                "java-generic-65424cc9": {
                                "processId": 2493,
                                "cmdline": "/usr/lib/jvm/java-11-openjdk-11.0.7.10-4.amzn2.0.1.x86_64/bin/java ... /usr/local/bin:/usr/local/lib/spring-boot-cli-2.3.1.RELEASE.jar org.springframework.boot.loader.JarLauncher run ./hello.groovy ",
                                "applicationType": "java-generic"
                }
}

analyze コマンドを実行すると、init 時に指定したアーティファクトディレクトリに
analysis.json が保存されます。アプリケーション実行のための依存関係が記述されており、
必要に応じて手動で値を書き換えることもできます。

$ sudo app2container analyze --application-id java-generic-65424cc9
✔ Created artifacts folder /root/app2container/java-generic-65424cc9
✔ Generated analysis data in /root/app2container/java-generic-65424cc9/analysis.json
? Analysis successful for application java-generic-65424cc9

? Next Steps:
1. View the application analysis file at /root/app2container/java-generic-65424cc9/analysis.json.
2. Edit the application analysis file as needed.
3. Start the containerization process using this command: app2container containerize --application-id java-generic-65424cc9

analysis.json の例 (クリックで展開)
analysis.json
{
       "a2CTemplateVersion": "1.0",
       "createdTime": "2020-07-04 09:31:254",
       "containerParameters": {
              "_comment1": "*** EDITABLE: The below section can be edited according to the application requirements. Please see the analysisInfo section below for details discovered regarding the application. ***",
              "imageRepository": "java-generic-65424cc9",
              "imageTag": "latest",
              "containerBaseImage": "amazonlinux:2",
              "appExcludedFiles": [],
              "appSpecificFiles": [],
              "applicationMode": false,
              "logLocations": [],
              "enableDynamicLogging": false,
              "dependencies": []
       },
       "analysisInfo": {
              "_comment2": "*** NON-EDITABLE: Analysis Results ***",
              "processId": 2493,
              "appId": "java-generic-65424cc9",
              "userId": "1001",
              "groupId": "1001",
              "cmdline": [
                     "/usr/lib/jvm/java-11-openjdk-11.0.7.10-4.amzn2.0.1.x86_64/bin/java",
                     "-cp",
                     "/usr/local/bin:/usr/local/lib/spring-boot-cli-2.3.1.RELEASE.jar",
                     "org.springframework.boot.loader.JarLauncher",
                     "run",
                     "./hello.groovy"
              ],
              "osData": {
                     "ANSI_COLOR": "0;33",
                     "CPE_NAME": "cpe:2.3:o:amazon:amazon_linux:2",
                     "HOME_URL": "https://amazonlinux.com/",
                     "ID": "amzn",
                     "ID_LIKE": "centos rhel fedora",
                     "NAME": "Amazon Linux",
                     "PRETTY_NAME": "Amazon Linux 2",
                     "VERSION": "2",
                     "VERSION_ID": "2"
              },
              "osName": "amzn",
              "ports": [
                     {
                            "localPort": 8080,
                            "protocol": "tcp6"
                     }
              ],
              "Properties": {
                     "classpath": "/usr/local/bin:/usr/local/lib/spring-boot-cli-2.3.1.RELEASE.jar",
                     "jdkVersion": "11.0.7"
              },
              "AdvancedAppInfo": null,
              "env": {
                     "HOME": "/home/ssm-user",
                     "JAVA_HOME": "/usr/lib/jvm/java-11-openjdk-11.0.7.10-4.amzn2.0.1.x86_64",
                     "LANG": "C.UTF-8",
                     "OLDPWD": "/usr/local",
                     "PATH": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin",
                     "PWD": "/home/ssm-user",
                     "SHLVL": "1",
                     "SPRING_HOME": "/usr/local",
                     "TERM": "xterm-256color"
              },
              "cwd": "/home/ssm-user",
              "procUID": {
                     "euid": "1001",
                     "suid": "1001",
                     "fsuid": "1001",
                     "ruid": "1001"
              },
              "procGID": {
                     "egid": "1001",
                     "sgid": "1001",
                     "fsgid": "1001",
                     "rgid": "1001"
              },
              "userNames": {
                     "1001": "ssm-user"
              },
              "groupNames": {
                     "1001": "ssm-user"
              },
              "fileDescriptors": [
                     "/dev/pts/8",
                     "/dev/pts/8",
                     "/dev/pts/8",
                     "/home/ssm-user/.m2/repository/org/springframework/boot/spring-boot-starter/2.3.1.RELEASE/spring-boot-starter-2.3.1.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/boot/spring-boot/2.3.1.RELEASE/spring-boot-2.3.1.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/spring-context/5.2.7.RELEASE/spring-context-5.2.7.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/2.3.1.RELEASE/spring-boot-autoconfigure-2.3.1.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/boot/spring-boot-starter-logging/2.3.1.RELEASE/spring-boot-starter-logging-2.3.1.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar",
                     "/usr/lib/jvm/java-11-openjdk-11.0.7.10-4.amzn2.0.1.x86_64/lib/modules",
                     "/home/ssm-user/.m2/repository/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar",
                     "/home/ssm-user/.m2/repository/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar",
                     "/home/ssm-user/.m2/repository/org/apache/logging/log4j/log4j-to-slf4j/2.13.3/log4j-to-slf4j-2.13.3.jar",
                     "/home/ssm-user/.m2/repository/org/apache/logging/log4j/log4j-api/2.13.3/log4j-api-2.13.3.jar",
                     "/home/ssm-user/.m2/repository/org/slf4j/jul-to-slf4j/1.7.30/jul-to-slf4j-1.7.30.jar",
                     "/home/ssm-user/.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/spring-core/5.2.7.RELEASE/spring-core-5.2.7.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/spring-jcl/5.2.7.RELEASE/spring-jcl-5.2.7.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/org/yaml/snakeyaml/1.26/snakeyaml-1.26.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/boot/spring-boot-starter-web/2.3.1.RELEASE/spring-boot-starter-web-2.3.1.RELEASE.jar",
                     "/usr/local/lib/spring-boot-cli-2.3.1.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/boot/spring-boot-starter-json/2.3.1.RELEASE/spring-boot-starter-json-2.3.1.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.11.0/jackson-databind-2.11.0.jar",
                     "/home/ssm-user/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.11.0/jackson-annotations-2.11.0.jar",
                     "/home/ssm-user/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.11.0/jackson-core-2.11.0.jar",
                     "/home/ssm-user/.m2/repository/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.11.0/jackson-datatype-jdk8-2.11.0.jar",
                     "/home/ssm-user/.m2/repository/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.11.0/jackson-datatype-jsr310-2.11.0.jar",
                     "/home/ssm-user/.m2/repository/com/fasterxml/jackson/module/jackson-module-parameter-names/2.11.0/jackson-module-parameter-names-2.11.0.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/boot/spring-boot-starter-tomcat/2.3.1.RELEASE/spring-boot-starter-tomcat-2.3.1.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/org/apache/tomcat/embed/tomcat-embed-core/9.0.36/tomcat-embed-core-9.0.36.jar",
                     "/home/ssm-user/.m2/repository/org/glassfish/jakarta.el/3.0.3/jakarta.el-3.0.3.jar",
                     "/home/ssm-user/.m2/repository/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.36/tomcat-embed-websocket-9.0.36.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/spring-web/5.2.7.RELEASE/spring-web-5.2.7.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/spring-beans/5.2.7.RELEASE/spring-beans-5.2.7.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/spring-webmvc/5.2.7.RELEASE/spring-webmvc-5.2.7.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/spring-aop/5.2.7.RELEASE/spring-aop-5.2.7.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/spring-expression/5.2.7.RELEASE/spring-expression-5.2.7.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/org/codehaus/groovy/groovy-templates/2.5.12/groovy-templates-2.5.12.jar",
                     "/home/ssm-user/.m2/repository/org/codehaus/groovy/groovy/2.5.12/groovy-2.5.12.jar",
                     "/home/ssm-user/.m2/repository/org/codehaus/groovy/groovy/2.5.12/groovy-2.5.12.jar",
                     "/home/ssm-user/.m2/repository/org/codehaus/groovy/groovy-xml/2.5.12/groovy-xml-2.5.12.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/spring-context/5.2.7.RELEASE/spring-context-5.2.7.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/boot/spring-boot/2.3.1.RELEASE/spring-boot-2.3.1.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/2.3.1.RELEASE/spring-boot-autoconfigure-2.3.1.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/spring-beans/5.2.7.RELEASE/spring-beans-5.2.7.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/spring-web/5.2.7.RELEASE/spring-web-5.2.7.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/boot/spring-boot-starter/2.3.1.RELEASE/spring-boot-starter-2.3.1.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/boot/spring-boot-starter-logging/2.3.1.RELEASE/spring-boot-starter-logging-2.3.1.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar",
                     "/home/ssm-user/.m2/repository/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar",
                     "/home/ssm-user/.m2/repository/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar",
                     "/home/ssm-user/.m2/repository/org/apache/logging/log4j/log4j-to-slf4j/2.13.3/log4j-to-slf4j-2.13.3.jar",
                     "/home/ssm-user/.m2/repository/org/apache/logging/log4j/log4j-api/2.13.3/log4j-api-2.13.3.jar",
                     "/home/ssm-user/.m2/repository/org/slf4j/jul-to-slf4j/1.7.30/jul-to-slf4j-1.7.30.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/spring-core/5.2.7.RELEASE/spring-core-5.2.7.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/spring-jcl/5.2.7.RELEASE/spring-jcl-5.2.7.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/org/yaml/snakeyaml/1.26/snakeyaml-1.26.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/boot/spring-boot-starter-web/2.3.1.RELEASE/spring-boot-starter-web-2.3.1.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/boot/spring-boot-starter-json/2.3.1.RELEASE/spring-boot-starter-json-2.3.1.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.11.0/jackson-databind-2.11.0.jar",
                     "/usr/local/lib/spring-boot-cli-2.3.1.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.11.0/jackson-annotations-2.11.0.jar",
                     "/home/ssm-user/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.11.0/jackson-core-2.11.0.jar",
                     "/home/ssm-user/.m2/repository/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.11.0/jackson-datatype-jdk8-2.11.0.jar",
                     "/home/ssm-user/.m2/repository/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.11.0/jackson-datatype-jsr310-2.11.0.jar",
                     "/home/ssm-user/.m2/repository/com/fasterxml/jackson/module/jackson-module-parameter-names/2.11.0/jackson-module-parameter-names-2.11.0.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/boot/spring-boot-starter-tomcat/2.3.1.RELEASE/spring-boot-starter-tomcat-2.3.1.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/org/apache/tomcat/embed/tomcat-embed-core/9.0.36/tomcat-embed-core-9.0.36.jar",
                     "/home/ssm-user/.m2/repository/org/glassfish/jakarta.el/3.0.3/jakarta.el-3.0.3.jar",
                     "/home/ssm-user/.m2/repository/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.36/tomcat-embed-websocket-9.0.36.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/spring-webmvc/5.2.7.RELEASE/spring-webmvc-5.2.7.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/spring-aop/5.2.7.RELEASE/spring-aop-5.2.7.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/org/springframework/spring-expression/5.2.7.RELEASE/spring-expression-5.2.7.RELEASE.jar",
                     "/home/ssm-user/.m2/repository/org/codehaus/groovy/groovy-templates/2.5.12/groovy-templates-2.5.12.jar",
                     "/home/ssm-user/.m2/repository/org/codehaus/groovy/groovy-xml/2.5.12/groovy-xml-2.5.12.jar"
              ],
              "dependencies": {}
       }


コンテナ化

containerize コマンドでアプリケーションをコンテナ化できます。
この際、AWS CLI に適切なクレデンシャル情報が設定されている必要があります。
(sudo で実行する場合、root ユーザーに設定されたプロファイル)
現在のところ、EC2 でインスタンスプロファイルを設定している場合でも、IAM ロールの
一時クレデンシャルは使用されないようですので、アクセスキーを別途設定しています。

$ sudo app2container containerize --application-id java-generic-65424cc9
✔ AWS prerequisite check succeeded
✔ Docker prerequisite check succeeded
✔ Extracted container artifacts for application
✔ Entry file generated
✔ Dockerfile generated under /root/app2container/java-generic-65424cc9/Artifacts
✔ Generated dockerfile.update under /root/app2container/java-generic-65424cc9/Artifacts
✔ Generated deployment file at /root/app2container/java-generic-65424cc9/deployment.json
? Containerization successful. Generated docker image java-generic-65424cc9

? You're all set to test and deploy your container image.

Next Steps:
1. View the container image with "docker images" and test the application.
2. When you're ready to deploy to AWS, please edit the deployment file as needed at /root/app2container/java-generic-65424cc9/deployment.json.
3. Generate deployment artifacts using "app2container generate app-deployment --application-id java-generic-65424cc9"

containerize コマンドにより generate app-deployment コマンド実行時に必要な
deployment.json や Dockerfile、コンテナイメージなどが生成されます。

$ sudo tree /root/app2container/java-generic-65424cc9/
/root/app2container/java-generic-65424cc9/
├── Artifacts
│   ├── ContainerFiles.tar ★アプリケーション実行の依存関係をまとめた tar
│   ├── Dockerfile 
│   ├── Dockerfile.update ★ 作成されたイメージをベースイメージとした Dockerfile のサンプル
│   ├── entryfile ★ コンテナ起動時の CMD 
│   └── excludedFiles ★ コンテナ化時に除外されたファイルのリスト
├── analysis.json
└── deployment.json

Dockerfile の例 (クリックで展開)
FROM amazonlinux:2
MAINTAINER AWS
WORKDIR /
# Copying Entryfile
COPY entryfile /entryfile
# Pre install packages
RUN yum -y install tar && yum -y install gzip && yum -y install shadow-utils.x86_64
# Adding and unpacking Tar file
COPY ContainerFiles.tar /
RUN tar xvfP /ContainerFiles.tar --directory / --skip-old-files --same-owner --ignore-failed-read && rm -rf /ContainerFiles.tar
# Follow the below example to update files# COPY ["generic_config_file", "/root/app2container/java-generic-65424cc9/Artifacts/generic_config_file"]# Environment Variables
ENV HOME /home/ssm-user
ENV JAVA_HOME /usr/lib/jvm/java-11-openjdk-11.0.7.10-4.amzn2.0.1.x86_64
ENV PWD /home/ssm-user
ENV TERM xterm-256color
ENV LANG C.UTF-8
ENV OLDPWD /usr/local
ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
ENV SHLVL 1
ENV SPRING_HOME /usr/local
# Exposing ports
EXPOSE 8080
# User and user group
RUN groupadd -f -r -g 1001 ssm-user
RUN id -u ssm-user > /dev/null 2>&1 || useradd -r -g 1001 -u 1001 ssm-user
USER ssm-user:ssm-user
WORKDIR /home/ssm-user
# Image Entrypoint
CMD /entryfile


deployment.json についても 手動で編集することが可能です。
ECS のパラメーターについて、デフォルトで cpu:2, memory:4096 が設定されており、
Fargate タスク実行時のリソースとして確保されるようですので、必要に応じて変更すべきかと思います。

deployment.json の例 (クリックで展開)
deployment.json
{
       "a2CTemplateVersion": "1.0",
       "applicationId": "java-generic-65424cc9",
       "imageName": "java-generic-65424cc9",
       "exposedPorts": [
              {
                     "localPort": 8080,
                     "protocol": "tcp6"
              }
       ],
       "environment": [],
       "ecrParameters": {
              "ecrRepoTag": "latest"
       },
       "ecsParameters": {
              "createEcsArtifacts": true,
              "ecsFamily": "java-generic-65424cc9",
              "cpu": 2,
              "memory": 4096,
              "dockerSecurityOption": "",
              "enableCloudwatchLogging": false,
              "publicApp": true,
              "stackName": "a2c-java-generic-65424cc9-ECS",
              "reuseResources": {
                     "vpcId": "",
                     "cfnStackName": "",
                     "sshKeyPairName": ""
              },
              "gMSAParameters": {
                     "domainSecretsArn": "",
                     "domainDNSName": "",
                     "domainNetBIOSName": "",
                     "createGMSA": false,
                     "gMSAName": ""
              }
       },
       "eksParameters": {
              "createEksArtifacts": false,
              "stackName": "a2c-java-generic-65424cc9-EKS",
              "reuseResources": {
                     "vpcId": "",
                     "cfnStackName": "",
                     "sshKeyPairName": ""
              }
       }
}[


この時点で コンテナイメージが作成されているため、ローカルで実行して検証することもできます。
現在稼働中の環境を再現するためだとはおもいますが、なかなかのイメージサイズになってます。

$ sudo docker image ls
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
java-generic-65424cc9   latest              d7843b85b3b9        About an hour ago   3.95GB
amazonlinux             2                   fa0a6a710ca7        3 days ago          163MB

$ sudo docker run --rm -d -p 8080:8080 java-generic-65424cc9:latest
34e6266424e130f0b6fcb6213547cc7b744123b24805db37bea3e4da9edc094c

$ sudo docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                    NAMES
34e6266424e1        java-generic-65424cc9:latest   "/bin/sh -c /entryfi…"   6 seconds ago       Up 5 seconds        0.0.0.0:8080->8080/tcp   vigilant_lederberg

$ curl http://localhost:8080
Hello World!

アプリケーションのデプロイ

デプロイ用リソース作成

generate app-deployment コマンドで、アプリケーションを AWS にデプロイするための
CloudFormation テンプレート等の各種リソースが生成されます。
--deploy オプションを付与することで、そのままデプロイまで実行できますが、
ここではまずはアーティファクトの生成のみを実行します。

$ sudo app2container generate app-deployment --application-id java-generic-65424cc9
✔ AWS prerequisite check succeeded
✔ Docker prerequisite check succeeded
✔ Created ECR Repository
✔ Registered ECS Task Definition with ECS
✔ Uploaded CloudFormation resources to S3 Bucket: <your_bucket_name>
✔ Generated CloudFormation Master template at: /root/app2container/java-generic-65424cc9/EcsDeployment/ecs-master.yml
? ECS CloudFormation templates and additional deployment artifacts generated successfully for application java-generic-65424cc9

? You're all set to use AWS CloudFormation to manage your application stack.

Next Steps:
1. Edit the CloudFormation template as necessary.
2. Create an application stack using the AWS CLI or the AWS Console. AWS CLI command:

        aws cloudformation deploy --template-file /root/app2container/java-generic-65424cc9/EcsDeployment/ecs-master.yml --capabilities CAPABILITY_NAMED_IAM --stack-name a2c-java-generic-65424cc9-ECS

3. Set up a pipeline for your application stack using "app2container:

        app2container generate pipeline --application-id java-generic-65424cc9"

実行が成功すると、アーティファクトディレクトリに ECS をデプロイするための
タスク定義、CloudFormation のマスターテンプレート、パイプライン用定義ファイルが配置されます。
EKS 用のリソースはデフォルトでは作成されませんので、記事後半を参照ください。

CloudFormation ではネストされたスタックが生成されるため、残りのテンプレートは init 時に
指定した S3 バケットにアップロードされています。

$ sudo tree /root/app2container/java-generic-65424cc9/
/root/app2container/java-generic-65424cc9/
├── Artifacts
│   ├── ContainerFiles.tar
│   ├── Dockerfile
│   ├── Dockerfile.update
│   ├── entryfile
│   └── excludedFiles
├── EcsDeployment
│   └── ecs-master.yml ★ CloudForamtion テンプレート
├── analysis.json
├── deployment.json
├── pipeline.json ★ パイプライン作成用定義ファイル
└── taskDef.json ★ ECS用タスク定義

$ aws s3 ls s3://<your_bucket_name>/a2c-<application-id>/ecs/subtemplates/
2020-07-04 11:58:23      12258 ecs-cluster.yml
2020-07-04 11:58:23       2327 ecs-dns.yml
2020-07-04 11:58:24      16521 ecs-gmsa-automation-doc.yml
2020-07-04 11:58:24       2545 ecs-gmsa-execute.yml
2020-07-04 11:58:24       7216 ecs-gmsa-iam-roles.yml
2020-07-04 11:58:24       6112 ecs-gmsa-lambda-functions.yml
2020-07-04 11:58:24       3713 ecs-gmsa.yml
2020-07-04 11:58:24      16909 ecs-lb-webapp.yml
2020-07-04 11:58:24      19955 ecs-master.yml
2020-07-04 11:58:24      10882 ecs-private-app.yml
2020-07-04 11:58:24       9586 ecs-public-load-balancer.yml
2020-07-04 11:58:24       3377 ecs-vpc.yml

また、この時点で ECS へのタスク定義登録および、ECR へのイメージ push が自動で行われています。

ECS on Fargate へのデプロイ

generate app-deployment コマンドで生成された ecs-master.yml を使用してデプロイします。

$ sudo aws cloudformation deploy --template-file /root/app2container/java-generic-65424cc9/EcsDeployment/ecs-master.yml --capabilities CAPABILITY_NAMED_IAM --stack-name a2c-java-generic-65424cc9-ECS

Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - a2c-java-generic-65424cc9-ECS

作成された ELB にリクエストを投げると、メッセージが返ってきました。

$ aws cloudformation describe-stacks --stack-name a2c-java-generic-65424cc9-ECS --query 'Stacks[].Outputs[2]'
[
    {
        "ExportName": "a2c-java-generic-65424cc9-ECS-PublicLoadBalancerDNSForCLIOutput",
        "OutputKey": "PublicLoadBalancerDNSName",
        "OutputValue": "a2c-j-Publi-XXXXXXXXXXXX-111111111.ap-northeast-1.elb.amazonaws.com"
    }
]

$ curl http://a2c-j-Publi-XXXXXXXXXXXX-111111111.ap-northeast-1.elb.amazonaws.com
Hello World!

コンテナを前提に作成されたアプリケーションと比較すると、事前の十分な検証が必要で
運用面等々の課題もあるかもしれませんが
数ステップでコンテナ化~ECS on Fargate へのデプロイまで行えるのは非常に魅力的です。

CI/CD パイプラインの作成

デプロイ用リソースの作成

generate pipeline を使用すると、AWS CodePipeline で CI/CD パイプラインを作成するために
必要なアーティファクトを生成することができます。
app-deployment と同様に --deploy オプションを使用することもできます。

generate pipline を実行するには、generate app-deployment で生成された pipeline.json の
releaseInfo に デプロイされた ECS のクラスタ名とサービス名を追記する必要があります。

pipeline.json
{
        "a2CTemplateVersion": "1.0",
        "sourceInfo": {
                "CodeCommit": {
                        "repositoryName": "a2c-java-generic-65424cc9-ecs",
                        "branch": "master"
                }
        },
        "imageInfo": {
                "image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/java-generic-65424cc9:latest"
        },
        "releaseInfo": {
                "ECS": {
                        "beta": {
                                "clusterName": "",
                                "serviceName": "",
                                "enabled": false
                        },
                        "prod": {
                                "clusterName": "a2c-java-generic-65424cc9-ECS-Cluster",
                                "serviceName": "a2c-java-generic-65424cc9-ECS-LBWebAppStack-XXXXXXXXXXXX-Service-YYYYYYYYYYYY",
                                "enabled": true
                        }
                }
        }
}

ここでは prod に先ほどデプロイしたリソースを指定しています。
generate pipeline を実行すると、CodePipline をデプロイするための
CloudFormation と CodeDeploy 用の buildspec.ymlテンプレートが作成されます。

$ sudo app2container generate pipeline --application-id java-generic-65424cc9
✔ Created CodeCommit repository
✔ Generated buildspec file(s)
✔ Generated CloudFormation templates
✔ Committed files to CodeCommit repository
? Pipeline resource template generation successful for application java-generic-65424cc9

? You're all set to use AWS CloudFormation to manage your pipeline stack.

Next Steps:
1. Edit the CloudFormation template as necessary.
2. Create a pipeline stack using the AWS CLI or the AWS Console. AWS CLI command:

        aws cloudformation deploy --template-file /root/app2container/java-generic-65424cc9/Artifacts/Pipeline/CodePipeline/ecs-pipeline-master.yml --capabilities CAPABILITY_NAMED_IAM --stack-name a2c-java-generic-65424cc9-ecs-pipeline-stack

$ sudo tree /root/app2container/java-generic-65424cc9/
/root/app2container/java-generic-65424cc9/
├── Artifacts
│   ├── ContainerFiles.tar
│   ├── Dockerfile
│   ├── Dockerfile.update
│   ├── Pipeline
│   │   └── CodePipeline
│   │       ├── Dockerfile
│   │       ├── buildspec.yml
│   │       └── ecs-pipeline-master.yml
│   ├── entryfile
│   └── excludedFiles
├── EcsDeployment
│   └── ecs-master.yml
├── analysis.json
├── deployment.json
├── pipeline.json
└── taskDef.json

パイプラインのデプロイ

ecs-pipeline-master.yml を使用してデプロイします。
こちらもネストされたスタックとしてデプロイされます。

$ sudo aws cloudformation deploy --template-file /root/app2container/java-generic-65424cc9/Artifacts/Pipeline/CodePipeline/ecs-pipeline-master.yml --capabilities CAPABILITY_NAMED_IAM --stack-name a2c-java-generic-65424cc9-ecs-pipeline-stack

Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - a2c-java-generic-65424cc9-ecs-pipeline-stack

これにより、Dockerfile および buildspec.yml が CodeCommit で管理された状態となり、
レポジトリへの変更を検知してパイプラインが起動します。
CodeBuild で コンテナイメージの Build & Push および、タスク定義の編集を行い、
ECS クラスターへのデプロイを行なう、パイプラインを簡単に作成することができます。

image.png

EKS のデプロイ

EKS デプロイ用アーティファクトの作成

EKS 関連のリソースを作成するには containerize コマンドで作成された deployment.json の
eksParameters を編集し、createEksArtifacts を true に変更する必要があります。

       "eksParameters": {
              "createEksArtifacts": true,
              "stackName": "a2c-java-generic-65424cc9-EKS",
              "reuseResources": {
                     "vpcId": "",
                     "cfnStackName": "",
                     "sshKeyPairName": ""
              }
       }

再度、generate app-delopyment コマンドを実行します。
pipeline.json は上書きされてしまうので、ご注意ください。

$ sudo app2container generate app-deployment --application-id java-generic-65424cc9
✔ AWS prerequisite check succeeded
✔ Docker prerequisite check succeeded
✔ Created ECR Repository
✔ Uploaded CloudFormation resources to S3 Bucket: <your_bucket_name>
✔ Generated CloudFormation Master template at: /root/app2container/java-generic-65424cc9/EksDeployment/amazon-eks-master.template.yaml
? EKS CloudFormation templates and additional deployment artifacts generated successfully for application java-generic-65424cc9

? You're all set to use AWS CloudFormation to manage your application stack.You're all set to use AWS CloudFormation to manage your application stack.

Next Steps:
1. Edit the CloudFormation template as necessary.
2. Create an application stack using the AWS CLI or the AWS Console. AWS CLI command:

        aws cloudformation deploy --template-file /root/app2container/java-generic-65424cc9/EksDeployment/amazon-eks-master.template.yaml --capabilities CAPABILITY_NAMED_IAM --stack-name a2c-java-generic-65424cc9-EKS

3. Setup a pipeline for your application stack using app2container:

        app2container generate pipeline --application-id java-generic-65424cc9

EKS クラスターデプロイ用の CloudFormation テンプレートと deployment と service を作成する
ための マニフェストファイル が作成されます。namespace が default だったりするので
こちらも必要に応じてカスタマイズします。

$ sudo tree /root/app2container/java-generic-65424cc9/
/root/app2container/java-generic-65424cc9/
├── Artifacts
│   ├── ContainerFiles.tar
│   ├── Dockerfile
│   ├── Dockerfile.update
│   ├── Pipeline
│   │   └── CodePipeline
│   │       ├── Dockerfile
│   │       ├── buildspec.yml
│   │       └── ecs-pipeline-master.yml
│   ├── entryfile
│   └── excludedFiles
├── EcsDeployment
│   └── ecs-master.yml
├── EksDeployment ★
│   ├── amazon-eks-master.template.yaml
│   └── java-generic-65424cc9.pem
├── analysis.json
├── deployment.json
├── eks_deployment.yaml ★
├── eks_service.yaml ★
├── pipeline.json
└── taskDef.json

EKS クラスターへのデプロイ

amazon-eks-master.template.yaml を使用して、EKS クラスターをデプロイします。
そこそこ時間がかかります。

$ sudo aws cloudformation deploy --template-file /root/app2container/java-generic-65424cc9/EksDeployment/amazon-eks-master.template.yaml --capabilities CAPABILITY_NAMED_IAM --stack-name a2c-java-generic-65424cc9-EKS

Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - a2c-java-generic-65424cc9-EKS

EKS についても CI/CD パイプラインを作成することができますが、
手順は ECS と同様であるため割愛します。

参考

App2Container Documenet
https://docs.aws.amazon.com/app2container/latest/UserGuide/what-is-a2c.html

以上です。
参考になれば幸いです。

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

【Docker】初心者が環境構築しました!

背景

未経験から転職した僕が初めてDockerの環境構築をしたので、アウトプットします。併せて、同じ初心者の方の参考になれば嬉しいです。

使用環境

  • Macを使用しています
  • 開発フレームワークはRuby on Railsです

Dockerとは

仮想環境を提供するオープンソースソフトウェアです。
仮想環境というのは、自分のPCやサーバーとは別の環境のことをいいます。
このメリットは何のか?といいますと例を2つくらい挙げたいと思います。

  1. MacPCを使用しいてWindows専用のソフトを使いたい!という時に仮想環境を作ってWindowsの環境を作り出せばそこでWindowsのソフトを作れちゃうって感じになります!

  2. 自分のPCのプログラミング言語のバージョンが5だとして、仕事の現場のバージョンが3を使っていたとしたらわざわざ自分のPCのバージョンを落さなくてもこの仮想環境情で開発できちゃうって訳です!!

これは便利ですね?(初心者ながら思っています、、笑)

なぜDockerを使うのか

理由は主に2点あります。
1. 環境構築が簡単
既に開発が行われている現場な難しい環境構築をしなくても簡単なコマンド(docker compose)を打てばすぐに開発に移れます。
2. 移動のしやすさ
イメージで言うとdockerと言う船にコンテナと言うパーツ(プログラミング言語Webサーバー、データベース等)が乗っている感じです。これはコマンドで簡単に移動できるみたいです。(まだ体験していないですが、、)

環境構築手順

※以下はまだDockerとDocker Composeを自分のPCにインストールしていない方向けです。(初めてDockerを使う方)
1. まずは下記のURLでDockerのインストールから始めましょう!
https://www.docker.com/
2. インストールが終わったらターミナルを開いて下記の作業をしてください。
そして、% docker --versionと% docker-compose --version(%は除いてください) と打ってください。
下記の様に出ていればインストール成功です。
Screenshot from Gyazo

まとめ

今回は概念の理解と簡単な環境構築手順をまとめてみました。
勉強し始めで間違っているところあるかもしれませんが、Dockerってすごく便利だ
なって思いました。今後も勉強してまた記事を更新していきたいと思います!!

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

dockerでRails6開発環境構築

紹介する内容

  • rails6開発環境をdockerでrails newから構築します
    • rails6.0.3.2です

結論

  • rails6開発環境をdockerでrails newから構築するなら、Dockerfileやentrypointの内容作成タイミングに気を付ける必要があります

紹介始めます

ディレクトリ構成

全体ソースコードは https://github.com/cheekykorkind/qiita-example/tree/master/rails/6/puma で確認できます

  • 全体図
    allD.png

  • rails new . -d postgresqlで生成された部分
    railsNew.png

Rails6プロジェクト作成までの手順です

docker composeがあるデレクトリーに移動しました

  • cd qitta-example/rails/6/puma

Dockerfileとentrypoint.shにdbマイグレーション、puma起動コマンド部分なしで、rails起動させるdockerコンテナを起動しました

  • railsをインストールするためです
  • railsがインストールされてない状態でentrypoint.shのbundle execコマンドでdb:create db:migraterails s -p 3000 -b 0.0.0.0などを行したらエラーになるからです

    • rails newコマンドを実行するタイミングで使ったDockerfileファイル commentoutDockerfile.png
    • rails newコマンドを実行するタイミングで使ったentrypoint.shファイル commentoutEntrypoint.png

rails起動させるdockerコンテナに入りました

  • DOCKER_UID=$(id -u $USER) DOCKER_GID=$(id -g $USER) docker-compose up -d
  • docker exec -it rails-puma-web /bin/bash

rails newコマンドでインストールしました

  • rails new . -d postgresql
  • postgres使いますからrails newコマンドにpostgresを含めました

database.ymlを修正しました

  • hostをdocker composeに合わせて調整しました
  • 他の部分も調整しました

Dockerfileとentrypoint.shにdbマイグレーション、puma起動コマンドを追加しました

  • railsがインストールされたから、dbマイグレーション、puma起動コマンドが問題なく起動できます

Rails6動きました

実行コマンドです

cd qitta-example/rails/6/puma
DOCKER_UID=$(id -u $USER) DOCKER_GID=$(id -g $USER) docker-compose up

railsPuma.gif

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

circleCIでRspecが失敗するのは環境変数をうまく渡せていなかったから

長い時間躓いたのでこちらに残します。
間違いがありましたら是非ご指摘ください。

ローカル環境でRspecのテストは通るのに何故かcircleCIではレッドになる。。

様子を見ていると環境変数がうまく渡せていないようでした。

やったこと

.envファイルに環境変数記入

HOGE= hogehoge

circleCIのProject SettingsからEnvironment Variablesで設定
これで充分と思っていたのですがテストは通らず。。

原因

docker-compose.ci.ymlでの記入が足りなかった

HOGE: ${HOGE}

で無事に通るようになりました!

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

Nginxコンテナを使ってみる①(dockerインストール~コンテナ起動)

単なる作業メモ。

Nginxを使ってみるべく書籍(Nginx実践ガイド)の内容をハンズオンしてみる。
なお書籍ではCentOS上にyumでnginxをインストールしているが
ここではEC2上にdockerをインストールしてnginxコンテナで動かす。

■EC2起動
何でも良かったので無料のt2.micro、AmazonLinux2でインスタンス起動。
セキュリティーグループでSSH(22)とHTTP(80)のみ、SourceIPは自PCのみにしておく。

■EC2インスタンスのSSH接続
SSHクライアント(今回はTeraterm)でインスタンスにログイン

■dockerインストール

dockerインストール
[ec2-user]$ sudo amazon-linux-extras install docker
Installing docker
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Cleaning repos: amzn2-core amzn2extra-docker
10 metadata files removed
4 sqlite files removed
0 metadata files removed
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                                                 | 3.7 kB  00:00:00
amzn2extra-docker                                                          | 3.0 kB  00:00:00
(1/5): amzn2-core/2/x86_64/group_gz                                        | 2.5 kB  00:00:00
(2/5): amzn2-core/2/x86_64/updateinfo                                      | 223 kB  00:00:00
(3/5): amzn2extra-docker/2/x86_64/updateinfo                               |   69 B  00:00:00
(4/5): amzn2extra-docker/2/x86_64/primary_db                               |  68 kB  00:00:00
(5/5): amzn2-core/2/x86_64/primary_db                                      |  42 MB  00:00:00
Resolving Dependencies
--> Running transaction check
---> Package docker.x86_64 0:19.03.6ce-4.amzn2 will be installed
--> Processing Dependency: runc >= 1.0.0 for package: docker-19.03.6ce-4.amzn2.x86_64
--> Processing Dependency: containerd >= 1.3.2 for package: docker-19.03.6ce-4.amzn2.x86_64
--> Processing Dependency: pigz for package: docker-19.03.6ce-4.amzn2.x86_64
--> Processing Dependency: libcgroup for package: docker-19.03.6ce-4.amzn2.x86_64
--> Running transaction check
---> Package containerd.x86_64 0:1.3.2-1.amzn2 will be installed
---> Package libcgroup.x86_64 0:0.41-21.amzn2 will be installed
---> Package pigz.x86_64 0:2.3.4-1.amzn2.0.1 will be installed
---> Package runc.x86_64 0:1.0.0-0.1.20200204.gitdc9208a.amzn2 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==================================================================================================
 Package        Arch       Version                                    Repository             Size
==================================================================================================
Installing:
 docker         x86_64     19.03.6ce-4.amzn2                          amzn2extra-docker      37 M
Installing for dependencies:
 containerd     x86_64     1.3.2-1.amzn2                              amzn2extra-docker      24 M
 libcgroup      x86_64     0.41-21.amzn2                              amzn2-core             66 k
 pigz           x86_64     2.3.4-1.amzn2.0.1                          amzn2-core             81 k
 runc           x86_64     1.0.0-0.1.20200204.gitdc9208a.amzn2        amzn2extra-docker     2.6 M

Transaction Summary
==================================================================================================
Install  1 Package (+4 Dependent packages)

Total download size: 65 M
Installed size: 271 M
Is this ok [y/d/N]: y
Downloading packages:
(1/5): libcgroup-0.41-21.amzn2.x86_64.rpm                                  |  66 kB  00:00:00
(2/5): pigz-2.3.4-1.amzn2.0.1.x86_64.rpm                                   |  81 kB  00:00:00
(3/5): containerd-1.3.2-1.amzn2.x86_64.rpm                                 |  24 MB  00:00:00
(4/5): docker-19.03.6ce-4.amzn2.x86_64.rpm                                 |  37 MB  00:00:00
(5/5): runc-1.0.0-0.1.20200204.gitdc9208a.amzn2.x86_64.rpm                 | 2.6 MB  00:00:00
--------------------------------------------------------------------------------------------------
Total                                                              69 MB/s |  65 MB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : runc-1.0.0-0.1.20200204.gitdc9208a.amzn2.x86_64                                1/5
  Installing : containerd-1.3.2-1.amzn2.x86_64                                                2/5
  Installing : libcgroup-0.41-21.amzn2.x86_64                                                 3/5
  Installing : pigz-2.3.4-1.amzn2.0.1.x86_64                                                  4/5
  Installing : docker-19.03.6ce-4.amzn2.x86_64                                                5/5
  Verifying  : docker-19.03.6ce-4.amzn2.x86_64                                                1/5
  Verifying  : containerd-1.3.2-1.amzn2.x86_64                                                2/5
  Verifying  : pigz-2.3.4-1.amzn2.0.1.x86_64                                                  3/5
  Verifying  : runc-1.0.0-0.1.20200204.gitdc9208a.amzn2.x86_64                                4/5
  Verifying  : libcgroup-0.41-21.amzn2.x86_64                                                 5/5

Installed:
  docker.x86_64 0:19.03.6ce-4.amzn2

Dependency Installed:
  containerd.x86_64 0:1.3.2-1.amzn2       libcgroup.x86_64 0:0.41-21.amzn2
  pigz.x86_64 0:2.3.4-1.amzn2.0.1         runc.x86_64 0:1.0.0-0.1.20200204.gitdc9208a.amzn2

Complete!
  0  ansible2                 available    \
        [ =2.4.2  =2.4.6  =2.8  =stable ]
  2  httpd_modules            available    [ =1.0  =stable ]
  3  memcached1.5             available    \
        [ =1.5.1  =1.5.16  =1.5.17 ]
  5  postgresql9.6            available    \
        [ =9.6.6  =9.6.8  =stable ]
  6  postgresql10             available    [ =10  =stable ]
  8  redis4.0                 available    \
        [ =4.0.5  =4.0.10  =stable ]
  9  R3.4                     available    [ =3.4.3  =stable ]
 10  rust1                    available    \
        [ =1.22.1  =1.26.0  =1.26.1  =1.27.2  =1.31.0  =1.38.0
          =stable ]
 11  vim                      available    [ =8.0  =stable ]
 13  ruby2.4                  available    \
        [ =2.4.2  =2.4.4  =2.4.7  =stable ]
 15  php7.2                   available    \
        [ =7.2.0  =7.2.4  =7.2.5  =7.2.8  =7.2.11  =7.2.13  =7.2.14
          =7.2.16  =7.2.17  =7.2.19  =7.2.21  =7.2.22  =7.2.23
          =7.2.24  =7.2.26  =stable ]
 17  lamp-mariadb10.2-php7.2  available    \
        [ =10.2.10_7.2.0  =10.2.10_7.2.4  =10.2.10_7.2.5
          =10.2.10_7.2.8  =10.2.10_7.2.11  =10.2.10_7.2.13
          =10.2.10_7.2.14  =10.2.10_7.2.16  =10.2.10_7.2.17
          =10.2.10_7.2.19  =10.2.10_7.2.22  =10.2.10_7.2.23
          =10.2.10_7.2.24  =stable ]
 18  libreoffice              available    \
        [ =5.0.6.2_15  =5.3.6.1  =stable ]
 19  gimp                     available    [ =2.8.22 ]
 20  docker=latest            enabled      \
        [ =17.12.1  =18.03.1  =18.06.1  =18.09.9  =stable ]
 21  mate-desktop1.x          available    \
        [ =1.19.0  =1.20.0  =stable ]
 22  GraphicsMagick1.3        available    \
        [ =1.3.29  =1.3.32  =1.3.34  =stable ]
 23  tomcat8.5                available    \
        [ =8.5.31  =8.5.32  =8.5.38  =8.5.40  =8.5.42  =8.5.50
          =stable ]
 24  epel                     available    [ =7.11  =stable ]
 25  testing                  available    [ =1.0  =stable ]
 26  ecs                      available    [ =stable ]
 27  corretto8                available    \
        [ =1.8.0_192  =1.8.0_202  =1.8.0_212  =1.8.0_222  =1.8.0_232
          =1.8.0_242  =stable ]
 28  firecracker              available    [ =0.11  =stable ]
 29  golang1.11               available    \
        [ =1.11.3  =1.11.11  =1.11.13  =stable ]
 30  squid4                   available    [ =4  =stable ]
 31  php7.3                   available    \
        [ =7.3.2  =7.3.3  =7.3.4  =7.3.6  =7.3.8  =7.3.9  =7.3.10
          =7.3.11  =7.3.13  =stable ]
 32  lustre2.10               available    \
        [ =2.10.5  =2.10.8  =stable ]
 33  java-openjdk11           available    [ =11  =stable ]
 34  lynis                    available    [ =stable ]
 35  kernel-ng                available    [ =stable ]
 36  BCC                      available    [ =0.x  =stable ]
 37  mono                     available    [ =5.x  =stable ]
 38  nginx1                   available    [ =stable ]
 39  ruby2.6                  available    [ =2.6  =stable ]
 40  mock                     available    [ =stable ]
 41  postgresql11             available    [ =11  =stable ]
 42  php7.4                   available    [ =stable ]
 43  livepatch                available    [ =stable ]
 44  python3.8                available    [ =stable ]
 45  haproxy2                 available    [ =stable ]
[ec2-user]$
dockerグループ追加
[ec2-user]$ sudo usermod -a -G docker ec2-user
[ec2-user]$
サービス起動
[ec2-user]$ sudo systemctl start docker.service
[ec2-user]$
自動起動設定
[ec2-user]$ sudo systemctl enable docker.service
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[ec2-user]$

■nginxコンテナ起動

PULL
[ec2-user]$ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
8559a31e96f4: Pull complete
8d69e59170f7: Pull complete
3f9f1ec1d262: Pull complete
d1f5ff4f210d: Pull complete
1e22bfa8652e: Pull complete
Digest: sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[ec2-user]$
コンテナ起動
[ec2-user]$ docker run -d --name nginx -p 80:80 --rm nginx:latest
6775ebb4074c0c7f8ded76587c1d6f6dbbc9f4aef345add09b73ad2cb005216c
[ec2-user]$
[ec2-user]$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
6775ebb4074c        nginx:latest        "/docker-entrypoint.…"   11 seconds ago      Up 11 seconds       0.0.0.0:80->80/tcp   nginx
[ec2-user]$

■コンテナに入ってみる

コンテナ接続
docker container exec -it nginx /bin/bash

■nginxのバージョン
nginxコマンドを-vオプションで打つとバージョン情報が出てくる。
-Vオプションで打つとバージョン情報に加えビルド情報等も出てくる。

nginxのバージョン確認
root@6775ebb4074c:~# nginx -V
nginx version: nginx/1.19.0
built by gcc 8.3.0 (Debian 8.3.0-6)
built with OpenSSL 1.1.1d  10 Sep 2019
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-1.19.0/debian/debuild-base/nginx-1.19.0=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'
root@6775ebb4074c:~#

■nginxのディレクトリ構造

/etc/nginx
設定ファイル置き場。
ここに置かれているnginx.confが最初に読み込まれる設定ファイル。
この中からincude指定された設定ファイルが追加で読み込まれていく。
デフォルトでは以下が追加で読み込まれる。
/etc/nginx/conf.d/*.conf;
/etc/nginx/mime.types;

設定ファイル置き場
root@6775ebb4074c:~# ls -l /etc/nginx
total 36
drwxr-xr-x 1 root root   26 Jul  4 09:57 conf.d
-rw-r--r-- 1 root root 1007 May 26 15:00 fastcgi_params
-rw-r--r-- 1 root root 2837 May 26 15:00 koi-utf
-rw-r--r-- 1 root root 2223 May 26 15:00 koi-win
-rw-r--r-- 1 root root 5231 May 26 15:00 mime.types
lrwxrwxrwx 1 root root   22 May 26 15:01 modules -> /usr/lib/nginx/modules
-rw-r--r-- 1 root root  643 May 26 15:01 nginx.conf
-rw-r--r-- 1 root root  636 May 26 15:00 scgi_params
-rw-r--r-- 1 root root  664 May 26 15:00 uwsgi_params
-rw-r--r-- 1 root root 3610 May 26 15:00 win-utf
root@6775ebb4074c:~#
root@6775ebb4074c:~#
root@6775ebb4074c:~#
root@6775ebb4074c:~# grep include /etc/nginx/nginx.conf
    include  /etc/nginx/mime.types;
    include  /etc/nginx/conf.d/*.conf;
root@6775ebb4074c:~#

/usr/lib/nginx/modules
追加モジュール置き場。書籍にはlibではなくlib64と書かれていたがこの環境ではlibだった。

追加モジュール置き場
root@6775ebb4074c:~# ls -l /usr/lib/nginx/modules/
total 2640
-rw-r--r-- 1 root root  24328 May 26 15:01 ngx_http_geoip_module-debug.so
-rw-r--r-- 1 root root  24328 May 26 15:01 ngx_http_geoip_module.so
-rw-r--r-- 1 root root  27568 May 26 15:01 ngx_http_image_filter_module-debug.so
-rw-r--r-- 1 root root  27568 May 26 15:01 ngx_http_image_filter_module.so
-rw-r--r-- 1 root root 632800 May 26 15:01 ngx_http_js_module-debug.so
-rw-r--r-- 1 root root 628704 May 26 15:01 ngx_http_js_module.so
-rw-r--r-- 1 root root  23400 May 26 15:01 ngx_http_xslt_filter_module-debug.so
-rw-r--r-- 1 root root  23400 May 26 15:01 ngx_http_xslt_filter_module.so
-rw-r--r-- 1 root root  19864 May 26 15:01 ngx_stream_geoip_module-debug.so
-rw-r--r-- 1 root root  19864 May 26 15:01 ngx_stream_geoip_module.so
-rw-r--r-- 1 root root 619232 May 26 15:01 ngx_stream_js_module-debug.so
-rw-r--r-- 1 root root 615136 May 26 15:01 ngx_stream_js_module.so
root@6775ebb4074c:~#

/usr/share/nginx/html
デフォルトのドキュメントルート。エラードキュメントもここ。
sh:デフォルトのドキュメントルート
root@6775ebb4074c:~# ls -l /usr/share/nginx/html
total 8
-rw-r--r-- 1 root root 494 May 26 15:00 50x.html
-rw-r--r-- 1 root root 612 May 26 15:00 index.html
root@6775ebb4074c:~#

/var/cache/nginxv
キャッシュファイル置き場

キャッシュファイル置き場
root@6775ebb4074c:~# ls -l /var/cache/nginx
total 0
drwx------ 2 nginx root 6 Jul  4 09:57 client_temp
drwx------ 2 nginx root 6 Jul  4 09:57 fastcgi_temp
drwx------ 2 nginx root 6 Jul  4 09:57 proxy_temp
drwx------ 2 nginx root 6 Jul  4 09:57 scgi_temp
drwx------ 2 nginx root 6 Jul  4 09:57 uwsgi_temp
root@6775ebb4074c:~#

/var/log/nginx
ログファイル置き場。
nginxのログはアクセスログとエラーログの2種類。
今回はコンテナなのでそれぞれ標準出力、標準エラー出力に
シンボリックリンクが張られている。

ログファイル置き場
root@6775ebb4074c:~# ls -l /var/log/nginx
total 0
lrwxrwxrwx 1 root root 11 Jun  9 16:57 access.log -> /dev/stdout
lrwxrwxrwx 1 root root 11 Jun  9 16:57 error.log -> /dev/stderr
root@6775ebb4074c:~#
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

nginxコンテナを使ってみる①

単なる作業メモ。
dockerインストール~nginxコンテナ起動まで。

nginxを使ってみたかったので
書籍(Nginx実践ガイド)に書かれている内容を実際にやってみる。

書籍はCentOS上にyumでnginxをインストールしているが
今回はEC2上にdockerをインストールしてnginxコンテナで動かす。

■EC2起動
何でも良かったので無料のt2.micro、AmazonLinux2でインスタンス起動。
セキュリティーグループはSSH(22)とHTTP(80)のみ、SourceIPは自PCに絞っておく。

■EC2インスタンスのSSH接続
SSHクライアント(今回はTeraterm)でインスタンスにログイン

■dockerインストール

dockerインストール
[ec2-user]$ sudo amazon-linux-extras install docker
Installing docker
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Cleaning repos: amzn2-core amzn2extra-docker
10 metadata files removed
4 sqlite files removed
0 metadata files removed
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                                                 | 3.7 kB  00:00:00
amzn2extra-docker                                                          | 3.0 kB  00:00:00
(1/5): amzn2-core/2/x86_64/group_gz                                        | 2.5 kB  00:00:00
(2/5): amzn2-core/2/x86_64/updateinfo                                      | 223 kB  00:00:00
(3/5): amzn2extra-docker/2/x86_64/updateinfo                               |   69 B  00:00:00
(4/5): amzn2extra-docker/2/x86_64/primary_db                               |  68 kB  00:00:00
(5/5): amzn2-core/2/x86_64/primary_db                                      |  42 MB  00:00:00
Resolving Dependencies
--> Running transaction check
---> Package docker.x86_64 0:19.03.6ce-4.amzn2 will be installed
--> Processing Dependency: runc >= 1.0.0 for package: docker-19.03.6ce-4.amzn2.x86_64
--> Processing Dependency: containerd >= 1.3.2 for package: docker-19.03.6ce-4.amzn2.x86_64
--> Processing Dependency: pigz for package: docker-19.03.6ce-4.amzn2.x86_64
--> Processing Dependency: libcgroup for package: docker-19.03.6ce-4.amzn2.x86_64
--> Running transaction check
---> Package containerd.x86_64 0:1.3.2-1.amzn2 will be installed
---> Package libcgroup.x86_64 0:0.41-21.amzn2 will be installed
---> Package pigz.x86_64 0:2.3.4-1.amzn2.0.1 will be installed
---> Package runc.x86_64 0:1.0.0-0.1.20200204.gitdc9208a.amzn2 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==================================================================================================
 Package        Arch       Version                                    Repository             Size
==================================================================================================
Installing:
 docker         x86_64     19.03.6ce-4.amzn2                          amzn2extra-docker      37 M
Installing for dependencies:
 containerd     x86_64     1.3.2-1.amzn2                              amzn2extra-docker      24 M
 libcgroup      x86_64     0.41-21.amzn2                              amzn2-core             66 k
 pigz           x86_64     2.3.4-1.amzn2.0.1                          amzn2-core             81 k
 runc           x86_64     1.0.0-0.1.20200204.gitdc9208a.amzn2        amzn2extra-docker     2.6 M

Transaction Summary
==================================================================================================
Install  1 Package (+4 Dependent packages)

Total download size: 65 M
Installed size: 271 M
Is this ok [y/d/N]: y
Downloading packages:
(1/5): libcgroup-0.41-21.amzn2.x86_64.rpm                                  |  66 kB  00:00:00
(2/5): pigz-2.3.4-1.amzn2.0.1.x86_64.rpm                                   |  81 kB  00:00:00
(3/5): containerd-1.3.2-1.amzn2.x86_64.rpm                                 |  24 MB  00:00:00
(4/5): docker-19.03.6ce-4.amzn2.x86_64.rpm                                 |  37 MB  00:00:00
(5/5): runc-1.0.0-0.1.20200204.gitdc9208a.amzn2.x86_64.rpm                 | 2.6 MB  00:00:00
--------------------------------------------------------------------------------------------------
Total                                                              69 MB/s |  65 MB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : runc-1.0.0-0.1.20200204.gitdc9208a.amzn2.x86_64                                1/5
  Installing : containerd-1.3.2-1.amzn2.x86_64                                                2/5
  Installing : libcgroup-0.41-21.amzn2.x86_64                                                 3/5
  Installing : pigz-2.3.4-1.amzn2.0.1.x86_64                                                  4/5
  Installing : docker-19.03.6ce-4.amzn2.x86_64                                                5/5
  Verifying  : docker-19.03.6ce-4.amzn2.x86_64                                                1/5
  Verifying  : containerd-1.3.2-1.amzn2.x86_64                                                2/5
  Verifying  : pigz-2.3.4-1.amzn2.0.1.x86_64                                                  3/5
  Verifying  : runc-1.0.0-0.1.20200204.gitdc9208a.amzn2.x86_64                                4/5
  Verifying  : libcgroup-0.41-21.amzn2.x86_64                                                 5/5

Installed:
  docker.x86_64 0:19.03.6ce-4.amzn2

Dependency Installed:
  containerd.x86_64 0:1.3.2-1.amzn2       libcgroup.x86_64 0:0.41-21.amzn2
  pigz.x86_64 0:2.3.4-1.amzn2.0.1         runc.x86_64 0:1.0.0-0.1.20200204.gitdc9208a.amzn2

Complete!
  0  ansible2                 available    \
        [ =2.4.2  =2.4.6  =2.8  =stable ]
  2  httpd_modules            available    [ =1.0  =stable ]
  3  memcached1.5             available    \
        [ =1.5.1  =1.5.16  =1.5.17 ]
  5  postgresql9.6            available    \
        [ =9.6.6  =9.6.8  =stable ]
  6  postgresql10             available    [ =10  =stable ]
  8  redis4.0                 available    \
        [ =4.0.5  =4.0.10  =stable ]
  9  R3.4                     available    [ =3.4.3  =stable ]
 10  rust1                    available    \
        [ =1.22.1  =1.26.0  =1.26.1  =1.27.2  =1.31.0  =1.38.0
          =stable ]
 11  vim                      available    [ =8.0  =stable ]
 13  ruby2.4                  available    \
        [ =2.4.2  =2.4.4  =2.4.7  =stable ]
 15  php7.2                   available    \
        [ =7.2.0  =7.2.4  =7.2.5  =7.2.8  =7.2.11  =7.2.13  =7.2.14
          =7.2.16  =7.2.17  =7.2.19  =7.2.21  =7.2.22  =7.2.23
          =7.2.24  =7.2.26  =stable ]
 17  lamp-mariadb10.2-php7.2  available    \
        [ =10.2.10_7.2.0  =10.2.10_7.2.4  =10.2.10_7.2.5
          =10.2.10_7.2.8  =10.2.10_7.2.11  =10.2.10_7.2.13
          =10.2.10_7.2.14  =10.2.10_7.2.16  =10.2.10_7.2.17
          =10.2.10_7.2.19  =10.2.10_7.2.22  =10.2.10_7.2.23
          =10.2.10_7.2.24  =stable ]
 18  libreoffice              available    \
        [ =5.0.6.2_15  =5.3.6.1  =stable ]
 19  gimp                     available    [ =2.8.22 ]
 20  docker=latest            enabled      \
        [ =17.12.1  =18.03.1  =18.06.1  =18.09.9  =stable ]
 21  mate-desktop1.x          available    \
        [ =1.19.0  =1.20.0  =stable ]
 22  GraphicsMagick1.3        available    \
        [ =1.3.29  =1.3.32  =1.3.34  =stable ]
 23  tomcat8.5                available    \
        [ =8.5.31  =8.5.32  =8.5.38  =8.5.40  =8.5.42  =8.5.50
          =stable ]
 24  epel                     available    [ =7.11  =stable ]
 25  testing                  available    [ =1.0  =stable ]
 26  ecs                      available    [ =stable ]
 27  corretto8                available    \
        [ =1.8.0_192  =1.8.0_202  =1.8.0_212  =1.8.0_222  =1.8.0_232
          =1.8.0_242  =stable ]
 28  firecracker              available    [ =0.11  =stable ]
 29  golang1.11               available    \
        [ =1.11.3  =1.11.11  =1.11.13  =stable ]
 30  squid4                   available    [ =4  =stable ]
 31  php7.3                   available    \
        [ =7.3.2  =7.3.3  =7.3.4  =7.3.6  =7.3.8  =7.3.9  =7.3.10
          =7.3.11  =7.3.13  =stable ]
 32  lustre2.10               available    \
        [ =2.10.5  =2.10.8  =stable ]
 33  java-openjdk11           available    [ =11  =stable ]
 34  lynis                    available    [ =stable ]
 35  kernel-ng                available    [ =stable ]
 36  BCC                      available    [ =0.x  =stable ]
 37  mono                     available    [ =5.x  =stable ]
 38  nginx1                   available    [ =stable ]
 39  ruby2.6                  available    [ =2.6  =stable ]
 40  mock                     available    [ =stable ]
 41  postgresql11             available    [ =11  =stable ]
 42  php7.4                   available    [ =stable ]
 43  livepatch                available    [ =stable ]
 44  python3.8                available    [ =stable ]
 45  haproxy2                 available    [ =stable ]
[ec2-user]$
dockerグループ追加
[ec2-user]$ sudo usermod -a -G docker ec2-user
[ec2-user]$
サービス起動
[ec2-user]$ sudo systemctl start docker.service
[ec2-user]$
自動起動設定
[ec2-user]$ sudo systemctl enable docker.service
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[ec2-user]$

■nginxコンテナ起動

PULL
[ec2-user]$ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
8559a31e96f4: Pull complete
8d69e59170f7: Pull complete
3f9f1ec1d262: Pull complete
d1f5ff4f210d: Pull complete
1e22bfa8652e: Pull complete
Digest: sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[ec2-user]$
コンテナ起動
[ec2-user]$ docker run -d --name nginx -p 80:80 --rm nginx:latest
6775ebb4074c0c7f8ded76587c1d6f6dbbc9f4aef345add09b73ad2cb005216c
[ec2-user]$
[ec2-user]$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
6775ebb4074c        nginx:latest        "/docker-entrypoint.…"   11 seconds ago      Up 11 seconds       0.0.0.0:80->80/tcp   nginx
[ec2-user]$

■コンテナに入ってみる

コンテナ接続
docker container exec -it nginx /bin/bash

■nginxのバージョン
nginxコマンドを-vオプションで打つとバージョン情報が出てくる。
-Vオプションで打つとバージョン情報に加えビルド情報等も出てくる。

nginxのバージョン確認
root@6775ebb4074c:~# nginx -V
nginx version: nginx/1.19.0
built by gcc 8.3.0 (Debian 8.3.0-6)
built with OpenSSL 1.1.1d  10 Sep 2019
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-1.19.0/debian/debuild-base/nginx-1.19.0=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'
root@6775ebb4074c:~#

■nginxのディレクトリ構造

/etc/nginx
設定ファイル置き場。
ここに置かれているnginx.confが最初に読み込まれる設定ファイル。
この中からincude指定された設定ファイルが追加で読み込まれていく。
デフォルトでは以下が追加で読み込まれる。
/etc/nginx/conf.d/*.conf;
/etc/nginx/mime.types;

設定ファイル置き場
root@6775ebb4074c:~# ls -l /etc/nginx
total 36
drwxr-xr-x 1 root root   26 Jul  4 09:57 conf.d
-rw-r--r-- 1 root root 1007 May 26 15:00 fastcgi_params
-rw-r--r-- 1 root root 2837 May 26 15:00 koi-utf
-rw-r--r-- 1 root root 2223 May 26 15:00 koi-win
-rw-r--r-- 1 root root 5231 May 26 15:00 mime.types
lrwxrwxrwx 1 root root   22 May 26 15:01 modules -> /usr/lib/nginx/modules
-rw-r--r-- 1 root root  643 May 26 15:01 nginx.conf
-rw-r--r-- 1 root root  636 May 26 15:00 scgi_params
-rw-r--r-- 1 root root  664 May 26 15:00 uwsgi_params
-rw-r--r-- 1 root root 3610 May 26 15:00 win-utf
root@6775ebb4074c:~#
root@6775ebb4074c:~#
root@6775ebb4074c:~#
root@6775ebb4074c:~# grep include /etc/nginx/nginx.conf
    include  /etc/nginx/mime.types;
    include  /etc/nginx/conf.d/*.conf;
root@6775ebb4074c:~#

/usr/lib/nginx/modules
追加モジュール置き場。書籍にはlibではなくlib64と書かれていたがこの環境ではlibだった。

追加モジュール置き場
root@6775ebb4074c:~# ls -l /usr/lib/nginx/modules/
total 2640
-rw-r--r-- 1 root root  24328 May 26 15:01 ngx_http_geoip_module-debug.so
-rw-r--r-- 1 root root  24328 May 26 15:01 ngx_http_geoip_module.so
-rw-r--r-- 1 root root  27568 May 26 15:01 ngx_http_image_filter_module-debug.so
-rw-r--r-- 1 root root  27568 May 26 15:01 ngx_http_image_filter_module.so
-rw-r--r-- 1 root root 632800 May 26 15:01 ngx_http_js_module-debug.so
-rw-r--r-- 1 root root 628704 May 26 15:01 ngx_http_js_module.so
-rw-r--r-- 1 root root  23400 May 26 15:01 ngx_http_xslt_filter_module-debug.so
-rw-r--r-- 1 root root  23400 May 26 15:01 ngx_http_xslt_filter_module.so
-rw-r--r-- 1 root root  19864 May 26 15:01 ngx_stream_geoip_module-debug.so
-rw-r--r-- 1 root root  19864 May 26 15:01 ngx_stream_geoip_module.so
-rw-r--r-- 1 root root 619232 May 26 15:01 ngx_stream_js_module-debug.so
-rw-r--r-- 1 root root 615136 May 26 15:01 ngx_stream_js_module.so
root@6775ebb4074c:~#

/usr/share/nginx/html
デフォルトのドキュメントルート。エラードキュメントもここ。
sh:デフォルトのドキュメントルート
root@6775ebb4074c:~# ls -l /usr/share/nginx/html
total 8
-rw-r--r-- 1 root root 494 May 26 15:00 50x.html
-rw-r--r-- 1 root root 612 May 26 15:00 index.html
root@6775ebb4074c:~#

/var/cache/nginxv
キャッシュファイル置き場

キャッシュファイル置き場
root@6775ebb4074c:~# ls -l /var/cache/nginx
total 0
drwx------ 2 nginx root 6 Jul  4 09:57 client_temp
drwx------ 2 nginx root 6 Jul  4 09:57 fastcgi_temp
drwx------ 2 nginx root 6 Jul  4 09:57 proxy_temp
drwx------ 2 nginx root 6 Jul  4 09:57 scgi_temp
drwx------ 2 nginx root 6 Jul  4 09:57 uwsgi_temp
root@6775ebb4074c:~#

/var/log/nginx
ログファイル置き場。
nginxのログはアクセスログとエラーログの2種類。
今回はコンテナなのでそれぞれ標準出力、標準エラー出力に
シンボリックリンクが張られている。

ログファイル置き場
root@6775ebb4074c:~# ls -l /var/log/nginx
total 0
lrwxrwxrwx 1 root root 11 Jun  9 16:57 access.log -> /dev/stdout
lrwxrwxrwx 1 root root 11 Jun  9 16:57 error.log -> /dev/stderr
root@6775ebb4074c:~#

■ブラウザアクセス
今回はブラウザアクセスできることを確認して終わり。

http://EC2インスタンスのパブリックDNS名

image.png

無事表示されたので今日はここまで。

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

nginxコンテナを使ってみる①(コンテナ起動)

単なる作業メモ。
dockerインストール~nginxコンテナ起動まで。

nginxを使ってみたかったので
書籍(Nginx実践ガイド)に書かれている内容を実際にやってみる。

書籍はCentOS上にyumでnginxをインストールしているが
今回はEC2上にdockerをインストールしてnginxコンテナで動かす。

■EC2起動
何でも良かったので無料のt2.micro、AmazonLinux2でインスタンス起動。
セキュリティーグループはSSH(22)とHTTP(80)のみ、SourceIPは自PCに絞っておく。

■EC2インスタンスのSSH接続
SSHクライアント(今回はTeraterm)でインスタンスにログイン

■dockerインストール

dockerインストール
[ec2-user]$ sudo amazon-linux-extras install docker
Installing docker
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Cleaning repos: amzn2-core amzn2extra-docker
10 metadata files removed
4 sqlite files removed
0 metadata files removed
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                                                 | 3.7 kB  00:00:00
amzn2extra-docker                                                          | 3.0 kB  00:00:00
(1/5): amzn2-core/2/x86_64/group_gz                                        | 2.5 kB  00:00:00
(2/5): amzn2-core/2/x86_64/updateinfo                                      | 223 kB  00:00:00
(3/5): amzn2extra-docker/2/x86_64/updateinfo                               |   69 B  00:00:00
(4/5): amzn2extra-docker/2/x86_64/primary_db                               |  68 kB  00:00:00
(5/5): amzn2-core/2/x86_64/primary_db                                      |  42 MB  00:00:00
Resolving Dependencies
--> Running transaction check
---> Package docker.x86_64 0:19.03.6ce-4.amzn2 will be installed
--> Processing Dependency: runc >= 1.0.0 for package: docker-19.03.6ce-4.amzn2.x86_64
--> Processing Dependency: containerd >= 1.3.2 for package: docker-19.03.6ce-4.amzn2.x86_64
--> Processing Dependency: pigz for package: docker-19.03.6ce-4.amzn2.x86_64
--> Processing Dependency: libcgroup for package: docker-19.03.6ce-4.amzn2.x86_64
--> Running transaction check
---> Package containerd.x86_64 0:1.3.2-1.amzn2 will be installed
---> Package libcgroup.x86_64 0:0.41-21.amzn2 will be installed
---> Package pigz.x86_64 0:2.3.4-1.amzn2.0.1 will be installed
---> Package runc.x86_64 0:1.0.0-0.1.20200204.gitdc9208a.amzn2 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==================================================================================================
 Package        Arch       Version                                    Repository             Size
==================================================================================================
Installing:
 docker         x86_64     19.03.6ce-4.amzn2                          amzn2extra-docker      37 M
Installing for dependencies:
 containerd     x86_64     1.3.2-1.amzn2                              amzn2extra-docker      24 M
 libcgroup      x86_64     0.41-21.amzn2                              amzn2-core             66 k
 pigz           x86_64     2.3.4-1.amzn2.0.1                          amzn2-core             81 k
 runc           x86_64     1.0.0-0.1.20200204.gitdc9208a.amzn2        amzn2extra-docker     2.6 M

Transaction Summary
==================================================================================================
Install  1 Package (+4 Dependent packages)

Total download size: 65 M
Installed size: 271 M
Is this ok [y/d/N]: y
Downloading packages:
(1/5): libcgroup-0.41-21.amzn2.x86_64.rpm                                  |  66 kB  00:00:00
(2/5): pigz-2.3.4-1.amzn2.0.1.x86_64.rpm                                   |  81 kB  00:00:00
(3/5): containerd-1.3.2-1.amzn2.x86_64.rpm                                 |  24 MB  00:00:00
(4/5): docker-19.03.6ce-4.amzn2.x86_64.rpm                                 |  37 MB  00:00:00
(5/5): runc-1.0.0-0.1.20200204.gitdc9208a.amzn2.x86_64.rpm                 | 2.6 MB  00:00:00
--------------------------------------------------------------------------------------------------
Total                                                              69 MB/s |  65 MB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : runc-1.0.0-0.1.20200204.gitdc9208a.amzn2.x86_64                                1/5
  Installing : containerd-1.3.2-1.amzn2.x86_64                                                2/5
  Installing : libcgroup-0.41-21.amzn2.x86_64                                                 3/5
  Installing : pigz-2.3.4-1.amzn2.0.1.x86_64                                                  4/5
  Installing : docker-19.03.6ce-4.amzn2.x86_64                                                5/5
  Verifying  : docker-19.03.6ce-4.amzn2.x86_64                                                1/5
  Verifying  : containerd-1.3.2-1.amzn2.x86_64                                                2/5
  Verifying  : pigz-2.3.4-1.amzn2.0.1.x86_64                                                  3/5
  Verifying  : runc-1.0.0-0.1.20200204.gitdc9208a.amzn2.x86_64                                4/5
  Verifying  : libcgroup-0.41-21.amzn2.x86_64                                                 5/5

Installed:
  docker.x86_64 0:19.03.6ce-4.amzn2

Dependency Installed:
  containerd.x86_64 0:1.3.2-1.amzn2       libcgroup.x86_64 0:0.41-21.amzn2
  pigz.x86_64 0:2.3.4-1.amzn2.0.1         runc.x86_64 0:1.0.0-0.1.20200204.gitdc9208a.amzn2

Complete!
  0  ansible2                 available    \
        [ =2.4.2  =2.4.6  =2.8  =stable ]
  2  httpd_modules            available    [ =1.0  =stable ]
  3  memcached1.5             available    \
        [ =1.5.1  =1.5.16  =1.5.17 ]
  5  postgresql9.6            available    \
        [ =9.6.6  =9.6.8  =stable ]
  6  postgresql10             available    [ =10  =stable ]
  8  redis4.0                 available    \
        [ =4.0.5  =4.0.10  =stable ]
  9  R3.4                     available    [ =3.4.3  =stable ]
 10  rust1                    available    \
        [ =1.22.1  =1.26.0  =1.26.1  =1.27.2  =1.31.0  =1.38.0
          =stable ]
 11  vim                      available    [ =8.0  =stable ]
 13  ruby2.4                  available    \
        [ =2.4.2  =2.4.4  =2.4.7  =stable ]
 15  php7.2                   available    \
        [ =7.2.0  =7.2.4  =7.2.5  =7.2.8  =7.2.11  =7.2.13  =7.2.14
          =7.2.16  =7.2.17  =7.2.19  =7.2.21  =7.2.22  =7.2.23
          =7.2.24  =7.2.26  =stable ]
 17  lamp-mariadb10.2-php7.2  available    \
        [ =10.2.10_7.2.0  =10.2.10_7.2.4  =10.2.10_7.2.5
          =10.2.10_7.2.8  =10.2.10_7.2.11  =10.2.10_7.2.13
          =10.2.10_7.2.14  =10.2.10_7.2.16  =10.2.10_7.2.17
          =10.2.10_7.2.19  =10.2.10_7.2.22  =10.2.10_7.2.23
          =10.2.10_7.2.24  =stable ]
 18  libreoffice              available    \
        [ =5.0.6.2_15  =5.3.6.1  =stable ]
 19  gimp                     available    [ =2.8.22 ]
 20  docker=latest            enabled      \
        [ =17.12.1  =18.03.1  =18.06.1  =18.09.9  =stable ]
 21  mate-desktop1.x          available    \
        [ =1.19.0  =1.20.0  =stable ]
 22  GraphicsMagick1.3        available    \
        [ =1.3.29  =1.3.32  =1.3.34  =stable ]
 23  tomcat8.5                available    \
        [ =8.5.31  =8.5.32  =8.5.38  =8.5.40  =8.5.42  =8.5.50
          =stable ]
 24  epel                     available    [ =7.11  =stable ]
 25  testing                  available    [ =1.0  =stable ]
 26  ecs                      available    [ =stable ]
 27  corretto8                available    \
        [ =1.8.0_192  =1.8.0_202  =1.8.0_212  =1.8.0_222  =1.8.0_232
          =1.8.0_242  =stable ]
 28  firecracker              available    [ =0.11  =stable ]
 29  golang1.11               available    \
        [ =1.11.3  =1.11.11  =1.11.13  =stable ]
 30  squid4                   available    [ =4  =stable ]
 31  php7.3                   available    \
        [ =7.3.2  =7.3.3  =7.3.4  =7.3.6  =7.3.8  =7.3.9  =7.3.10
          =7.3.11  =7.3.13  =stable ]
 32  lustre2.10               available    \
        [ =2.10.5  =2.10.8  =stable ]
 33  java-openjdk11           available    [ =11  =stable ]
 34  lynis                    available    [ =stable ]
 35  kernel-ng                available    [ =stable ]
 36  BCC                      available    [ =0.x  =stable ]
 37  mono                     available    [ =5.x  =stable ]
 38  nginx1                   available    [ =stable ]
 39  ruby2.6                  available    [ =2.6  =stable ]
 40  mock                     available    [ =stable ]
 41  postgresql11             available    [ =11  =stable ]
 42  php7.4                   available    [ =stable ]
 43  livepatch                available    [ =stable ]
 44  python3.8                available    [ =stable ]
 45  haproxy2                 available    [ =stable ]
[ec2-user]$
dockerグループ追加
[ec2-user]$ sudo usermod -a -G docker ec2-user
[ec2-user]$
サービス起動
[ec2-user]$ sudo systemctl start docker.service
[ec2-user]$
自動起動設定
[ec2-user]$ sudo systemctl enable docker.service
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[ec2-user]$

■nginxコンテナ起動

PULL
[ec2-user]$ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
8559a31e96f4: Pull complete
8d69e59170f7: Pull complete
3f9f1ec1d262: Pull complete
d1f5ff4f210d: Pull complete
1e22bfa8652e: Pull complete
Digest: sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[ec2-user]$
コンテナ起動
[ec2-user]$ docker run -d --name nginx -p 80:80 --rm nginx:latest
6775ebb4074c0c7f8ded76587c1d6f6dbbc9f4aef345add09b73ad2cb005216c
[ec2-user]$
[ec2-user]$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
6775ebb4074c        nginx:latest        "/docker-entrypoint.…"   11 seconds ago      Up 11 seconds       0.0.0.0:80->80/tcp   nginx
[ec2-user]$

■コンテナに入ってみる

コンテナ接続
docker container exec -it nginx /bin/bash

■nginxのバージョン
nginxコマンドを-vオプションで打つとバージョン情報が出てくる。
-Vオプションで打つとバージョン情報に加えビルド情報等も出てくる。

nginxのバージョン確認
root@6775ebb4074c:~# nginx -V
nginx version: nginx/1.19.0
built by gcc 8.3.0 (Debian 8.3.0-6)
built with OpenSSL 1.1.1d  10 Sep 2019
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-1.19.0/debian/debuild-base/nginx-1.19.0=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'
root@6775ebb4074c:~#

■nginxのディレクトリ構造

/etc/nginx
設定ファイル置き場。
ここに置かれているnginx.confが最初に読み込まれる設定ファイル。
この中からincude指定された設定ファイルが追加で読み込まれていく。
デフォルトでは以下が追加で読み込まれる。
/etc/nginx/conf.d/*.conf;
/etc/nginx/mime.types;

設定ファイル置き場
root@6775ebb4074c:~# ls -l /etc/nginx
total 36
drwxr-xr-x 1 root root   26 Jul  4 09:57 conf.d
-rw-r--r-- 1 root root 1007 May 26 15:00 fastcgi_params
-rw-r--r-- 1 root root 2837 May 26 15:00 koi-utf
-rw-r--r-- 1 root root 2223 May 26 15:00 koi-win
-rw-r--r-- 1 root root 5231 May 26 15:00 mime.types
lrwxrwxrwx 1 root root   22 May 26 15:01 modules -> /usr/lib/nginx/modules
-rw-r--r-- 1 root root  643 May 26 15:01 nginx.conf
-rw-r--r-- 1 root root  636 May 26 15:00 scgi_params
-rw-r--r-- 1 root root  664 May 26 15:00 uwsgi_params
-rw-r--r-- 1 root root 3610 May 26 15:00 win-utf
root@6775ebb4074c:~#
root@6775ebb4074c:~#
root@6775ebb4074c:~#
root@6775ebb4074c:~# grep include /etc/nginx/nginx.conf
    include  /etc/nginx/mime.types;
    include  /etc/nginx/conf.d/*.conf;
root@6775ebb4074c:~#

/usr/lib/nginx/modules
追加モジュール置き場。書籍にはlibではなくlib64と書かれていたがこの環境ではlibだった。

追加モジュール置き場
root@6775ebb4074c:~# ls -l /usr/lib/nginx/modules/
total 2640
-rw-r--r-- 1 root root  24328 May 26 15:01 ngx_http_geoip_module-debug.so
-rw-r--r-- 1 root root  24328 May 26 15:01 ngx_http_geoip_module.so
-rw-r--r-- 1 root root  27568 May 26 15:01 ngx_http_image_filter_module-debug.so
-rw-r--r-- 1 root root  27568 May 26 15:01 ngx_http_image_filter_module.so
-rw-r--r-- 1 root root 632800 May 26 15:01 ngx_http_js_module-debug.so
-rw-r--r-- 1 root root 628704 May 26 15:01 ngx_http_js_module.so
-rw-r--r-- 1 root root  23400 May 26 15:01 ngx_http_xslt_filter_module-debug.so
-rw-r--r-- 1 root root  23400 May 26 15:01 ngx_http_xslt_filter_module.so
-rw-r--r-- 1 root root  19864 May 26 15:01 ngx_stream_geoip_module-debug.so
-rw-r--r-- 1 root root  19864 May 26 15:01 ngx_stream_geoip_module.so
-rw-r--r-- 1 root root 619232 May 26 15:01 ngx_stream_js_module-debug.so
-rw-r--r-- 1 root root 615136 May 26 15:01 ngx_stream_js_module.so
root@6775ebb4074c:~#

/usr/share/nginx/html
デフォルトのドキュメントルート。エラードキュメントもここ。
sh:デフォルトのドキュメントルート
root@6775ebb4074c:~# ls -l /usr/share/nginx/html
total 8
-rw-r--r-- 1 root root 494 May 26 15:00 50x.html
-rw-r--r-- 1 root root 612 May 26 15:00 index.html
root@6775ebb4074c:~#

/var/cache/nginxv
キャッシュファイル置き場

キャッシュファイル置き場
root@6775ebb4074c:~# ls -l /var/cache/nginx
total 0
drwx------ 2 nginx root 6 Jul  4 09:57 client_temp
drwx------ 2 nginx root 6 Jul  4 09:57 fastcgi_temp
drwx------ 2 nginx root 6 Jul  4 09:57 proxy_temp
drwx------ 2 nginx root 6 Jul  4 09:57 scgi_temp
drwx------ 2 nginx root 6 Jul  4 09:57 uwsgi_temp
root@6775ebb4074c:~#

/var/log/nginx
ログファイル置き場。
nginxのログはアクセスログとエラーログの2種類。
今回はコンテナなのでそれぞれ標準出力、標準エラー出力に
シンボリックリンクが張られている。

ログファイル置き場
root@6775ebb4074c:~# ls -l /var/log/nginx
total 0
lrwxrwxrwx 1 root root 11 Jun  9 16:57 access.log -> /dev/stdout
lrwxrwxrwx 1 root root 11 Jun  9 16:57 error.log -> /dev/stderr
root@6775ebb4074c:~#

■ブラウザアクセス
今回はブラウザアクセスできることを確認して終わり。

http://EC2インスタンスのパブリックDNS名

image.png

無事表示されたので今日はここまで。

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

Rails6+MySQL+Nginx+Unicorn+Docker環境構築メモ

この記事で書くこと

  • Rails6+MySQL+Nginx+Unicorn+Dockerの構成での環境構築手順

対象者

  • Rails6+MySQL+Nginx+Unicorn+Dockerの構成で環境構築したい人

注意

筆者も勉強中の身なので間違ったことを書いてる可能性があります。
ミスを見つけられた際は優しく教えていただけると幸いです。

なぜやるか

勤め先ではDockerやDockerComposeを使用しておらず、このままだとヤバイと思ったので勉強のために。
環境構築してみてハマる場面も結構多かったので後続の人の参考になると嬉しいです。

環境

docker dor macをインストール済み

$ bundler -v
Bundler version 2.1.4

$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin18]

$ rails -v
Rails 6.0.3.2
Gemfile.lock
RUBY VERSION
 ruby 2.5.1p57

BUNDLED WITH
 2.1.4

環境構築手順

以下のステップで解説していきます。

  1. Railsプロジェクトの作成
  2. ディレクトリ構成
  3. unicornの導入,設定
  4. Dockerfileの構築
    1. Railsコンテナ用Dockerfileの構築
    2. Nginxコンテナ用Dockerfileの構築
  5. docker-compose.ymlの構築
  6. ビルド&コンテナ起動

Railsプロジェクトの作成

$ gem install rails //最新版のrailsをmacにインストールします。
$ rails new rails-sample //rails new コマンドでプロジェクトを新規作成します。

ディレクトリ構成

最終的なディレクトリ構成はこのようになります。
少し見辛いですが、ご了承ください。

├── Gemfile //編集します
├── Gemfile.lock //bundle installで生成されます
├── README.md
├── Rakefile
├── app
├── babel.config.js
├── bin
├── config
   ├──unicorn.conf.rb //作ります
   └──database.yml //編集します
├── config.ru
├── db
├── docker
   └──nginx
     ├──Dockerfile //作ります
     └──nginx.conf //作ります
   └──rails
     └──Dockerfile //作ります
├── docker-compose.yml //作ります
├── lib
├── log
├── node_modules //yarn installで生成されます
├── package.json
├── postcss.config.js
├── public
├── storage
├── test
├── tmp
├── vendor
└── yarn.lock //yarn installで生成されます

unicornの設定

gem'unicorn'のインストール

rails-sample/Gemfile.
gem 'unicorn'

unicorn.conf.rbの構築

設定ファイルは色々な記事で書かれているものを流用してます。
一つ一つの設定はあともう少しで理解できそうなので次回別記事で書きたいと思います。

今回大事なポイントは listenをtmp/sockets/.unicorn.sockに指定しているところです。
後述するnginxの設定ファイルのupstream unicornのパスと同じにする必要があります。

rails-sample/config/unicorn.conf.rb
$worker  = 2
$timeout = 30
$app_dir = "/rails-sample" #自分のアプリケーションまでのpath
$listen  = File.expand_path 'tmp/sockets/.unicorn.sock', $app_dir
$pid     = File.expand_path 'tmp/pids/unicorn.pid', $app_dir
$std_log = File.expand_path 'log/unicorn.log', $app_dir
# set config
worker_processes  $worker
working_directory $app_dir
stderr_path $std_log
stdout_path $std_log
timeout $timeout
listen  $listen
pid $pid
# loading booster
preload_app true
# before starting processes
before_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!
  old_pid = "#{server.config[:pid]}.oldbin"
  if old_pid != server.pid
    begin
      Process.kill "QUIT", File.read(old_pid).to_i
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end
end
# after finishing processes
after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end

Dockerfileの構築

Rails用Dockerfileの構築

他の記事を見ていると本当にそれ必要?と思うものが多かったので今回はできる限り最小構成でDockerfileを作ります。
実際にビルドしたりコンテナを建てた時にエラーが起きたら都度追加していくことにしました。

最終的なDockerfileはこの章の最後に乗っているので急ぎの方は飛ばして頂ければと思います。

今回ベースイメージはローカルのバージョンに合わせてruby:2.5.1を使用します。
bundlerもローカルと同じ2.1.4を使用したいので、環境変数"BUNDLER_VERSION"に2.1.4を指定しています。

build-essentialは基本的に必須らしいので入れていますが、本当に必要かどうかは面倒なので確かめていません(お許しを)
wgetコマンドはdockerrizeをインストールするために追加しています。
dockerizeはdocker-composeでmysqlコンテナとrailsコンテナを同時に立ち上げる時に必要になるのでインストールしています。

とりあえずのDockerfileがこちらになります。

FROM ruby:2.5.1

ENV DOCKERIZE_VERSION v0.6.1
ENV BUNDLER_VERSION 2.1.4

RUN apt update && apt install -y --no-install-recommends \
      build-essential \
      wget \

#dockerizeをインストール、解凍
RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && tar -C /usr/local/bin -xzf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && apt clean \
    && rm -rf /var/lib/apt/lists/*

COPY . /sample-app
WORKDIR /sample-app

RUN gem install bundler -v "2.1.4"
RUN bundle install

ここから実際にビルドしたりコンテナを立ち上げてエラーが出たら都度改修していくことにします。
では早速ビルドしてコンテナを立ち上げます。

$ docker-compose build
$ docker-compose up -d
rails-sample/log/unicorn.log
I, [2020-07-04T01:25:44.679467 #12]  INFO -- : Refreshing Gem list
sh: 1: yarn: not found


========================================
  Your Yarn packages are out of date!
  Please run `yarn install --check-files` to update.
========================================


To disable this check, please change `check_yarn_integrity`
to `false` in your webpacker config file (config/webpacker.yml).

ビルドに失敗しました。
sh: 1: yarn: not found と書いてあるのでyarnをインストールします。
yarnをインストールするためにDockerfileに以下を追加します。

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 update && apt install -y yarn

再度ビルドします。

$ docker-compose build
Step 4/11 : 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 update && apt install -y yarn
 ---> Running in 407ad46184b0
Warning: apt-key output should not be parsed (stdout is not a terminal)
OK
deb https://dl.yarnpkg.com/debian/ stable main

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

Ign:1 http://deb.debian.org/debian stretch InRelease
Get:2 http://security.debian.org/debian-security stretch/updates InRelease [94.3 kB]
Get:3 http://deb.debian.org/debian stretch-updates InRelease [93.6 kB]
Get:4 http://deb.debian.org/debian stretch Release [118 kB]
Get:5 http://security.debian.org/debian-security stretch/updates/main amd64 Packages [529 kB]
Get:6 http://deb.debian.org/debian stretch Release.gpg [2410 B]
Get:7 http://deb.debian.org/debian stretch-updates/main amd64 Packages [28.2 kB]
Get:8 http://deb.debian.org/debian stretch/main amd64 Packages [7083 kB]
Fetched 7948 kB in 6s (1166 kB/s)
Reading package lists...
E: The method driver /usr/lib/apt/methods/https could not be found.
E: Failed to fetch https://dl.yarnpkg.com/debian/dists/stable/InRelease  
E: Some index files failed to download. They have been ignored, or old ones used instead.
ERROR: Service 'web' failed to build: The command '/bin/sh -c 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 update && apt install -y yarn' returned a non-zero code: 100

ググった結果、ココに書いてある通りコマンドを追加します。

RUN apt update && apt install apt-transport-https //追加

追加して再度ビルド&コンテナを立ち上げます。

$ docker-compose build
$ docker-compose up -d
rails-sample/log/unicorn.log
I, [2020-07-04T01:39:01.693206 #13]  INFO -- : Refreshing Gem list
/usr/share/yarn/lib/cli.js:46099
  let {
      ^

SyntaxError: Unexpected token {
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:373:25)
    at Object.Module._extensions..js (module.js:416:10)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Module.require (module.js:353:17)
    at require (internal/module.js:12:17)
    at Object.<anonymous> (/usr/share/yarn/bin/yarn.js:24:13)
    at Module._compile (module.js:409:26)
    at Object.Module._extensions..js (module.js:416:10)


========================================
  Your Yarn packages are out of date!
  Please run `yarn install --check-files` to update.
========================================


To disable this check, please change `check_yarn_integrity`
to `false` in your webpacker config file (config/webpacker.yml).

エラーに書いてある通りコンテナ内で"yarn install --check-files"を実行しましたが解決せず...

root@0b6243be00a2:/rails-sample# yarn install --check-files
/usr/share/yarn/lib/cli.js:46099
  let {
      ^

SyntaxError: Unexpected token {
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:373:25)
    at Object.Module._extensions..js (module.js:416:10)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Module.require (module.js:353:17)
    at require (internal/module.js:12:17)
    at Object.<anonymous> (/usr/share/yarn/bin/yarn.js:24:13)
    at Module._compile (module.js:409:26)
    at Object.Module._extensions..js (module.js:416:10)

ググってみるとこの記事を見つけました。
この人の回答を参考にしてDockerfileに下記を追加しました。
スクリーンショット 2020-07-04 10.48.08.png

RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - && apt-get install -y nodejs //追加

再度ビルド&コンテナを立ち上げます。
するとエラー文は変わりましたが、またエラー...

rails-sample/log/unicorn.log
I, [2020-07-04T02:09:25.493307 #13]  INFO -- : Refreshing Gem list
warning Integrity check: System parameters don't match
error Integrity check failed
error Found 1 errors.


========================================
  Your Yarn packages are out of date!
  Please run `yarn install --check-files` to update.
========================================


To disable this check, please change `check_yarn_integrity`
to `false` in your webpacker config file (config/webpacker.yml).


yarn check v1.22.4
info Visit https://yarnpkg.com/en/docs/cli/check for documentation about this command.

言われた通り yarn install --check-files を実行しても解決せず。
yarn upgrade でパッケージのアップデートも試しましたが解決しませんでした。

ここでハマりましたが、色々調べた結果 node_modulesディレクトリを削除してから yarn install 実行で解決しました。
正直原因は理解できていませんが、同じエラーでハマった人は試してみてください。

中には config/webpacker.yml の check_yarn_integrity をfalseにして解決してる記事もありましたが邪道だと思われます。

ビルドする時に実行したいのでDockerfileにコマンドを追加します。

RUN yarn install //追加

最終的なDockerfileはこのようになりました。

rails-sample/docker/rails/Dockerfile.
FROM ruby:2.5.1

ENV DOCKERIZE_VERSION v0.6.1
ENV BUNDLER_VERSION 2.1.4

RUN apt update && apt install apt-transport-https

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 update && apt install -y yarn

RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - && apt-get install -y nodejs

RUN apt update && apt install -y --no-install-recommends \
      build-essential \
      wget

RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && tar -C /usr/local/bin -xzf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && apt clean \
    && rm -rf /var/lib/apt/lists/*

COPY . /rails-sample
WORKDIR /rails-sample

RUN yarn install
RUN gem install bundler -v "2.1.4"
RUN bundle install

Nginxコンテナ用Dockerfile & Nginx設定ファイル

rails-sample/docker/nginx/Dockerfile.
FROM nginx:stable

RUN rm -f /etc/nginx/conf.d/*

COPY nginx.conf /etc/nginx/conf.d/rails-sample.conf

CMD /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf
rails-sample/docker/nginx/nginx.conf
upstream unicorn {
  server unix:/rails-sample/tmp/sockets/.unicorn.sock fail_timeout=0;
}

server {
  listen 80 default;
  server_name localhost;

  access_log /var/log/nginx/access.log;
  error_log  /var/log/nginx/error.log;

  root /rails-sample/public;

  client_max_body_size 100m;

  error_page 404             /404.html;
  error_page 505 502 503 504 /500.html;

  try_files  $uri/index.html $uri @unicorn;
  keepalive_timeout 5;

  location @unicorn {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://unicorn;
  }
}

docker-compose.ymlの構築

webとnginxでbuildディレクティブの書き方が違うところに疑問を持つ人もいると思います。私がそうでした。

最初はwebの方もnginxと同じように

build:
  context: ./docker/rails
  dockerfile: Dockerfile

で書いていたのですが、dockerize -waitから始まるコマンドを実行できずエラーになってしまいました。

公式のcontextディレクティブの解説には「指定したディレクトリが構築コンテクストとなり、Docker デーモンに送信します。」と書かれていますが、いまいち分かりません。

このあたりももっと勉強して別記事を書きたいと思っています。

とりあえず以下の構成で動くので今回はこれで許してください。

rails-sample/docker-compose.yml
version: '3'
services:
  web:
    build:
      context: .
      dockerfile: ./docker/rails/Dockerfile
    command: dockerize -wait tcp://db:3306 -timeout 20s bundle exec unicorn -p 3000 -c /rails-sample/config/unicorn.conf.rb
    tty: true
    stdin_open: true
    depends_on:
      - db 
    ports:
      - "3000:3000"
    volumes:
      - .:/rails-sample:cached
      - tmp-data:/rails-sample/tmp/sockets
      - public-data:/rails-sample/public

  db:
    image: mysql:5.7
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    ports: 
      - '4306:3306'
    environment:
      MYSQL_DATABASE: rails_sample_development
      MYSQL_ROOT_PASSWORD: password
    volumes:
      - mysql-data:/var/lib/mysql

  nginx:
    build:
      context: ./docker/nginx/Dockerfile
    ports:
      - 80:80
    restart: always
    volumes:
      - tmp-data:/rails-sample/tmp/sockets
      - public-data:/rails-sample/public
    depends_on:
      - web 

volumes:
  public-data:
  tmp-data:
  mysql-data:

ビルド&コンテナ起動

後は以下のコマンドを実行してコンテナを起動すればOKです。

$ docker-compose build
$ docker-compose up -d
$ docker-compose build
$ docker-compose up -d

コンテナを確認すると無事コンテナの起動に成功しました!

$ docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                               NAMES
761147b1084d        rails-sample_nginx   "/bin/sh -c '/usr/sb…"   45 minutes ago      Up 45 minutes       0.0.0.0:80->80/tcp                  rails-sample_nginx_1
3c2021f8d455        rails-sample_web     "dockerize -wait tcp…"   45 minutes ago      Up 45 minutes       0.0.0.0:3000->3000/tcp              rails-sample_web_1
d0cc75d1e7bb        mysql:5.7            "docker-entrypoint.s…"   45 minutes ago      Up 45 minutes       33060/tcp, 0.0.0.0:4306->3306/tcp   rails-sample_db_1

後は好きなように開発を進めていけばOKです!

おわり

最後まで読んで頂きありがとうございました。
誰かのお役に立てれば幸いです。それでは~

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

DockerでNuxt.js + TypeScript + Sassの環境構築

概要

nuxt.jsをdockerで動かすための環境を作ったので忘れない様に残しておきます。

環境

・macOS
・Docker for mac

ファイル構成

最終的なファイル構成は以下の様な感じになります。

- docker
  - nuxt
    - Dockerfile
- sample
  - nuxt.config.js
  - その他省略
- docker-compose.yml 

手順

Dockerfile作成

Dockerfile
FROM node:14.4.0-alpine

WORKDIR /app

RUN apk update && \
    npm install -g npm && \
    npm install -g @vue/cli && \
    npm install -g @vue/cli-init

ENV HOST 0.0.0.0
EXPOSE 3000

CMD ["/bin/ash"]

docker-compose.yml作成

docker-compose.yml
version: '3'
services:
  nuxt:
    build: ./docker/nuxt
    ports:
      - 3000:3000
    volumes:
      - .:/app
    stdin_open: true
    tty: true

イメージをビルド

$ docker-compose build

コンテナを立ち上げる

$ docker-compose up -d

create-nuxt-appでnuxtプロジェクトを作成する

npxはインストールしていないパッケージを一度だけ実行できる機能があります。

$ npx create-nuxt-app sample

色々な選択肢が出てきるので好きなのを選びましょう。
※そしてここでTypeScriptを選択すること。

create-nuxt-app v3.1.0
✨  Generating Nuxt.js project in sample
? Project name: sample
? Programming language: TypeScript
? Package manager: Npm
? UI framework: None
? Nuxt.js modules: (Press <space> to select, <a> to toggle all, <i> to invert selection)
? Linting tools: (Press <space> to select, <a> to toggle all, <i> to invert selection)
? Testing framework: Jest
? Rendering mode: Single Page App
? Deployment target: Server (Node.js hosting)
? Development tools: (Press <space> to select, <a> to toggle all, <i> to invert selection)

インストールが無事完了したら下記のメッセージが出ます。

?  Successfully created project sample

  To get started:

        cd sample
        npm run dev

  To build & start for production:

        cd sample
        npm run build
        npm run start

  To test:

        cd sample
        npm run test


  For TypeScript users. 

  See : https://typescript.nuxtjs.org/cookbook/components/

※TypeScriptの使い方についてはhttps://typescript.nuxtjs.org/cookbook/components/ を参照してくださいとのこと。

ガイドに沿ってnuxt.jsを立ち上げてみます。

$ cd sample
$ npm run dev
> nuxt


   ╭───────────────────────────────────────╮
   │                                       │
   │   Nuxt.js @ v2.13.3                   │
   │                                       │
   │   ▸ Environment: development          │
   │   ▸ Rendering:   client-side          │
   │   ▸ Target:      server               │
   │                                       │
   │   Listening: http://localhost:3000/   │
   │                                       │
   ╰───────────────────────────────────────╯

ℹ Preparing project for development                                                           16:39:27
ℹ Initial build may take a while                                                              16:39:27
✔ Builder initialized                                                                         16:39:27
✔ Nuxt files generated                                                                        16:39:27
ℹ Starting type checking service...                                           nuxt:typescript 16:39:31

✔ Client
  Compiled successfully in 11.52s

ℹ Type checking in progress...                                                nuxt:typescript 16:39:43
ℹ Waiting for file changes                                                                    16:39:43
ℹ Memory usage: 261 MB (RSS: 361 MB)                                                          16:39:43
ℹ Listening on: http://localhost:3000/                                                        16:39:43
ℹ No type errors found                                                        nuxt:typescript 16:39:45
ℹ Version: typescript 3.8.3                                                   nuxt:typescript 16:39:45
ℹ Time: 13999 ms   

無事立ち上がったようなのでhttp://localhost:3000/ にアクセスしてみます。
スクリーンショット 2020-07-04 16.40.20.png

あれっ?

調べてみるとどうやら以下のserverの記述がnuxt.config.jsに必要なようです。
[参考]
https://qiita.com/arthur_foreign/items/bc87c9b66e7ea9710c6b

nuxt.config.js
  mode: 'spa',
  server: {
    port: 3001, // 3000でもいい
    host: '0.0.0.0',
  },

再チャレンジ

$ npm run dev

> nuxt


   ╭──────────────────────────────────────────╮
   │                                          │
   │   Nuxt.js @ v2.13.3                      │
   │                                          │
   │   ▸ Environment: development             │
   │   ▸ Rendering:   client-side             │
   │   ▸ Target:      server                  │
   │                                          │
   │   Listening: http://192.168.0.11:3001/   │
   │                                          │
   ╰──────────────────────────────────────────╯

ℹ Preparing project for development                                                           17:02:18
ℹ Initial build may take a while                                                              17:02:18
✔ Builder initialized                                                                         17:02:18
✔ Nuxt files generated                                                                        17:02:18
ℹ Starting type checking service...                                           nuxt:typescript 17:02:22

✔ Client
  Compiled successfully in 3.93s

ℹ Type checking in progress...                                                nuxt:typescript 17:02:26
ℹ Waiting for file changes                                                                    17:02:26
ℹ Memory usage: 271 MB (RSS: 345 MB)                                                          17:02:26
ℹ Listening on: http://192.168.0.11:3001/                                                     17:02:26
ℹ No type errors found                                                        nuxt:typescript 17:02:31
ℹ Version: typescript 3.8.3                                                   nuxt:typescript 17:02:31
ℹ Time: 9546 ms                   

スクリーンショット 2020-07-04 17.04.25.png

無事立ち上げることができました?

Sassの追加

プロジェクトのディレクトリにて追加でsass-loaderをnpm installしてあげればokです。
[参考]
https://ja.nuxtjs.org/faq/pre-processors/

$ npm install --save-dev node-sass sass-loader
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker pull時に dial unix /var/run/docker.sock: connect: permission denied が出る場合の対処法

docker pull時に dial unix /var/run/docker.sock: connect: permission denied が出る場合の対処法

$ docker pull ubuntu:18.04
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/images/create?fromImage=ubuntu&tag=18.04: dial unix /var/run/docker.sock: connect: permission denied

/var/run/docker.sockはrootもしくはdockerグループのユーザしかアクセスできないようだ。

$ ls -l /var/run/docker.sock
srw-rw---- 1 root docker 0  7月  4 15:38 /var/run/docker.sock

なので、現在のユーザをdockerグループに追加する
以下はユーザID:ubuntuの例

$ sudo usermod -g docker ubuntu
$ sudo /bin/systemctl restart docker.service
$ id ubuntu
uid=1000(ubuntu) gid=999(docker) groups=999(docker),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),126(sambashare)

その後、ログアウト/ログインしてグループ追加設定を有効化する。
そして、再度、同手順を実行してpermission deniedが出ないことを確認する

$ docker pull ubuntu:18.04
(permission deniedが出ない)

参考

Ubuntu 18.04にDockerをインストールする
dockerコマンドをsudoの付与無しに実行できるようにする

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

Ubuntu 18.04 LTS にdockerをインストールする

環境

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.3 LTS
Release:    18.04
Codename:   bionic

インストール手順

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable test edge"
sudo apt-get update
sudo apt-get install -y docker-ce

バージョン確認

$ $ docker --version
Docker version 19.03.12, build 48a66213fe

参考

Ubuntu 18.04にDockerをインストールする
Install Docker Engine on Ubuntu

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

docker run --tmpfsでエラーが出た時の対処方法

はじめに

本記事は以下の「Docker実践ガイド 第2版」を進めていて詰まったポイントの解決メモです。

91j47MxChxL.jpg

3-9-1 コンテナでのApache Webサービスの起動

/sbin/initを使ったDockerコンテナの起動

ここで示されているコマンド

$ docker container run \ 
-it \
--tmpfs /tmp \
--tmpfs /run \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--stop-signal SIGRTMIN+3 \
--name test01 \
-h test01 \
centos:test01 /sbin/init

を実行したところ、

docker: invalid reference format.
See 'docker run --help'.

と返された。
docker run --help
を実行したところ、きちんと全てのオプションは見つかって使い方も問題なさそう。

いろいろ調べた結果
--tmpfs /tmp
となっている--tmpfsオプションを
--mount type=tmpfs,destination=/tmp
のように--mountオプションで代替することで解決

修正後

$ docker run \
-it \
--mount type=tmpfs,destination=/tmp \
--mount type=tmpfs,destination=/run \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--stop-signal SIGRTMIN+3 \
--name test01 \
-h test01 \
centos:test01 /sbin/init

参考

Docker Documentation

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

Docker&LaravelでSQLSTATE[HY000] [2002] Connection refusedが出た時の対処法

はじめに

こんなエラーでた。

terminal
  SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = laravel and table_name = migrations and table_type = 'BASE TABLE')

  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:671
    667|         // If an exception occurs when attempting to run a query, we'll format the error
    668|         // message to include the bindings with SQL, which will make this exception a
    669|         // lot more helpful to the developer instead of just the database's errors.
    670|         catch (Exception $e) {
  > 671|             throw new QueryException(
    672|                 $query, $this->prepareBindings($bindings), $e
    673|             );
    674|         }
    675| 

      +37 vendor frames 
  38  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

結論

configがしっかり反映されていなかったので、以下のコマンドでconfigに.envの内容を反映させると解消された。

terminal(Docker内)
$ php artisan cache:clear
$ php artisan config:cache

対処法

php artisan tinkerで.envの内容が反映されているか確かめる

terminal(Docker内)
$ php atisan tinker

>> config('database')
=> [
     "default" => "mysql",
     "connections" => [
       "sqlite" => [
         "driver" => "sqlite",
         "url" => null,
         "database" => "xxx",
         "prefix" => "",
         "foreign_key_constraints" => true,
       ],
       "mysql" => [
         "driver" => "mysql",
         "url" => null,
         "host" => "mysql", // この辺に注目
         "port" => "3306",
         "database" => "xxx", // この辺に注目 
         "username" => "xxx", // この辺に注目
         "password" => "xxx", // この辺に注目
         "unix_socket" => "",
         "charset" => "utf8mb4",
         "collation" => "utf8mb4_unicode_ci",
         "prefix" => "",
         "prefix_indexes" => true,
         "strict" => true,
         "engine" => null,
         "options" => [],
       ],

       # 以下省略

configに、.envの内容が反映されてなかったら結論で示したコマンドでどうにかなるかも(自分は解決した)

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

Docker-composeでnginx-proxyのBasic認証をする方法

はじめに

この記事ではDocker-compose環境下でnginx-proxyのBasic認証の方法を紹介します。

設定ファイル

ディレクトリの構成は以下の通りです。

.
├── data
│   ├── conf.d
│   │   └── default.conf
│   ├── html
│   │   └── index.html
│   └── htpasswd
└── docker-compose.yml

docker-compose.ymlは以下のように設定します。

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
    volumes:
      - ./data/htpasswd:/etc/nginx/htpasswd
      - ./data/conf.d:/etc/nginx/conf.d
      - /var/run/docker.sock:/tmp/docker.sock:ro
    network_mode: bridge
  nginx:
    image: nginx
    network_mode: bridge
    environment:
      VIRTUAL_HOST: localhost
    volumes:
      - ./data/html/:/usr/share/nginx/html

この状態で以下のコマンドを入力しコンテナを立ち上げます。

$ docker-compose up -d

この状態でlocalhostに接続すると何の認証もなくindex.htmlが表示されます。次に本題のBasic認証の設定を行います。htpasswdディレクトリにて以下のコマンドを入力すると設定することができます。

$ cd data/htpasswd
$ htpasswd -c -b localhost user test

ここでlocalhostはドメイン名、userはユーザ名、testはパスワードを意味します。設定後にコンテナを再起動するとBasic認証が反映されます。

おわりに

この記事ではDocker-compose環境下でnginx-proxyのBasic認証の方法を紹介しました。

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

Haskellで超簡単にシングルバイナリを作る

はじめに

Haskellをローカル開発環境で勉強していろいろな抽象的な知識を得たものの、実際活用するにあたってデプロイとかその辺どうするんだろう?やっぱりdocker使って簡単にやりたいな〜

でも、Goとかだと簡単に100%静的なシングルバイナリになるし、Rustとかもmuslを利用していい感じに行けそうだけどHaskellだとわからない>< というお気持ちが強かったので、簡単にデプロイできる100%静的リンクのシングルバイナリ作るぞ!と思って調べたお話です。

対象読者

Haskellを本番で使ったことない人向け

大雑把に説明

概要

  1. 静的リンクされたバイナリを作るためのDockerコンテナ上でプロジェクトをビルドしてバイナリを手に入れる
  2. 動作用のDockerイメージにそのバイナリを乗っける
  3. そのイメージを動かす!

環境

OS : MacOS Catalina
パッケージマネージャ : Stack

今回はHaskellのパッケージマネージャであるStackを利用してやっていきますが、cabalでもなんでもできそうなので調べてみてください。

Stack Docker integration

StackにはDockerと協調していい感じにバイナリを作ってくれる機能があります。

stack.yaml
docker:
  repo: {{docker imageの名前}}
  enable: {{ true or false }}

こんな感じで追記すると、

$ stack build

としたときにrepoに記載しているimageを使ってbuildをしてくれます。
enableをfalseにした場合は$ docker build --docker ってコマンドになるので僕はfalseにしてます。

local-bin-path

stackにはinstall機能もありますね。

$ stack install

とすると、ローカルのプロジェクトのソースをビルドして、~/.local/bin この辺(つまりグローバル)に実行可能ファイルを置いてくれます。

でもグローバルはやじゃん!

$ stack install --local-bin-path=./bin

こうすると、現在のディレクトリの bin 配下にいい感じにビルドしてくれるのでバイナリが手に入ります!

ghc-musl

musl-libcを使って静的リンクされたバイナリを簡単に作ることができるimageをHaskell界の聖人様が作ってくれているので、利用します。

参考リポジトリ: https://github.com/utdemir/ghc-musl

やっていき!

上で説明した三つの項目を利用していい感じに動作用imageを作る作業をやっていきます。

1. まずはHaskellのdocker integrationを利用してビルド時のイメージを設定

stack.yaml
docker:
  repo: utdemir/ghc-musl:v7-libgmp-ghc883 # 正しいhaskellコンパイラを指定しよう
  enable: false

2. 静的リンク用の設定を追加

stack.yaml
executables:
  example-exe:
    main:                Main.hs
    source-dirs:         app
    ghc-options:
    - -threaded
    - -rtsopts
    - -with-rtsopts=-N
    - -static -optl-static -optl-pthread -fPIC # <- これを追加!
    dependencies:
    - example

3. バイナリを手に入れよう

これで ./bin/docker/ 配下に静的リンクされたバイナリが手に入ります

$ stack install --local-bin-path=./bin/docker --docker

4. 動作用のDockerイメージをビルドする

ベースイメージは本当に何にも含まれていないscratchを利用することによって、静的リンクされていることを確認します。
こうすると、イメージのサイズもバイナリと同じサイズになってめっちゃちっちゃくて最高です。
(実用上いろいろ考えるとAlpineの方がいいかもしれないです)

Dockerfile
FROM scratch
COPY ./bin/docker/{ バイナリの名前入れてね } /
CMD ["./{ バイナリの名前入れてね }"]

ビルドします

$ docker build . -t {任意のイメージの名前}

4. そして動かす!

$ docker run --rm --init {イメージ名}

おわり

Servantのシンプルなプロジェクトで動作確認をしたけれど、他のDB操作系のライブラリとかでHaskell以外の他の依存がある場合はどうなるんやろな?ってところはやってないので、大規模プロジェクトでは未知数ですが、試してみてコメントいただけるとありがたいです〜。

もっといい方法があればコメントにて教えてください!
あと、聖人様のリポジトリにスターをつけてたくさん開発してもらえるように促してください!

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

DockerのmariaDBにログインできずに困った話

目的

  • Docker環境のmariaDBにログインできず困った話をまとめる。

実施環境

  • ハードウェア環境
項目 情報
OS macOS Catalina(10.15.5)
ハードウェア MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)
プロセッサ 2 GHz クアッドコアIntel Core i5
メモリ 32 GB 3733 MHz LPDDR4
グラフィックス Intel Iris Plus Graphics 1536 MB

前提条件

困るまでの経緯

  1. 下記の手順を実行してDockerにてLaravelの開発環境を構築した。
  2. マイグレーションの結果を確認するためにMacのターミナルから下記コマンドを実行してPHPのdockerコンテナに入った。

    $ docker exec -it PHPのコンテナ名 bash
    
  3. Dockerコンテナ内で下記コマンドを実行してmariaDBにログインを試みた

    $ mysql -u ログインmariaDBユーザ名 -p
    

困った現象

  • 先のコマンドを実行してmariaDBにログインを試みたが下記のエラーが出力された。

    >bash: mysql command not found
    
  • アプリ側でマイグレーションをしたことがあったためこの時点で混乱してしまった。

解決までの経緯

  1. 別のターミナルのウインドウにて下記コマンドを実行してmariaDBのコンテナに入った。

    $ docker exec -it PHPのコンテナ名 bash
    
  2. mariaDBのDockerコンテナ内で下記コマンドを実行してmariaDBにログインを試みた

    $ mysql -u ログインmariaDBユーザ名 -p
    
  3. 正常にログインすることができた。

何が間違えていたのか

  • PHPのコンテナ内でmariaDBにログインしようとしていた。
  • mariaDBはmariaDBのコンテナからでないとログインすることはできない。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む