Docker, Puppet 및 Vagrant를 사용하여 LAMP 웹 애플리케이션을 개발하는 방법은 무엇입니까?
암흑 시대에 LAMP 웹 애플리케이션 개발을위한 평소 설정은 내 컴퓨터에서 로컬로 테스트하는 것이 었습니다. PHP (제 경우), 데이터베이스 및 웹 서버가 모두 기본적으로 설치되었습니다.
서버는 Apache 및 MySQL의 표준 설치로 설정되었으며 웹 앱의 다른 부분에 대해 여러 가상 호스트가 있습니다. 로컬 컴퓨터에서 얻은 결과에 만족하면 서버와 git pull스테이징 환경에 로그인했습니다 . 모든 것이 내 컴퓨터에서와 마찬가지로 서버에서도 잘 작동한다고 가정하면 프로덕션을 위해 동일한 작업을 수행 할 것입니다.
새로운 시작…
이제 저는 완전히 새로운 웹 애플리케이션을 처음부터 시작하고 있으며 "올바른 방식"으로 수행하고 싶습니다. 나는 Docker, Vagrant 및 Puppet에 대해 읽었습니다 (그리고 Chef, Chef의 반복 프로세스보다는 Puppet의 종속성 시스템을 개인적으로 선호하지만). 내가 한 모든 연구에도 불구하고 답을 찾을 수없는 몇 가지 질문이 여전히있는 것 같습니다.
웹 서버 (예 : Apache), 데이터베이스 서버 (예 : MySQL) 및 웹 애플리케이션의 각 부분에 대해 별도의 Docker 컨테이너가 있어야합니까 ?
웹 애플리케이션의 일부 에 대해 이야기 할 때 mysite.com , controlpanel.mysite.com 등을 의미합니다 . 이러한 "부분"은 동일한 데이터베이스를 공유합니다.
Docker는 웹 및 데이터베이스 서버와 같은 것을위한 기성 컨테이너를 제공하는 것처럼 보이므로 최소한 별도의 컨테이너에 있어야하는 것 같습니다. 내 웹 앱의 다른 부분도 별도의 컨테이너에 있어야합니까?
Docker 컨테이너는 내부의 소프트웨어를 업데이트하지 않고 교체 할 수 있도록 설계되었습니다. 내가 잃고 싶지 않은 그들이 쓰는 데이터는 어떻습니까?
데이터베이스 서버는 내 데이터베이스의 콘텐츠 (백업하려는)와 관련된 파일을 관리합니다. 웹 서버는 로그를 생성하고 내 웹 애플리케이션은 다양한 파일과 캐시 등을 관리 할 것입니다. 이러한 모든 파일은 애플리케이션의 컨테이너 외부에 작성해야합니다 (업데이트 할 때 대체 할 수 있기 때문입니까?). 따라서 어디로 가야합니까? ? 호스트 머신의 파일 시스템으로 바로 들어가나요? 아니면 별도의 "Docker 볼륨"으로? Docker 볼륨으로 이동하는 경우 데이터베이스, 웹 서버, 애플리케이션 등에 대해 별도의 볼륨을 사용해야합니까? 지금처럼 내 로컬 컴퓨터에서 SFTP를 사용하여 콘텐츠에 쉽게 액세스 할 수 있습니까? 여기서 편의를 잃고 싶지 않습니다!
Puppet을 사용하여 개발 서버와 프로덕션 서버 모두에 대해 Docker 컨테이너를 만들고 관리하는 것이 좋은 생각입니까?
Puppet이 Docker 컨테이너를 직접 관리하는 것을 지원하는 것으로 보이므로 처음부터 서버 또는 프로덕션 환경 (Vagrant 사용)을 쉽게 설정하는 합리적으로 좋은 방법 인 것 같습니다.
다행히도 몇 가지 관련 질문을했습니다. LAMP와 유사한 웹 앱의 개발 및 생산을위한 적절한 "모범 사례"를 얻는 것이 좋을 것입니다. 내가 찾은 것들이 많지 않은 것 같습니다!
웹 서버 (예 : Apache), 데이터베이스 서버 (예 : MySQL) 및 웹 애플리케이션의 각 부분에 대해 별도의 Docker 컨테이너가 있어야합니까?
그 질문에 대한 정답이 없습니다. 프로덕션에서 docker를 사용하는 경우 프로덕션 환경에서 Docker 컨테이너를 개발 환경에서 실행하십시오. 그렇지 않으면 가장 쉬운 방법으로 도커 컨테이너를 사용하십시오.
고정 표시기 허브는 PHP, 데이터베이스 등을 위해 용기를 갈 준비 제공하며 그들을 사용하기 쉽습니다. 다른 한편 으로 상호 작용할 수 있도록 함께 연결 해야합니다. 개발 환경의 경우 여러 컨테이너를 사용하는 경우 docker-compose 를 사용 하는 것이 좋습니다.
또 다른 경로는 데이터베이스, 웹 서버 및 php를 실행하는 프로덕션 머신에 가장 가까운 도커 이미지를 빌드하는 것입니다 (머신이 하나 뿐이라고 가정). 이러한 이미지의 컨테이너는 여러 프로세스를 실행해야합니다. 이것은 다른 방법으로 달성 될 수 있습니다. 감독자 또는 phusion / baseimage를 살펴보십시오 .
웹 애플리케이션의 일부에 대해 이야기 할 때 mysite.com, controlpanel.mysite.com 등을 의미합니다.
분리시킬 수 있습니다. 이러한 앱이 세션을 공유해야하는 경우 세션이 데이터베이스 또는 모두가 액세스 할 수있는 Docker 볼륨에 저장되어 있는지 확인하십시오.
Docker 컨테이너는 내부의 소프트웨어를 업데이트하지 않고 교체 할 수 있도록 설계되었습니다. 내가 잃고 싶지 않은 그들이 쓰는 데이터는 어떻습니까?
Docker에는 데이터가 컨테이너 외부의 파일 시스템에 기록 될 수 있도록 볼륨이라는 것이 있습니다. 볼륨 작업에는 여러 가지 방법이 있습니다 . Docker 호스트 에서 컨테이너 볼륨 으로 디렉토리를 마운트 하거나 데이터 볼륨 컨테이너 또는 명명 된 볼륨을 가질 수 있습니다 .
Docker 볼륨은 중요한 개념이며 시간을내어 마스터하는 것이 좋습니다.
Docker 호스트에서 컨테이너가 사용하는 데이터에 쉽게 액세스하려면 Docker 호스트에 디렉터리를 마운트하는 것이 좋습니다. 파일의 권한 및 소유권과 관련하여 까다로울 수 있지만
백업과 관련하여 볼륨과 관련하여 알아야 할 모든 것이 자세히 설명되어있는 docker 사용 설명서를 살펴보십시오 .
Puppet을 사용하여 개발 서버와 프로덕션 서버 모두에 대해 Docker 컨테이너를 만들고 관리하는 것이 좋은 생각입니까?
모범 사례는 프로덕션 환경에서 작업하는 것과 동일한 방식으로 개발 환경에서 작업하는 것입니다. 모든 작업이 프로덕션 환경에 사용되지 않으면 개발 환경에 맞게 꼭두각시를 올바르게 설정하는 과정을 거치지 않아도됩니다. docker로 VM을 프로비저닝 하는 Vagrantfile을 갖는 것은 쉘 프로비저닝 만으로 정말 쉽습니다 . IMHO 꼭두각시 / 셰프 / ...은 과잉입니다.
올바른 질문을하고 있지만 모든 상황에 맞는 답은 없습니다. 제 생각에는 두 가지 방법이 있습니다.
- 개발 환경이 프로덕션 환경을 정확하게 복제하도록합니다.
- 개발자가 새로운 도구를 사용하여 발생하는 마찰을 느끼지 않도록 최대한 간단하고 직관적으로 유지하면서 개발 환경을 프로덕션과 다르게 만듭니다.
@Thomasleveil의 대답은 이미 매우 훌륭하고 모든 중요한 부분을 다루지 만 몇 가지 추가 사항을 추가하고 싶습니다.
Vagrant, Puppet / Chef 및 docker-compose
Vagrant 로 가상 머신 을 프로비저닝 할 때 일반적으로 Puppet 또는 Chef를 사용하여 몇 가지 셸 스크립트와 함께 서버에 필요한 패키지를 설치합니다. PuPHPet 은 가상 머신 기반 LAMP 스택 을 구성하고 Puppet과 Vagrant가 좀 더 복잡한 설정에서 함께 작동하는 방법을 학습 할 수있는 훌륭한 소스입니다 . 그런데 대안은 Protobox 입니다.
VM에서와 같은 방식으로 Vagrant와 함께 Docker 컨테이너 를 사용할 때 . 그런 다음 vagrant up기본적으로 Docker 공급자를 사용하여 Docker 컨테이너를 실행 합니다. Vagrant는 Dockerfile에서 컨테이너를 빌드하거나 docker-compose( fig)와 비슷하게 기존 이미지를 사용하여 실행합니다.
Docker 설정을 위해 Vagrant를 선택하는 주된 이유는 사용자 또는 팀이 부분적으로 Windows 환경에서 작업하는 경우, Vagrant를 사용하면 호스트 시스템에 관계없이 설정을 일관되게 유지할 수 있기 때문입니다 ( 호스트 VM 참조 ).
OS X를 사용 docker-compose하는 경우 Virtual Box VM과 함께 사용할 수 있고 Linux를 사용하는 경우 기본적으로 Docker를 사용할 수 있습니다. sshWindows 또는 OS X에 관계없이 항상을 통해 boot2docker (또는 다른 Docker 호스트 VM)에 로그인 할 수 있습니다.
참고 : SSH를 컨테이너에 연결해서는 안되지만 이는 또 다른 주제입니다.
2015 년 2 월 현재
docker-compose 나에게 조금 더 빠르게 느껴지고 컨테이너의 시작, 중지 및 재 구축을보다 효율적으로 처리합니다.
Vagrant는 다른 호스트 VM을 지정하는 이점이 있습니다. 그러한 설정을 선호하는 경우 프로젝트별로.
참고 : Puppet 빌드 프로세스와 더 관련이있는 Docker 프로비저닝 도구도 있습니다.
웹 서버 (예 : Apache), 데이터베이스 서버 (예 : MySQL) 및 웹 애플리케이션의 각 부분에 대해 별도의 Docker 컨테이너가 있어야합니까?
When using Docker containers you're basically running single, isolated processes. The usage of a supervisior should be avoided and is also not needed for a LAMP stack.
So my answer is definitely: Yes, there should be separate containers!
When I talk about parts of the web application, I mean things like mysite.com, controlpanel.mysite.com, etc.
This depends on your needs, I suggest you to have a read of the 12factor application documentation, which describes the important things to take care of in a very detailed way.
Docker containers seem to be designed to be replaceable rather than me having to update the software inside them. What about the data they write that I don't want to loose?
In addition to @Thomasleveil's answer I'd recommend you also a separate storage backend for user uploads like Amazon S3, SFTP or WebDAV.
In my opinon your web application container should be treated like a client application accessing your database and storage backends (services) and not rely on data from volumes when running in a production environment.
Is it a good idea to use Puppet to create and manage the Docker containers, both for the development server and production server?
I don't know about the orchestration capabilities of Puppet, but for building containers, if you're using Vagrant I see no need for Puppet, because of the native Docker provisioner of Vagrant.
Bonus
For all those things described above, you can have a look at my 12factor PHP application template based on Yii 2.0 Framework with a dockerized LAMP stack. With Docker you can also easily plug-in reverse proxies or selenium testing containers into your project, because they exist as pre-build images and can be downloaded and configured in a few minutes and started in seconds.
'IT TIP' 카테고리의 다른 글
| Angular 2의 동적 템플릿 URL (0) | 2020.11.05 |
|---|---|
| Linux 커널 모듈을 사용하는 것이 무엇인지 알아내는 방법이 있습니까? (0) | 2020.11.05 |
| 접미사 트리 및 시도. (0) | 2020.11.05 |
| 이 Rails JSON 인증 API (Devise 사용)는 안전합니까? (0) | 2020.11.05 |
| 데이터베이스 / SQL : 경도 / 위도 데이터를 저장하는 방법은 무엇입니까? (0) | 2020.11.05 |