Dico

Docker Compose로 Nginx, PHP 구성하기

서버 환경 : Ubuntu 18.04.2

Docker Composer

Docker Container 여러 개를 관리하고 실행하는 도구

1. Docker Composer 최신 버전 설치

최신 버전 설치 링크

# sudo curl -L https://github.com/docker/compose/releases/download/1.25.1-rc1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose

2. 설치 확인

# docker composer --version
Docker version 18.09.7, build 2d0083d

3. Docker 작업 폴더 생성

# mkdir -p /home/dico/docker
# cd /home/dico/docker

Nginx

1. Nginx 설정 파일 작성

# mkdir -p nginx/conf.d
# vi /home/dico/docker/nginx/conf.d/default.conf
server {
        root /var/www/html;
        index index.html index.htm index.php;

        server_name localhost;

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


        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass php:9000; 
                fastcgi_index index.php;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_path_info;
        }
}

2. PHP 소스 작성

# mkdir -p nginx/html
# vi /home/dico/docker/nginx/html/index.php
<?php
echo 'owo';
echo phpinfo();
?>

3. dockerfile 작성

# vi /home/dico/docker/nginx/dockerfile
FROM nginx:latest

# 설정 파일을 Docker 내부로 복사
COPY ./conf.d/default.conf /etc/nginx/conf.d/default.conf

# Docker Host로 포트 번호 노출
EXPOSE 80

# 백그라운드에서 실행
ENTRYPOINT ["nginx","-g","daemon off;"]

docker-compose.yml 작성

# vi docker-compose.yml
version: "3.7"
services:
        db:
                # 컨테이너 이름 지정
                container_name: db
                # 이미지 지정 - Official Images로 컨테이너를 생성
                image: mysql
                restart: always
                environment:
                        MYSQL_DATABASE: dico_db
                        MYSQL_USER: dico
                        MYSQL_PASSWORD: dico
                        MYSQL_ROOT_PASSWORD: root
                # 호스트에 있는 폴더를 컨테이너 안에 있는 폴더로 마운트
                volumes:
                        - ./mysql/data:/var/lib/mysql:rw
                # 연결 포트 지정
                ports:
                        - "3306:3306"       
        app:
                container_name: php
                image: php:fpm
                # db 컨테이너가 올라간 후 app 컨테이너를 올린다.
                depends_on:
                        - db
                ports:
                        - "9000:9000"
                volumes:
                        - ./nginx/html:/var/www/html
                environment:
                        PMA_HOST: db
                        PMA_USERE: dico
                        PMA_PASSWORD: root
        web:
                container_name: nginx
                # 이미지 지정 - 직접 작성한 dockerfile을 실행하여 컨테이너 생성
                build:
                        context: ./nginx
                        dockerfile: dockerfile
                depends_on:
                        - app
                volumes:
                        - ./nginx/html:/var/www/html
                        - ./nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf
                ports:
                        - "80:80"
                        - "443:443"
                links:
                        - app
                restart: always

데몬으로 실행

# docker-compose up -d

확인

# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                      NAMES
ca7d79e077b4        docker_web          "nginx -g 'daemon of…"   8 seconds ago       Up 5 seconds        0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   nginx
d8e5502f7f90        php:fpm             "docker-php-entrypoi…"   11 seconds ago      Up 9 seconds        0.0.0.0:9000->9000/tcp                     php
ad039c0eba2c        mysql               "docker-entrypoint.s…"   13 seconds ago      Up 11 seconds       0.0.0.0:3306->3306/tcp, 33060/tcp          db

URL 확인

localhost/index.php