欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

如何创建Docker镜像(三种方式)以及私有仓库的创建

程序员文章站 2022-03-29 23:40:48
...

一、Docker镜像

1.1 docker镜像

应用的是发布的标准格式
支撑一个docker容器的运行

1.2 docker镜像的创建方法

  • 基于已有的镜像创建
  • 基于本地模板创建
  • 基于Dockerfile创建

Docker镜像是分层的结构

如何创建Docker镜像(三种方式)以及私有仓库的创建
①Dockerfile中的每个指令都会创建一个新的镜像层
②镜像层将被缓存和复用
③当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
④某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效
⑤镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件

二、基于已有的镜像创建实例

将容器里面运行的程序及运行环境打包生成新的镜像

docker commit  选项  容器id  想要创建的镜像名:标签
-m:说明信息
-a:作者信息
-p:生成过程中停止容器的运行

实例

[aaa@qq.com ~]# docker ps -a  #现有容器
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
86cf506635da        centos:7            "/bin/bash"         6 seconds ago       Up 5 seconds                            nervous_shockley
[aaa@qq.com ~]# docker commit -m "image" -a "zf" -p 86cf506635da docker:new   #创建docker:new镜像
sha256:e3056b40acd772abc9a39c6c4f3cb42ba119eb9392b32fb275414f00e82d55b2
[aaa@qq.com ~]# docker images  #查看生成的镜像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker              new                 e3056b40acd7        9 seconds ago       267MB
centos              7                   4f280dc8c807        21 hours ago        267MB
#最好停止容器再创建镜像

三、基于本地模板创建实例

通过导入操作系统模板文件生成新的镜像
使用wget命令导入为本地镜像

如何创建Docker镜像(三种方式)以及私有仓库的创建

[aaa@qq.comer1 ~]# cat debian-7.0-x86-minimal.tar.gz | docker import - daoke:new  #导入模板命名镜像名为daoke:new
[aaa@qq.com ~]# docker images #查看生成的镜像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
daoke               new                 61b2d8af0457        38 seconds ago      215MB
docker              new                 e3056b40acd7        10 minutes ago      267MB
centos              7                   4f280dc8c807        22 hours ago        267MB

四、基于Dockerfile创建实例

Dockerfile是由一组指令组成的文件。

文件结构:

  • 基础镜像信息
  • 维护者信息
  • 镜像操作指令
  • 容器启动时执行指令

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

Dockerfile操作指令:

指令 解释
FROM 镜像 指定新镜像所基于的镜像,第一条指令必须为FROM指令 ,
MAINTAINER名字 说明新镜像的维护人信息
RUN 命令 在所基于的镜像上执行命令,并提交到新的镜像中
CMD [ "要运行的程序”,”参数1,"参数2 "] 指令启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令,如果指定多条则只能最后一条被执行
EXPOSE 端口号 暴露镜像端口号,方便运行镜像和提供服务时,映射给外部节点使用
ENV 环境变量变量值 设置一个环境变量的值,会被后面的RUN使用
ADD 源文件/目录 目标文件/目录 从宿主机复制文件到容器,如果是压缩包并进行解压,源文件要与Dockerfile同一目录
COPY源文件/目录目标文件/目录 将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中
VOLUME [“目录"] 在容器中创建一个挂载点
USER用户名/UID 指定运行容器时的用户
WORKDIR路径 为后续的RUN、CMD、ENTRYPOINT指定 工作目录,相当于cd
ONBUILD命令 指定所生成的镜像作为一个基础镜像时所要运行的命令
HEALTHCHECK 健康检查

实例

[aaa@qq.com ~]# mkdir apache  #建立镜像目录
[aaa@qq.com ~]# cd apache/

#创建Dockerfile
[aaa@qq.com apache]# vi Dockerfile  
FROM centos:7  #基于的基础镜像,在centos内核运行
MAINTAINER this is zzf web  #维护者信息
RUN yum -y update   
RUN yum -y install httpd
EXPOSE 80   #开启80端口,给外部映射用
ADD index.html /var/www/html/index.html  #将宿主机网站文件加入到镜像内
ADD run.sh /run.sh  #将执行脚本复制到镜像内
RUN chmod 755 /run.sh  #提权
CMD ["/run.sh"]  #启动容器时执行脚本,开启Apache服务

#当前目录里创建index.html和run.sh
[aaa@qq.com apache]# vi run.sh 
#!/bin/bash
rm -rf /run/httpd/*  
exec /usr/sbin/apachectl -D FOREGROUND  #启动容器时启动服务
[aaa@qq.com apache]# vi index.html 
hello

#创建镜像,必须在当前有Dockerfile的目录***意空格加. 代表当前目录
[aaa@qq.com apache]# docker build -t http:centos .
#查看创建的镜像
[aaa@qq.com apache]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
http                centos              5db0e8103d54        5 minutes ago       539MB
daoke               new                 61b2d8af0457        33 minutes ago      215MB
docker              new                 e3056b40acd7        43 minutes ago      267MB
centos              7                   4f280dc8c807        22 hours ago        267MB

#运行镜像为容器
-p 为映射端口,将容器端口80映射为宿主主机端口1212(必须是未被占用的)
-P 不指定节点端口,随机指定端口,默认从32768端口开始分配
[aaa@qq.com apache]# docker run -d -p 1212:80 http:centos   

#查看容器状态
[aaa@qq.com apache]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
a8fa8ae6be42        http:centos         "/run.sh"           3 minutes ago       Up 3 minutes        0.0.0.0:1212->80/tcp   xenodochial_franklin
86cf506635da        centos:7            "/bin/bash"         48 minutes ago      Up 48 minutes                              nervous_shockley

关闭防火墙,测试Apache服务

如何创建Docker镜像(三种方式)以及私有仓库的创建

五、私有仓库的创建

拉取仓库镜像registry

[aaa@qq.com ~]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
cbdbe7a5bc2a: Pull complete 
47112e65547d: Pull complete 
46bcb632e506: Pull complete 
c1cc712bcecd: Pull complete 
3db6272dcbfa: Pull complete 
Digest: sha256:8be26f81ffea54106bae012c6f349df70f4d5e7e2ec01b143c46e2c03b9e551d
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest

指定私有仓库位置,才能在后面上传、拉取镜像

[aaa@qq.com ~]# vi /etc/docker/daemon.json 
{   
   #添加一行
  "insecure-registries": ["192.168.247.130:5000"],  #冒号后有空格,私有仓库端口为5000
  "registry-mirrors": ["https://lgjs7fbd.mirror.aliyuncs.com"]
}

重启docker

[aaa@qq.com ~]# systemctl restart docker

创建容器并启动

[aaa@qq.com ~]# docker create -it registry /bin/bash
[aaa@qq.com ~]# docker start af9ac719549c  
af9ac719549c
[aaa@qq.com ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                            PORTS               NAMES
af9ac719549c        registry            "/entrypoint.sh /bin…"   41 seconds ago      Exited (127) 2 seconds ago                            trusting_banzai
#并未启动成功

运行registry镜像为容器,并做端口映射,放入后台持续运行

-v为数据卷,挂载宿主主机/data/registry目录到容器/tmp/registry,没有此目录会自动创建目录
[aaa@qq.com ~]# docker run -d -p 5000:5000 -v /data/redistry:/tmp/registry registry
73eee89e69874daa0024a2753f307d0e5c3961f0d63df298c41a4d3fb559715b
[aaa@qq.com ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                            PORTS                    NAMES
73eee89e6987        registry            "/entrypoint.sh /etc…"   4 seconds ago       Up 3 seconds                      0.0.0.0:5000->5000/tcp   confident_nash

在进行上传镜像前,需要对镜像打标签,改镜像名为 私有库:端口/镜像名

[aaa@qq.com ~]# docker tag docker:new 192.168.247.130:5000/centos  新镜像名为
[aaa@qq.com ~]# docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
http                          centos              5db0e8103d54        47 minutes ago      539MB
daoke                         new                 61b2d8af0457        About an hour ago   215MB
192.168.247.130:5000/centos   latest              e3056b40acd7        About an hour ago   267MB
docker                        new                 e3056b40acd7        About an hour ago   267MB
centos                        7                   4f280dc8c807        23 hours ago        267MB
registry                      latest              2d4f4b5309b1        5 months ago        26.2MB

上传镜像到私有仓库

[aaa@qq.com ~]# docker push 192.168.247.130:5000/centos  
The push refers to repository [192.168.247.130:5000/centos]
8d152c3fb6f4: Pushed 
latest: digest: sha256:fd992fc03bf59b5435b8b455d34adf9019800b6e5fc32aca081f2130c51c5b55 size: 530

获取私有仓库列表

[aaa@qq.com registry]# curl -XGET http://192.168.247.130:5000/v2/_catalog
{"repositories":["centos"]}

测试私有仓库,从仓库拉取镜像

aaa@qq.com ~]# docker pull 192.168.247.130:5000/centos
Using default tag: latest
latest: Pulling from centos
Digest: sha256:fd992fc03bf59b5435b8b455d34adf9019800b6e5fc32aca081f2130c51c5b55
Status: Image is up to date for 192.168.247.130:5000/centos:latest
192.168.247.130:5000/centos:latest
相关标签: docker 运维