[Docker] Handcrafting a Container Image
Pull httpd image and run the container
[cloud_user@ip-10-0-1-78 ~]$ docker pull httpd:2.4
[cloud_user@ip-10-0-1-78 ~]$ docker run --name webtemplate -d httpd:2.4
b33977ff66d330fa6354f7d23fb4d96d891fffcbe7c270a889b08a6437d222f0
[cloud_user@ip-10-0-1-78 ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b33977ff66d3 httpd:2.4 "httpd-foreground" 4 seconds ago Up 3 seconds 80/tcp webtemplate
Exec into container and download the code
We want to ssh into container
docker exec -it webtemplate bash
We want to make sure system is up to date and install git
apt update && apt install git -y
After installing git, we can clone the repo to get the code. We want to put the code into /tmp/widget-factory-inc
folder
git clone https://github.com/linuxacademy/content-widget-factory-inc.git /tmp/widget-factory-inc
Serve the webstie
Before we serve the website, we need to remove the default index.html
file come alone with apache2.
root@b33977ff66d3:/usr/local/apache2# ls -l htdocs/
total 4
-rw-r--r--. 1 501 staff 45 Jun 11 2007 index.html
root@b33977ff66d3:/usr/local/apache2# rm htdocs/index.html
After cleaning the file, we can copy our code into htdocs/
root@b33977ff66d3:/usr/local/apache2# cp -r /tmp/widget-factory-inc/web/* htdocs/
root@b33977ff66d3:/usr/local/apache2# ls -l htdocs/
total 16
drwxr-xr-x. 2 root root 76 Jan 25 06:46 img
-rw-r--r--. 1 root root 3059 Jan 25 06:46 index.html
-rw-r--r--. 1 root root 2910 Jan 25 06:46 quote.html
-rw-r--r--. 1 root root 2611 Jan 25 06:46 support.html
-rw-r--r--. 1 root root 2645 Jan 25 06:46 widgets.html
Now we have our code into the container, next we can create the image, so exit container first.
exit
Create image
First we need to get contianer id
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b33977ff66d3 httpd:2.4 "httpd-foreground" 12 minutes ago Up 12 minutes 80/tcp webtemplate
Create a image named example/widgetfactory
docker commit b33977ff66d3 example/widgetfactory:v1
Now let's see our images
[cloud_user@ip-10-0-1-78 ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
example/widgetfactory v1 c301f990ab9c 26 seconds ago 243MB
httpd 2.4 6e794a483258 7 days ago 145MB
We can notice the image example/widgetfactory
size is much larger than the base image, that's because we forgot the clear out extra build tools.
Cleanup
Let's back into the container to clear the extra resource
docker exec -it webtemplate bash
First, let's delete the code from /tmp/widget-factory-inc/
rm -rf /tmp/widget-factory-inc/
Second, we also need to remove git, its related tools and cleanup the apt packages
apt remove git -y && apt autoremove -y && apt clean
Now image has been cleanup
exit
Build image again
[cloud_user@ip-10-0-1-78 ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b33977ff66d3 httpd:2.4 "httpd-foreground" 19 minutes ago Up 19 minutes 80/tcp webtemplate
[cloud_user@ip-10-0-1-78 ~]$ docker commit b33977ff66d3 example/widgetfactory:v2
sha256:85eec7c693f9bab0563ff3e8e5096a7ac8099c8f3a274e39d8feb2a1360872d0
[cloud_user@ip-10-0-1-78 ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
example/widgetfactory v2 85eec7c693f9 4 seconds ago 164MB
example/widgetfactory v1 c301f990ab9c 6 minutes ago 243MB
httpd 2.4 6e794a483258 7 days ago 145MB
Now, v2 size is much smaller.
Let's also remove v1 image, since we don't need it anymore.
docker rmi example/widgetfactory:v1
[cloud_user@ip-10-0-1-78 ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
example/widgetfactory v2 85eec7c693f9 2 minutes ago 164MB
httpd 2.4 6e794a483258 7 days ago 145MB
[cloud_user@ip-10-0-1-78 ~]$
Let's run our container
docker run --name web1 -p 8081:80 -d example/widgetfactory:v2
docker run --name web2 -p 8082:80 -d example/widgetfactory:v2
docker run --name web3 -p 8083:80 -d example/widgetfactory:v2
Now we have 3 copies of container running:
[cloud_user@ip-10-0-1-78 ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
589e6c2ce3c3 example/widgetfactory:v2 "httpd-foreground" 9 seconds ago Up 8 seconds 0.0.0.0:8083->80/tcp, :::8083->80/tcp web3
1bf1ba11d5ae example/widgetfactory:v2 "httpd-foreground" 15 seconds ago Up 14 seconds 0.0.0.0:8082->80/tcp, :::8082->80/tcp web2
dbd54fe50ef4 example/widgetfactory:v2 "httpd-foreground" 54 seconds ago Up 53 seconds 0.0.0.0:8081->80/tcp, :::8081->80/tcp web1
b33977ff66d3 httpd:2.4
Stop httpd container, which we don't need it
docker stop webtemplate
Now if goes to the website https:<public-ip>:8081, https:<public-ip>:8082, https:<public-ip>:8083
, we can see the same site host on different port of the same container image.
If we stop one of the continer: docker stop web2
, we will see the site is offline.
Congras!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2022-01-25 [AWS] AWS Inspector vs AWS Trust Advisor
2022-01-25 [JS Pattern] Container / Presentational Pattern
2019-01-25 [Node.js] Show More Lines in a Node.js Error Stack Trace
2019-01-25 [TypeScript] Deeply mark all the properties of a type as read-only in TypeScript
2019-01-25 [Angular] Angular Attribute Decorator - When to use it?
2017-01-25 [RxJS] Add debug method to Observable in TypeScript
2017-01-25 [Angular] NgRx/effect, why to use it?