盘Docker吗?Docker镜像制作与私有仓库建立

前言

一:镜像制作

  • 什么是Docker镜像?

    在 Docker 的术语里,一个只读层被称为镜像,一个镜像是永久不会变的。

    由于 Docker 使用一个统一文件系统,Docker 进程认为整个文件系统是以读写方式挂载的。 但是所有的变更都发生顶层的可写层,而下层的原始的只读镜像文件并未变化,所以Docker镜像是分层的

    mark

  • 我们构建镜像一般有三种方式:

    1、基于Dockerfile(最常用)创建

    2、基于已有的镜像容器进行创建镜像

    3、基于本地模板进行构建

  • Docker镜像的分层

    Dockerfile中每个指令都会创建一个新的镜像层

    镜像层将被缓存和复用

    当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效

    某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效

    镜像层是不可变的,如果在某一层中添加一个文件,然后再下一层中删除它,则镜像中依然会包含该文

1.1:基于Dockerfile创建镜像

  • 什么是Dockerfile?

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

    Dockerfile结构分成四个部分:

    1、基础镜像信息

    2、维护者信息

    3、镜像操作指令

    4、容器启动时指定指令

  • Dockerfile常用操作指令

    指令 含义
    FROM 镜像 指定新镜像所基于的镜像,第一条指令必须为FROM指令,
    每创建一个镜像就需要一条FROM指令
    MAINTAINER 名字 说明新镜像的维护人信息
    RUN 命令 在所基于的镜像执行命令,并提交到新的镜像中
    CMD [ “要运行的程序”,“参数1”,“参数2”] 指令启动容器时要运行的命令或者脚本,Dockerfile只能
    有一条CMD命令,如果指定多条则只能执行最后一条
    EXPOSE 端口号 指定新镜像加载到Docker时要开启的端口
    ENV 环境变量 变量值 设置一个环境变量的值,会被后面的RUN使用
    ADD 源文件/目录 目标文件/目录 将源文件复制到目标文件,源文件要与Dockerfile位于
    相同目录中,或者是一个URL
    COPY 源文件/目录 目标文件/目录 将本地主机上的文件/目录复制到目标地点,源文件/目录
    要与Dockerfile在相同的目录中
    VOLUME [“目录”] 在容器中创建一个挂载点
    USER 用户名/UID 指定运行容器时的用户
    WORKDIR 路径 为后续的RUN、CMD、ENTRYPOINT指定工作目录
    ONBUILD 命令 指定所生成的镜像作为一个基础镜像时所要运行的命令
    HEALTHCHECK 健康检查
  • ADD命令解释,如果不理解请看下方举例中Dockerfile文件中的命令

1.2:举例:使用Dockerfile创建镜像

使用Dockerfile创建一个httpd镜像并运行

1、编写Dockerfile文件

[root@docker ~]# mkdir apache
[root@docker ~]# cd apache/
[root@docker apache]# vim Dockerfile
##基于的基础镜像
FROM centos 
##维护镜像的用户信息
MAINTAINER The porject <CN-TangZheng> 
##镜像操作指令安装Apache软件
RUN yum -y update    
 ##安装Apache服务 
RUN yum -y install httpd 
##开启80端口
EXPOSE 80  
##复制网址首页文件
ADD index.html /var/www/html/index.html	'//此命令可以结合上图理解'
##将执行脚本复制到镜像中
ADD run.sh /run.sh           
RUN chmod 755 /run.sh
##启动容器时执行脚本
CMD ["/run.sh"]             

2、编写执行脚本与首页内容

[root@docker apache]# vim run.sh
#!/bin/bash
rm -rf /run/httpd/*	'//清除缓存'
exec /usr/sbin/apachectl -D FOREGROUND	'//启动apache'
[root@docker apache]# echo "this is test web" > index.html

3、生成镜像

[root@docker apache]# ls
Dockerfile  index.html  run.sh
[root@docker apache]# docker build -t httpd:centos .	'//最后的一个"."要注意,-t:镜像的名字:标签'
    '//每一个缓存层都会生成一个临时容器来执行命令,然后删除'
[root@docker apache]# docker images	'//查看镜像,已经生成了两个'
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               centos              d2010670b33a        19 seconds ago      434MB
centos              latest              470671670cac        3 months ago        237MB

4、新镜像运行容器

[root@docker apache]# docker run -d -p 1111:80 httpd:centos	'//-p 指定端口号,-P 随机端口号'
04b0f0f1bda36a4857f8d48e044cd17f442be19f4d32dee4cf3183827b451b55
[root@docker apache]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
04b0f0f1bda3        httpd:centos        "/run.sh"           4 seconds ago       Up 3 seconds        0.0.0.0:1111->80/tcp   nostalgic_greider

5、测试容器

mark

1.3:基于已有的镜像容器创建

  • 创建容器

    [root@docker apache]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    httpd               centos              d2010670b33a        23 minutes ago      434MB
    centos              latest              470671670cac        3 months ago        237MB	'//使用此镜像创建容器'
    [root@docker apache]# docker create -it centos /bin/bash
    [root@docker apache]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
    325c28cc9349        centos              "/bin/bash"         42 seconds ago      Created                                    infallible_poitras
    04b0f0f1bda3        httpd:centos        "/run.sh"           21 minutes ago      Up 21 minutes       0.0.0.0:1111->80/tcp   nostalgic_greider
    
    
  • 创建镜像

    [root@docker apache]# docker commit -m "ceshi" -a "tang" 325c28cc9349 tang:centos	'//-m:说明文字,-a:提交的作者'
    sha256:a49089651887dee9c9168532466542ca7ea0c9113da078230694ac30aebe064c
    [root@docker apache]# docker images	'//镜像创建成功'
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    tang                centos              a49089651887        14 seconds ago      237MB
    httpd               centos              d2010670b33a        30 minutes ago      434MB
    centos              latest              470671670cac        3 months ago        237MB
    
    

1.4:基于本地模板创建

二:Docker私有仓库建立

2.1:私有仓库设置步骤

1、下载registry镜像

2、客户端设置daemon.json文件,指定私有仓库位置

3、生成registry容器,开放5000端口

4、镜像打标签

5、上传镜像,docker push

6、下载镜像,docker pull

2.2:建立私有仓库

  • 1、服务端下载registry镜像

    '//我直接使用这台当做服务端和客户端了'
    [root@docker apache]# docker pull registry
    
    
  • 2、指定镜像仓库的地址

    [root@docker apache]# vim /etc/docker/daemon.json 
    {
      "insecure-registries": ["192.168.233.133:5000"],	'//添加此段'
      "registry-mirrors": ["https://yu1vx79j.mirror.aliyuncs.com"]
    }
    [root@docker apache]# systemctl restart docker
    
    
  • 3、生成registry容器,开放5000端口

    [root@docker apache]# docker create -it registry /bin/bash
    87db162017924493a4dadefd1f58ff2fdf5a62921a9f4233c84143340e36e1e5
    [root@docker apache]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                            PORTS                  NAMES
    87db16201792        registry            "/entrypoint.sh /bin…"   12 seconds ago       Created                                                  agitated_darwin
    [root@docker apache]# docker start 87db16201792
    [root@docker apache]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
    60e04d648d5116ceb369eee810e8ed85f2043aa2f573b0ebf1e1233e8e13e2f6
    
  • 4、镜像打标签

    [root@docker apache]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    tang                centos              a49089651887        38 minutes ago      237MB
    httpd               centos              d2010670b33a        About an hour ago   434MB
    registry            latest              708bc6af7e5e        2 months ago        25.8MB
    centos              latest              470671670cac        3 months ago        237MB
    [root@docker apache]# docker tag tang:centos 192.168.233.133:5000/httpd
    
    
  • 5、上传镜像测试

    [root@docker apache]# docker push 192.168.233.133:5000/httpd
    The push refers to repository [192.168.233.133:5000/httpd]
    0683de282177: Pushed 
    latest: digest: sha256:7a6f34c22ab081c96ee0b676244300691d7a2f63fe4aedd22f150f17fe4aa5a9 size: 529
    
    
  • 6、下载镜像测试

    [root@docker apache]#  curl -XGET http://192.168.233.133:5000/v2/_catalog
    {"repositories":["httpd"]}
    [root@docker apache]# docker pull 192.168.233.133:5000/httpd
    
    

谢谢赏阅!如有疑问可评论区交流!

原创文章 172 获赞 97 访问量 5万+

猜你喜欢

转载自blog.csdn.net/CN_TangZheng/article/details/105681571