lets pull in a specific version of node with the alpine tag , alpine images are typically the samllest and helps you create small images.
docker pull node:lts-alpine
lts-alpine: Pulling from library/node
cbdbe7a5bc2a: Pull complete 9287919c3a0f: Pull complete 43a47bbd54c9: Pull complete 3c1bcea295c4: Pull complete Digest: sha256:53bbb1eeb8bc916ee27f9e01c542788699121bd7b5a9d9f39eaff64c2fcd0412
Status: Downloaded newer image for node:lts-alpine
docker.io/library/node:lts-alpine
lets look at the size tag
C:\training>docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
user-service-api latest d6c4df7196aa 44 hours ago 945MB
website latest ec6fa782dfbf 45 hours ago 137MB
node lts-alpine d8b74300d554 6 days ago 89.6MB
node latest f47907840247 6 days ago 943MB
note how small the lts-alpine image is , its only 137MB compared to the 943MB for node
the same applies for nginx – bottom line alpine linux images are much more smaller
nginx alpine bd53a8aa5ac9 8 days ago 22.3MB
nginx latest 992e3b7be046 8 days ago 133MB
lets change our images to use the alpine version
change the corresponding dockerfile , where it says From , update to refer to the nginx :alpine or node:alpine and issue the build command as shown below
C:\training\nodeegs\user-service-api>docker build -t user-service-api:latest .
Sending build context to Docker daemon 19.97kB
Step 1/6 : FROM node:alpine
---> 87e4e57acaa5
Step 2/6 : WORKDIR /app
---> Running in 2c324be4450e
Removing intermediate container 2c324be4450e
---> a52a0e88e8e9
Step 3/6 : ADD package*.json ./
---> d69b2ede02d2
Step 4/6 : RUN npm install
---> Running in 79165a49fa10
npm WARN user-service-api@1.0.0 No description
npm WARN user-service-api@1.0.0 No repository field.
added 50 packages from 37 contributors and audited 50 packages in 1.699s
found 0 vulnerabilities
Removing intermediate container 79165a49fa10
---> 6e7a39633834
Step 5/6 : ADD . .
---> 9a2cc6e2ef61
Step 6/6 : CMD node index.js
---> Running in 951c562eaa77
Removing intermediate container 951c562eaa77
---> 48026bfc7e3d
Successfully built 48026bfc7e3d
Successfully tagged user-service-api:latest
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.
now when we check the image size , we can see the size reduced as well since we reused the tags, the older images are assigned none
C:\training\dockertrng>docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
website latest 556fcda99af2 5 seconds ago 26.3MB
user-service-api latest 48026bfc7e3d 2 minutes ago 119MB
<none> <none> d6c4df7196aa 44 hours ago 945MB
<none> <none> ec6fa782dfbf 45 hours ago 137MB
node alpine 87e4e57acaa5 6 days ago 117MB
node latest f47907840247 6 days ago 943MB
nginx alpine bd53a8aa5ac9 8 days ago 22.3MB
nginx latest 992e3b7be046 8 days ago 133MB
lets look at tags , version and tagging . Version allows controlling image version. Since the underlying image of node , nginx can change , its advisable to specify version. go to hub.docker.com and search for node as well as go to nodejs.org and figure out the stable version
on the hub.docker.com , look for the corresponding alpine image
mention this version in the docker file
from
to
vscode will actually list out all of the image versions available. now go ahead and reissue the docker build command and you can now see the exact version being pulled to create the image
you can use the docker tag command to assign a version to an image. so in the example below , we can assign version 1 to the image with the latest tag
docker tag user-service-api:latest user-service-api:1
C:\training\nodeegs\user-service-api>docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
user-service-api 1 f97cb57c9621 38 minutes ago 92.4MB
user-service-api latest f97cb57c9621 38 minutes ago 92.4MB
website latest 556fcda99af2 54 minutes ago 26.3MB
if we need to make any change to the source code , we can build it and assign it the tag latest and then create a version 2 from the latest tag. This way the image with the latest tag will always point to the latest version and then we have specific versions as well.
C:\training\nodeegs\user-service-api>docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
user-service-api 1 f97cb57c9621 42 minutes ago 92.4MB
user-service-api 2
https://cloud.google.com/container-registrylets talk about docker registries , docker registries is a scalable server side application that stores and lets you distribute images. We just need to use the command push to get the image to the registry. docker hub is a public registry , quay.io , Amazon ECR , Azure container registry , google container registry are the other ones .
lets push one of our images to docker hub , login to docker hub and create anew repo , you get one private repo by default
in my case i am going to call the private repository as myrepo and this is what it looks like
it shows the command to push a new tag to this repo . go back to your desktop and click on login and this presents you with the login screen
you can also login by typing docker login and enter your creds
here is the tricky part , the push refers to the registry path , so its best to name the repo same as application and in docker to put a tag that has your docker id
docker push sjvz/myrepos/userserviceapi:2
The push refers to repository [docker.io/sjvz/myrepos/userserviceapi]
d8ff11b621d8: Preparing c980f362df9f: Preparing b87374988724: Preparing 6e960b3b1e1c: Preparing 8760de05bee9: Preparing 52fdc5bf1f19: Waiting 8049bee4ff2a: Waiting 50644c29ef5a: Waiting denied: requested access to the resource is denied
docker tag user-service-api:2 sjvz/myrepos:2
docker push sjvz/myrepos:2
The push refers to repository [docker.io/sjvz/myrepos]
d8ff11b621d8: Pushed c980f362df9f: Pushed b87374988724: Pushed 6e960b3b1e1c: Pushed 8760de05bee9: Pushed 52fdc5bf1f19: Pushed 8049bee4ff2a: Pushed 50644c29ef5a: Pushed 2: digest: sha256:169e40860aa8d2db29de09cdd33d9fe924c8eda71e27212f3054742806ca7fec size: 1992
its kind of weird , but i have tagged my application with myid/reponame and then pushed to the repo …not sure if there is a better way to do this
so its best to delete the repository and name it same as application and then push to the same
you can delete the repo by going into settings .
when you create a new repo , it does give you these instructions to tag the image with the reponame as follows
docker tag local-image:tagname new-repo:tagname
docker push new-repo:tagname
you can use docker inspect containerid to inspect the container
docker logs containerid to inspect the logs
docker logs -f containerid , to follow the logs in realtime
to get into the container , use docker exec -it containerid , the i stands for interactive and the ‘t’ stands for tty terminal