웹사이트 검색

Ubuntu 14.04에서 Docker Compose를 사용하여 Wordpress 및 PhpMyAdmin을 설치하는 방법


소개

Docker Compose를 사용하면 Docker 컨테이너의 오케스트레이션 프로세스(예: 시작, 종료, 컨테이너 내 연결 및 볼륨 설정)를 정말 쉽게 처리할 수 있습니다.

이 문서에서는 Docker Compose를 사용하여 응용 프로그램(이 경우 PHPMyAdmin을 추가로 포함하는 WordPress)을 설치하는 실제 예제를 제공합니다. WordPress는 일반적으로 Linux, Apache, MySQL/MariaDB 및 PHP를 의미하는 LAMP 스택에서 실행됩니다. 공식 WordPress Docker 이미지에는 Apache와 PHP가 포함되어 있으므로 걱정해야 할 부분은 MariaDB뿐입니다.

전제 조건

이 문서를 따르려면 다음이 필요합니다.

  • 우분투 14.04 물방울
  • sudo 권한이 있는 루트가 아닌 사용자(Ubuntu 14.04의 초기 서버 설정에 설정 방법이 설명되어 있음)
  • Ubuntu 14.04에서 Docker Compose를 설치 및 사용하는 방법의 지침에 따라 설치된 Docker 및 Docker Compose

1단계 - 워드프레스 설치하기

우리는 공식 MariaDB Docker 이미지를 사용할 것입니다. 궁금한 점이 있다면 각각의 GitHub 및 Docker 허브 페이지에서 이러한 이미지와 해당 구성 옵션에 대한 더 많은 정보를 확인할 수 있습니다.

데이터가 저장될 폴더를 만들고 WordPress 컨테이너를 실행하기 위한 최소한의 docker-compose.yml 파일을 만들어 보겠습니다.

mkdir ~/wordpress && cd $_

그런 다음 즐겨 사용하는 텍스트 편집기로 ~/wordpress/docker-compose.yml을 생성합니다(기본 설정이 없으면 nano가 쉽습니다).

  1. nano ~/wordpress/docker-compose.yml

다음을 붙여넣습니다.

wordpress:
  image: wordpress

이는 Docker Compose에게 wordpress라는 새 컨테이너를 시작하고 Docker 허브에서 wordpress 이미지를 다운로드하도록 지시합니다.

다음과 같이 이미지를 가져올 수 있습니다.

  1. docker-compose up

Docker가 Docker Hub에서 WordPress 이미지를 다운로드하고 추출하는 것을 볼 수 있으며 잠시 후 아래와 유사한 오류 메시지가 표시됩니다.

Output
wordpress_1 | error: missing WORDPRESS_DB_HOST and MYSQL_PORT_3306_TCP environment variables wordpress_1 | Did you forget to --link some_mysql_container:mysql or set an external db wordpress_1 | with -e WORDPRESS_DB_HOST=hostname:port? dockercompose_wordpress_1 exited with code 1

이것은 데이터베이스를 찾을 수 없다고 불평하는 WordPress입니다. 믹스에 MariaDB 이미지를 추가하고 연결하여 수정해 보겠습니다.

2단계 - MariaDB 설치

MariaDB 이미지를 그룹에 추가하려면 텍스트 편집기로 docker-compose.yml을 다시 엽니다.

nano ~/wordpress/docker-compose.yml

docker-compose.yml을 아래와 일치하도록 변경합니다(들여쓰기에 주의하세요. YAML 파일은 공백을 구분합니다).

wordpress:
  image: wordpress
  links:
    - wordpress_db:mysql
wordpress_db:
  image: mariadb

여기서 수행한 작업은 wordpress_db라는 새 컨테이너를 정의하고 Docker Hub의 mariadb 이미지를 사용하도록 지시하는 것입니다. 또한 wordpress 컨테이너에 wordpress_db 컨테이너를 wordpress 컨테이너에 연결하고 이를 mysql(내부 wordpress 컨테이너 호스트 이름 mysqlwordpress_db 컨테이너로 전달됩니다.

docker-compose up을 다시 실행하면 MariaDB 이미지를 다운로드하는 것을 볼 수 있으며 아직 완료되지 않았다는 것도 알 수 있습니다.

Output
wordpress_db_1 | error: database is uninitialized and MYSQL_ROOT_PASSWORD not set wordpress_db_1 | Did you forget to add -e MYSQL_ROOT_PASSWORD=... ? wordpress_1 | error: missing required WORDPRESS_DB_PASSWORD environment variable wordpress_1 | Did you forget to -e WORDPRESS_DB_PASSWORD=... ? wordpress_1 | wordpress_1 | (Also of interest might be WORDPRESS_DB_USER and WORDPRESS_DB_NAME.) wordpress_wordpress_db_1 exited with code 1 wordpress_wordpress_1 exited with code 1 Gracefully stopping... (press Ctrl+C again to force)

WordPress는 여전히 데이터베이스를 찾을 수 없다고 불평하고 있으며 이제 MariaDB로부터 루트 암호가 설정되지 않았다는 새로운 불만이 접수되었습니다.

두 컨테이너를 연결하는 것만으로는 충분하지 않은 것 같습니다. 계속해서 MYSQL_ROOT_PASSWORD 변수를 설정하여 실제로 실행할 수 있도록 합시다.

Docker Compose 파일을 다시 편집합니다.

  1. nano ~/wordpress/docker-compose.yml

이 두 줄을 wordpress_db 섹션의 end에 추가하되 examplepass를 더 안전한 것으로 변경해야 합니다. 비밀번호!

wordpress_db:
...
  environment:
    MYSQL_ROOT_PASSWORD: examplepass
...

이렇게 하면 원하는 암호로 MYSQL_ROOT_PASSWORD라는 wordpress_db 컨테이너 내부에 환경 변수가 설정됩니다. MariaDB Docker 이미지는 시작할 때 이 환경 변수를 확인하도록 구성되어 있으며 비밀번호가 MYSQL_ROOT_PASSWORD로 정의된 루트 계정으로 DB 설정을 처리합니다.

그 동안 WordPress 설치가 실제로 로드되면 연결할 수 있도록 포트 포워드도 설정해 보겠습니다. wordpress 섹션 아래에 다음 두 줄을 추가합니다.

wordpress:
...
  ports:
    - 8080:80
...

첫 번째 포트 번호는 호스트의 포트 번호이고 두 번째 포트 번호는 컨테이너 내부의 포트입니다. 따라서 이 구성은 호스트의 포트 8080에 대한 요청을 컨테이너 내부의 기본 웹 서버 포트 80으로 전달합니다.

참고: Wordpress를 호스트의 기본 웹 서버 포트 80에서 실행하려면 호스트의 포트 80에 대한 요청이 내부의 포트 80으로 전달되도록 이전 행을 80:80으로 변경하십시오. 워드프레스 컨테이너.

이제 완전한 docker-compose.yml 파일이 다음과 같이 표시됩니다.

wordpress:
  image: wordpress
  links:
    - wordpress_db:mysql
  ports:
    - 8080:80
wordpress_db:
  image: mariadb
  environment:
    MYSQL_ROOT_PASSWORD: examplepass

이 구성을 사용하면 실제로 WordPress를 실행할 수 있습니다. 이번에는 터미널을 계속 사용할 수 있도록 백그라운드에서 컨테이너를 실행하도록 docker-compose에 지시하는 -d 옵션을 사용하여 실행해 보겠습니다.

  1. docker-compose up -d

화면에서 수많은 텍스트가 날아가는 것을 볼 수 있습니다. 진정되면 웹 브라우저를 열고 IP로 이동합니다.

새로운 WordPress 설치 페이지가 표시되고 평소와 같이 설치 및 블로그를 완료할 수 있습니다.

둘 다 공식 Docker 이미지이고 Docker의 모든 모범 사례를 따르고 있기 때문에 이러한 각 이미지에는 사전 정의된 영구 볼륨이 있습니다. 즉, 컨테이너를 다시 시작하면 블로그 게시물이 계속 유지됩니다. Docker 데이터 볼륨 자습서에서 Docker 볼륨 작업에 대해 자세히 알아볼 수 있습니다.

3단계 - PhpMyAdmin 컨테이너 추가

좋습니다. 상대적으로 통증이 없었습니다. 조금 멋지게 해봅시다.

지금까지 우리는 Docker 팀이 정확한지 확인하기 위해 많은 노력을 기울이는 공식 이미지만 사용했습니다. WordPress 컨테이너를 구성하기 위해 환경 변수를 제공할 필요가 없다는 것을 눈치채셨을 것입니다. 제대로 구성된 MariaDB 컨테이너에 연결하자마자 모든 것이 제대로 작동했습니다.

wordpress_db 컨테이너에서 실제로 MYSQL_ROOT_PASSWORD 변수를 가져오고 이를 사용하여 WordPress에 연결하는 스크립트가 WordPress Docker 컨테이너 내부에 있기 때문입니다.

공식 이미지 영역을 조금 벗어나 커뮤니티에서 기여한 PhpMyAdmin 이미지를 사용해 봅시다. 계속해서 docker-compose.yml을 한 번 더 편집합니다.

  1. nano docker-compose.yml

파일 끝에 다음을 붙여넣습니다.

phpmyadmin:
  image: corbinu/docker-phpmyadmin
  links:
    - wordpress_db:mysql
  ports:
    - 8181:80
  environment:
    MYSQL_USERNAME: root
    MYSQL_ROOT_PASSWORD: examplepass

examplepass를 이전에 설정한 wordpress_db 컨테이너와 정확히 동일한 루트 암호로 바꾸십시오.

이것은 커뮤니티 구성원 corbinu에 의해 docker-phpmyadmin을 가져와 이름이 mysqlwordpress_db 컨테이너에 연결합니다(의미 phpmyadmin 컨테이너 내부에서 호스트 이름 mysql에 대한 참조가 wordpress_db 컨테이너로 전달됨) 호스트의 포트 8181에서 포트 80을 노출합니다. 마지막으로 MariaDB 사용자 이름과 비밀번호로 몇 가지 환경 변수를 설정합니다. 이 이미지는 wordpress 이미지처럼 wordpress_db 컨테이너 환경에서 MYSQL_ROOT_PASSWORD 환경 변수를 자동으로 가져오지 않습니다. 실제로 wordpress_db 컨테이너에서 MYSQL_ROOT_PASSWORD: examplepass 줄을 복사하고 사용자 이름을 root로 설정해야 합니다.

이제 전체 docker-compose.yml 파일이 다음과 같이 표시됩니다.

wordpress:
  image: wordpress
  links:
    - wordpress_db:mysql
  ports:
    - 8080:80
wordpress_db:
  image: mariadb
  environment:
    MYSQL_ROOT_PASSWORD: examplepass
phpmyadmin:
  image: corbinu/docker-phpmyadmin
  links:
    - wordpress_db:mysql
  ports:
    - 8181:80
  environment:
    MYSQL_USERNAME: root
    MYSQL_ROOT_PASSWORD: examplepass

이제 애플리케이션 그룹을 다시 시작하십시오.

  1. docker-compose up -d

PhpMyAdmin이 설치되는 것을 볼 수 있습니다. 완료되면 서버의 IP 주소를 다시 방문하십시오(이번에는 포트 8181 사용, 예: http://123.456.789.123:8181). PhpMyAdmin 로그인 화면이 나타납니다.

계속해서 사용자 이름 root와 YAML 파일에 설정한 비밀번호를 사용하여 로그인하면 데이터베이스를 탐색할 수 있습니다. 서버에는 WordPress 설치의 모든 데이터가 포함된 wordpress 데이터베이스가 포함되어 있음을 알 수 있습니다.

이 방법으로 원하는 만큼 컨테이너를 추가하고 원하는 방식으로 모두 연결할 수 있습니다. 보시다시피 접근 방식은 매우 강력합니다. 각 개별 구성 요소의 구성 및 전제 조건을 처리하고 모두 동일한 서버에 설정하는 대신 레고 블록처럼 조각을 연결하고 구성 요소를 조금씩 추가할 수 있습니다. 관심이 있는 경우 문서와 같은 도구를 사용합니다.

4단계 — WordPress 사이트 만들기

WordPress 사이트의 모든 파일이 Docker 컨테이너에 저장되어 있으므로 컨테이너를 중지하고 다시 시작하면 파일은 어떻게 됩니까?

기본적으로 WordPress 컨테이너의 문서 루트는 영구적입니다. 이는 Docker Hub의 WordPress 이미지가 이러한 방식으로 구성되기 때문입니다. WordPress 사이트를 변경하고 응용 프로그램 그룹을 중지했다가 다시 시작하면 웹 사이트에 변경 사항이 계속 유지됩니다.

해 보자.

웹 브라우저에서 WordPress로 이동합니다(예: http://123.456.789.123:8080). Hello World! 편집 이미 존재하는 게시물입니다. 그런 다음 다음 명령을 사용하여 모든 Docker 컨테이너를 중지합니다.

  1. docker-compose stop

WordPress 사이트를 다시 로드해 보십시오. 웹사이트가 다운된 것을 볼 수 있습니다. Docker 컨테이너를 다시 시작합니다.

  1. docker-compose up -d

다시 WordPress 사이트를 로드합니다. 블로그 사이트와 이전에 변경한 내용이 표시되어야 합니다. 이는 컨테이너가 중지된 경우에도 변경 사항이 저장됨을 보여줍니다.

5단계 - 호스트 파일 시스템에 문서 루트 저장(선택 사항)

호스트와 컨테이너 간에 파일을 공유하기 위해 Docker 데이터 볼륨을 사용하여 호스트 파일 시스템에 WordPress의 문서 루트를 저장할 수 있습니다.

참고: Docker 데이터 볼륨 작업에 대한 자세한 내용은 Docker 데이터 볼륨 자습서를 살펴보십시오.

한번 해봅시다. docker-compose.yml 파일을 한 번 더 엽니다.

nano ~/wordpress/docker-compose.yml

wordpress: 섹션에 다음 줄을 추가합니다.

wordpress:
...
  volumes:
    - ~/wordpress/wp_html:/var/www/html
    ...

현재 실행 중인 docker-compose 세션을 중지합니다.

  1. docker-compose stop

볼륨을 호스트 파일 시스템에 매핑할 수 있도록 기존 컨테이너를 제거합니다.

  1. docker-compose rm wordpress

WordPress를 다시 시작합니다.

  1. docker-compose -d

프롬프트가 반환되면 WordPress가 다시 시작되어 실행되어야 합니다. 이번에는 호스트 파일 시스템을 사용하여 문서 루트를 저장합니다.

~/wordpress 디렉토리를 보면 wp_html 디렉토리가 있음을 알 수 있습니다.

  1. ls ~/wordpress

모든 WordPress 소스 파일이 그 안에 있습니다. 변경 사항은 WordPress 컨테이너에서 실시간으로 선택됩니다.

이 경험은 평소보다 약간 더 원활했습니다. WordPress Docker 컨테이너는 시작될 때 /var/www/html가 비어 있는지 확인하고 거기에 파일을 적절하게 복사하도록 구성되었습니다. 일반적으로 이 단계는 직접 수행해야 합니다.

결론

완전한 WordPress 배포가 실행 중이어야 합니다. 동일한 방법을 사용하여 Docker 허브에서 사용할 수 있는 이미지를 사용하여 매우 다양한 시스템을 배포할 수 있어야 합니다. 어떤 볼륨이 영구적이고 각 컨테이너에 해당하지 않는지 파악해야 합니다.

행복한 도커링!