[{"data":1,"prerenderedAt":1891},["ShallowReactive",2],{"article-build-lamp-with-docker":3},{"id":4,"title":5,"body":6,"category":1878,"createdAt":1880,"description":5,"extension":1881,"index":1882,"meta":1883,"navigation":405,"path":1884,"publish":405,"seo":1885,"series":1882,"seriesTitle":1882,"stem":1886,"tag":1887,"thumbnail":1889,"updatedAt":1880,"__hash__":1890},"articles\u002Farticles\u002Fbuild-lamp-with-docker.md","Dockerでosから作るcentos8+apache2.4+laravel 6 開発環境構築",{"type":7,"value":8,"toc":1852},"minimark",[9,13,16,20,31,34,330,333,346,349,353,363,377,380,383,386,389,640,643,647,716,730,738,756,759,763,769,787,805,812,815,821,827,831,864,882,890,893,926,929,933,936,953,956,959,965,979,985,988,994,1215,1218,1221,1224,1323,1334,1338,1341,1379,1395,1398,1432,1450,1454,1561,1570,1573,1576,1583,1589,1599,1605,1617,1621,1635,1641,1648,1651,1655,1665,1671,1678,1684,1689,1694,1697,1703,1710,1716,1719,1723,1726,1732,1735,1741,1752,1758,1767,1773,1783,1793,1799,1807,1839,1842,1845,1848],[10,11,12],"p",{},"こんにちはjunです。laravelの開発環境をDockerで構築した機会がありました。よくlaravelぐらいならば apcheイメージを入れたりして構築すると思います。その場合大体イメージのosがUbuntuになったりしますが、本番環境のosはcentosだったりと「osから構築したいなー」と思ったので今回はDockerfileとdocker-composeを用いてosからlaravelまで構築しようと思います。",[10,14,15],{},"この記事で使用したOSとdockerのバージョン\ndocker：19.03.13\nmaxOS Catalina 10.15.5",[17,18,19],"h2",{"id":19},"構成の全体像",[21,22,27],"pre",{"className":23,"code":25,"language":26},[24],"language-text","centos_laravel\n├── docker-compose.yml\n├── laravel\n│\n├── web\n    ├── Dockerfile\n    ├── httpd.conf\n    └── php.ini\n","text",[28,29,25],"code",{"__ignoreMap":30},"",[10,32,33],{},"ディレクトリは上記の様な感じです。docker-compose.ymlは以下の様になっています。",[21,35,40],{"className":36,"code":37,"filename":38,"language":39,"meta":30,"style":30},"language-yml shiki shiki-themes material-theme-ocean","version: '3'\nservices: \n  web_1:\n    image: centos8_apache:1.0\n    depends_on: \n      - db\n    volumes: \n      - .\u002Flaravel\u002F:\u002Fvar\u002Fwww\u002Fhtml\u002F\n      - \u002Fsys\u002Ffs\u002Fcgroup:\u002Fsys\u002Ffs\u002Fcgroup:ro\n    ports: \n      - \"9000:80\"\n      - \"3000:3000\"\n    privileged: true\n    command: \u002Fsbin\u002Finit\n  db:\n    image: mysql:5.7\n    environment:\n      MYSQL_DATABASE: larvel_docker\n      MYSQL_USER: test\n      MYSQL_PASSWORD: testtest\n      MYSQL_ROOT_PASSWORD: rootroot\n    ports: \n      - \"3306:3306\"\n    volumes: \n      - laravel_data:\u002Fvar\u002Flib\u002Fmysql\nvolumes: \n  laravel_data: {}\n","docker-compose.yml","yml",[28,41,42,65,77,86,97,107,116,126,134,142,152,166,178,190,201,209,219,227,238,249,260,271,280,292,301,309,319],{"__ignoreMap":30},[43,44,47,51,55,58,62],"span",{"class":45,"line":46},"line",1,[43,48,50],{"class":49},"s-wAU","version",[43,52,54],{"class":53},"sAklC",":",[43,56,57],{"class":53}," '",[43,59,61],{"class":60},"sfyAc","3",[43,63,64],{"class":53},"'\n",[43,66,68,71,73],{"class":45,"line":67},2,[43,69,70],{"class":49},"services",[43,72,54],{"class":53},[43,74,76],{"class":75},"s0W1g"," \n",[43,78,80,83],{"class":45,"line":79},3,[43,81,82],{"class":49},"  web_1",[43,84,85],{"class":53},":\n",[43,87,89,92,94],{"class":45,"line":88},4,[43,90,91],{"class":49},"    image",[43,93,54],{"class":53},[43,95,96],{"class":60}," centos8_apache:1.0\n",[43,98,100,103,105],{"class":45,"line":99},5,[43,101,102],{"class":49},"    depends_on",[43,104,54],{"class":53},[43,106,76],{"class":75},[43,108,110,113],{"class":45,"line":109},6,[43,111,112],{"class":53},"      -",[43,114,115],{"class":60}," db\n",[43,117,119,122,124],{"class":45,"line":118},7,[43,120,121],{"class":49},"    volumes",[43,123,54],{"class":53},[43,125,76],{"class":75},[43,127,129,131],{"class":45,"line":128},8,[43,130,112],{"class":53},[43,132,133],{"class":60}," .\u002Flaravel\u002F:\u002Fvar\u002Fwww\u002Fhtml\u002F\n",[43,135,137,139],{"class":45,"line":136},9,[43,138,112],{"class":53},[43,140,141],{"class":60}," \u002Fsys\u002Ffs\u002Fcgroup:\u002Fsys\u002Ffs\u002Fcgroup:ro\n",[43,143,145,148,150],{"class":45,"line":144},10,[43,146,147],{"class":49},"    ports",[43,149,54],{"class":53},[43,151,76],{"class":75},[43,153,155,157,160,163],{"class":45,"line":154},11,[43,156,112],{"class":53},[43,158,159],{"class":53}," \"",[43,161,162],{"class":60},"9000:80",[43,164,165],{"class":53},"\"\n",[43,167,169,171,173,176],{"class":45,"line":168},12,[43,170,112],{"class":53},[43,172,159],{"class":53},[43,174,175],{"class":60},"3000:3000",[43,177,165],{"class":53},[43,179,181,184,186],{"class":45,"line":180},13,[43,182,183],{"class":49},"    privileged",[43,185,54],{"class":53},[43,187,189],{"class":188},"sbqyR"," true\n",[43,191,193,196,198],{"class":45,"line":192},14,[43,194,195],{"class":49},"    command",[43,197,54],{"class":53},[43,199,200],{"class":60}," \u002Fsbin\u002Finit\n",[43,202,204,207],{"class":45,"line":203},15,[43,205,206],{"class":49},"  db",[43,208,85],{"class":53},[43,210,212,214,216],{"class":45,"line":211},16,[43,213,91],{"class":49},[43,215,54],{"class":53},[43,217,218],{"class":60}," mysql:5.7\n",[43,220,222,225],{"class":45,"line":221},17,[43,223,224],{"class":49},"    environment",[43,226,85],{"class":53},[43,228,230,233,235],{"class":45,"line":229},18,[43,231,232],{"class":49},"      MYSQL_DATABASE",[43,234,54],{"class":53},[43,236,237],{"class":60}," larvel_docker\n",[43,239,241,244,246],{"class":45,"line":240},19,[43,242,243],{"class":49},"      MYSQL_USER",[43,245,54],{"class":53},[43,247,248],{"class":60}," test\n",[43,250,252,255,257],{"class":45,"line":251},20,[43,253,254],{"class":49},"      MYSQL_PASSWORD",[43,256,54],{"class":53},[43,258,259],{"class":60}," testtest\n",[43,261,263,266,268],{"class":45,"line":262},21,[43,264,265],{"class":49},"      MYSQL_ROOT_PASSWORD",[43,267,54],{"class":53},[43,269,270],{"class":60}," rootroot\n",[43,272,274,276,278],{"class":45,"line":273},22,[43,275,147],{"class":49},[43,277,54],{"class":53},[43,279,76],{"class":75},[43,281,283,285,287,290],{"class":45,"line":282},23,[43,284,112],{"class":53},[43,286,159],{"class":53},[43,288,289],{"class":60},"3306:3306",[43,291,165],{"class":53},[43,293,295,297,299],{"class":45,"line":294},24,[43,296,121],{"class":49},[43,298,54],{"class":53},[43,300,76],{"class":75},[43,302,304,306],{"class":45,"line":303},25,[43,305,112],{"class":53},[43,307,308],{"class":60}," laravel_data:\u002Fvar\u002Flib\u002Fmysql\n",[43,310,312,315,317],{"class":45,"line":311},26,[43,313,314],{"class":49},"volumes",[43,316,54],{"class":53},[43,318,76],{"class":75},[43,320,322,325,327],{"class":45,"line":321},27,[43,323,324],{"class":49},"  laravel_data",[43,326,54],{"class":53},[43,328,329],{"class":53}," {}\n",[10,331,332],{},"構築の流れとしては",[334,335,336,340,343],"ul",{},[337,338,339],"li",{},"centos8、apache2.4、php7.4、nodejsが入ったwebサーバーイメージを作成",[337,341,342],{},"webサーバーイメージとmysqlイメージで作られた2つのコンテナをdocker-composeで連携する",[337,344,345],{},"laraevelのマイグレーションを行う。",[10,347,348],{},"と行った流れで行います。",[350,351,352],"h3",{"id":352},"webサーバーイメージ",[10,354,355,358,359,362],{},[28,356,357],{},"web","ディレクトリ配下にはcentos8、apache、php、nodeがインストールされたイメージを作成する",[28,360,361],{},"Dockerfile","とapacheの設定ファイル、phpの設定ファイルがあります。",[10,364,365,366,369,370,372,373,376],{},"laravelでは実運用の際にドキュメントルート を変更する必要があるので",[28,367,368],{},"httpd.conf","を編集して、それをコンテナの",[28,371,368],{},"にコピーしています。",[28,374,375],{},"php.ini","はタイムゾーン を書き足すぐらいですけど同じ様にエディタ上で設定ファイルを変更できる様にしています。",[350,378,379],{"id":379},"laravelディレクトリ",[10,381,382],{},"larvelディレクトリはlaravelソースが予めインストールされています。そのソースをコンテナのドキュメントルート 配下にボリュームすることでローカルのエディタで編集してコンテナ環境でレビューすることができます。",[17,384,385],{"id":385},"webサーバーイメージを作成",[10,387,388],{},"それではまずwebサーバーイメージを作成していきます。と言っても以下のDockerfileの内容で事足ります。",[21,390,394],{"className":391,"code":392,"language":393,"meta":30,"style":30},"language-dockerfile shiki shiki-themes material-theme-ocean","FROM centos:8\n\nENV container docker\nRUN (cd \u002Flib\u002Fsystemd\u002Fsystem\u002Fsysinit.target.wants\u002F; for i in *; do [ $i == \\\nsystemd-tmpfiles-setup.service ] || rm -f $i; done); \\\nrm -f \u002Flib\u002Fsystemd\u002Fsystem\u002Fmulti-user.target.wants\u002F*;\\\nrm -f \u002Fetc\u002Fsystemd\u002Fsystem\u002F*.wants\u002F*;\\\nrm -f \u002Flib\u002Fsystemd\u002Fsystem\u002Flocal-fs.target.wants\u002F*; \\\nrm -f \u002Flib\u002Fsystemd\u002Fsystem\u002Fsockets.target.wants\u002F*udev*; \\\nrm -f \u002Flib\u002Fsystemd\u002Fsystem\u002Fsockets.target.wants\u002F*initctl*; \\\nrm -f \u002Flib\u002Fsystemd\u002Fsystem\u002Fbasic.target.wants\u002F*;\\\nrm -f \u002Flib\u002Fsystemd\u002Fsystem\u002Fanaconda.target.wants\u002F*;\nVOLUME [ \"\u002Fsys\u002Ffs\u002Fcgroup\" ]\nCMD [\"\u002Fusr\u002Fsbin\u002Finit\"]\n\nRUN \u002Fbin\u002Fcp \u002Fusr\u002Fshare\u002Fzoneinfo\u002FAsia\u002FTokyo \u002Fetc\u002Flocaltime\n\nRUN yum install -y epel-release && yum clean all\n\nRUN rpm -ivh http:\u002F\u002Fftp.riken.jp\u002FLinux\u002Fremi\u002Fenterprise\u002Fremi-release-8.rpm\n\nRUN yum -y update && yum clean all\n\nRUN yum -y install httpd && yum clean all\n\nCOPY .\u002Fhttpd.conf \u002Fetc\u002Fhttpd\u002Fconf\u002Fhttpd.conf\n\nRUN yum -y install php74-php php74-php-mysqli php74-php-gd php74-php-mbstring php74-php-opcache php74-php-xml php74-php-pear php74-php-devel php74-php-pecl-imagick php74-php-pecl-imagick-devel php74-php-pecl-zip\n\nRUN ln \u002Fusr\u002Fbin\u002Fphp74 \u002Fusr\u002Fbin\u002Fphp\n\nCOPY .\u002Fphp.ini \u002Fetc\u002Fopt\u002Fremi\u002Fphp74\u002Fphp.ini\n\nRUN chown -R apache:apache \u002Fvar\u002Fwww\u002Fhtml\n\nRUN systemctl enable php74-php-fpm\n\nRUN systemctl enable httpd \n\nVOLUME [ \"\u002Fvar\u002Fwww\u002Fhtml\" ]\n\nRUN chown -R apache:apache \u002Fvar\u002Fwww\u002Fhtml\n\nRUN dnf -y module enable nodejs:12\n\nRUN dnf -y install nodejs\n\nEXPOSE 80\n","dockerfile",[28,395,396,401,407,412,417,422,427,432,437,442,447,452,457,462,467,471,476,480,485,489,494,498,503,507,512,516,521,525,531,536,542,547,553,558,564,569,575,580,586,591,597,602,607,612,618,623,629,634],{"__ignoreMap":30},[43,397,398],{"class":45,"line":46},[43,399,400],{},"FROM centos:8\n",[43,402,403],{"class":45,"line":67},[43,404,406],{"emptyLinePlaceholder":405},true,"\n",[43,408,409],{"class":45,"line":79},[43,410,411],{},"ENV container docker\n",[43,413,414],{"class":45,"line":88},[43,415,416],{},"RUN (cd \u002Flib\u002Fsystemd\u002Fsystem\u002Fsysinit.target.wants\u002F; for i in *; do [ $i == \\\n",[43,418,419],{"class":45,"line":99},[43,420,421],{},"systemd-tmpfiles-setup.service ] || rm -f $i; done); \\\n",[43,423,424],{"class":45,"line":109},[43,425,426],{},"rm -f \u002Flib\u002Fsystemd\u002Fsystem\u002Fmulti-user.target.wants\u002F*;\\\n",[43,428,429],{"class":45,"line":118},[43,430,431],{},"rm -f \u002Fetc\u002Fsystemd\u002Fsystem\u002F*.wants\u002F*;\\\n",[43,433,434],{"class":45,"line":128},[43,435,436],{},"rm -f \u002Flib\u002Fsystemd\u002Fsystem\u002Flocal-fs.target.wants\u002F*; \\\n",[43,438,439],{"class":45,"line":136},[43,440,441],{},"rm -f \u002Flib\u002Fsystemd\u002Fsystem\u002Fsockets.target.wants\u002F*udev*; \\\n",[43,443,444],{"class":45,"line":144},[43,445,446],{},"rm -f \u002Flib\u002Fsystemd\u002Fsystem\u002Fsockets.target.wants\u002F*initctl*; \\\n",[43,448,449],{"class":45,"line":154},[43,450,451],{},"rm -f \u002Flib\u002Fsystemd\u002Fsystem\u002Fbasic.target.wants\u002F*;\\\n",[43,453,454],{"class":45,"line":168},[43,455,456],{},"rm -f \u002Flib\u002Fsystemd\u002Fsystem\u002Fanaconda.target.wants\u002F*;\n",[43,458,459],{"class":45,"line":180},[43,460,461],{},"VOLUME [ \"\u002Fsys\u002Ffs\u002Fcgroup\" ]\n",[43,463,464],{"class":45,"line":192},[43,465,466],{},"CMD [\"\u002Fusr\u002Fsbin\u002Finit\"]\n",[43,468,469],{"class":45,"line":203},[43,470,406],{"emptyLinePlaceholder":405},[43,472,473],{"class":45,"line":211},[43,474,475],{},"RUN \u002Fbin\u002Fcp \u002Fusr\u002Fshare\u002Fzoneinfo\u002FAsia\u002FTokyo \u002Fetc\u002Flocaltime\n",[43,477,478],{"class":45,"line":221},[43,479,406],{"emptyLinePlaceholder":405},[43,481,482],{"class":45,"line":229},[43,483,484],{},"RUN yum install -y epel-release && yum clean all\n",[43,486,487],{"class":45,"line":240},[43,488,406],{"emptyLinePlaceholder":405},[43,490,491],{"class":45,"line":251},[43,492,493],{},"RUN rpm -ivh http:\u002F\u002Fftp.riken.jp\u002FLinux\u002Fremi\u002Fenterprise\u002Fremi-release-8.rpm\n",[43,495,496],{"class":45,"line":262},[43,497,406],{"emptyLinePlaceholder":405},[43,499,500],{"class":45,"line":273},[43,501,502],{},"RUN yum -y update && yum clean all\n",[43,504,505],{"class":45,"line":282},[43,506,406],{"emptyLinePlaceholder":405},[43,508,509],{"class":45,"line":294},[43,510,511],{},"RUN yum -y install httpd && yum clean all\n",[43,513,514],{"class":45,"line":303},[43,515,406],{"emptyLinePlaceholder":405},[43,517,518],{"class":45,"line":311},[43,519,520],{},"COPY .\u002Fhttpd.conf \u002Fetc\u002Fhttpd\u002Fconf\u002Fhttpd.conf\n",[43,522,523],{"class":45,"line":321},[43,524,406],{"emptyLinePlaceholder":405},[43,526,528],{"class":45,"line":527},28,[43,529,530],{},"RUN yum -y install php74-php php74-php-mysqli php74-php-gd php74-php-mbstring php74-php-opcache php74-php-xml php74-php-pear php74-php-devel php74-php-pecl-imagick php74-php-pecl-imagick-devel php74-php-pecl-zip\n",[43,532,534],{"class":45,"line":533},29,[43,535,406],{"emptyLinePlaceholder":405},[43,537,539],{"class":45,"line":538},30,[43,540,541],{},"RUN ln \u002Fusr\u002Fbin\u002Fphp74 \u002Fusr\u002Fbin\u002Fphp\n",[43,543,545],{"class":45,"line":544},31,[43,546,406],{"emptyLinePlaceholder":405},[43,548,550],{"class":45,"line":549},32,[43,551,552],{},"COPY .\u002Fphp.ini \u002Fetc\u002Fopt\u002Fremi\u002Fphp74\u002Fphp.ini\n",[43,554,556],{"class":45,"line":555},33,[43,557,406],{"emptyLinePlaceholder":405},[43,559,561],{"class":45,"line":560},34,[43,562,563],{},"RUN chown -R apache:apache \u002Fvar\u002Fwww\u002Fhtml\n",[43,565,567],{"class":45,"line":566},35,[43,568,406],{"emptyLinePlaceholder":405},[43,570,572],{"class":45,"line":571},36,[43,573,574],{},"RUN systemctl enable php74-php-fpm\n",[43,576,578],{"class":45,"line":577},37,[43,579,406],{"emptyLinePlaceholder":405},[43,581,583],{"class":45,"line":582},38,[43,584,585],{},"RUN systemctl enable httpd \n",[43,587,589],{"class":45,"line":588},39,[43,590,406],{"emptyLinePlaceholder":405},[43,592,594],{"class":45,"line":593},40,[43,595,596],{},"VOLUME [ \"\u002Fvar\u002Fwww\u002Fhtml\" ]\n",[43,598,600],{"class":45,"line":599},41,[43,601,406],{"emptyLinePlaceholder":405},[43,603,605],{"class":45,"line":604},42,[43,606,563],{},[43,608,610],{"class":45,"line":609},43,[43,611,406],{"emptyLinePlaceholder":405},[43,613,615],{"class":45,"line":614},44,[43,616,617],{},"RUN dnf -y module enable nodejs:12\n",[43,619,621],{"class":45,"line":620},45,[43,622,406],{"emptyLinePlaceholder":405},[43,624,626],{"class":45,"line":625},46,[43,627,628],{},"RUN dnf -y install nodejs\n",[43,630,632],{"class":45,"line":631},47,[43,633,406],{"emptyLinePlaceholder":405},[43,635,637],{"class":45,"line":636},48,[43,638,639],{},"EXPOSE 80\n",[10,641,642],{},"もう少し細かく解説していきます。",[350,644,646],{"id":645},"centos8をいれ設定","centos8をいれ、設定",[21,648,650],{"className":391,"code":649,"language":393,"meta":30,"style":30},"FROM centos:8\n\nENV container docker\nRUN (cd \u002Flib\u002Fsystemd\u002Fsystem\u002Fsysinit.target.wants\u002F; for i in *; do [ $i == \\\nsystemd-tmpfiles-setup.service ] || rm -f $i; done); \\\nrm -f \u002Flib\u002Fsystemd\u002Fsystem\u002Fmulti-user.target.wants\u002F*;\\\nrm -f \u002Fetc\u002Fsystemd\u002Fsystem\u002F*.wants\u002F*;\\\nrm -f \u002Flib\u002Fsystemd\u002Fsystem\u002Flocal-fs.target.wants\u002F*; \\\nrm -f \u002Flib\u002Fsystemd\u002Fsystem\u002Fsockets.target.wants\u002F*udev*; \\\nrm -f \u002Flib\u002Fsystemd\u002Fsystem\u002Fsockets.target.wants\u002F*initctl*; \\\nrm -f \u002Flib\u002Fsystemd\u002Fsystem\u002Fbasic.target.wants\u002F*;\\\nrm -f \u002Flib\u002Fsystemd\u002Fsystem\u002Fanaconda.target.wants\u002F*;\nVOLUME [ \"\u002Fsys\u002Ffs\u002Fcgroup\" ]\nCMD [\"\u002Fusr\u002Fsbin\u002Finit\"]\n\nRUN \u002Fbin\u002Fcp \u002Fusr\u002Fshare\u002Fzoneinfo\u002FAsia\u002FTokyo \u002Fetc\u002Flocaltime\n",[28,651,652,656,660,664,668,672,676,680,684,688,692,696,700,704,708,712],{"__ignoreMap":30},[43,653,654],{"class":45,"line":46},[43,655,400],{},[43,657,658],{"class":45,"line":67},[43,659,406],{"emptyLinePlaceholder":405},[43,661,662],{"class":45,"line":79},[43,663,411],{},[43,665,666],{"class":45,"line":88},[43,667,416],{},[43,669,670],{"class":45,"line":99},[43,671,421],{},[43,673,674],{"class":45,"line":109},[43,675,426],{},[43,677,678],{"class":45,"line":118},[43,679,431],{},[43,681,682],{"class":45,"line":128},[43,683,436],{},[43,685,686],{"class":45,"line":136},[43,687,441],{},[43,689,690],{"class":45,"line":144},[43,691,446],{},[43,693,694],{"class":45,"line":154},[43,695,451],{},[43,697,698],{"class":45,"line":168},[43,699,456],{},[43,701,702],{"class":45,"line":180},[43,703,461],{},[43,705,706],{"class":45,"line":192},[43,707,466],{},[43,709,710],{"class":45,"line":203},[43,711,406],{"emptyLinePlaceholder":405},[43,713,714],{"class":45,"line":211},[43,715,475],{},[10,717,718,721,722,729],{},[28,719,720],{},"FROM centos:8","で書かれている様に、centos8自身のイメージは公式の",[723,724,728],"a",{"href":725,"rel":726},"https:\u002F\u002Fhub.docker.com\u002F_\u002Fcentos",[727],"nofollow","dockerHub","からpullします。そしてこれらの記述は公式の手順のソースを貼り付けた感じです。",[10,731,732,733,737],{},"以前dockerにcentos8の環境を作ろうとして詰まった時がありました（",[723,734,736],{"href":735},"\u002Farticles\u002Fstuck-on-docker-centos8","こちら","の記事）。その際はこの以下の部分だけを書いていました。",[21,739,741],{"className":391,"code":740,"language":393,"meta":30,"style":30},"FROM centos:8\nRUN \u002Fbin\u002Fcp \u002Fusr\u002Fshare\u002Fzoneinfo\u002FAsia\u002FTokyo \u002Fetc\u002Flocaltime\n#..以下同じ\n",[28,742,743,747,751],{"__ignoreMap":30},[43,744,745],{"class":45,"line":46},[43,746,400],{},[43,748,749],{"class":45,"line":67},[43,750,475],{},[43,752,753],{"class":45,"line":79},[43,754,755],{},"#..以下同じ\n",[10,757,758],{},"純粋に公式のcentosイメージはデフォルトでsystemdがアクティブにならず、コンテナを立てても応答しません。docker-composeの際にも一工夫必要になりますが、まずは上の方の記述でcenotsのイメージ設定をしましょう。",[350,760,762],{"id":761},"apache24をいれる","apache2.4をいれる",[21,764,767],{"className":765,"code":766,"language":26},[24],"RUN yum -y install httpd && yum clean all\n\nCOPY .\u002Fhttpd.conf \u002Fetc\u002Fhttpd\u002Fconf\u002Fhttpd.conf\n",[28,768,766],{"__ignoreMap":30},[10,770,771,772,775,776,779,780,783,784,786],{},"こんだけです。",[28,773,774],{},"yum -y install httpd","を",[28,777,778],{},"RUN","してhttpdを入れているだけですね。ちなみにdockerコンテナ内でyumなどを用いてインストールする際は",[28,781,782],{},"-y","オプションをつけましょう。",[28,785,782],{},"オプションは全てyesで答えるというオプションです。これがないとインストール時に「本当にインストールしますか？（Yes\u002FNo）」と聞かれ、ビルドがとまります。",[10,788,789,790,792,793,795,796,798,799,801,802,804],{},"そして",[28,791,361],{},"と同じディレクトリにいる",[28,794,368],{},"をコンテナ内の",[28,797,368],{},"にCOPYします。",[28,800,368],{},"は別途にapache2.4コンテナを立ててコピーするか、最初はこのCOPY部分をコメントアウトして一度この",[28,803,361],{},"をビルドしてコピーしても大丈夫です。",[806,807,811],"div",{"className":808},[809,810],"alert","alert-info","\nコンテナ内からソースを手元にコピーするためにはdocker cp コマンドを用います。\n",[10,813,814],{},"例えば別途にapache2.4という名前でコンテナを立ち上げている場合、以下の様にしてhttpd.confをコピーします。",[21,816,819],{"className":817,"code":818,"language":26},[24],"docker container cp apache2.4:\u002Fetc\u002Fhttpd\u002Fconf\u002Fhttpd.conf .\u002F\n",[28,820,818],{"__ignoreMap":30},[10,822,823,824,826],{},"こうするとコンテナ内のソースが手元にコピーされます。インストールする環境によって",[28,825,368],{},"の置き場所が変わったりもするのでまずはCOPY無しでビルドして、パスを確認してから手元にコピーするといいです。",[350,828,830],{"id":829},"php-をいれる","php をいれる",[21,832,834],{"className":391,"code":833,"language":393,"meta":30,"style":30},"RUN rpm -ivh http:\u002F\u002Fftp.riken.jp\u002FLinux\u002Fremi\u002Fenterprise\u002Fremi-release-8.rpm\n\nRUN yum -y install php74-php php74-php-mysqli php74-php-gd php74-php-mbstring php74-php-opcache php74-php-xml php74-php-pear php74-php-devel php74-php-pecl-imagick php74-php-pecl-imagick-devel php74-php-pecl-zip\n\nRUN ln \u002Fusr\u002Fbin\u002Fphp74 \u002Fusr\u002Fbin\u002Fphp\n\nCOPY .\u002Fphp.ini \u002Fetc\u002Fopt\u002Fremi\u002Fphp74\u002Fphp.ini\n",[28,835,836,840,844,848,852,856,860],{"__ignoreMap":30},[43,837,838],{"class":45,"line":46},[43,839,493],{},[43,841,842],{"class":45,"line":67},[43,843,406],{"emptyLinePlaceholder":405},[43,845,846],{"class":45,"line":79},[43,847,530],{},[43,849,850],{"class":45,"line":88},[43,851,406],{"emptyLinePlaceholder":405},[43,853,854],{"class":45,"line":99},[43,855,541],{},[43,857,858],{"class":45,"line":109},[43,859,406],{"emptyLinePlaceholder":405},[43,861,862],{"class":45,"line":118},[43,863,552],{},[10,865,866,869,870,873,874,877,878,881],{},[28,867,868],{},"remi","リポジトリをインストールして",[28,871,872],{},"yum","を通じてphp7.4を入れます。",[28,875,876],{},"RUN ln \u002Fusr\u002Fbin\u002Fphp74 \u002Fusr\u002Fbin\u002Fphp"," で ",[28,879,880],{},"php","コマンドを使用できる様にします。",[10,883,789,884,886,887,889],{},[28,885,368],{},"と同じ様に",[28,888,375],{},"を手元からコピーします。",[350,891,892],{"id":892},"権限の設定と永続化",[21,894,896],{"className":391,"code":895,"language":393,"meta":30,"style":30},"RUN chown -R apache:apache \u002Fvar\u002Fwww\u002Fhtml\n\nRUN systemctl enable php74-php-fpm\n\nRUN systemctl enable httpd \n\nVOLUME [ \"\u002Fvar\u002Fwww\u002Fhtml\" ]\n",[28,897,898,902,906,910,914,918,922],{"__ignoreMap":30},[43,899,900],{"class":45,"line":46},[43,901,563],{},[43,903,904],{"class":45,"line":67},[43,905,406],{"emptyLinePlaceholder":405},[43,907,908],{"class":45,"line":79},[43,909,574],{},[43,911,912],{"class":45,"line":88},[43,913,406],{"emptyLinePlaceholder":405},[43,915,916],{"class":45,"line":99},[43,917,585],{},[43,919,920],{"class":45,"line":109},[43,921,406],{"emptyLinePlaceholder":405},[43,923,924],{"class":45,"line":118},[43,925,596],{},[10,927,928],{},"webサーバーとphpを入れたのでドキュメントルート をapacheが触れる様に権限を変更します。そしてwebサーバーとphp-fpmが自動で起動する様にします。最後にlaravelプロジェクトをドキュメントルート配下にボリュームできる様にボリュームの設定をします。",[350,930,932],{"id":931},"nodejsをいれるおまけ","node.jsをいれる（おまけ）",[10,934,935],{},"node.jsをいれるのはフロントの開発でnuxt.jsを用いるためです。ここは飛ばしても構いません。",[21,937,939],{"className":391,"code":938,"language":393,"meta":30,"style":30},"RUN dnf -y module enable nodejs:12\n\nRUN dnf -y install nodejs\n",[28,940,941,945,949],{"__ignoreMap":30},[43,942,943],{"class":45,"line":46},[43,944,617],{},[43,946,947],{"class":45,"line":67},[43,948,406],{"emptyLinePlaceholder":405},[43,950,951],{"class":45,"line":79},[43,952,628],{},[17,954,955],{"id":955},"イメージをビルドする",[10,957,958],{},"webサーバーのDockerfileが書き終わったのでまずビルドしてイメージを作りましょう。Dockerfileがあるディレクトリで以下のコマンドを唱えます。",[21,960,963],{"className":961,"code":962,"language":26},[24],"$ docker build -t centos_apache:1.0 . \n",[28,964,962],{"__ignoreMap":30},[10,966,967,970,971,974,975,978],{},[28,968,969],{},". ","は「現在のディレクトリ」という意味です。そして -t でタグをつけを有効にします。今回作成したイメージは ",[28,972,973],{},"centos_apache","で",[28,976,977],{},"1.0","というタグをつけておきます。ビルドは少し時間がかかりますが、完了すればローカルにこのイメージが登録されます。dockerhubなどに置いておけば、他の人にがpullできる様になります。",[21,980,983],{"className":981,"code":982,"language":26},[24],"$ docker images                                           \nREPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE\ncentos_apache                   1.0                54784hkjdfjk        17 hours ago        941MB\n",[28,984,982],{"__ignoreMap":30},[17,986,987],{"id":987},"docker-composeを作成",[10,989,990,991,993],{},"それではosから調整したwebサーバーイメージは作成できたので、次はdocker-composeを使用してDBコンテナとの連携などをしていきます。",[28,992,38],{},"は以下の通りです。",[21,995,997],{"className":36,"code":996,"filename":38,"language":39,"meta":30,"style":30},"version: '3'\nservices: \n  web_1:\n    image: centos_apache:1.0\n    depends_on: \n      - db\n    volumes: \n      - .\u002Flaravel\u002F:\u002Fvar\u002Fwww\u002Fhtml\u002F\n      - \u002Fsys\u002Ffs\u002Fcgroup:\u002Fsys\u002Ffs\u002Fcgroup:ro\n    ports: \n      - \"9000:80\"\n      - \"3000:3000\"\n    privileged: true\n    command: \u002Fsbin\u002Finit\n  db:\n    image: mysql:5.7\n    environment:\n      MYSQL_DATABASE: trend_system\n      MYSQL_USER: trend\n      MYSQL_PASSWORD: trendtrend\n      MYSQL_ROOT_PASSWORD: rootroot\n    ports: \n      - \"3306:3306\"\n    volumes: \n      - laravel_data:\u002Fvar\u002Flib\u002Fmysql\nvolumes: \n  laravel_data: {}\n",[28,998,999,1011,1019,1025,1034,1042,1048,1056,1062,1068,1076,1086,1096,1104,1112,1118,1126,1132,1141,1150,1159,1167,1175,1185,1193,1199,1207],{"__ignoreMap":30},[43,1000,1001,1003,1005,1007,1009],{"class":45,"line":46},[43,1002,50],{"class":49},[43,1004,54],{"class":53},[43,1006,57],{"class":53},[43,1008,61],{"class":60},[43,1010,64],{"class":53},[43,1012,1013,1015,1017],{"class":45,"line":67},[43,1014,70],{"class":49},[43,1016,54],{"class":53},[43,1018,76],{"class":75},[43,1020,1021,1023],{"class":45,"line":79},[43,1022,82],{"class":49},[43,1024,85],{"class":53},[43,1026,1027,1029,1031],{"class":45,"line":88},[43,1028,91],{"class":49},[43,1030,54],{"class":53},[43,1032,1033],{"class":60}," centos_apache:1.0\n",[43,1035,1036,1038,1040],{"class":45,"line":99},[43,1037,102],{"class":49},[43,1039,54],{"class":53},[43,1041,76],{"class":75},[43,1043,1044,1046],{"class":45,"line":109},[43,1045,112],{"class":53},[43,1047,115],{"class":60},[43,1049,1050,1052,1054],{"class":45,"line":118},[43,1051,121],{"class":49},[43,1053,54],{"class":53},[43,1055,76],{"class":75},[43,1057,1058,1060],{"class":45,"line":128},[43,1059,112],{"class":53},[43,1061,133],{"class":60},[43,1063,1064,1066],{"class":45,"line":136},[43,1065,112],{"class":53},[43,1067,141],{"class":60},[43,1069,1070,1072,1074],{"class":45,"line":144},[43,1071,147],{"class":49},[43,1073,54],{"class":53},[43,1075,76],{"class":75},[43,1077,1078,1080,1082,1084],{"class":45,"line":154},[43,1079,112],{"class":53},[43,1081,159],{"class":53},[43,1083,162],{"class":60},[43,1085,165],{"class":53},[43,1087,1088,1090,1092,1094],{"class":45,"line":168},[43,1089,112],{"class":53},[43,1091,159],{"class":53},[43,1093,175],{"class":60},[43,1095,165],{"class":53},[43,1097,1098,1100,1102],{"class":45,"line":180},[43,1099,183],{"class":49},[43,1101,54],{"class":53},[43,1103,189],{"class":188},[43,1105,1106,1108,1110],{"class":45,"line":192},[43,1107,195],{"class":49},[43,1109,54],{"class":53},[43,1111,200],{"class":60},[43,1113,1114,1116],{"class":45,"line":203},[43,1115,206],{"class":49},[43,1117,85],{"class":53},[43,1119,1120,1122,1124],{"class":45,"line":211},[43,1121,91],{"class":49},[43,1123,54],{"class":53},[43,1125,218],{"class":60},[43,1127,1128,1130],{"class":45,"line":221},[43,1129,224],{"class":49},[43,1131,85],{"class":53},[43,1133,1134,1136,1138],{"class":45,"line":229},[43,1135,232],{"class":49},[43,1137,54],{"class":53},[43,1139,1140],{"class":60}," trend_system\n",[43,1142,1143,1145,1147],{"class":45,"line":240},[43,1144,243],{"class":49},[43,1146,54],{"class":53},[43,1148,1149],{"class":60}," trend\n",[43,1151,1152,1154,1156],{"class":45,"line":251},[43,1153,254],{"class":49},[43,1155,54],{"class":53},[43,1157,1158],{"class":60}," trendtrend\n",[43,1160,1161,1163,1165],{"class":45,"line":262},[43,1162,265],{"class":49},[43,1164,54],{"class":53},[43,1166,270],{"class":60},[43,1168,1169,1171,1173],{"class":45,"line":273},[43,1170,147],{"class":49},[43,1172,54],{"class":53},[43,1174,76],{"class":75},[43,1176,1177,1179,1181,1183],{"class":45,"line":282},[43,1178,112],{"class":53},[43,1180,159],{"class":53},[43,1182,289],{"class":60},[43,1184,165],{"class":53},[43,1186,1187,1189,1191],{"class":45,"line":294},[43,1188,121],{"class":49},[43,1190,54],{"class":53},[43,1192,76],{"class":75},[43,1194,1195,1197],{"class":45,"line":303},[43,1196,112],{"class":53},[43,1198,308],{"class":60},[43,1200,1201,1203,1205],{"class":45,"line":311},[43,1202,314],{"class":49},[43,1204,54],{"class":53},[43,1206,76],{"class":75},[43,1208,1209,1211,1213],{"class":45,"line":321},[43,1210,324],{"class":49},[43,1212,54],{"class":53},[43,1214,329],{"class":53},[10,1216,1217],{},"コンテナはwebサーバーとDBサーバーの二つをたて、それらをdepends_onを通じて連携します。そして手元にはlaravelとnuxtをインストールしたプロジェクトディレクトリを置いておき、それをコンテナのドキュメントルートに置くと行った手順です。",[10,1219,1220],{},"それでは詳細を解説していきます。",[350,1222,1223],{"id":1223},"webサーバーコンテナの記述",[21,1225,1227],{"className":36,"code":1226,"filename":38,"language":39,"meta":30,"style":30},"web_1:\n    image: centos_apache:1.0\n    depends_on: \n        - db\n    volumes: \n        - .\u002Flaravel\u002F:\u002Fvar\u002Fwww\u002Fhtml\u002F\n        - \u002Fsys\u002Ffs\u002Fcgroup:\u002Fsys\u002Ffs\u002Fcgroup:ro\n    ports: \n        - \"9000:80\"\n        - \"3000:3000\"\n    privileged: true\n    command: \u002Fsbin\u002Finit\n",[28,1228,1229,1236,1244,1252,1259,1267,1273,1279,1287,1297,1307,1315],{"__ignoreMap":30},[43,1230,1231,1234],{"class":45,"line":46},[43,1232,1233],{"class":49},"web_1",[43,1235,85],{"class":53},[43,1237,1238,1240,1242],{"class":45,"line":67},[43,1239,91],{"class":49},[43,1241,54],{"class":53},[43,1243,1033],{"class":60},[43,1245,1246,1248,1250],{"class":45,"line":79},[43,1247,102],{"class":49},[43,1249,54],{"class":53},[43,1251,76],{"class":75},[43,1253,1254,1257],{"class":45,"line":88},[43,1255,1256],{"class":53},"        -",[43,1258,115],{"class":60},[43,1260,1261,1263,1265],{"class":45,"line":99},[43,1262,121],{"class":49},[43,1264,54],{"class":53},[43,1266,76],{"class":75},[43,1268,1269,1271],{"class":45,"line":109},[43,1270,1256],{"class":53},[43,1272,133],{"class":60},[43,1274,1275,1277],{"class":45,"line":118},[43,1276,1256],{"class":53},[43,1278,141],{"class":60},[43,1280,1281,1283,1285],{"class":45,"line":128},[43,1282,147],{"class":49},[43,1284,54],{"class":53},[43,1286,76],{"class":75},[43,1288,1289,1291,1293,1295],{"class":45,"line":136},[43,1290,1256],{"class":53},[43,1292,159],{"class":53},[43,1294,162],{"class":60},[43,1296,165],{"class":53},[43,1298,1299,1301,1303,1305],{"class":45,"line":144},[43,1300,1256],{"class":53},[43,1302,159],{"class":53},[43,1304,175],{"class":60},[43,1306,165],{"class":53},[43,1308,1309,1311,1313],{"class":45,"line":154},[43,1310,183],{"class":49},[43,1312,54],{"class":53},[43,1314,189],{"class":188},[43,1316,1317,1319,1321],{"class":45,"line":168},[43,1318,195],{"class":49},[43,1320,54],{"class":53},[43,1322,200],{"class":60},[10,1324,1325,1326,1329,1330,1333],{},"この箇所は先ほどビルドしたwebサーバーイメージを用いたコンテナに関する記述です。",[28,1327,1328],{},"depends_on: -db","とすることでDBと連携ができる様になります。そして",[28,1331,1332],{},".\u002Flaravel\u002F:\u002Fvar\u002Fwww\u002Fhtml\u002F","でプロジェクトソースをコンテナに入れ込んでいます。",[1335,1336,1337],"h4",{"id":1337},"centosのための記述",[10,1339,1340],{},"そして先述の通りcenots8のイメージを使用している場合はコンテナがきちんと起動するために以下のコードが必要です。",[21,1342,1344],{"className":36,"code":1343,"filename":38,"language":39,"meta":30,"style":30},"volumes: \n    - \u002Fsys\u002Ffs\u002Fcgroup:\u002Fsys\u002Ffs\u002Fcgroup:ro\nprivileged: true\ncommand: \u002Fsbin\u002Finit\n",[28,1345,1346,1354,1361,1370],{"__ignoreMap":30},[43,1347,1348,1350,1352],{"class":45,"line":46},[43,1349,314],{"class":49},[43,1351,54],{"class":53},[43,1353,76],{"class":75},[43,1355,1356,1359],{"class":45,"line":67},[43,1357,1358],{"class":53},"    -",[43,1360,141],{"class":60},[43,1362,1363,1366,1368],{"class":45,"line":79},[43,1364,1365],{"class":49},"privileged",[43,1367,54],{"class":53},[43,1369,189],{"class":188},[43,1371,1372,1375,1377],{"class":45,"line":88},[43,1373,1374],{"class":49},"command",[43,1376,54],{"class":53},[43,1378,200],{"class":60},[10,1380,1381,1382,1386,1387,1390,1391,1394],{},"詳細は",[723,1383,736],{"href":1384,"rel":1385},"https:\u002F\u002Fjun-app.com\u002Fdocker-centos8\u002F",[727],"の記事にて解説します。centos8はデフォルトでコンテナ内でアクティブにならずwebサーバーも起動しません。ホストマシンの",[28,1388,1389],{},"systemd","をマウントし、そして",[28,1392,1393],{},"privileged: true","にてコンテナにroot権限を与えることで、コンテナのcentos8が動きます。",[1335,1396,1397],{"id":1397},"ポートを通す",[21,1399,1401],{"className":36,"code":1400,"filename":38,"language":39,"meta":30,"style":30},"ports: \n    - \"9000:80\"\n    - \"3000:3000\"\n",[28,1402,1403,1412,1422],{"__ignoreMap":30},[43,1404,1405,1408,1410],{"class":45,"line":46},[43,1406,1407],{"class":49},"ports",[43,1409,54],{"class":53},[43,1411,76],{"class":75},[43,1413,1414,1416,1418,1420],{"class":45,"line":67},[43,1415,1358],{"class":53},[43,1417,159],{"class":53},[43,1419,162],{"class":60},[43,1421,165],{"class":53},[43,1423,1424,1426,1428,1430],{"class":45,"line":79},[43,1425,1358],{"class":53},[43,1427,159],{"class":53},[43,1429,175],{"class":60},[43,1431,165],{"class":53},[10,1433,1434,1435,1438,1439,1442,1443,1446,1447,1449],{},"ここでホストマシンの",[28,1436,1437],{},"localhost:9000","と",[28,1440,1441],{},"localhost:3000","をコンテナの",[28,1444,1445],{},"localhost","、",[28,1448,1441],{},"につなげる様にします。ホストマシンを9000にしたのは気分です。干渉しなければ他のポートでも大丈夫です。",[350,1451,1453],{"id":1452},"dbの記述","DBの記述",[21,1455,1457],{"className":36,"code":1456,"filename":38,"language":39,"meta":30,"style":30},"db:\n    image: mysql:5.7\n    environment:\n      MYSQL_DATABASE: laravel_test\n      MYSQL_USER: test\n      MYSQL_PASSWORD: testtest\n      MYSQL_ROOT_PASSWORD: rootroot\n    ports: \n      - \"3306:3306\"\n    volumes: \n      - laravel_data:\u002Fvar\u002Flib\u002Fmysql\nvolumes: \n  laravel_data: {}\n",[28,1458,1459,1466,1474,1480,1489,1497,1505,1513,1521,1531,1539,1545,1553],{"__ignoreMap":30},[43,1460,1461,1464],{"class":45,"line":46},[43,1462,1463],{"class":49},"db",[43,1465,85],{"class":53},[43,1467,1468,1470,1472],{"class":45,"line":67},[43,1469,91],{"class":49},[43,1471,54],{"class":53},[43,1473,218],{"class":60},[43,1475,1476,1478],{"class":45,"line":79},[43,1477,224],{"class":49},[43,1479,85],{"class":53},[43,1481,1482,1484,1486],{"class":45,"line":88},[43,1483,232],{"class":49},[43,1485,54],{"class":53},[43,1487,1488],{"class":60}," laravel_test\n",[43,1490,1491,1493,1495],{"class":45,"line":99},[43,1492,243],{"class":49},[43,1494,54],{"class":53},[43,1496,248],{"class":60},[43,1498,1499,1501,1503],{"class":45,"line":109},[43,1500,254],{"class":49},[43,1502,54],{"class":53},[43,1504,259],{"class":60},[43,1506,1507,1509,1511],{"class":45,"line":118},[43,1508,265],{"class":49},[43,1510,54],{"class":53},[43,1512,270],{"class":60},[43,1514,1515,1517,1519],{"class":45,"line":128},[43,1516,147],{"class":49},[43,1518,54],{"class":53},[43,1520,76],{"class":75},[43,1522,1523,1525,1527,1529],{"class":45,"line":136},[43,1524,112],{"class":53},[43,1526,159],{"class":53},[43,1528,289],{"class":60},[43,1530,165],{"class":53},[43,1532,1533,1535,1537],{"class":45,"line":144},[43,1534,121],{"class":49},[43,1536,54],{"class":53},[43,1538,76],{"class":75},[43,1540,1541,1543],{"class":45,"line":154},[43,1542,112],{"class":53},[43,1544,308],{"class":60},[43,1546,1547,1549,1551],{"class":45,"line":168},[43,1548,314],{"class":49},[43,1550,54],{"class":53},[43,1552,76],{"class":75},[43,1554,1555,1557,1559],{"class":45,"line":180},[43,1556,324],{"class":49},[43,1558,54],{"class":53},[43,1560,329],{"class":53},[10,1562,1563,1564,1569],{},"DBはmysql:5.7の",[723,1565,1568],{"href":1566,"rel":1567},"https:\u002F\u002Fhub.docker.com\u002F_\u002Fmysql",[727],"公式イメージ","を使用します。パスワードの設定なども簡単に行ってくれます。そしてデータ内容は永続化したいのでlaravel_data:{}をボリュームしておきます。",[10,1571,1572],{},"DBはこれでOKです。もしDBにあるデータをまっさらにしたい場合はコンテナを止めて、ボリュームを削除すれば大丈夫です。",[17,1574,1575],{"id":1575},"laravelのプロジェクトソースの調整",[10,1577,1578,1579,1582],{},"以上でwebサーバーとDBサーバーの準備は整いました。次は",[28,1580,1581],{},"laravel","ソースと細かい調整を行います。まずはlaravelディレクトリにプロジェクトを入れます。今回はバージョン６を入れます。ローカルにはcomposerが入っているものとします。",[21,1584,1587],{"className":1585,"code":1586,"language":26},[24],"$ cd laravel\n$ composer create-project \"laravel\u002Flaravel=6.*\" .\n",[28,1588,1586],{"__ignoreMap":30},[10,1590,1591,1592,1595,1596,1598],{},"laravelのソースが並んだら",[28,1593,1594],{},".env","を以下の様にDBの設定を書き込みます。",[28,1597,38],{},"で設定した通りのパスワード、ユーザーです。",[21,1600,1603],{"className":1601,"code":1602,"filename":1594,"language":26,"meta":30},[24],"...\nDB_CONNECTION=mysql\nDB_HOST=db\nDB_PORT=3306\nDB_DATABASE=laravel_test\nDB_USERNAME=root\nDB_PASSWORD=rootroot\n...\n",[28,1604,1602],{"__ignoreMap":30},[10,1606,1607,1610,1611,1613,1614,1616],{},[28,1608,1609],{},"DB_HOST","は",[28,1612,38],{},"のserviceで定義した名前",[28,1615,1463],{},"で大丈夫です。こうすればマイグレーションができる様になります。",[350,1618,1620],{"id":1619},"httpdconfとphpiniの微調整","httpd.confとphp.iniの微調整",[10,1622,1623,1624,1627,1628,1630,1631,1634],{},"Laravelではドキュメントルート を ",[28,1625,1626],{},"\u002Fpublic"," 配下にする様に言われています。",[28,1629,368],{},"のデフォルトのドキュメントルートは ",[28,1632,1633],{},"\u002Fvar\u002Fwww\u002Fhtml","なので以下の様に変更しておきます",[21,1636,1639],{"className":1637,"code":1638,"filename":368,"language":26,"meta":30},[24],"DocumentRoot \"\u002Fvar\u002Fwww\u002Fhtml\u002Fpublic\"\n\n\u003CDirectory \"\u002Fvar\u002Fwww\u002Fhtml\u002Fpublic\">\n    Options Indexes FollowSymLinks\n    AllowOverride All\n    Require all granted\n\u003C\u002FDirectory>\n",[28,1640,1638],{"__ignoreMap":30},[10,1642,1643,1644,1647],{},"こうするとapacheは",[28,1645,1646],{},"\u002Fvar\u002Fwww\u002Fhtml\u002Fpublic","をドキュメントルートとして見てくれます。",[10,1649,1650],{},"php.iniはタイムゾーン をAsia\u002FTokyoにするだけです。",[17,1652,1654],{"id":1653},"composeを起動","composeを起動！",[10,1656,1657,1658,1661,1662,1664],{},"それでは",[28,1659,1660],{},"docker-compose","で起動します。",[28,1663,38],{},"がある場所にて以下の様に唱えます。",[21,1666,1669],{"className":1667,"code":1668,"language":26},[24],"$ docker-compose up -d\n",[28,1670,1668],{"__ignoreMap":30},[10,1672,1673,1674,1677],{},"ビルドがうまくいけば",[28,1675,1676],{},"docker ps","で2つのコンテナが起動しているのが確認できます。",[21,1679,1682],{"className":1680,"code":1681,"language":26},[24],"CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                          NAMES\n3e121d905e5e        centos_apache:1.0   \"\u002Fsbin\u002Finit\"             5 seconds ago       Up 3 seconds        0.0.0.0:3000->3000\u002Ftcp, 0.0.0.0:9000->80\u002Ftcp   centos_apache_web_1_1\nea5076e310e9        mysql:5.7           \"docker-entrypoint.s…\"   5 seconds ago       Up 4 seconds        0.0.0.0:3306->3306\u002Ftcp, 33060\u002Ftcp              centos_apache_db_1\n",[28,1683,1681],{"__ignoreMap":30},[10,1685,1686,1688],{},[28,1687,1437],{},"をブラウザでアクセスすると",[1690,1691],"image-render",{":src":1692,":width":1693},"'_mix\u002Fsch-2020-11-28-17.33.36-768x407.png'","'100%'",[10,1695,1696],{},"はい。おなじみのLaravelの画面が表示されました。マイグレーションをするためにコンテナに入ります。",[21,1698,1701],{"className":1699,"code":1700,"language":26},[24],"$ docker exec -it centos_apache_web_1_1 \u002Fbin\u002Fbash\n",[28,1702,1700],{"__ignoreMap":30},[10,1704,1705,1706,1709],{},"プロジェクトルートに移動して",[28,1707,1708],{},"php artisan migrate","を唱えるとDBコンテナへマイグレーションされます。",[21,1711,1714],{"className":1712,"code":1713,"language":26},[24],"$ cd \u002Fvar\u002Fwww\u002Fhtml\n$ ls\nREADME.md  artisan    client         composer.lock  database      nuxt.config.js     package.json  public     routes      storage  vendor\napp        bootstrap  composer.json  config         node_modules  package-lock.json  phpunit.xml   resources  server.php  tests    webpack.mix.js\n\n$ php artisan migrate\nMigration table created successfully.\nMigrating: 2014_10_12_000000_create_users_table\nMigrated:  2014_10_12_000000_create_users_table (0.03 seconds)\nMigrating: 2014_10_12_100000_create_password_resets_table\nMigrated:  2014_10_12_100000_create_password_resets_table (0.02 seconds)\nMigrating: 2019_08_19_000000_create_failed_jobs_table\nMigrated:  2019_08_19_000000_create_failed_jobs_table (0.01 seconds)\n",[28,1715,1713],{"__ignoreMap":30},[10,1717,1718],{},"本当に入ったかはDBコンテナに入ってmysqlコマンドを通じて中身を見ると確認できます。ここまでくればLaravelの環境構築は完了です。phpのバージョンを変えてみたりで、OS環境による検証もある程度楽になるでしょう。",[17,1720,1722],{"id":1721},"おまけnuxtjsを起動させる","（おまけ）Nuxt.jsを起動させる",[10,1724,1725],{},"一応私のプロジェクトではnuxt.jsを入れていたので、せっかくなので解説します。larvelディレクトリにてnuxt.jsのプロジェクトを作成します。（ローカルでも、コンテナ内でもどちらでも。私はローカルで作成）",[21,1727,1730],{"className":1728,"code":1729,"language":26},[24],"$ cd laravel\n$ npx create-nuxt-app client\n",[28,1731,1729],{"__ignoreMap":30},[10,1733,1734],{},"以下の様なディレクトリになりました。",[21,1736,1739],{"className":1737,"code":1738,"language":26},[24],".\n├── README.md\n├── app\n├── artisan\n├── bootstrap\n├── client # nuxt ソース\n├── composer.json\n├── composer.lock\n├── config\n├── database\n├── phpunit.xml\n├── public\n├── resources\n├── routes\n├── server.php\n├── storage\n├── tests\n├── vendor\n└── webpack.mix.js\n",[28,1740,1738],{"__ignoreMap":30},[10,1742,1743,1744,1747,1748,1751],{},"ちなみにLaravelに初期にあった",[28,1745,1746],{},"package.json","は削除しています。",[28,1749,1750],{},"client","ディレクトリ配下にnuxtのソースがありますが、これだと管理がしにくいので以下の様に変更します。",[21,1753,1756],{"className":1754,"code":1755,"language":26},[24],".\n├── README.md\n├── app\n├── artisan\n├── bootstrap\n├── client\n├── composer.json\n├── composer.lock\n├── config\n├── database\n├── node_modules #clientから\n├── nuxt.config.js #clientから\n├── package-lock.json #clientから\n├── package.json #clientから\n├── phpunit.xml\n├── public\n├── resources\n├── routes\n├── server.php\n├── storage\n├── tests\n├── vendor\n└── webpack.mix.js\n",[28,1757,1755],{"__ignoreMap":30},[10,1759,1760,1762,1763,1766],{},[28,1761,1750],{},"から4つのファイルを引っ張り出し、そして",[28,1764,1765],{},"nuxt.config.js","に以下を追記します。",[21,1768,1771],{"className":1769,"code":1770,"filename":1765,"language":26,"meta":30},[24],"srcDir: 'client\u002F',\n",[28,1772,1770],{"__ignoreMap":30},[10,1774,1775,1776,1778,1779,1782],{},"こうすることで",[28,1777,1750],{},"配下はnuxtのソースだけを置いて設定ファイルや",[28,1780,1781],{},"dist","はLaravelのプロジェクトルートに出される様にします。この辺はチームの好みによるので自由に変更してください。",[10,1784,1785,1786,1789,1790,1792],{},"そしてコンテナ内に入って ",[28,1787,1788],{},"npm run dev","をすればnuxtの開発サーバーが立ち上がるのですが、その前にまた",[28,1791,1765],{},"に以下の内容を記述します。",[21,1794,1797],{"className":1795,"code":1796,"filename":1765,"language":26,"meta":30},[24],"server: {\n    host: '0.0.0.0'\n},\n",[28,1798,1796],{"__ignoreMap":30},[10,1800,1801,1802,1804,1805,974],{},"dockerコンテナを使用しない場合はこの設定は要らないのですが、コンテナ内で",[28,1803,1788],{},"をしてそれに接続するには上記の設定が必要です。コンテナ内のlocalhost:3000に開発サーバーが立ち上がります。",[28,1806,38],{},[21,1808,1810],{"className":36,"code":1809,"filename":38,"language":39,"meta":30,"style":30},"ports: \n    - \"9000:80\"\n    - \"3000:3000\n",[28,1811,1812,1820,1830],{"__ignoreMap":30},[43,1813,1814,1816,1818],{"class":45,"line":46},[43,1815,1407],{"class":49},[43,1817,54],{"class":53},[43,1819,76],{"class":75},[43,1821,1822,1824,1826,1828],{"class":45,"line":67},[43,1823,1358],{"class":53},[43,1825,159],{"class":53},[43,1827,162],{"class":60},[43,1829,165],{"class":53},[43,1831,1832,1834,1836],{"class":45,"line":79},[43,1833,1358],{"class":53},[43,1835,159],{"class":53},[43,1837,1838],{"class":60},"3000:3000\n",[10,1840,1841],{},"この様にホストの3000とコンテナの3000ポートをつないでいたので、localhost:3000にアクセスすると",[1690,1843],{":src":1844,":width":1693},"'_mix\u002Fsch-2020-11-28-18.02.48-768x599.png'",[10,1846,1847],{},"nuxtの画面が現れました。（UIフレームワークにvuetifyを選択するとこの画面になります。）これでnuxtの開発もコンテナ内で実行できます。",[1849,1850,1851],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .s-wAU, html code.shiki .s-wAU{--shiki-default:#F07178}html pre.shiki code .sAklC, html code.shiki .sAklC{--shiki-default:#89DDFF}html pre.shiki code .sfyAc, html code.shiki .sfyAc{--shiki-default:#C3E88D}html pre.shiki code .s0W1g, html code.shiki .s0W1g{--shiki-default:#BABED8}html pre.shiki code .sbqyR, html code.shiki .sbqyR{--shiki-default:#FF9CAC}",{"title":30,"searchDepth":79,"depth":79,"links":1853},[1854,1858,1865,1866,1873,1876,1877],{"id":19,"depth":67,"text":19,"children":1855},[1856,1857],{"id":352,"depth":79,"text":352},{"id":379,"depth":79,"text":379},{"id":385,"depth":67,"text":385,"children":1859},[1860,1861,1862,1863,1864],{"id":645,"depth":79,"text":646},{"id":761,"depth":79,"text":762},{"id":829,"depth":79,"text":830},{"id":892,"depth":79,"text":892},{"id":931,"depth":79,"text":932},{"id":955,"depth":67,"text":955},{"id":987,"depth":67,"text":987,"children":1867},[1868,1872],{"id":1223,"depth":79,"text":1223,"children":1869},[1870,1871],{"id":1337,"depth":88,"text":1337},{"id":1397,"depth":88,"text":1397},{"id":1452,"depth":79,"text":1453},{"id":1575,"depth":67,"text":1575,"children":1874},[1875],{"id":1619,"depth":79,"text":1620},{"id":1653,"depth":67,"text":1654},{"id":1721,"depth":67,"text":1722},[1879],"devstack","2026-01-16","md",null,{},"\u002Farticles\u002Fbuild-lamp-with-docker",{"title":5,"description":5},"articles\u002Fbuild-lamp-with-docker",[1888,1581],"docker","_mix\u002Fdokcer_laravel.jpeg","V2jA9dknjBNGZQzsV_h65rI9ap5VBJ9l1skOpFFoD8c",1782886886283]