docker镜像的创建和私有仓库的创建(代码片段)

author author     2022-12-10     123

关键词:

一、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镜像的创建和私有仓库的创建(代码片段)

一、docker镜像的创建方法1、基于已有镜像创建2、基于本地模板创建3、基于dockerfile创建4、搭建私有仓库及其使用方法一、docker镜像的创建方法docker镜像是除了docker的核心技术之外,也是应用发布的标准格式。一个完整的docker镜... 查看详情

docker(4)搭建私有镜像仓库(代码片段)

【Docker】(4)搭建私有镜像仓库说明1、这里是通过阿里云,搭建Docker私有镜像仓库。2、这里打包的镜像是从官网拉下来的,并不是自己项目创建的新镜像,主要测试功能一、搭建过程首先进入阿里云创建镜像仓库:https://dev.aliyun.... 查看详情

docker镜像创建及建立私有仓库(代码片段)

Docker镜像创建方法创建镜像的方法有三种,分别是基于已有的镜像创建、基于本地模板创建、基于Dockerfile创建,下面着重介绍这三种创建镜像的方法。?基于已有镜像创建首先将镜像加载到容器,将容器里面运行的程序及运行环... 查看详情

docker数据管理与网络通信之私有仓库建立(代码片段)

...库。首先需要在构建私有仓库的服务器上下载registry镜像dockerpullregistry在/etc/docker/目录 查看详情

在docker中创建私有仓库(代码片段)

仓库简介随着创建的镜像日益增多,就需要有一个保存镜像的地方,这就是仓库。目前有两种仓库:公共仓库和私有仓库。最方便的就是使用公共仓库上传和下载镜像,下载公共仓库中的镜像不需要注册,但上传镜像到公共仓库... 查看详情

docker创建私有仓库(代码片段)

...可以被认为是一个具体的项目或目录。例如对于仓库地址docker.sina.com.cn/centos:centos63来说,docker.sina.com.cn是注册服务器地址,cent 查看详情

docker创建私有仓库|数据卷和数据卷容器|容器互联操作详解(代码片段)

目录一、Docker私有仓库的操作1、创建私有仓库2、上传3、获取私有仓库列表4、测试私有仓库下载二、Docker数据卷和数据卷容器1、数据卷2、数据卷容器三、容器互联(使用centos镜像)一、Docker私有仓库的操作1、创建私有仓库do... 查看详情

docker教程-8-dockerhub仓库及私有仓库的使用(代码片段)

目录1、DockerHub镜像仓库的使用1.1注册账号并登录1.2创建一个公开/私有仓库1.3 在命令行中登录/退出DockerHub1.4 对本地镜像打tag编号1.5 将镜像推送到DockerHub的Registry1.6 从DockerHub下载镜像到本地2、私有仓库的搭建和使用2.1使用dock... 查看详情

docker学习笔记-仓库(代码片段)

Docker仓库是镜像存储、分发、部署的关键,制作好应用程序镜像后上传到仓库,使用Dockerdaemon从仓库拉取后运行,我们可以使用官方共有仓库dockerhub或者搭建私有仓库DockerHub包含众多镜像,无需登录就可以搜索和使用注册DockerHub... 查看详情

docker搭建私有仓库之registry(代码片段)

Registry*有时候使用DockerHub这样的公共仓库可能不方便,用户可以创建一个本地仓库供私人使用。*docker-registry是官方提供的工具,可以用于构建私有的镜像仓库。注:*随着docker使用的镜像越来越多,就需要有一个保存镜像的地方... 查看详情

docker教程-8-dockerhub仓库及私有仓库的使用(代码片段)

目录1、DockerHub镜像仓库的使用1.1注册账号并登录1.2创建一个公开/私有仓库1.3 在命令行中登录/退出DockerHub1.4 对本地镜像打tag编号1.5 将镜像推送到DockerHub的Registry1.6 从DockerHub下载镜像到本地2、私有仓库的搭建和使用2.1使用dock... 查看详情

docker搭建本地私有仓库(代码片段)

1.使用registry镜像创建私有仓库安装docker后,可以通过官方提供的registry镜像来简单搭建一套本地私有仓库环境:dockerrun-d-p5000:5000registry:2这将自动下载并启动一个registry容器,创建本地的私有仓库服务。默认情况下,仓库会被创... 查看详情

dockerdocker配置(代码片段)

Docker配置Dcoker基本组成镜像(Image):docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。容器(container):Docker利用容器技术,独... 查看详情

05-docker仓库(代码片段)

访问Docker仓库仓库(Repository)是集中存放镜像的地方,又分共有仓库和私有仓库。注册服务器和仓库有所区别,注册服务器是存放仓库的具体服务器,一个注册服务器可以有多个仓库,而每个仓库下可以有多个镜像,仓库可以... 查看详情

docker本地仓库和私有仓库(代码片段)

docker本地仓库和私有仓库一、docker本地仓库1.首先下载registry镜像2.在daemon.json文件中添加私有镜像仓库地址3.运行registry容器docker容器重启策略4.为镜像打标签5.上传到私有仓库6.列出私有仓库的所有镜像7.列出私有仓库的centos镜像... 查看详情

docker本地仓库和私有仓库(代码片段)

docker本地仓库和私有仓库一、docker本地仓库1.首先下载registry镜像2.在daemon.json文件中添加私有镜像仓库地址3.运行registry容器docker容器重启策略4.为镜像打标签5.上传到私有仓库6.列出私有仓库的所有镜像7.列出私有仓库的centos镜像... 查看详情

docker建立私有仓库(代码片段)

Docker(五)建立私有仓库随着创建的镜像日益增多,就需要一个保存镜像的地方,这就是仓库。仓库目前有两张:1:公有仓库2:私有仓库私有仓库建立[[email protected]~]dockerpullregistryUsingdefaulttag:latestlatest:Pullingfromlibrary/registry4... 查看详情

docker--构建镜像私有仓库registry数据卷端口映射(代码片段)

Docker入门之构建镜像、私有仓库registry、数据卷、端口映射一、构建自定义镜像的方式1.Dockerfile(基于源镜像修改配置,用Dockerfile生成自己需要的镜像),用于新的业务2.基于已有的镜像容器进行创建,常用在业务升级上面。3.... 查看详情