개발 꿀팁/PHP

도커 원클릭 Nginx+PHP 환경 구축 (자동 배치 명령 포함)

Jammie 2022. 7. 13. 16:25
반응형

글의 주요 부분은 단계별 튜토리얼입니다. 글의 마지막은 내가 원클릭 설치 명령을 정리한 것입니다. 자동으로 docker를 다운로드하여 설치하고, 미러를 구축하며, 컨테이너 클러스터를 작동시킵니다(팩 안의 주석 커버 범위 80%까지).
여러분은 튜토리얼을 보고 직접 시도하거나 원클릭 설치 명령을 실행할 수 있습니다. 이 과정은 약 10분 동안 4대의 다른 기계에서 수행되었습니다. 네트워크상의 이유로 5-15분 정도입니다.

이 장의 내용이 원클릭 설치로 다운로드되는 것과 다르다면, 원클릭 설치 기준으로 원클릭 설치 버전은 계속 갱신되며, v1.3.0 버전은 memcache와 redis를 지원합니다.

설치 후 IP:8081에 직접 액세스하면 phpinfo 페이지가 나타납니다

이번 배포는 단일 서버에서 도커를 사용하여 통합 환경을 구축하고 Nginx+PHP 프로젝트를 실행하기 위한 것입니다.

호스트 시스템:CentOS7+ 메모리 4G
Docker 환경 설치
일단 윰댕 업데이트하고

$ sudo yum update

도커 이전 버전 제거 (있는 경우)

$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine

시스템 종속성 설치

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

소프트웨어 원본 정보 추가

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum 캐시 업데이트

sudo yum makecache fast

docker-ce 설치

sudo yum -y install docker-ce

docker 백그라운드 서비스 시작

sudo systemctl start docker

알리미러 가속 권장, 바이두에서 바로 튜토리얼이 있습니다. 절차가 간단합니다. 그렇지 않으면 도커 공식 미러를 다운로드하는 것이 느릴 수 있습니다.
hello-world 테스트 실행

[root@runoob ~]# docker run hello-world
     docker  run 이 명령은 로컬에서 hello-world 미러를 찾고, 로컬에 없으면 자동으로 다운로드한 다음 hello-world를 실행합니다

docker-ce 삭제 (docker를 제거하려면 다음 명령을 실행합니다)

$ sudo yum remove docker-ce
$ sudo rm -rf /var/lib/docker

현재 Docker 환경이 조성되어 있습니다. 다음은 Docker를 사용하여 Nginx와 PHP를 구축할 것입니다. 데이터베이스에 대해서는 이전 데이터베이스 서버를 사용합니다.
다음은 Dockerfile을 사용하여 Nginx 환경을 만듭니다.
Dockerfile에 대해 자세히 알고 싶다면 https://www.cnblogs.com/jsonhc/p/7767669.htm를 추천합니다.L

/root 디렉터리에 새 docker-env 폴더를 만듭니다. 여기에는 nginx와 php의 미러링된 모든 파일과 Dockerfile이 포함됩니다

cd /root

mkdir docker-env     //폴더 만들기

cd docker-env/

mkdir nginx             //nginx 관련 파일 저장

cd nginx/

touch Dockerfile && mkdir conf && mkdir logs && mkdir html && mkdir www    //Dockerfile 파일 만들기, nginx의 설정 디렉터리, 로그 등 디렉터리 만들기

nginx 폴더 아래의 Dockerfile 내용은 다음과 같습니다. 나만의 nginx 미러를 만드는 데 사용됩니다

[root@mdm nginx]# cat Dockerfile 
# 기본 미러링
FROM centos

# 관리자
MAINTAINER 271648298@qq.com

# wget 다운로드 도구 설치하기
RUN yum install -y wget 

# usr/lcoal/src로 전환/카탈로그는 cd에 해당하며 cd로 대체할 수 있지만, docker 공식에서는 cd를 권장하지 않습니다
WORKDIR /usr/local/src

# 현재 폴더에 원격 파일을 추가합니다. 참고: 현재 디렉터리를 나타내는 점(.)ADD는 미러에 원격 파일을 추가할 수 있지만 COPY는 로컬 파일만 미러에 추가할 수 있다
ADD http://nginx.org/download/nginx-1.17.0.tar.gz .

# RUN,미러 내에서 압축 풀기 명령 실행
RUN tar zxvf nginx-1.17.0.tar.gz

# 디렉터리 바꾸기
WORKDIR /usr/local/src/nginx-1.17.0

# 업데이트 yum, 실행 안 함
# RUN yum -y update 

# 필요한 소프트웨어 설치 및 nginx 사용자 추가
RUN yum install -y gcc gcc-c++ glibc make openssl-devel
RUN yum install -y libxslt-devel -y gd-devel GeoIP GeoIP-devel pcre pcre-devel
RUN  useradd -M -s /sbin/nologin nginx

# 마운트 볼륨, 테스트 케이스 (여기서 마운트된 볼륨, 이 시스템의 디렉터리를 지정할 수 없습니다. 유연하지 않습니다. 일반적으로 컨테이너를 시작할 때 -v 매개 변수를 통해 마운트 볼륨을 지정하거나 docker-compose.yaml 파일에서 로컬 디렉터리를 지정할 수 있습니다)
VOLUME ["/data"]

# 컴파일 설치nginx
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_degradation_module --with-http_stub_status_module && make && make install

# 切Nginx의 설정 디렉터리로 전환
WORKDIR /usr/local/nginx/conf

# 하위 설정 폴더 만들기, 개인 취향, 안 만들 수도 있고 다른 이름 불러도 되지만, 특별한 기호를 붙이지 않는 것이 좋습니다,
RUN mkdir vhost


# 변수를 설정하고 명령을 실행할 때 접두사 디렉터리를 생략할 수 있습니다	
ENV PATH /usr/local/nginx/sbin:$PATH


# 노출 포트
EXPOSE 80

# the command of entrypoint
ENTRYPOINT ["nginx"]

# 명령 실행, 배열 형식, "-g daemon off;" 컨테이너를 실행할 때 컨테이너는 전면에서 실행되며 종료되지 않습니다
CMD ["-g", "daemon off;"]

간단한 명령으로 nginx 미러를 만들어 보겠습니다

[root@mdm nginx]# docker build -t centos_nginx:self .    //주의, 마지막에 한 가지 점이 있다(영문 마침표),    centos_nginx는 미러 이름, self는 태그, 버전 번호와 같은 의미

그런 다음 docker images 명령을 통해 새로 구축된 미러를 볼 수 있습니다. 이 미러를 통해 컨테이너를 시작합니다. 컨테이너에 들어가서 카탈로그와 설정을 기억합니다. 나중에 모든 서버와 환경이 컨테이너를 사용하게 될 수도 있습니다

    docker run -d -p 8082:80 --name=test_nginx centos_nginx:self    //컨테이너를 시작합니다. 성공적으로 출력하면 문자열이 표시됩니다
            -d 데몬 실행은 컨테이너 백그라운드 실행이 종료되지 않는다는 뜻
            -p  매핑 포트 번호, 호스트 포트: 컨테이너 포트
            --name 컨테이너 이름,
            마지막 centos_nginx: self는 미러링입니다: 버전 번호
    docker ps -a                                                                                   //모든 컨테이너 목록을 보면 다음과 같이 표시됩니다. nginx 컨테이너가 정상적으로 시작되었음을 나타냅니다

    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
    d51f2c95b66c        centos_nginx:self   "nginx -g 'daemon of…"   5 seconds ago       Up 4 seconds        0.0.0.0:8082->80/tcp   test_nginx
    
    curl 127.0.1:8082 명령을 통해 Welcome to nginx와 같은 영어 힌트를 볼 수 있습니다. 즉, 모든 것을 설명합니다

    다음은 용기에 들어가 ssh를 통해서도 들어갈 수 있는 여러 가지 방법이 있는데 여기서 제가 자주 쓰는 방식만 소개하겠습니다

    docker exec -it   d51f2c95b66c   /bin/bash      //이 방식으로 들어가면 용기가 꺼지지 않습니다, docker attach 진입했다가 퇴출하면 용기가 닫히고, 뒤에 /bin/bash  바꿀 수도 있고  /bin/sh(예를 들어 알파인 베이스 미러링)
    
    들어와서 Nginx 프로필 보기

        [root@d51f2c95b66c /]# cd /usr/local/nginx/
        [root@d51f2c95b66c nginx]# ls
        client_body_temp  conf  fastcgi_temp  html  logs  proxy_temp  sbin  scgi_temp  uwsgi_temp

    이 버전의 nginx의 디렉토리 구조를 스스로 파악하여 나중에 쉽게 구성할 수 있습니다
    exit 명령으로 컨테이너를 종료합니다

/root/docker-env/nginx/conf 폴더에 들어갑니다

cd /root/docker-env/nginx/conf

touch nginx.conf       //이 파일은 나중에 Nginx의 프로필로 컨테이너에 마운트됩니다,

너는 통과할 수 있다  docker cp d51f2c95b66c :/usr/local/nginx/conf/nginx.conf /root/docker-env/nginx/conf    다음 내 nginx 프로필을 사용할 수 있도록 Nginx 컨테이너의 기본 프로필을 복사합니다

내 nginx.conf 파일은 다음과 같습니다. nginx.conf 로그와 하위 프로필에 해당하는 디렉터리에 주의하십시오. 모두 존재하며 존재하지 않는 디렉터리는 컨테이너에 들어가 해당 디렉터리를 만듭니다

[root@mdm conf]# cat nginx.conf

user  nginx;
worker_processes  1;

error_log  /usr/local/nginx/logs/error.log warn;
pid        /usr/local/nginx/logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    	include       /usr/local/nginx/conf/mime.types;
    	default_type  application/octet-stream;

    	log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    	access_log  /usr/local/nginx/logs/access.log  main;

    	server_names_hash_bucket_size 128;
        client_header_buffer_size 32k;
        large_client_header_buffers 4 32k;
        client_max_body_size 50m;

        sendfile   on;
        tcp_nopush on;

        keepalive_timeout 60;

        tcp_nodelay on;

        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_buffer_size 64k;
        fastcgi_buffers 4 64k;
        fastcgi_busy_buffers_size 128k;
        fastcgi_temp_file_write_size 256k;

        gzip on;
        gzip_min_length  1k;
        gzip_buffers     4 16k;
        gzip_http_version 1.1;
        gzip_comp_level 2;
        gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss;
        gzip_vary on;
        gzip_proxied   expired no-cache no-store private auth;
        gzip_disable   "MSIE [1-6]\.";

        #limit_conn_zone $binary_remote_addr zone=perip:10m;
        ##If enable limit_conn_zone,add "limit_conn perip 10;" to server section.

        server_tokens off;
        access_log off;
    	include /usr/local/nginx/conf/vhost/*.conf;
		
server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
	        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;
	
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

이제 nginx의 구성이 거의 완료되었으므로, 방금 시작한 컨테이너를 멈추고 8082 포트를 해제한 다음 디렉터리를 마운트하는 방식으로 시작합니다

docker  stop  d51f2c95b66c


docker run -d -p 8082:80 -v /root/docker-env/nginx/logs:/usr/local/nginx/logs -v /root/docker-env/nginx/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf -v /root/docker-env/nginx/conf/vhost:/usr/local/nginx/conf/vhost -v /www:/www centos_nginx:self
//이렇게 되면 nginx의 프로필과 프로젝트 소재 디렉토리/wwhwhwhow가 모두 마운트되어 호스트 상에서 프로필을 수정하고 nginx에 접속할 수 있게 되며, nginx의 기본 구성은 이것으로 끝납니다。

PHP 미러링 구축
php 폴더 만들기

cd /root/docker-env
mkdir php
cd php
touch Dockerfile

php의 Dockerfile 파일 내용은 다음과 같다

[root@guangai-app php]# cat Dockerfile 


FROM php:7.1-fpm-alpine3.9

MAINTAINER 271648298@qq.com


# install redis
 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
    && apk update \
    && apk add --no-cache libmcrypt-dev freetype-dev libjpeg-turbo-dev \
    && docker-php-ext-install mcrypt pdo_mysql \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd \
    && mkdir -p /usr/src/php/ext/redis \
    && curl -L https://github.com/phpredis/phpredis/archive/3.1.6.tar.gz | tar xvz -C /usr/src/php/ext/redis --strip 1 \
    && echo 'redis' >> /usr/src/php-available-exts \
    && docker-php-ext-install redis

파일 내용이 적어 보이는데, 도커의 공식 php 미러를 사용했기 때문에 alpine 시스템을 기반으로 5M 미만의 Linux 시스템을 사용하였습니다.

여기에 필요한 gd, mysqlpdo, redis 등의 라이브러리만 설치되어 있으며, 다른 라이브러리가 필요한 경우 자체적으로 추가할 수 있습니다.

php: 7.1-fpm-alpine 3.9에 무엇이 포함되어 있는지 홈페이지에서 주소: https://github.com/docker-library/php/blob/a7e2de0e8f2b902bc36be6f5d61c0b4fcd1052ff/7.1/alpine3.9/fpm/Dockerfile

이제 저희만의 PHP 미러를 만들어보도록 하겠습니다

docker build -t alpine_php:self .    //주의, 마지막에 한 가지 점이 있다(.)

이 미러링에 따라 컨테이너를 시작하고 연결/ WWW

docker run --name myphp-fpm -v /root/docker-env/nginx/www:/www -d alpine_php:self

이제 Nginx와 PHP 미러링을 모두 사용할 수 있습니다. PHP 미러링에는 필요한 확장 기능이 포함되어 있습니다. 서버를 새로 열 때 어떻게 배치합니까?
명령으로도 가능하지만, docker-compose라는 경량 용기 편성 도구를 소개합니다.
docker-compose 설치

sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose   //여기가 좀 느릴 수도 있어요

sudo chmod +x /usr/local/bin/docker-compose

docker-compose --version

이제 docker-compose 도구를 설치했습니다. 사용법을 알아보겠습니다.
docker-env 폴더에 들어갑니다

[root@guangai-app ~]#cd /root/docker-env
[root@guangai-app docker-env]# ls
docker-compose.yml  nginx  php

보시다시피, 우리가 방금 완성한 nginx 디렉터리와 php 디렉터리가 있고, 그 외에 docker-compose.yml 파일이 있습니다

docker-compose.yml 파일의 내용은 다음과 같습니다

[root@guangai-app docker-env]# cat docker-compose.yml 
nginx:
    build: ./nginx
    volumes: 
        - /root/docker-env/nginx/html:/usr/share/nginx/html
        - /root/docker-env/nginx/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf
        - /root/docker-env/nginx/conf/vhost:/usr/local/nginx/conf/vhost
        - /root/docker-env/nginx/logs:/usr/local/nginx/logs
        - /www:/www
    ports: 
        - "8081:80"
    links: 
        - php
php:
    build: ./php
    volumes:
        - /www:/www

/root/docker-env/nginx/conf/vhost에서 nginx 컨테이너에 사용할 nginx 설정 파일( test-php.conf) 을 만들 것입니다. test-php.conf 파일의 내용은 다음과 같습니다.
물론 처음일 때는 이 파일을 최대한 간단하게 쓸 수 있고, php만 해석하면 된다

[root@guangai-app vhost]# cat test-php.conf 
server {
    listen       80;
    server_name  localhost;

	location / {
		    root   /www/api_wx_klagri_com_cn/public;
            index  index.php index.html index.htm;
            if (!-e $request_filename) {
              rewrite ^(.*)$ /index.php?s=$1 last;
              break;
            }
        }


    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
		root   /www/cms/public;
    }

	location ~ \.php$ {
                root           /www/api_wx_klagri_com_cn/public;
                fastcgi_pass    php:9000;
                fastcgi_index   index.php;
                #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
                fastcgi_split_path_info ^(.+\.php)(.*)$;
                fastcgi_param PATH_INFO $fastcgi_path_info;
                fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include        fastcgi_params;
                set $real_script_name $fastcgi_script_name;
                if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
                        set $real_script_name $1;
                        set $path_info $2;
                }
                fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
                fastcgi_param SCRIPT_NAME $real_script_name;
                fastcgi_param PATH_INFO $path_info;
				include		   vhost/my_params/api_wx.conf;
        }


}

nginx를 배치하고 docker-compose를 통해 nginx+php를 시작합니다

docker-compose up -d      //-d  后台运行

docker-compose up-d //-d 백그라운드 실행

nginx 설정을 수정한 후 docker-compose up-d--force- recreate 다시 시작

그리고 당신의 ip+ 포트 번호를 통해서, 예를 들면 http://59.110.217.236:8081/index.php.

오케이

지금까지 제가 정리해 놓은 도커는 Nginx+PHP.x+Redis+Memcache를 배치하는 단계였습니다.나를 위해서 아직 핵심 개발 업무를 해야 한다. 도중에 몇 번이나 끊어져서 품질을 보장할 수 없다. 단지 참고만 할 뿐, 순서에 따라 집행하는 데 문제가 있으면 메시지를 남겨도 된다.
나중에 내가 정리한 최신 버튼 설치 명령은 다음과 같습니다. root 사용자 실행, /root 디렉토리 아래에서 실행, 실행 후 직접 액세스 8081 포트에서 익숙한 phpinfo 페이지를 보는 것은 성공이다

#  리눅스에 먼저 unzip을 설치한 후 다음 명령을 실행합니다(unzip, yum install-y unzip 설치)。
cd /root && wget https://github.com/eternity-wdd/docker-env/archive/master.zip && unzip master.zip && mv docker-env-master docker-env && cd docker-env && /bin/bash init.sh
#  자세한 내용은 다운로드한 파일의 README.md을 참조하십시오

서버 환경 메모리는 4G 이상, 커널 버전은 3.10 이상이라는 점에 유의해야 한다.퍼스널 패권 서버 킹은 기본적으로 할 수 없습니다. 로컬 가상 시스템이 이 명령을 실행하려고 시도하지 않았습니다. 첫 번째 실행이 성공하지 못했습니다. 다시 실행해 주십시오(개별 예).
Nginx와 PHP의 프로필, 로그 파일은 모두 docker-env 폴더에 해당 디렉토리에 있습니다.
환경을 중지하려면 docker-env 폴더에 들어가서 docker-compose stop 명령을 실행합니다. docker-compose up-d를 다시 시작합니다.가
PHP 확장 자체 설치, 이미 부분 확장, gd, mysqlpdo, redis 등
위의 단계가 성공하면 사용자 환경 프로필을 수정할 수 있습니다
nginx 설정을 수정한 후 docker-compose up-d --force- recreate를 통해 재시작합니다. 다시 컴파일할 경우 docker-co를 마지막으로 추가할 수 있습니다.mpose up-d --force-recreate -- build
8081 포트를 통해 직접 접속하면 phpinfo() 페이지가 나타납니다. 설치 패키지에는 도메인 테스트를 포함한 완전한 설명 파일이 포함되어 있어 주석 커버리지가 높습니다.초보자가 보기 좋아요~
자동 설치 스크립트는 Docker가 설치되지 않은 서버에서만 사용할 수 있습니다. 그렇지 않으면 최신 버전의 Docker를 마운트 해제하고 Docker의 설정을 수정한 경우(예: IDE 원격 연결)이어) 설정은 덮어쓰고 컨테이너는 exit(exit)이지만 다시 작동시킬 수 있다

반응형