Docker Toolbox로 제작된 Windows용 개발 환경 구축

13531 단어 Docker

개시하다


IDE와 디자이너의 PC를 이용해 개발할 때도 Docker로 쉽게 개발 환경을 만들고자 한다.
Docker+Virtualbox를 사용하여 컨테이너와 호스트 OS 간에 간단하게 공유 폴더를 만들 수 있습니다.
좋아하는 편집기로 개발할 수 있습니다.

컨디션

  • DockerToolbox 1.9.1
    https://www.docker.com/products/docker-toolbox
  • 설치 프로그램을 다운로드해 설치를 추진하면 기트, Docker 등 개발에 필요한 도구를 통합한다.

    파일 구성


    적당한 곳에서 개발 환경용 목록을 준비하다.
    + source
     - Dockerfile
     + app
       - Gemfile
       - index.rb
    
    Dockerfile
    FROM ruby
    
    RUN mkdir -p /srv/www/app
    COPY app/Gemfile /srv/www/app
    WORKDIR /srv/www/app
    RUN bundle install
    CMD ruby index.rb
    
    app/Gemfile
    source "http://rubygems.org"
    
    gem 'sinatra'
    gem 'sinatra-contrib'
    
    app/index.rb
    require 'sinatra'
    require 'sinatra/reloader'
    
    set :bind, '0.0.0.0'
    set :port, 3000
    
    get '/' do
      'hello'
    end
    

    Docker 이미지 만들기


    Docker Toolbox 설치를 시작할 때 들어오는 Docker Qickstart Terminal 입니다.
    처음 시작할 때 가상 머신 제작이 있어서 시간이 좀 걸릴 거예요.
    터미널 시작이 완료되면 방금 만든 폴더로 이동하여 Docker 이미지를 만듭니다.
    (C 드라이브로 이동하는 것은 소문자 c입니다.)
    $ cd /c/source
    $ docker build -t web .
    $ docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
    web                 latest              a8b38a36ca7d        About a minute ago   725.5 MB
    
    

    Docker 이미지 시작


    생성된 이미지를 시작합니다.
    Windows의 GiitBash라면/슬래시를 앞에 두지 않으면 순조롭게 작동할 수 없습니다.
    $ cd /c/source/app
    $ docker run -d -v /$(pwd):/srv/www/app -p 3000:3000 -t web
    

    시작 이미지에 액세스하기


    가상 시스템의 IP를 확인합니다.
    $ docker-machine ip default
    192.168.99.100
    
    방문http://192.168.99.100:3000/ 확인

    파일 변경


    source/app/index.rb의 내용이 변경되어 반영되었는지 확인해 보세요.
    app/index.rb
    require 'sinatra'
    require 'sinatra/reloader'
    
    set :bind, '0.0.0.0'
    set :port, 3000
    
    get '/' do
      'hello world'
    end
    
    저장하면 반영될 줄 안다.
    바로 반영된다면 실제 개발에서 충분히 활용할 수 있을 것이다.

    더욱 복잡한 구성


    실제 개발에서 MySQL과 Nginx도 포함된 구성은 일반적이다.
    docker-compose를 사용하여 컨테이너를 통일적으로 시작합니다.

    이번에 제작된 구성은 위의 그림과 같다.루비 프로세스는 MySQL 및 Ngnix와 통신합니다.

    파일 구성


    방금 홈페이지에 제작한 간이판 구성을 그대로 담았다.
    웹 페이지 아래에 app를 설정하지 않으면 Docker 이미지의 구축이 실패할 수 있습니다.
    + source
      - docker-compose.yml
      + web
        - Dockerfile
        + app
          - Gemfile
          - index.rb
      + ngnix
        - Dockerfile
        - nginx.conf
    
    docker-compose.yml
    web:
      build: ./web
      volumes:
        - ./web/app:/srv/www/app
      links:
        - mysql
    datastore:
      image: busybox
      volumes:
        - /data/nginx
        - /var/lib/mysql
    nginx:
      build: ./nginx
      ports:
        - '80:80'
      volumes_from:
        - datastore
      links:
        - web
    mysql:
      image: mysql
      environment:
        MYSQL_ROOT_PASSWORD: 'hoge'
      volumes_from:
        - datastore
    
    MySQL 데이터는 Docker 컨테이너가 끝나면 사라지기 때문에 전용 데이터 영구화용 컨테이너를 준비했습니다.
    데이터만 넣으면 되니까busybox 같은 소규모 활용.
    Dockerfile
    FROM ruby
    
    RUN apt-get update && apt-get -y install mysql-client
    
    RUN mkdir -p /srv/www/app
    COPY app/Gemfile /srv/www/app
    WORKDIR /srv/www/app
    RUN bundle install
    CMD ruby index.rb
    
    아까와 달리 루비는 MySQL과 연결하기 위해 mysql-client를 설치해야 합니다.
    web/app/Gemfile
    source "https://rubygems.org"
    
    gem 'sinatra'
    gem 'sinatra-contrib'
    gem 'mysql2'
    
    MySQL 연결용 프로그램 라이브러리를 설치합니다.
    web/app/index.rb
    require 'sinatra'
    require 'sinatra/reloader'
    require 'mysql2'
    
    set :bind, '0.0.0.0'
    set :port, '3000'
    
    # MySQL接続
    client = Mysql2::Client.new(
      :host => ENV['MYSQL_PORT_3306_TCP_ADDR'],
      :username => 'root',
      :password => ENV['MYSQL_ENV_MYSQL_ROOT_PASSWORD']
    )
    
    get '/' do
      results = client.query("SHOW DATABASES")
      tables = []
      results.each do |row|
        tables << row['Database']
      end
    
      "#{tables.join('<br>')}"
    end
    
    MySQL 확인 연결에 대한 처리가 추가되었습니다.
    nginx/Dockerfile
    FROM nginx
    COPY nginx.conf /etc/nginx/nginx.conf
    
    Nginx 설정 파일을 반영하기 위해 파일을 작성한 다음 이미지를 만듭니다.
    nginx/nginx.conf
    events {
      worker_connections  1024;
    }
    
    http {
      include       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"';
    
      sendfile        on;
      keepalive_timeout  65;
    
      access_log  /data/nginx/access.log  main;
    
      upstream backend {
        server web:3000;
      }
    
      server {
        listen       80;
        server_name  localhost;
    
        location / {
          if (-f $request_filename) { break; }
          proxy_set_header X-Real-IP  $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
          proxy_redirect off;
          proxy_pass http://backend;
        }
      }
    
      include /etc/nginx/conf.d/*.conf;
    }
    
    Sinatra 애플리케이션의 TPC를 설정합니다. 3000번 포트에서 80번 포트로 이동합니다.
    docker-compose.왜냐하면 yml에 링크:웹이라는 이름이 설정되어 있어요.
    host 이름에서 웹이라는 이름을 사용할 수 있습니다.

    Docker Compose에서 이미지 시작


    방금 제작한 환경과 다르다고 생각해 보세요. 새로운 가상 환경을 만드는 것부터 시작하세요.
    docker-machine의create 옵션을 이용하여 dev라는 이름을 만드는 환경입니다.
    eval 명령을 사용하면 환경 설정을 불러오고 docker 명령 등을 사용할 수 있습니다.
    $ cd /c/source
    $ docker-machine create --driver virtualbox dev
    $ eval "$(docker-machine env dev)"
    $ docker-compose build
    $ docker-compose up
    
    docker-composie 명령을 사용하여 이미지를 구축하고 시작합니다.

    방문해 보다


    IP 를 확인한 후 브라우저를 통해 액세스합니다.
    $ docker-machine ip dev
    192.168.99.100
    
    방문http://192.168.99.100/ 확인

    배치 Docker 환경 구성


    구축은 2, 3지령만 하면 가능하지만 매번 디자이너에게 지령을 하게 하는 문턱이 높다.
    Windows이기 때문에 배치 파일을 만들어 데스크톱에 올려놓고 시작하면 환경이 회복됩니다.
    start.sh
    #!/bin/sh
    
    docker-machine create --driver virtualbox dev
    docker-machine start dev
    eval "$(docker-machine env dev)"
    docker-compose build
    docker-compose up -d
    
    방금 만든 Docker로 구성된 경로(docker-composie.yml 있음)에 상기 일괄 처리 파일을 배치합니다.
    파일 확장자를sh로 설정하면 GiitBash와 연결된 파일이 되며, 파일을 두 번 클릭하면 시작할 수 있습니다.
    위의 파일은 시작용이기 때문에 적당히 끝낼 준비를 하면 편리합니다.

    끝말


    Docker+Virtualbox는 자동으로 공유 폴더를 만들 수 있기 때문에 Docker 용기가 시작될 때volume를 지정하면 용기에서 호스트 OS가 좋아하는 곳의 폴더를 펼치고 파일을 편집할 수 있습니다.
    간단하게 환경 구축을 하고 유쾌하게 개발했으면 좋겠습니다.

    좋은 웹페이지 즐겨찾기