One former colleague of mine used to say that even a monkey can become a DevOps engineer if put some effort. So I asked him to make DevOps engineer out of me. “Sure”, he said and gave me my first assignment: to read a book “How Linux Works: What Every Superuser Should Know” by Brian Ward. I abandoned the book in the middle, not because it was a boring book, but because it was hard to read the pure theory without applying it. However since then I got some interest in devops stuff.
Yesterday I tryied to dockerize my next.js application and was surprised how easy it was. If you the same as me before think that Docker is too complex, I can say that it’s not (or maybe I have not got into complexity yet). Below are the steps I performed to get my app into a docker container.
You can download Docker installer from the official site. Installation went smooth on my Mac machine, however I got into minor issues when was doing the same on Linux CentOS. Here are the installation steps for CentOS:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install docker-ce sudo usermod -aG docker $(whoami) sudo systemctl enable docker.service sudo systemctl start docker.service
If there is an error during
docker-ce installation, this command might help:
sudo yum install http://vault.centos.org/centos/7.3.1611/extras/x86_64/Packages/container-selinux-2.9-4.el7.noarch.rpm
Create Dockerfile and place it in the root of your Next.js application. Here is my Dockerfile:
FROM node:alpine # Set working directory. All the paths will be relative to WORKDIR WORKDIR /opt/dist # Install PM2 globally RUN npm install --global pm2 # Install dependencies COPY package*.json ./ RUN npm install # Copy source files COPY . . # Build the app RUN npm run build # Run the app CMD [ "pm2-runtime", "start", "npm", "--", "start" ]
Btw, do not repeat my mistake: originally the first line of my docker file was
FROM node:12. As a result a final docker image was huge, about 1.3 Gb. I spent almost 1 hour trying to understand what makes the image so large, then found the github issue which recommends to use
node:alpine variants that are much more reasonable in size.
Build Docker image
Run this command to create a docker image:
docker build -t my_app .
Run Docker container from the image
This is the last step. To run Docker container type:
docker run -d -p 3000:3000 my_app:latest
After that your application will be available at localhost:3000. Easy, right?
A few useful Docker commands
To wrap it up, here are few Docker commands that I found useful during setup:
docker ps # to see a list of running containers docker stop [container_id] # to stop given container docker images # to see a list of docker images docker logs [first 3 characters of container id] # to see a log of a given container docker rmi -f $(docker images -a -q) # to remove all docker images
Coming back to the beginning of the article, have I became a DevOps after getting my Next app into Docker? Of course, no! It’s just baby steps, but I enjoy it a lot.