码迷,mamicode.com
首页 > 其他好文 > 详细

Docker镜像的创建和私有仓库的创建

时间:2020-05-14 17:40:18      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:usr   nim   reload   ecs   step   程序   images   准备   大致   

一、docker镜像的创建方法

1、基于已有镜像创建

2、基于本地模板创建

3、基于dockerfile创建

4、搭建私有仓库及其使用方法

一、docker镜像的创建方法

docker镜像是除了docker的核心技术之外,也是应用发布的标准格式。一个完整的docker镜像可以支撑一个docker容器的运行,在docker的整个使用过程中,进入一个已经定型的容器之后,就可以在容器中进行操作,最常见的操作就是在容器中安装应用服务,如果要把已经安装的服务进行迁移,就需要把环境及搭建的服务生成新的镜像。

创建镜像的方法有三种,分别是基于已有镜像创建、基于本地模板创建及基于dockerfile创建。接下来会将这几种方法依次写下来。

1、基于已有镜像创建

基于已有镜像创建主要是使用docker commit命令,本质上就是把一个容器里面运行的程序及该程序的运行环境打包起来生成新的镜像。

命令格式如下:

docker  commit  [选项]  容器ID/名称  仓库名称:[标签]

常用选项如下:

-m:说明信息;

-a:作者信息;

-p:生成过程中停止容器的运行

基于已有镜像创建新的镜像举例:

1)启动一个镜像,在容器里做修改,然后将修改后的容器提交为新的镜像,需要记住该容器的ID号,如下:

[root@centos01 ~]# docker images  <!--查看本地镜像-->
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
hub.c.163.com/public/centos   6.7-tools           b2ab0ed558bb        3 years ago         602 MB
[root@centos01 ~]# docker run -it -d --name centos6.7 hub.c.163.com/public/centos:6.7-tools  
     <!--基于docker宿主机镜像运行一个容器-->
e70418f794378109bb583e2d9171b55d7fd747460cff2819f1dffb9df04dac4c
[root@centos01 ~]# docker ps   <!--查看正在运行的容器 加-a参数是查看所有容器-->
CONTAINER ID        IMAGE                                   COMMAND                  CREATED              STATUS              PORTS               NAMES
e70418f79437        hub.c.163.com/public/centos:6.7-tools   "/usr/bin/supervisord"   About a minute ago   Up About a minute   22/tcp              centos6.7
[root@centos01 ~]# docker exec -it centos6.7 /bin/bash  <!--登录刚创建的容器-->
[root@e70418f79437 /]# echo "lyx" > /etc/lyx.txt  <!--写入测试数据-->
[root@e70418f79437 /]# exit   <!--退出容器-->
exit
[root@centos01 ~]# docker commit -m "newnamed" -a "lyx" centos6.7 centos6.701 
               <!--使用docker commit命令创建一个新的镜像-->
sha256:305f99b50a1e8844ea21a2411649108f662ad5d42c35fa9ff2cf3608172d1590
[root@centos01 ~]# docker images  <!--查看刚创建的镜像是否生成-->
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
centos6.701                   latest              305f99b50a1e        32 seconds ago      602 MB
hub.c.163.com/public/centos   6.7-tools           b2ab0ed558bb        3 years ago         602 MB
[root@centos01 ~]# docker create -it centos6.701 /bin/bash <!--基于新创建的镜像创建一个容器-->
eb6522ec046e9b3c7bfcb1edb5c84545aa8264f27075c019ee89da9150039e2f
[root@centos01 ~]# docker ps  <!--查看所有容器,获取刚创建的容器ID-->
[root@centos01 ~]# docker ps -a
CONTAINER ID        IMAGE                                   COMMAND                  CREATED             STATUS              PORTS               NAMES
eb6522ec046e        centos6.701                             "/bin/bash"              55 seconds ago      Created                                 condescending_darwin
e70418f79437        hub.c.163.com/public/centos:6.7-tools   "/usr/bin/supervisord"   9 minutes ago       Up 9 minutes        22/tcp              centos6.7
[root@centos01 ~]# docker start eb6522ec046e <!--启动容器-->
eb6522ec046e
[root@centos01 ~]# docker exec -it eb6 /bin/bash  <!--登录到新创建的容器-->
[root@eb6522ec046e /]# cat /etc/lyx.txt  <!--验证之前容器写入的数据是否还在-->
lyx
[root@eb6522ec046e /]# exit   <!--退出容器-->
exit

2、基于本地模板创建

通过导入操作系统模板文件可以生成镜像,模板可以从OPENVZ开源项目,或者 https://wiki.openvz.org/Download/template/precreated ,优先使用OPENVZ开源项目那个链接;

基于本地模板创建举例:

1)下载centos 7的迷你版系统模板,使用docker导入命令导入为本地镜像:

[root@centos01 ~]# wget https://download.openvz.org/template/precreated/centos-7-x86_64-minimal.tar.gz   
................<!--省略部分内容-->
[root@centos01 ~]# ls | grep centos   <!--确认已经下载centos7的模板压缩包-->
centos-7-x86_64-minimal.tar.gz
[root@centos01 ~]# cat centos-7-x86_64-minimal.tar.gz |docker import - docker:new 
             <!--使用docker导入命令导入为本地镜像-->
sha256:6d662f735ee8efbd53f23e017fdb5c777303aaab93a085ee6c10d9fcb71b4ba8
[root@centos01 ~]# docker images | grep new      <!--查看导入的镜像-->
docker                        new                 6d662f735ee8        27 seconds ago      435 MB
<!--至此,可使用这个镜像创建容器并部署需要的功能,进行使用了-->
[root@centos01 ~]# docker run -it -d docker:new /bin/bash <!--使用新镜像运行一个容器-->
0c10ee4230983b020a0268f40d4523685226ee570271e71a5b5d24ec57e8f46a
[root@centos01 ~]# docker ps |grep new  <!--查看刚运行的容器ID-->
0c10ee423098        docker:new                              "/bin/bash"              About a minute ago   Up About a minute                       nostalgic_wescoff
[root@centos01 ~]# docker exec -it 0c1 /bin/bash   <!--使用ID前三位登录刚运行的容器-->
[root@0c10ee423098 /]# ls 
bin  boot  dev  etc  fastboot  home  lib  lib64  ......  <!--查看-->
[root@0c10ee423098 /]# exit     <!--退出容器-->
exit

3、基于dockerfile创建

dockerfile是由一组指令组成的文件,其中每条指令对应Linux中的一条命令,docker程序将读取dockerfile中的指令生成指定镜像。

dockerfile结构大致分为四个部分:

基础镜像信息;

维护者信息;

镜像操作指令;

容器启动时执行指令;

dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用“#”号开头的注释;

dockerfile中的配置项介绍:

[root@centos01 ~]# docker tag docker:new centos7.lyx
[root@centos01 ~]# docker images | grep lyx
centos7.lyx                   latest              6d662f735ee8        9 minutes ago       435 MB
[root@centos01 ~]# vim Dockerfile
FROM centos           <!--第一行必须指明基于的基础镜像(该镜像必须存在)-->
MAINTAINER The centos project <lyx@centos.org>    <!--维护该镜像的用户信息-->
<!--以下是镜像的操作指令-->
RUN yum -y update
RUN yum -y install openssh-server
RUN sed -i ‘s/UsePAM yes/UsePAM no/g‘ /etc/ssh/sshd_config
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
EXPOSE 22       <!--开启22端口-->
CMD ["/usr/sbin/sshd","-D"]     <!--启动容器时执行指令-->

在编写dockerfile时,有严格的格式需要遵循:第一行必须使用FROM指令指明所基于的镜像名称;之后使用MAINTAINER指令说明维护该镜像的用户信息;然后是镜像操作相关指令,如RUN指令,每运行一条指令,都会给基础镜像添加新的一层;最后使用CMD指令来指定启动容器时要运行的命令操作。

dockerfile有十几条命令可用于构建镜像,其中常见的指令如下:
技术图片

dockerfile使用举例——使用dockerfile创建apache镜像并在容器中运行

1)创建镜像并加载到容器中运行:

[root@centos01 ~]# mkdir apache               <!--建立工作目录-->
[root@centos01 ~]# cd apache/                <!--切换至新建的目录-->
[root@centos01 apache]# vim Dockerfile             <!--编写dockerfile文件-->

FROM centos                <!--基于的基础镜像centos-->
MAINTAINER the centos project <lyx@163.com>     <!--维护该镜像的用户信息-->
RUN yum -y update            <!--使用yum进行更新-->
RUN yum -y install httpd        <!--镜像操作指令安装apache软件包-->
EXPOSE 80                         <!--开启80端口-->
ADD index.html /var/www/html/index.html <!--将本地的首页文件index.html复制到镜像中-->
ADD run.sh /run.sh      <!--将本地的运行脚本run.sh复制到镜像中-->
RUN chmod 775 /run.sh       <!--赋予脚本执行权限-->
RUN systemctl disable httpd             <!--设置apache服务不自行启动-->
CMD ["/run.sh"]             <!--启动容器时执行脚本-->
<!--输入上述信息后,保存退出-->
[root@centos01 apache]# docker images | grep centos     
<!--确保本地有centos的基础镜像,因为在dockerfile文件中指定了该镜像-->
centos7                       system              c065d5c0571d        About an hour ago   435 MB
[root@centos01 apache]# vim run.sh               <!--编写执行脚本内容-->
#!/bin/bash
rm -rf /run/httpd/*              <!--清理httpd的缓存-->
exec /usr/sbin/apachectl -D FOREGROUND           <!--启动apache服务-->
[root@centos01 apache]# echo "dockerfile  test" >index.html          <!--编写一个首页文件-->
[root@centos01 apache]# ls               <!--确保当前目录下的文件有以下三个-->
Dockerfile  index.html  run.sh
<!--当以上准备完成后,就可以使用docker  build命令来创建镜像,如下:-->
[root@centos01 apache]# docker build -t httpd:centos .     
<!--注意上面命令的末尾有个“.”,表示当前路径,若不加则会报错。-->
<!--其中“-t”选项用来指定镜像的标签信息-->
Sending build context to Docker daemon 4.096 kB
Step 1/10 : FROM centos
Trying to pull repository docker.io/library/centos ... 
latest: Pulling from docker.io/library/centos
  .................. <!--省略部分内容,此处需要静等几分钟,此时系统在执行dockerfile文件中的指令-->
    <!--若在显示信息中有报红的信息,只要配置文件无误,一般属于正常(是有关yum的信息)-->
Removing intermediate container 81a3d6c9d3db
Step 10/10 : CMD /run.sh
 ---> Running in 5cdc467fd874
 ---> 5d56b826432d
Removing intermediate container 5cdc467fd874
Successfully built 5d56b826432d
<!--当出现以上提示,则表示新的镜像已经创建成功了-->
<!--在整个创建过程中,可以看到每运行一次dockerfile中的指令,都会以给初始镜像加上新的一层-->
[root@centos01 apache]# docker run -d -p 81:80 httpd:centos  
<!--将新生成的镜像加载到容器中运行-->
<!--其中“-p”选项实现从本地端口81到容器中80端口的映射-->
192cd783028dcb3013ebb40b65ba8450e695e424e700a13cb8a44bb84af3e71a
[root@centos01 apache]# docker ps -a         <!--查询容器是否运行-->
CONTAINER ID        IMAGE                      COMMAND                  CREATED              STATUS              PORTS                       NAMES
192cd783028d        httpd:centos               "/run.sh"                About a minute ago   Up About a minute   0.0.0.0:81->80/tcp          gallant_khorana
                  <!--省略部分内容-->

至此,可以看到新生成的镜像已经在容器中加载运行了,本机(宿主机,不是docker容器)的IP地址为192.168.1.1,此时client访问192.168.1.1的81端口,就相当于访问了刚运行的容器的80端口,如下:
技术图片

4、搭建私有仓库及其使用方法

随着创键的镜像增多,就需要有一个保存镜像的地方,这就是仓库。目前有两种仓库:公共仓库和私有仓库。最方便的就是使用公共仓库上传和下载,下载公共仓库的镜像是不需要注册的,但是上传时,是需要注册的。下面介绍如何创建私有仓库。

方法如下:

[root@centos01 ~]# docker pull registry:2  <!--下载registry:2的镜像-->
[root@centos01 ~]# docker run -itd --name registry --restart=always  -p 5000:5000 -v /registry:/var/lib/registry registry:2
<!--p:端口映射(前面是宿主机端口:后面是容器暴露的端口)-->
<!---v:挂载目录(前面是宿主机的目录:后面的是容器的目录)自动创建宿主机的目录-->
[root@centos01 ~]# docker tag centos:nginx 192.168.1.1:5000/centos:nginx
[root@centos01 ~]# vim /usr/lib/systemd/system/docker.service 
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.1:5000
<!--修改原本的配置文件添加不安全的仓库,地址是宿主机的IP地址与5000端口-->
[root@centos01 ~]# systemctl daemon-reload 
[root@centos01 ~]# systemctl restart docker             <!--重新启动docker服务-->
[root@centos01 ~]# docker ps           <!--确认registry容器正常运行-->
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
2645c31b2306        registry:2          "/entrypoint.sh /etc…"   21 minutes ago      Up 42 seconds       0.0.0.0:5000->5000/tcp   registry
?
[root@centos01 ~]# docker push 192.168.1.1:5000/centos:nginx <!--上传镜像到私有仓库-->

私有仓库搭建完成,验证成功!这时打开另一台docker主机下载进行测试:

[root@centos01 ~]# vim /usr/lib/systemd/system/docker.service 
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.1:5000
<!--修改原本的配置文件添加不安全的仓库,地址是registry主机的IP地址与5000端口-->
[root@centos01 ~]# systemctl daemon-reload 
[root@centos01 ~]# systemctl restart docker             <!--重新启动docker服务-->
[root@centos01 ~]# docker run -itd --name nginx 192.168.1.1:5000/centos:nginx nginx -g "daemon off;"
<!--基于镜像创建容器-->
[root@centos01 ~]# docker inspect nginx     <!--查看容器的详细信息-->
[root@centos01 ~]# curl 172.17.0.3          <!--测试访问-->

私有仓库这是才算搭建完成!测试完成!

———————— 本文至此结束,感谢阅读 ————————

Docker镜像的创建和私有仓库的创建

标签:usr   nim   reload   ecs   step   程序   images   准备   大致   

原文地址:https://blog.51cto.com/14156658/2495184

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!