- 投稿日:2020-07-04T22:44:28+09:00
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.htmlhello.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.gzinstall.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 クラスターへのデプロイを行なう、パイプラインを簡単に作成することができます。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-65424cc9EKS クラスターデプロイ用の 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.jsonEKS クラスターへのデプロイ
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-EKSEKS についても CI/CD パイプラインを作成することができますが、
手順は ECS と同様であるため割愛します。参考
App2Container Documenet
https://docs.aws.amazon.com/app2container/latest/UserGuide/what-is-a2c.html以上です。
参考になれば幸いです。
- 投稿日:2020-07-04T21:23:32+09:00
【Docker】初心者が環境構築しました!
背景
未経験から転職した僕が初めてDockerの環境構築をしたので、アウトプットします。併せて、同じ初心者の方の参考になれば嬉しいです。
使用環境
- Macを使用しています
- 開発フレームワークはRuby on Railsです
Dockerとは
仮想環境を提供するオープンソースソフトウェアです。
仮想環境というのは、自分のPCやサーバーとは別の環境のことをいいます。
このメリットは何のか?といいますと例を2つくらい挙げたいと思います。
MacPCを使用しいてWindows専用のソフトを使いたい!という時に仮想環境を作ってWindowsの環境を作り出せばそこでWindowsのソフトを作れちゃうって感じになります!
自分の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(%は除いてください) と打ってください。
下記の様に出ていればインストール成功です。
まとめ
今回は概念の理解と簡単な環境構築手順をまとめてみました。
勉強し始めで間違っているところあるかもしれませんが、Dockerってすごく便利だ
なって思いました。今後も勉強してまた記事を更新していきたいと思います!!
- 投稿日:2020-07-04T21:13:03+09:00
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 で確認できます
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:migrate
やrails s -p 3000 -b 0.0.0.0
などを行したらエラーになるからです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
- 投稿日:2020-07-04T20:31:11+09:00
circleCIでRspecが失敗するのは環境変数をうまく渡せていなかったから
- 投稿日:2020-07-04T20:10:36+09:00
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:~#
- 投稿日:2020-07-04T20:10:36+09:00
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名
無事表示されたので今日はここまで。
- 投稿日:2020-07-04T20:10:36+09:00
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名
無事表示されたので今日はここまで。
- 投稿日:2020-07-04T20:07:41+09:00
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.2Gemfile.lockRUBY VERSION ruby 2.5.1p57 BUNDLED WITH 2.1.4環境構築手順
以下のステップで解説していきます。
- Railsプロジェクトの作成
- ディレクトリ構成
- unicornの導入,設定
- Dockerfileの構築
- Railsコンテナ用Dockerfileの構築
- Nginxコンテナ用Dockerfileの構築
- docker-compose.ymlの構築
- ビルド&コンテナ起動
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 endDockerfileの構築
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 -drails-sample/log/unicorn.logI, [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 buildStep 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 -drails-sample/log/unicorn.logI, [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に下記を追加しました。
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - && apt-get install -y nodejs //追加再度ビルド&コンテナを立ち上げます。
するとエラー文は変わりましたが、またエラー...rails-sample/log/unicorn.logI, [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 installNginxコンテナ用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.confrails-sample/docker/nginx/nginx.confupstream 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.ymlversion: '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です!
おわり
最後まで読んで頂きありがとうございました。
誰かのお役に立てれば幸いです。それでは~
- 投稿日:2020-07-04T17:19:45+09:00
DockerでNuxt.js + TypeScript + Sassの環境構築
概要
nuxt.jsをdockerで動かすための環境を作ったので忘れない様に残しておきます。
環境
・macOS
・Docker for macファイル構成
最終的なファイル構成は以下の様な感じになります。
- docker - nuxt - Dockerfile - sample - nuxt.config.js - その他省略 - docker-compose.yml手順
Dockerfile作成
DockerfileFROM 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.ymlversion: '3' services: nuxt: build: ./docker/nuxt ports: - 3000:3000 volumes: - .:/app stdin_open: true tty: trueイメージをビルド
$ docker-compose buildコンテナを立ち上げる
$ docker-compose up -dcreate-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/ にアクセスしてみます。
あれっ?
調べてみるとどうやら以下のserverの記述がnuxt.config.jsに必要なようです。
[参考]
https://qiita.com/arthur_foreign/items/bc87c9b66e7ea9710c6bnuxt.config.jsmode: '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無事立ち上げることができました?
Sassの追加
プロジェクトのディレクトリにて追加でsass-loaderをnpm installしてあげればokです。
[参考]
https://ja.nuxtjs.org/faq/pre-processors/$ npm install --save-dev node-sass sass-loader
- 投稿日:2020-07-04T15:50:30+09:00
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の付与無しに実行できるようにする
- 投稿日:2020-07-04T15:34:23+09:00
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
- 投稿日:2020-07-04T15:17:17+09:00
docker run --tmpfsでエラーが出た時の対処方法
はじめに
本記事は以下の「Docker実践ガイド 第2版」を進めていて詰まったポイントの解決メモです。
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参考
- 投稿日:2020-07-04T15:13:43+09:00
Docker&LaravelでSQLSTATE[HY000] [2002] Connection refusedが出た時の対処法
はじめに
こんなエラーでた。
terminalSQLSTATE[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
の内容が反映されてなかったら結論で示したコマンドでどうにかなるかも(自分は解決した)
- 投稿日:2020-07-04T14:57:54+09:00
Docker-composeでnginx-proxyのBasic認証をする方法
はじめに
この記事ではDocker-compose環境下でnginx-proxyのBasic認証の方法を紹介します。
設定ファイル
ディレクトリの構成は以下の通りです。
. ├── data │ ├── conf.d │ │ └── default.conf │ ├── html │ │ └── index.html │ └── htpasswd └── docker-compose.ymldocker-compose.ymlは以下のように設定します。
docker-compose.ymlversion: '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認証の方法を紹介しました。
- 投稿日:2020-07-04T14:46:23+09:00
Haskellで超簡単にシングルバイナリを作る
はじめに
Haskellをローカル開発環境で勉強していろいろな抽象的な知識を得たものの、実際活用するにあたってデプロイとかその辺どうするんだろう?やっぱりdocker使って簡単にやりたいな〜
でも、Goとかだと簡単に100%静的なシングルバイナリになるし、Rustとかもmuslを利用していい感じに行けそうだけどHaskellだとわからない>< というお気持ちが強かったので、簡単にデプロイできる100%静的リンクのシングルバイナリ作るぞ!と思って調べたお話です。
対象読者
Haskellを本番で使ったことない人向け
大雑把に説明
概要
- 静的リンクされたバイナリを作るためのDockerコンテナ上でプロジェクトをビルドしてバイナリを手に入れる
- 動作用のDockerイメージにそのバイナリを乗っける
- そのイメージを動かす!
環境
OS : MacOS Catalina パッケージマネージャ : Stack今回はHaskellのパッケージマネージャであるStackを利用してやっていきますが、cabalでもなんでもできそうなので調べてみてください。
Stack Docker integration
StackにはDockerと協調していい感じにバイナリを作ってくれる機能があります。
stack.yamldocker: 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.yamldocker: repo: utdemir/ghc-musl:v7-libgmp-ghc883 # 正しいhaskellコンパイラを指定しよう enable: false2. 静的リンク用の設定を追加
stack.yamlexecutables: example-exe: main: Main.hs source-dirs: app ghc-options: - -threaded - -rtsopts - -with-rtsopts=-N - -static -optl-static -optl-pthread -fPIC # <- これを追加! dependencies: - example3. バイナリを手に入れよう
これで
./bin/docker/
配下に静的リンクされたバイナリが手に入ります$ stack install --local-bin-path=./bin/docker --docker4. 動作用のDockerイメージをビルドする
ベースイメージは本当に何にも含まれていないscratchを利用することによって、静的リンクされていることを確認します。
こうすると、イメージのサイズもバイナリと同じサイズになってめっちゃちっちゃくて最高です。
(実用上いろいろ考えるとAlpineの方がいいかもしれないです)DockerfileFROM scratch COPY ./bin/docker/{ バイナリの名前入れてね } / CMD ["./{ バイナリの名前入れてね }"]ビルドします
$ docker build . -t {任意のイメージの名前}4. そして動かす!
$ docker run --rm --init {イメージ名}おわり
Servantのシンプルなプロジェクトで動作確認をしたけれど、他のDB操作系のライブラリとかでHaskell以外の他の依存がある場合はどうなるんやろな?ってところはやってないので、大規模プロジェクトでは未知数ですが、試してみてコメントいただけるとありがたいです〜。
もっといい方法があればコメントにて教えてください!
あと、聖人様のリポジトリにスターをつけてたくさん開発してもらえるように促してください!
- 投稿日:2020-07-04T00:44:20+09:00
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 前提条件
- 下記の先輩の記事と自分の記事を参考に環境を構築した。
困るまでの経緯
- 下記の手順を実行してDockerにてLaravelの開発環境を構築した。
マイグレーションの結果を確認するためにMacのターミナルから下記コマンドを実行してPHPのdockerコンテナに入った。
$ docker exec -it PHPのコンテナ名 bashDockerコンテナ内で下記コマンドを実行してmariaDBにログインを試みた
$ mysql -u ログインmariaDBユーザ名 -p困った現象
先のコマンドを実行してmariaDBにログインを試みたが下記のエラーが出力された。
>bash: mysql command not foundアプリ側でマイグレーションをしたことがあったためこの時点で混乱してしまった。
解決までの経緯
別のターミナルのウインドウにて下記コマンドを実行してmariaDBのコンテナに入った。
$ docker exec -it PHPのコンテナ名 bashmariaDBのDockerコンテナ内で下記コマンドを実行してmariaDBにログインを試みた
$ mysql -u ログインmariaDBユーザ名 -p正常にログインすることができた。
何が間違えていたのか
- PHPのコンテナ内でmariaDBにログインしようとしていた。
- mariaDBはmariaDBのコンテナからでないとログインすることはできない。