Docker镜像基础知识
Docker镜像的分层
Docker镜像基础知识
- Dockerfile中的每个指令都会创建一个新的镜像层
- 镜像层将被缓存和复用
- 当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
镜像- - 某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效
- 镜像层是不可变的,如果在某一层中添加—个文件,然后在下一层中册除它,则镜像中依然会包含该文件
Docker镜像的创建
Docker镜像
- 应用发布的标准格式
- 支撑一个Docker容器的运行Docker镜像的创建方法
●基于已有镜像创建
●基于本地模板创建
●基于Dockerfile创建
创建的基础命令
基于已有镜像创建
将容器里面运行的程序及运行环境打包生成新的镜像
docker commit [选项] 容器lID/名称 仓库名称:[标签]
-m说明信息
-a作者信息
-p生成过程中停止容器的运行
基于本地模板创建
- 通过导入操作系统模板文件生成新的镜像
- 使用wget命令导入为本地镜像
wget
http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
- 导入成功后可查看本地镜像信息
docker images | grep new
基于Dockerfile创建
-
Dockerfile是由一组指令组成的文件Dockerfile结构四部分
●基础镜像信息
●维护者信息
●镜像操作指令
●容器启动时执行指令 -
Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以“#"号开头的注释
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
健康检查
案例环境
构建各类Docker镜像服务案例环境
主机 服务器
操作系统 Centos 7.4 x86-64
IP地址 20.0.0.18
版本 Docker 19.03.13
需求描述
●基于容器(现有镜像)创建镜像服务
●基于模板创建镜像服务
●基于Dockerfile 创建常用基础服务
基于现有镜像创建案例
[root@server1 ~] docker images #查看本地镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 8652b9f0cb4c 12 days ago 204MB
docker create -it centos:7 /bin/bash #创建本地容器
docker ps -a #查看本地容器的id
docker commit -m "first" -a "lol" c107483776e5 fir_docker:centos7 #基于容器创建本地镜像
[root@server1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
fir_docker centos7 9da393da38fd 6 minutes ago 204**加粗样式**MB
centos 7 8652b9f0cb4c 12 days ago 204MB
基于本地模板创建
先将模板上传至宿主机再进行操作
或者可以使用wget命令获取
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minim.tar.gz
获取完成后
[root@server1 ~] cat debian-7.0-x86-minimal.tar.gz | docker import - debian:jin
sha256:becee52554ca7d2e3eda84dd62d41e5363ef4bd1439ceaef1d760fef52a9880a
[root@server1 ~] docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
debian jin becee52554ca 7 seconds ago 215MB
fir_docker centos7 9da393da38fd 20 minutes ago 204MB
centos 7 8652b9f0cb4c 12 days ago 204MB
使用Dockerfile文件创建镜像
[root@server1 /] mkdir http #创建单个dockerfile的独立目录
[root@server1 /] cd http/
[root@server1 http] vi Dockerfile 在目录下创建Dockerfile文件 D一定要大写
FROM centos:7 #定义要使用的镜像 可以不是本地的 公共库的会自动下载
MAINTAINER first dockerfile #定义说明
RUN yum -y update #更新容器的yum库
RUN yum -y install httpd #安装httpd服务
EXPOSE 80 #开启80端口
ADD index.html /var/www/html/index.html #将当前目录下的index.html文件 挂载到容器的/var/www/html/下
ADD run.sh /run.sh #同上
RUN chmod 755 /run.sh #为脚本文件添加执行权限
CMD ["/run.sh"] #定义容器创建完成后执行的操作
保存退出
[root@server1 http] vim run.sh #编辑脚本文件
#!/bin/bash
rm -rf /run/httpd/* #删除run下的httpd进程文件
exec /usr/sbin/apachectl -D FOREGROUND #开启httpd服务
保存退出
[root@server1 http] vi index.html #定义http网页文件内容
this is first dockerfile web
[root@server1 http] docker build -t httpd:centos7 . #创建基于dockerfile的镜像
[root@server1 http] netstat -anptu | grep 4399 #查看本地要使用的端口是否开启
[root@server1 http] docker run -d -p 4399:80 httpd:centos7 #创建并执行一个容器 并映射容器的80端口到宿主机的4399端口
b2a86b6299fcc82ac35e6b8b42472562cf7d815f127d420ee9c897113cd06795
验证web是否成功开启
创建私有镜像库
docker pull registry #下载私有库镜像
vim /etc/docker/daemon.json #定义私有库的地址和端口
{
"insecure-registries": ["20.0.0.18:5000"],
"registry-mirrors": ["https://h73*****.mirror.aliyuncs.com"]
}
保存退出
docker create -it registry /bin/bash #创建私有库容器
docker ps -a
docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry #开启私有库容器 并将宿主机的/data/registry挂载到/tmp/registry registry下
docker tag nginx:latest 20.0.0.18:5000/nginx #重命名镜像名称为私有库地址+端口/镜像名
docker push 20.0.0.18:5000/nginx #上传
curl -XGET http://20.0.0.18:5000/v2/_catalog #查看私有库的日志文件 是否上传成功
curl -XGET http://20.0.0.18:5000/v2/_catalog
{"repositories":["nginx"]}
docker rmi 20.0.0.18:5000/nginx:latest #删除本地镜像 以便验证下载
docker pull 20.0.0.18:5000/nginx #下载镜像
docker images
[root@server1 http]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd centos7 42fdcbd2f4c5 About an hour ago 476MB
debian jin becee52554ca 2 hours ago 215MB
fir_docker centos7 9da393da38fd 2 hours ago 204MB
20.0.0.18:5000/nginx latest bc9a0695f571 33 hours ago 133MB
完成
创建docker数据卷
docker数据卷是将宿主机的目录挂载到容器下 实现文件共享
[root@server1 http]# docker run -v /var/www:/data1 --name web1 -it centos /bin/bash
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
3c72a8ed6814: Pull complete
Digest: sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd
Status: Downloaded newer image for centos:latest
[root@90f0c0845a14 /]# cd /data1/
[root@90f0c0845a14 data1]# touch a.txt
[root@90f0c0845a14 data1]# ls
a.txt
[root@90f0c0845a14 data1]# exit
exit
[root@server1 http]# cd /var/www/
[root@server1 www]# ll
总用量 0
-rw-r--r--. 1 root root 0 11月 26 17:19 a.txt
创建容器卷
容器卷理论上是容器与容器之间共享一个目录
docker ps -a
docker run --name web2 -v /data1 -v /data2 -it centos:7 /bin/bash
docker run -it --volumes-from web2 --name web3 centos:7 /bin/bash
[root@937b3f947ab4 /]# ls
anaconda-post.log data2 home media proc sbin tmp
bin dev lib mnt root srv usr
data1 etc lib64 opt run sys var
创建关联容器
创建2个互相关联的容器
[root@server1 www]# docker run -itd -P --name web4 centos:7 /bin/bashcc5fa2f0e9b346d6aca3e19146c5d552a2a7497bb7354231d38ca0df0f512d58
[root@server1 www]# docker run -itd -P --name web5 --link web4:web4 centos:7 /bin/bash
feff2e61bbb065ed8ae747fa29b6c0f27612614a35fabf36e3389cb7af6188e8
[root@server1 www]# docker exec -it web5 bash
[root@feff2e61bbb0 /]# ping web4
PING web4 (172.17.0.3) 56(84) bytes of data.
64 bytes from web4 (172.17.0.3): icmp_seq=1 ttl=64 time=0.057 ms
64 bytes from web4 (172.17.0.3): icmp_seq=2 ttl=64 time=0.039 ms
^C
--- web4 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.039/0.048/0.057/0.009 ms
完成
端口映射
-P是随机分配映射端口 -p是指定端口
随机端口是从32768开始每次递增
[root@server1 www]# docker run -d -P httpd:centos7
7abd6c347c797acdb4546a8d46ca3940daaf7251c9d061a94a26cffd318c46b7
[root@server1 www]# docker ps -a | grep http
7abd6c347c79 httpd:centos7 "/run.sh" 5 seconds ago Up 5 seconds 0.0.0.0:32768->80/tcp hopeful_shamir