Computer >> 컴퓨터 >  >> 프로그램 작성 >> 데이터 베이스

Docker Machine 및 Compose를 사용한 로컬 개발에서 원격 배포까지

이 게시물의 목표는 가능한 한 원격 배포 환경에 가까운 환경에서 애플리케이션을 개발하는 것입니다. Docker Machine과 Compose를 사용하여 로컬 개발에서 원격 배포로 앱을 이동해 보겠습니다.

도커 도커 도커

Docker Machine 및 Compose를 사용한 로컬 개발에서 원격 배포까지 먼저 Docker를 설치해야 합니다. 이 게시물은 작성 당시의 모든 최신 Docker 구성 요소를 사용합니다.

  1. 도커 1.7.0
  2. 도커 머신 0.3.0
  3. Docker Compose 1.3.0

게시물의 나머지 부분에서는 VirtualBox에서 Docker를 실행한다고 가정하겠습니다.

방명록에 서명하세요

우리가 배포할 애플리케이션은 간단한 방명록입니다. 기본적인 3 Tier 앱을 시연하는 것으로 충분합니다. 다음 기술을 사용하여 웹 앱을 개발할 로컬 개발 환경으로 시작하겠습니다.

  • 웹 서버용 Nginx
  • 앱 서버의 경우:
    • 프로그래밍 언어용 Python
    • 웹 프레임워크용 플라스크
    • WSGI 서버용 Gunicorn
  • 데이터베이스용 MySQL

GitHub의 리포지토리에서 작업할 예정이므로 해당 리포지토리를 복제하여 시작하겠습니다.

git clone https://github.com/rackerlabs/guestbook.git -b dmc guestbook
cd guestbook

아래에서 사용 중인 Docker 호스트를 추적하는 것도 매우 쉽습니다. 대화 중인 호스트를 쉽게 찾을 수 있도록 이 별칭을 설정하는 것이 좋습니다.

alias de='env | grep DOCKER_'

이제 de를 입력하면 됩니다. 어떤 Docker 환경 변수가 설정되어 있는지 확인합니다.

애플리케이션을 로컬 개발에서 원격 배포로 이동한 최종 결과는 다음과 같습니다.

Docker Machine 및 Compose를 사용한 로컬 개발에서 원격 배포까지

지역 개발

우리의 로컬 개발 환경(dev env)은 자격 증명을 설정하거나 보안에 대해 걱정할 필요가 없기 때문에 매우 간단합니다. 원격 배포와 구별되도록 모든 개발 환경 항목에 "-dev"를 접미사로 지정합니다.

환경 초기화

docker-machine을 사용하여 컨테이너용 Docker 호스트를 생성합니다. 그런 다음 해당 호스트를 사용하도록 Docker를 구성합니다. 마지막으로 docker-compose는 전체 개발 환경을 불러옵니다.

docker-machine create --driver virtualbox guestbook-dev
docker-machine ip guestbook-dev # note the Guestbook Dev IP Address
eval "$(docker-machine env guestbook-dev)"
docker-compose up

실행되는 동안 docker-compose.yml을 읽고 이것이 우리에게 어떤 역할을 하는지 알아보세요. 설명이 잘 되어 있으므로 자명해야 합니다. 공통 구성 요소의 기반으로 docker-compose-common.yml을 확장하는 방법에 유의하십시오. docker-compose.yml 참조에서 Docker Compose 파일 형식에 대한 전체 설명을 찾을 수 있습니다.

모든 것이 다운로드되고 실행되면 데이터베이스를 초기화해야 합니다. 우리는 앱의 일회용 컨테이너 실행을 사용하여 데이터베이스에 테이블을 생성하는 파이썬 명령을 실행할 것입니다.

새 터미널을 열고 방명록 디렉토리로 변경하십시오.

eval "$(docker-machine env guestbook-dev)"
docker-compose run --rm --no-deps app python app.py create_db

이것을 위해 일회성 컨테이너를 실행하는 문제를 해결해야 하는 이유는 무엇입니까? docker-compose는 환경 변수를 자동으로 주입하므로 데이터베이스에 연결해야 합니다. 우리가 할 구성이 없습니다.

이제 브라우저를 열고 위에서 언급한 방명록 개발자 IP 주소로 이동합니다. 방명록에 서명하십시오.

변경하기

계속해서 애플리케이션 코드를 빠르게 개발할 수 있도록 합시다. docker-compose.yml에는 그렇게 할 수 있는 몇 가지 주요 구성 옵션이 있습니다. 앱 서비스에서 볼륨 및 명령에 대한 설명을 다시 읽으십시오.

즐겨 사용하는 텍스트 편집기에서 app/templates/index.html을 엽니다. 변경하고 저장하십시오. 브라우저로 돌아가서 새로고침하세요. 짜잔!

원격 배포

이 부분은 자격 증명을 설정하고 보안에 대해 걱정해야 하기 때문에 더 까다롭습니다. Rackspace 계정이 없는 경우 developer+에 가입하면 무료 크레딧을 받을 수 있습니다. 계정이 준비되면 API 키를 찾아야 합니다. 터미널에서 다음 환경 변수를 설정합니다.

export OS_USERNAME=your-rackspace-username
export OS_API_KEY=your-rackspace-api-key
export OS_REGION_NAME=IAD

환경 초기화

docker-machine을 사용하여 컨테이너용 Docker 호스트를 생성합니다.

docker-machine create --driver rackspace guestbook
docker-machine ip guestbook # note the Guestbook IP Address

환경 보호

면책 조항:이것은 가능한 가장 안전한 구성에 가깝지 않습니다. 이 스크립트는 기본 구성보다 더 안전한 용도로만 사용됩니다. 서버를 소유하거나 자전거를 도난당하는 것을 방지하는 이 스크립트에 대해 어떠한 약속도 하지 않습니다. 나쁜 놈들은 여전히 ​​당신을 잡으러 나가고 있습니다. 그리고 이 스크립트를 실행한다고 해서 보안 애플리케이션 코드를 작성하지 않아도 되는 것은 아닙니다!

fail2ban을 설치하여 서버에 대한 무차별 로그인 시도를 방지하고 필요한 포트만 허용하도록 ufw로 방화벽을 설정하십시오. 명령이 완전히 완료될 때까지 출력이 표시되지 않으므로 약간의 인내가 필요합니다.

docker-machine ssh guestbook "apt-get update"
docker-machine ssh guestbook "apt-get -y install fail2ban"
docker-machine ssh guestbook "ufw default deny"
docker-machine ssh guestbook "ufw allow ssh"
docker-machine ssh guestbook "ufw allow http"
docker-machine ssh guestbook "ufw allow 2376" # Docker
docker-machine ssh guestbook "ufw --force enable"

환경 초기화 계속

Docker Compose가 원격 배포를 구축하기 전에 데이터베이스에 대한 몇 가지 환경 변수를 설정해야 합니다. 이러한 환경 변수는 docker-compose-prod.yml 파일에서 사용됩니다. 우리는 민감한 데이터를 GitHub에 커밋하는 것을 방지하기 위해 이 작업을 수행합니다.

export MYSQL_USER=guestbook-admin
export MYSQL_PASSWORD=$(hexdump -v -e '1/1 "%.2x"' -n 32 /dev/random)
export MYSQL_ROOT_PASSWORD=$(hexdump -v -e '1/1 "%.2x"' -n 32 /dev/random)

echo "MYSQL_USER=$MYSQL_USER"
echo "MYSQL_PASSWORD=$MYSQL_PASSWORD"
echo "MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD"

이제 해당 호스트를 사용하도록 Docker를 구성합니다. 마지막으로 docker-compose는 백그라운드에서 컨테이너를 빌드하고 실행하므로 로컬 개발에서와 같이 다채로운 로그 메시지가 표시되지 않습니다.

eval "$(docker-machine env guestbook)"
docker-compose --file docker-compose-prod.yml build
docker-compose --file docker-compose-prod.yml up -d

실행하는 동안 docker-compose-prod.yml을 읽고 이것이 우리에게 무엇을 하는지 감을 잡으세요. docker-compose 명령에 파일 이름을 포함할 필요가 없도록 기본 docker-compose.yml 파일 이름이 어떻게 지정되었는지 확인하세요. 설명이 잘 되어 있으므로 자명해야 합니다. 또한 docker-compose-common.yml을 공통 구성 요소의 기반으로 확장합니다.

모든 것이 빌드되고 실행되면 데이터베이스를 초기화해야 합니다. 우리는 앱의 일회용 컨테이너 실행을 사용하여 데이터베이스에 테이블을 생성하는 파이썬 명령을 실행할 것입니다.

docker-compose --file docker-compose-prod.yml run --rm --no-deps app python app.py create_db

이제 브라우저를 열고 위에서 언급한 방명록 IP 주소로 이동합니다. 방명록에 서명하십시오.

변경하기

원격 환경에서 애플리케이션 코드를 개발하고 싶지는 않지만 변경 사항을 쉽게 배포하고 싶습니다.

즐겨 사용하는 텍스트 편집기에서 app/templates/index.html을 엽니다. 변경하고 저장하십시오. 브라우저로 돌아가 방명록 Dev로 이동합니다. IP 주소 및 다시 로드. 로컬 개발 환경에서 예상대로 변경되었는지 확인하세요.

이제 몇 가지 친숙한 명령을 실행하여 해당 변경 사항을 원격 환경에 배포합니다.

docker-compose --file docker-compose-prod.yml build
docker-compose --file docker-compose-prod.yml up -d

브라우저에서 방명록 IP 주소로 돌아가서 다시 로드하십시오. 짜잔! 변경 사항이 표시되고 데이터가 손상되지 않고 부팅됩니다.

다음은 무엇입니까?

한 단계 더 나아가기 위해 다음에 무엇을 하시겠습니까?

데이터는 애플리케이션에서 가장 중요한 부분입니다. 안전한지 확인해야 합니다. 백업 계획으로 시작하십시오. 솔루션을 롤링하고 Cloud Files에 cron 작업 저장소 데이터베이스 덤프를 가질 수 있습니다. 또는 쉬운 경로로 이동하여 Cloud Backup을 사용할 수 있습니다. 마지막으로 고가용성 클라우드 데이터베이스를 만들고 대신 사용하도록 docker-compose.yml을 변경할 수 있습니다.

결론

최대한 원격 배포 환경에 가까운 환경에서 애플리케이션을 개발하는 방법을 배웠기를 바랍니다. 문제가 발생하면 아래 의견에 알려주십시오.