Docker 및 Docker compose가 있는 Elixir+Phoenix 개발 환경

이제 동영상을 통해 이 내용을 보실 수 있습니다.
Video link 노후
편집: 2021년 11월 27일: Phoenix 1.6.0 버전에서 Webpack, Npm 등의 내용을 삭제하고 Esbuild로 옮겼기 때문에 본문도 현재 업데이트되었습니다.
편집 25.12.2021: Docker 환경에서 작업하는 끝점 ip를 변경합니다.
나는 이미 Elixir, Phoenix, Docker를 2년 동안 따랐다.나는 소형 시범과 실험을 시작했다.Elixir와 Phoenix를 Docker 환경에 배치하는 것은 매우 고통스러웠고, 특히 실행할 때의 설정은 고통스러웠다.Elixir와 Phoenix를 Docker와 Docker compose에 어떻게 설정하는지에 관해서는 적어도 20가지의 다른 방법과 강좌가 있다.이 강좌들 중 하나는 모두 효과가 있지만, 어떤 것은 이미 유행이 지났거나 너무 복잡하다.
오늘 나는 이 문제를 다시 깊이 연구하고, Docker와 Docker compose를 사용하여 Elixir +Phoenix에 적당한 열을 설정하여 로컬 개발 환경을 다시 불러올 시간이 있다.

선결 조건
본문에서, 나는 이 공구들을 어떻게 설치하는지 상세하게 소개하지 않지만, 아래에 필요한 공구를 열거하였다.
부두 노동자
  • Docker compose
  • 장생불로약(최신 1.10.4 사용했습니다)
  • Phoenix 프레임워크(최신 1.5.4 사용)

  • Phoenix 응용 프로그램 만들기
    모든 장치를 설치한 후 다음 명령을 실행하여 새 Phoenix 프로젝트를 생성할 수 있습니다.
    $ mix phx.new app_name
    
    몇 개의 표지가 이 명령에 전달될 수 있지만, 이 명령은 우리가 필요로 하는 모든 것을 포함한다. (Ecto, 웹 패키지 등)phx.new documentation에 대한 더 많은 정보.

    부사장
    프로젝트 안내 기간에 mix은 명령deps.get & deps.compile을 실행하여 필요한 의존항을 가져오고 컴파일합니다
    이것은 문제가 있습니다. 왜냐하면 우리는 용기에서 프로그램/웹 서버를 실행하기를 원하기 때문에, 호스트 시스템에서 실행하기를 원하지 않기 때문입니다.Elixir 응용 프로그램을 실행하려면 릴리스 바이너리 파일을 실행하는 동일한 시스템 구조에서 컴파일해야 합니다.현재 프로젝트 구조에서 deps 폴더를 삭제하는 것은 안전합니다.
    이제 새로 만든 프로그램에 대한 Docker 설정을 시작합니다!

    Docker와 Docker 조합
    이 섹션에서는 다음 파일을 생성합니다.
  • Dockerfile
  • docker compose.야마하
  • .환경
  • Dockerfile은 Docker 이미지를 구축하는 데 사용되며, 응용 프로그램, 의존 항목, 필요한 도구를 포함합니다.docker-compose.yml-yaml 태그 파일로 저희 서비스, 볼륨 등을 정의하는 데 사용됩니다..env - 애플리케이션의 환경 변수를 저장합니다.

    Dockerfile
    다음은 저희 Dockerfile의 내용을 보실 수 있습니다.
    FROM bitwalker/alpine-elixir-phoenix:latest
    
    WORKDIR /app
    
    COPY mix.exs .
    COPY mix.lock .
    
    CMD mix deps.get && mix phx.server
    
    첫 번째 줄에서 우리는 우리의 기본적인 이미지를 정의하여 우리의 이미지를 기초 위에 세우는 데 사용한다.보시다시피 Elixir, Phoenix 및 애플리케이션에 필요한 기타 툴이 포함된 bitwalker/alpine-elixir-phoenix을 사용하고 있습니다.
    다음 몇 줄에서 작업 디렉터리를 정의하고 파일을 복사하며 새 디렉터리를 만들 것입니다.CMD은 우리가 컨테이너에 불을 붙일 때 실행하는 노선이다.DEP를 가져오고 서버를 시작하는 데 사용되는 명령은 두 개입니다.

    docker 작성.yml
    version: '3.6'
    services:
      db:
        environment:
          PGDATA: /var/lib/postgresql/data/pgdata
          POSTGRES_PASSWORD: postgres
          POSTGRES_USER: postgres
          POSTGRES_HOST_AUTH_METHOD: trust
        image: 'postgres:11-alpine'
        restart: always
        volumes:
          - 'pgdata:/var/lib/postgresql/data'
      web:
        build: .
        depends_on:
          - db
        environment:
          MIX_ENV: dev
        env_file:
          - .env
        ports:
          - '4000:4000'
        volumes:
          - .:/app
    volumes:
      pgdata:
    
    여기에서 docker compose 스크립트 버전, 만들어야 할 서비스와 볼륨을 정의했습니다.
    보시다시피 두 개의 서비스(용기)가 dbweb을 만들고 있습니다.dbweb-container가 사용하는 데이터베이스 용기입니다.이미지 속성에서 우리는 이미지, 즉 postgres:11-alpine을 정의했다.PostgreSQL 12와 같은 업데이트된 버전을 사용할 수 있습니다.이것은 실제적으로 생산 환경에서 사용할 버전에 달려 있습니다.인프라와 관련된 문제를 최소화하기 위해 서로 다른 환경에서 같은 버전을 사용하는 것을 권장합니다.
    이러한 속성에 대한 자세한 내용은 docker-compose documentation 을 참조하십시오.

    에반 선생
    DATABASE_URL=postgres://postgres:postgres@db:5432/myapp_dev
    
    현재 데이터베이스 URL의 환경 변수만 있습니다.잠시 후, 응용 프로그램이 증가할 때, 이 파일에 응용 프로그램 환경 변수를 저장합니다.

    그것을 점화하다
    우선, 우리는 우리의 부두 노동자의 이미지를 만들어야 한다.
    $ docker-compose build
    
    만약 네가 하는 모든 일이 정확하다면, 이미지의 구축은 상대적으로 빨라야 한다.현재 이미지가 준비되어 있지만 먼저 데이터베이스 URL의 환경 변수를 사용하기 위해 프로그램을 설정해야 하기 때문에 이렇게 하겠습니다.config/dev.exs으로 이동하여 엽니다.다음과 같은 방법으로 데이터베이스의 내용을 변경합니다.
    # Configure your database
    config :myapp, Myapp.Repo,
      username: "postgres",
      password: "postgres",
      database: "myapp_dev",
      hostname: "localhost",
      show_sensitive_data_on_connection_error: true,
      pool_size: 10
    
    이 경우:
    # Configure your database
    config :myapp, Myapp.Repo,
      url: System.get_env("DATABASE_URL"),
      show_sensitive_data_on_connection_error: true,
      pool_size: 10
    
    참고 끝점 IP를 0.0.0.0으로 변경합니다.
    보시다시피 컨테이너 환경에서 데이터베이스에 연결된 데이터베이스 URL을 가져오고 있습니다.
    이제 애플리케이션을 시작할 준비가 되었습니다.
    $ docker-compose up
    
    이것은 deps를 검사하고, deps와 원본 파일을 컴파일하지만, 잠시만 기다려 주십시오.
    [error] Postgrex.Protocol (#PID<0.3932.0>) failed to connect: ** (Postgrex.Error) FATAL 3D000 (invalid_catalog_name) database "myapp_dev" does not exist
    
    우리는 연결할 수 있는 데이터베이스가 없다.우리는 이 문제를 해결한다.
    $ docker-compose run web mix ecto.create
    
    이 프로그램을 실행하면 프로그램의 데이터베이스가 닫혔다는 유쾌한 메시지를 받을 수 있습니다.재구매 협의가 이미 창설되었습니다!훌륭했어
    용기에서 믹스 명령을 실행할 수 있습니다. 믹스 도구를 사용할 수 있기 때문입니다.마이그레이션, 피드, 데이터베이스 삭제를 실행하고 데이터베이스를 다시 설정하여 다시 시작할 수 있습니다.
    지금 실행:
    $ docker-compose up
    
    응용 프로그램은 데이터베이스 연결을 통해 시작하고 개발을 준비해야 합니다!localhost:4000으로 이동합니다. 현재 원본 파일을 변경하면 서버에 업데이트되기 때문에 용기를 수동으로 다시 시작할 필요가 없습니다!

    결론
    이것은 지원하는 파일 수가 가장 적은 아주 간단한 설정입니다.
    AWS에 Elixir 어플리케이션을 배포하는 후속 기사를 작성합니다.그것은 생산 환경, Terraform 인프라, 그리고 약간의 CI 마법 설정 프로그램을 포함할 것이다.
    읽어주셔서 감사합니다. 마음에 드셨으면 좋겠습니다.🙂

    좋은 웹페이지 즐겨찾기