In this article you will learn how to use Docker for local application development
We are going to see how we can use Docker to run our application in Docker container but still able to code from local editor
Create Rails app
$ rails new next_big_app
Design a Dockerfile
We need to pull Ruby image as we are developing a Rails app
FROM ruby:2.6.5
Update the Docker container with latest packages info
RUN apt-get update && apt-get install apt-transport-https
Install Node.js
# Install Node.js
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash -
RUN apt-get update && apt-get install -y nodejs
# Install yarn
ADD https://dl.yarnpkg.com/debian/pubkey.gpg /tmp/yarn-pubkey.gpg
RUN apt-key add /tmp/yarn-pubkey.gpg && rm /tmp/yarn-pubkey.gpg
RUN echo 'deb https://dl.yarnpkg.com/debian/ stable main' > /etc/apt/sources.list.d/yarn.list
RUN apt-get update && apt-get install -y --no-install-recommends yarn
Set workdir
WORKDIR /next_big_app
Copy gemfiles from local app to container workdir
Install bundler in container
COPY Gemfile /next_big_app
COPY Gemfile.lock /next_big_app
COPY package.json /next_big_app
COPY yarn.lock /next_big_app
RUN gem install bundler --conservative
Copy all sources of current directory to work directory
COPY . /next_big_app
Run bundle install
RUN bundle install --verbose --jobs 20 --retry 5 && \
yarn install --check-files
Expose app PORT and set entry command to run the app
EXPOSE 3000
CMD ["rails", "server", "-b", "0.0.0.0"]
Our Dockerfile
would look like this
FROM ruby:2.6.5
RUN apt-get update && apt-get install apt-transport-https
# Install Node.js
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash -
RUN apt-get update && apt-get install -y nodejs
# Install yarn
ADD https://dl.yarnpkg.com/debian/pubkey.gpg /tmp/yarn-pubkey.gpg
RUN apt-key add /tmp/yarn-pubkey.gpg && rm /tmp/yarn-pubkey.gpg
RUN echo 'deb https://dl.yarnpkg.com/debian/ stable main' > /etc/apt/sources.list.d/yarn.list
RUN apt-get update && apt-get install -y --no-install-recommends yarn
WORKDIR /next_big_app
COPY Gemfile /next_big_app
COPY Gemfile.lock /next_big_app
COPY package.json /next_big_app
COPY yarn.lock /next_big_app
RUN gem install bundler --conservative
COPY . /next_big_app
RUN bundle install --verbose --jobs 20 --retry 5 && \
yarn install --check-files
EXPOSE 3000
CMD ["rails", "server", "-b", "0.0.0.0"]
Now we have created a Dockerfile. Let's create a docker-compose file to specify our app service.
Create Docker compose file
We will use docker-compose to start our app. docker-compose also makes it easy to set additional configuration when we run the app.
As you see, we say
version: '2'
Then we specify services
services:
web:
In the web part we put our options for docker-compose
Set path to build Dockerfile from. We set it as .
as our Dockerfile
resides in current directory
web:
build: .
Then we specify our image
image: anil/next_big_app
We need to set our local source directory as shared volume to our workdir
volumes:
- .:/next_big_app
Finally we map the local port with our container port
ports:
- "3000:3000"
This is how our docker-compose.yml
would look finally
version: '2'
services:
web:
build: .
image: anil/next_big_app
volumes:
- .:/next_big_app
ports:
- "3000:3000"
Now we need to start our application
Run docker-compose rm
to remove any stopped service containers.
$ docker-compose rm
No stopped containers
Now run docker-compose up
$ docker-compose up
Creating next_big_app_web_1 ... done
Attaching to next_big_app_web_1
web_1 | => Booting Puma
web_1 | => Rails 6.0.2.2 application starting in development
web_1 | => Run `rails server --help` for more startup options
You should be able to use your favorite editor to change source code and run the app inside the container now.