当前位置:   article > 正文

docker镜像制作_docker制作镜像

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 的链接,以便将映像部署到主机。

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


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

图像存储库

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


3、docker镜像的获取


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

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

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

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


4、镜像的生成


镜像的生成途径:

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

5、基于容器制作镜像


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

用法:

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

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

  1. [root@localhost ~]# docker pull busybox        //拉取镜像
  2. Using default tag: latest
  3. latest: Pulling from library/busybox
  4. 5cc84ad355aa: Pull complete 
  5. Digest: sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678
  6. Status: Downloaded newer image for busybox:latest
  7. docker.io/library/busybox:latest
  8. [root@localhost ~]# docker images
  9. REPOSITORY     TAG       IMAGE ID       CREATED        SIZE
  10. busybox        latest    beae173ccac6   7 months ago   1.24MB
  11. //--name是代表容器名,--it代表使用镜像创建容器后进入交互式命令
  12. [root@localhost ~]# docker run --name t1 -it busybox
  13. / # ls
  14. bin   dev   etc   home  proc  root  sys   tmp   usr   var
  15. / # mkdir data
  16. / # echo 'happy' > data/index.html
  17. / # cat data/index.html 
  18. happy
  19. /


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

  1. [root@localhost ~]# docker commit -p t1
  2. sha256:d71dd4dae383f9d8b175ed36a092cf16a01ff0694a6e5786dafad8cc18207765
  3. [root@localhost ~]# docker images
  4. REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
  5. <none>       <none>    d71dd4dae383   5 seconds ago   1.24MB
  6. busybox      latest    beae173ccac6   7 months ago    1.24MB
  7. [root@localhost ~]# docker tag d71dd4dae383 servicestt/l1:v0.1
  8. [root@localhost ~]# docker images
  9. REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
  10. servicestt/l1   v0.1      d71dd4dae383   48 seconds ago   1.24MB
  11. busybox         latest    beae173ccac6   7 months ago     1.24MB



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


 

  1. [root@localhost ~]# docker login                //拉取日志授权
  2. Authenticating with existing credentials...
  3. WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
  4. Configure a credential helper to remove this warning. See
  5. https://docs.docker.com/engine/reference/commandline/login/#credentials-store
  6. Login Succeeded
  7. [root@localhost ~]# docker push servicestt/l1:v0.1                //从个人仓库中拉取l1镜像使用
  8. The push refers to repository [docker.io/servicestt/l1]
  9. 5381ff491e6c: Pushed 
  10. 01fd6df81c8e: Mounted from library/busybox 
  11. v0.1: digest: sha256:c466be3a3d1e1cb5b5a0aa86ebf526dc6c93b1b3cb5b5185099f0ec1655e7010 size: 734


 

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

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



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


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

  1. [root@localhost ~]# docker inspect b1
  2. [
  3.                     ...此处省略N行
  4.             "Cmd": [
  5.                 "sh"
  6.             ],
  7.                     ...此处省略N行
  8.                     "Gateway": "172.17.0.1",
  9.                     "IPAddress": "172.17.0.2",
  10.                     ...此处省略N行
  11. ]




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

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


 

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

  1. [root@localhost ~]# docker run --name t2 -d servicestt/b1:v0.2
  2. c2ad25452e1971efb3915a24a514b0900b95c8887050bf764a4b2684882c2bed
  3. [root@localhost ~]# docker container ls
  4. CONTAINER ID   IMAGE                COMMAND                  CREATED              STATUS              PORTS     NAMES
  5. 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,看是否能访问到网页
 

  1. [root@localhost ~]# docker inspect t2
  2.   Path": "/bin/httpd",
  3.         "Args": [
  4.             "-f",
  5.             "-h",
  6.             "/data"
  7.   "Gateway": "172.17.0.1",
  8.      "IPAddress": "172.17.0.2",


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

  1. [root@localhost ~]# curl 172.17.0.2
  2. happy


 


6、镜像的导入与导出


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

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

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

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

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

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


 

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

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


 


二、扩展题

1、apache安装


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

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


 

进入容器
 

  1. [root@my yum.repos.d]# docker exec -it  b1  /bin/bash
  2. [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
  3.   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
  4.                                  Dload  Upload   Total   Spent    Left  Speed
  5. 100  2495  100  2495    0     0   4392      0 --:--:-- --:--:-- --:--:--  4392
  6. [root@403c104037cf yum.repos.d]# ls
  7. CentOS-Base.repo
  8. //修改下阿里云云主机
  9. [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
  10. //下载环境工具
  11. 创建apache用户组
  12. [root@localhost ~]# useradd -r -M -s /sbin/nologin apache
  13. [root@localhost ~]# id apache
  14. uid=994(apache) gid=991(apache) groups=991(apache)
  15. 安装依赖包
  16. yum -y install make openssl-devel pcre-devel expat-devel libtool gcc gccc++


 

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

  1. [root@my yum.repos.d]# docker exec -it  b1  /bin/bash
  2. [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
  3.   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
  4.                                  Dload  Upload   Total   Spent    Left  Speed
  5. 100  2495  100  2495    0     0   4392      0 --:--:-- --:--:-- --:--:--  4392
  6. [root@403c104037cf yum.repos.d]# ls
  7. CentOS-Base.repo
  8. //修改下阿里云云主机
  9. [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
  10. //下载环境工具
  11. 创建apache用户组
  12. [root@localhost ~]# useradd -r -M -s /sbin/nologin apache
  13. [root@localhost ~]# id apache
  14. uid=994(apache) gid=991(apache) groups=991(apache)
  15. 安装依赖包
  16. yum -y install make openssl-devel pcre-devel expat-devel libtool gcc gccc++

apr
 

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



apr-util
 

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


 

httpd
 

  1. 解压httpd-2.4.54.tar.bz2
  2. [root@http ~]#tar xf httpd-2.4.54.tar.bz2
  3. [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
  4. //预编译
  5. make && make install

安装完成

2、实例


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

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


//供参考
 

  1. [root@403c104037cf conf]# /usr/local/apache/bin/httpd 
  2. 这种httpd启动方式虽然可以成功,但生成的镜像放在另一台终端创建的容器中却一直启动不了
  3. //验证
  4. [root@my src]# docker commit -a 'lty <1@2.com>' -c 'CMD ["/usr.local/apache/bin/httpd"]' -p b1 centos-httpd:v1
  5. sha256:a2f286fdc421fcd4d056cf39e74c9e2c124789ff31cc32b7b4bd681810303230
  6. [root@my src]# docker images | grep centos-httpd
  7. centos-httpd   v1        a2f286fdc421   19 seconds ago   749MB
  8. [root@my src]# docker run  -d -it --name http1 centos-httpd:v1
  9. a21f547b14612940d5d7cf8cd860a8e6f2f39d1fc23de88b2fe5878cdb6b3b38
  10. [root@my src]# docker ps -a
  11. CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS       PORTS     NAMES
  12. a21f547b1461   centos-httpd:v1   "/usr.local/apache/b…"   24 seconds ago   Created                http1
  13. [root@my src]# docker start http1
  14. Error                       //报错


 


3、启动的两种方法


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

//关闭进程

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


另一台终端中
 

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

(二)方法
 

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


 

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

  1. [root@my src]# docker run -d -it --name web3 -p 80:80  centos-httpd:v3
  2. fd0feaedc5693d6dff94ea91d313cc9ad94da8b342ced0ac5824d96232d2b656
  3. [root@my src]# docker ps 
  4. CONTAINER ID   IMAGE             COMMAND                  CREATED              STATUS          PORTS                               NAMES
  5. 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
  6. State   Recv-Q  Send-Q     Local Address:Port     Peer Address:Port  Process  
  7. LISTEN  0       128              0.0.0.0:22            0.0.0.0:*              
  8. LISTEN  0       128              0.0.0.0:80 
  9. [root@my src]# curl 192.168.47.136
  10. <html><body><h1>It works!</h1></body></html>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/975960
推荐阅读
相关标签
  

闽ICP备14008679号