文章目录
前言
一:镜像制作
-
什么是Docker镜像?
在 Docker 的术语里,一个只读层被称为镜像,一个镜像是永久不会变的。
由于 Docker 使用一个统一文件系统,Docker 进程认为整个文件系统是以读写方式挂载的。 但是所有的变更都发生顶层的可写层,而下层的原始的只读镜像文件并未变化,所以Docker镜像是分层的
-
我们构建镜像一般有三种方式:
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位于
相同目录中,或者是一个URLCOPY 源文件/目录 目标文件/目录 将本地主机上的文件/目录复制到目标地点,源文件/目录
要与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、测试容器
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:基于本地模板创建
-
下载本地模板
通过导入系统模板文件可以生成镜像,模板可以从OPENVZ开源项目下载
地址为:https://wiki.openvz.org/Download/template/precreated
或者使用wget下载:wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
-
模板下载后直接导入即可
[root@docker opt]# ls debian-7.0-x86-minimal.tar.gz [root@docker opt]# cat debian-7.0-x86-minimal.tar.gz | docker import - daoke:new [root@docker opt]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE daoke new 487145d2411f 8 seconds ago 215MB
二: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