docker镜像制作

​​​​​

目录

​​​​​

一、docker镜像的制作

1、Docker Hub

2、Docker Hub 提供以下主要功能:

3、docker镜像的获取

4、镜像的生成

5、基于容器制作镜像

6、镜像的导入与导出

二、扩展题

1、apache安装

2、实例

3、启动的两种方法


一、docker镜像的制作


多数情况下,我们做镜像是基于别人已存在的某个基础镜像来实现的,我们把它称为base image。比如一个纯净版的最小化的centos、ubuntu或debian。

那么这个最小化的centos镜像从何而来呢?其实这个基础镜像一般是由Docker Hub的相关维护人员,也就是Docker官方手动制作的。这个基础镜像的制作对于Docker官方的专业人员来说是非常容易的,但对于终端用户来说就不是那么容易制作的了。

1、Docker Hub


Docker Hub 是一项基于云的注册表服务,允许您链接到代码存储库、构建映像并对其进行测试、存储手动推送的映像以及指向 Docker Cloud 的链接,以便将映像部署到主机。

它为容器映像发现、分发和更改管理、用户和团队协作以及整个开发管道中的工作流自动化提供了集中式资源。

docker镜像制作_第1张图片


2、Docker Hub 提供以下主要功能:

图像存储库

            从社区和官方库中查找和提取映像,以及管理、推送到您有权访问的私有映像库以及从中拉取映像库。
自动构建
            在对源代码存储库进行更改时自动创建新映像。
网络钩子
                Webhooks 是自动构建的一项功能,可让您在成功推送到存储库后触发操作。
组织
                创建工作组以管理对映像存储库的访问。
GitHub 和 Bitbucket 集成
                将中心和 Docker 映像添加到当前工作流。


3、docker镜像的获取


要从远程注册表(例如您自己的 Docker 注册表)获取 Docker 映像并将其添加到本地系统,请使用 docker pull 命令:
```
# docker pull [:]/[/]:
```
是一个在 TCP 上提供 docker 分发服务的主机(默认值:5000)

一起 识别由 注册表控制的特定映像

              一些注册表也支持原始;对于这些, 是可选的
             但是,当它被包括在内时,提供的附加层次结构级别对于区分具有相同图像是有用的
                层次结构的附加级别

Namespace
组织 redhat/kubernetes, google/kubernetes
登录(用户名) Alice/application, bob/application
角色 开发/数据库,测试/数据库,生产/数据库


4、镜像的生成


镜像的生成途径:

Dockerfile
基于容器制作
Docker Hub 自动构建

docker镜像制作_第2张图片

5、基于容器制作镜像


根据容器的更改创建新映像

用法:

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
 

选项 违约 描述
—作者, -a 作者(例如,“约翰·汉尼拔·史密斯 [email protected]")
-c, --更改列表 将 Dockerfile 指令应用于创建的映像
-m, --消息字符串 提交消息
-p, --暂停 在提交期间暂停容器

[root@localhost ~]# docker pull busybox        //拉取镜像
Using default tag: latest
latest: Pulling from library/busybox
5cc84ad355aa: Pull complete 
Digest: sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest
[root@localhost ~]# docker images
REPOSITORY     TAG       IMAGE ID       CREATED        SIZE
busybox        latest    beae173ccac6   7 months ago   1.24MB

//--name是代表容器名,--it代表使用镜像创建容器后进入交互式命令
[root@localhost ~]# docker run --name t1 -it busybox
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # mkdir data
/ # echo 'happy' > data/index.html
/ # cat data/index.html 
happy
/ # 


在创建镜像时,我们不能关闭容器,必须使其处于运行状态,所以我们必须要另起一个终端,然后执行
 

[root@localhost ~]# docker commit -p t1
sha256:d71dd4dae383f9d8b175ed36a092cf16a01ff0694a6e5786dafad8cc18207765
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
           d71dd4dae383   5 seconds ago   1.24MB
busybox      latest    beae173ccac6   7 months ago    1.24MB
[root@localhost ~]# docker tag d71dd4dae383 servicestt/l1:v0.1
[root@localhost ~]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
servicestt/l1   v0.1      d71dd4dae383   48 seconds ago   1.24MB
busybox         latest    beae173ccac6   7 months ago     1.24MB



此时要注意的是,我们的仓库名叫l1,所以我们要在Docker Hub上创建一个名为l1的仓库,然后再将我们做好的镜像push上去。servicestt/l1而前面的services是属于在hub网站自定义的名字,后则是仓库名
 

docker镜像制作_第3张图片


 

[root@localhost ~]# docker login                //拉取日志授权
Authenticating with existing credentials...
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@localhost ~]# docker push servicestt/l1:v0.1                //从个人仓库中拉取l1镜像使用
The push refers to repository [docker.io/servicestt/l1]
5381ff491e6c: Pushed 
01fd6df81c8e: Mounted from library/busybox 
v0.1: digest: sha256:c466be3a3d1e1cb5b5a0aa86ebf526dc6c93b1b3cb5b5185099f0ec1655e7010 size: 734


 

docker镜像制作_第4张图片

使用新生成的镜像创建容器,并查看在t1容器中创建的html
 

[root@localhost ~]# docker run --name b1 -it servicestt/l1:v0.1
/ # ls
bin   data  dev   etc   home  proc  root  sys   tmp   usr   var
/ # ls data/
index.html
/ # cat data/index.html 
happy



>由此可见,新生成的镜像中是包含了新增的内容的,但是此时有一个问题,那就是容器默认要启动的进程是什么?在这里,默认情况下是启动的sh进程,但我们是要启动一个http站点,所以我们要在创建镜像时将容器默认启动的进程设为httpd,这样一来我们就可以通过新生成的镜像来快速构建一个简单的http站点了。


使用docker inspect命令查看b1容器启动的默认进程是什么
 

[root@localhost ~]# docker inspect b1
[
                    ...此处省略N行
            "Cmd": [
                "sh"
            ],
                    ...此处省略N行
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    ...此处省略N行
]




重新生成镜像并上传
//这里要求上传的命令为httpd

[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE                COMMAND   CREATED          STATUS          PORTS     NAMES
1ea4daffa63a   servicestt/l1:v0.1   "sh"      38 minutes ago   Up 38 minutes             b1
e5bed605f932   busybox              "sh"      2 hours ago      Up 2 hours                t1
[root@localhost ~]# docker commit -a 'sean ' -c 'CMD ["/bin/httpd","-f","-h","/data"]' -p b1 servicestt/b1:v0.2
sha256:51ba93864e4a115f19fc89fd4881e6135712380fc7f0305a5d29a72843b70ba5


 

//使用新生成的镜像创建容器
 

[root@localhost ~]# docker run --name t2 -d servicestt/b1:v0.2
c2ad25452e1971efb3915a24a514b0900b95c8887050bf764a4b2684882c2bed
[root@localhost ~]# docker container ls
CONTAINER ID   IMAGE                COMMAND                  CREATED              STATUS              PORTS     NAMES
c2ad25452e19   servicestt/b1:v0.2   "/bin/httpd -f -h /d…"   About a minute ago   Up About a minute             t2


使用docker inspect命令查看t2容器启动的默认进程是什么,以及其IP地址,然后用curl命令访问该IP,看是否能访问到网页
 

[root@localhost ~]# docker inspect t2

  Path": "/bin/httpd",
        "Args": [
            "-f",
            "-h",
            "/data"
  "Gateway": "172.17.0.1",
     "IPAddress": "172.17.0.2",


     
//查看在次拉取的镜像文件,结果显示使用相同的镜像所属配置也相同

[root@localhost ~]# curl 172.17.0.2
happy


 


6、镜像的导入与导出


假如有2台主机,我们在主机1上做了一个镜像,主机2想用这个镜像怎么办呢?

我们可以在主机1上push镜像到镜像仓库中,然后在主机2上pull把镜像拉下来使用,这种方式就显得比较麻烦,假如我只是测试用的,在一台主机上做好镜像后在另一台主机上跑一下就行了,没必要推到仓库上然后又把它拉到本地来。

此时我们可以在已有镜像的基础上把镜像打包成一个压缩文件,然后拷贝到另一台主机上将其导入,这就是镜像的导入和导出功能。

docker中我们使用docker save进行导出,使用docker load进行导入。

在已生成镜像的主机上执行docker save导出镜像
 

[root@yj ~]# docker save -o myimages.gz servicestt/b1
[root@yj ~]# ls
anaconda-ks.cfg  myimages.gz  pass
[root@yj ~]# scp myimages.gz [email protected]:/root
The authenticity of host '192.168.47.136 (192.168.47.136)' can't be established.
ECDSA key fingerprint is SHA256:btx2dSz90l/nMB41dSXH0DVPsBDudqSrCLbIIHMRNM4.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.47.136' (ECDSA) to the list of known hosts.
[email protected]'s password: 
myimages.gz 


 

在另一台没有镜像的主机上执行docker load导入镜像
 

[root@my ~]# docker load -i myimages.gz
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
Error: stat myimages.gz: no such file or directory
[root@my ~]# ls
anaconda-ks.cfg  apr-1.6.5.tar.bz2       httpd-2.4.54.tar.bz2
apr-1.6.5        apr-util-1.6.1.tar.bz2  myimages.gz
[root@my ~]# docker load -i myimages.gz
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
Getting image source signatures
Copying blob bf776f0c3d77 done  
Copying blob 01fd6df81c8e done  
Copying blob 5381ff491e6c done  
Copying config 51ba93864e done  
Writing manifest to image destination
Storing signatures
Loaded image(s): localhost/servicestt/b1:v0.2
[root@my ~]# docker images
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
REPOSITORY               TAG         IMAGE ID      CREATED      SIZE
localhost/servicestt/b1  v0.2        51ba93864e4a  5 hours ago  1.47 MB


 


二、扩展题

1、apache安装


在拉取的centos镜像容器中搭建httpd服务
 

[root@yj ~]# docker search centos
NAME                                         DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
centos                                       The official build of CentOS.                   7270      [OK]   
[root@yj ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete 
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
[root@yj ~]# docker images
centos          latest    5d0da3dc9764   10 months ago   231MB
[root@my yum.repos.d]# docker run -dit --name b1 centos
403c104037cfcda91cc807fb29e9283a81ce4d94a4dba798c9797ee2aff5a37b
[root@my yum.repos.d]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
403c104037cf   centos    "/bin/bash"   5 seconds ago   Up 5 seconds             b1


 

进入容器
 

[root@my yum.repos.d]# docker exec -it  b1  /bin/bash
[root@403c104037cf yum.repos.d]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2495  100  2495    0     0   4392      0 --:--:-- --:--:-- --:--:--  4392
[root@403c104037cf yum.repos.d]# ls
CentOS-Base.repo
//修改下阿里云云主机
[root@403c104037cf yum.repos.d]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo

//下载环境工具
创建apache用户组
[root@localhost ~]# useradd -r -M -s /sbin/nologin apache
[root@localhost ~]# id apache
uid=994(apache) gid=991(apache) groups=991(apache)
安装依赖包
yum -y install make openssl-devel pcre-devel expat-devel libtool gcc gccc++


 

分别预编译安装三个软件包
 

[root@my yum.repos.d]# docker exec -it  b1  /bin/bash
[root@403c104037cf yum.repos.d]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2495  100  2495    0     0   4392      0 --:--:-- --:--:-- --:--:--  4392
[root@403c104037cf yum.repos.d]# ls
CentOS-Base.repo
//修改下阿里云云主机
[root@403c104037cf yum.repos.d]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo

//下载环境工具
创建apache用户组
[root@localhost ~]# useradd -r -M -s /sbin/nologin apache
[root@localhost ~]# id apache
uid=994(apache) gid=991(apache) groups=991(apache)
安装依赖包
yum -y install make openssl-devel pcre-devel expat-devel libtool gcc gccc++

apr
 

[root@localhost apr-1.6.5]# vi configure
# $RM "$cfgfile" //将此行加上注释,或者删除此行
......
[root@localhost apr-1.6.5]# ./configure --prefix=/usr/local/apr
[root@localhost apr-1.6.5]# make && make install



apr-util
 

./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make && make install


 

httpd
 

解压httpd-2.4.54.tar.bz2
[root@http ~]#tar xf httpd-2.4.54.tar.bz2
[root@403c104037cf httpd-2.4.54]# ./configure --prefix=/usr/local/apache --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork
//预编译
make && make install

安装完成

2、实例


在容器中编写脚本,并于启动apache
 

[root@403c104037cf ~]# cd /usr/local/apache/
[root@403c104037cf apache]# ls
bin    cgi-bin    error    icons     logs  manual
build  conf    htdocs    include  man   modules
[root@403c104037cf apache]# cd conf/
[root@403c104037cf conf]# vi httpd.conf 
 # ServerName www.example.com:80          //取消注释
[root@403c104037cf conf]# /usr/local/apache/bin/httpd 
[root@403c104037cf conf]# ss -antl         //启动80端口
State   Recv-Q  Send-Q     Local Address:Port     Peer Address:Port  Process  
LISTEN  0       128              0.0.0.0:80            0.0.0.0:*  


//供参考
 

[root@403c104037cf conf]# /usr/local/apache/bin/httpd 
这种httpd启动方式虽然可以成功,但生成的镜像放在另一台终端创建的容器中却一直启动不了

//验证
[root@my src]# docker commit -a 'lty <[email protected]>' -c 'CMD ["/usr.local/apache/bin/httpd"]' -p b1 centos-httpd:v1
sha256:a2f286fdc421fcd4d056cf39e74c9e2c124789ff31cc32b7b4bd681810303230
[root@my src]# docker images | grep centos-httpd
centos-httpd   v1        a2f286fdc421   19 seconds ago   749MB
[root@my src]# docker run  -d -it --name http1 centos-httpd:v1
a21f547b14612940d5d7cf8cd860a8e6f2f39d1fc23de88b2fe5878cdb6b3b38
[root@my src]# docker ps -a
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS       PORTS     NAMES
a21f547b1461   centos-httpd:v1   "/usr.local/apache/b…"   24 seconds ago   Created                http1
[root@my src]# docker start http1
Error                       //报错


 


3、启动的两种方法


**(一)**
在容器中中创建一个脚本

//关闭进程

[root@403c104037cf apr-util-1.6.1]# pkill httpd
[root@403c104037cf apr-util-1.6.1]# ss -antl
State  Recv-Q   Send-Q     Local Address:Port     Peer Address:Port  Process 
[root@403c104037cf ~]# vi httpd.sh
# !/bin/bash
/usr/local/apache/bin/httpd
sleep 5d                                        //为了防止在后台运行,sleep固定运行在前台运行五天
[root@403c104037cf ~]# chmod +x httpd.sh              给脚本执行权限


另一台终端中
 

[root@my src]# docker commit -a 'lty <[email protected]>' -c 'CMD ["/root/httpd.sh"]' -p b1 centos-httpd:v2
sha256:d6a946ada2477ca61c9c0494ad765d90a34e63321a75f6f9f9741ed9fecf93b9
[root@my src]# docker images
REPOSITORY     TAG       IMAGE ID       CREATED          SIZE
centos-httpd   v2        d6a946ada247   55 seconds ago   940MB
[root@my src]# docker run -d -it --name web1  centos-httpd:v2
10c211f0ed1e6970567c6fd43c741fd06c0b7948d08dd17ae12ceba68e3972b7
//可以发现在创建容器后就处于运行状态了
[root@my src]# docker ps
CONTAINER ID   IMAGE             COMMAND            CREATED         STATUS         PORTS     NAMES
10c211f0ed1e   centos-httpd:v2   "/root/httpd.sh"   2 minutes ago   Up 2 minutes             web1
[root@my src]# docker inspect web1
 "Gateway": "172.17.0.1",
 "IPAddress": "172.17.0.3",
 //可见自己搭建的镜像使用后可以成功访问
[root@my src]# curl 172.17.0.3

It works!

(二)方法
 

//这里的-D  指定的是本来存放在后台的命令却放在前台去运行
[root@my src]# docker commit -a 'lty <[email protected]>' -c 'CMD ["/usr/local/apache/bin/httpd","-D","FOREGROUND"]' -p b1 centos-httpd:v3
sha256:feff4b0fd2bc264c5d4ce576e2baff673eff62c64b16c6713e27091e4dfb567a
[root@my src]# docker images
REPOSITORY     TAG       IMAGE ID       CREATED          SIZE
centos-httpd   v3        feff4b0fd2bc   26 seconds ago   940MB
centos-httpd   v2        d6a946ada247   16 minutes ago   940MB
             66c9c9c06a38   33 minutes ago   940MB
centos         latest    5d0da3dc9764   10 months ago    231MB
[root@my src]# docker run -d -it --name web2 centos-httpd:v3
1b44b2a7f099ded02e9fae036a7ff72837c086f7548483b32140513301ea5009
[root@my src]# docker ps 
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS          PORTS     NAMES
1b44b2a7f099   centos-httpd:v3   "/usr/local/apache/b…"   6 seconds ago    Up 6 seconds              web2


 

接下来做一个80端口映射就完成了
 

[root@my src]# docker run -d -it --name web3 -p 80:80  centos-httpd:v3
fd0feaedc5693d6dff94ea91d313cc9ad94da8b342ced0ac5824d96232d2b656
[root@my src]# docker ps 
CONTAINER ID   IMAGE             COMMAND                  CREATED              STATUS          PORTS                               NAMES
fd0feaedc569   centos-httpd:v3   "/usr/local/apache/b…"   About a minute ago   Up 58 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   web3
State   Recv-Q  Send-Q     Local Address:Port     Peer Address:Port  Process  
LISTEN  0       128              0.0.0.0:22            0.0.0.0:*              
LISTEN  0       128              0.0.0.0:80 
[root@my src]# curl 192.168.47.136

It works!

你可能感兴趣的:(docker镜像实例,centos,docker,容器,apache,kubernetes)