[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!

posted @ 2023-01-25 15:06  Zhentiw  阅读(12)  评论(0编辑  收藏  举报