关键词:
docker镜像的分层- Dockerfile 中的每个指令都会创建一个新的镜像层;
- 镜像层将会被缓存和复用;
- 当 Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效;
- 某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效;
- 镜像层是不变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然包含该文件
docker镜像
- 是应用发布的标准格式
- 可支撑一个docker容器的运行
docker镜像的创建方法
- 基于已有镜像创建
- 基于本地模板创建
- 基于dockerfile创建
基于已有镜像创建
将容器里面运行的程序及运行环境打包生成新的镜像
docker commit [选项] 容器ID/名称 仓库名称:[标签]
-m:说明信息
-a:作者信息
-p:生成过程中停止容器的运行
基于本地模板创建
- 通过导入操作系统模板文件生成新的镜像
- 使用wget命令导入为本地镜像
- 导入成功后可查看本地镜像信息
基于 Dockerfile 创建
- Dockerfile 是由一组指令组成的文件
- Dockerfile 结构的四部分
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时执行指令
- 使用 Dockerfile 创建镜像并在容器中运行
dockerfile操作指令
基于已有镜像创建
[root@localhost ~]# docker pull centos //下载镜像
[root@localhost ~]# docker create -it centos /bin/bash //基于centos镜像创建容器
30d395e63fc32b9dcf96029869f40a8002990f689410cca2660af4056ed2614f
[root@localhost ~]# docker ps -a //查看容器信息
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
30d395e63fc3 centos "/bin/bash" 7 seconds ago Created inspiring_germain
[root@localhost ~]# docker commit -m "new" -a "daoke" 30d395e63fc3 daoke:centos //将容器里面运行的程序及运行环境打包生成新的镜像
sha256:66d76f9225b94ce6156db953bd16c384f74067f981d45bee99340f3a965506d3
[root@localhost ~]# docker images //查看镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
daoke centos 66d76f9225b9 10 seconds ago 220MB
centos latest 0f3e07c0138f 3 months ago 220MB
基于本地模板创建
[root@localhost ~]# mount.cifs //192.168.100.3/LNMP-C7 /mnt/ //将本地模板挂载到Linux上
Password for root@//192.168.100.3/LNMP-C7:
[root@localhost ~]# cd /mnt //切换目录到/mnt
[root@localhost docker]# ls
debian-7.0-x86-minimal.tar.gz
[root@localhost mnt]# cat debian-7.0-x86-minimal.tar.gz | docker import - daoke:new //基于本地模板创建一个镜像
sha256:487145d2411f0440c50fd93d0e8a9e27610d2de745a25d06955f21c80e65753a
[root@localhost mnt]# docker images //查看镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
daoke new 487145d2411f 8 seconds ago 215MB
centos latest 0f3e07c0138f 3 months ago 220MB
基于dockefile文件创建
[root@localhost ~]# mkdir apache //创建一个目录
[root@localhost ~]# cd apache/
[root@localhost apache]# vim Dockerfile //编写一个dockerfile文件
FROM centos //基于的基础镜像
MAINTAINER The porject <xu> //维护镜像的用户信息
RUN yum -y update //镜像操作指令安装Apache软件
RUN yum -y install httpd //安装Apache服务
EXPOSE 80 //开启80端口
ADD index.html /var/www/html/index.html //复制网址首页文件
ADD run.sh /run.sh //将执行脚本复制到镜像中
RUN chmod 755 /run.sh
CMD ["/run.sh"] //启动容器时执行脚本
[root@localhost apache]# vim run.sh //编辑run.sh脚本
#!/bin/bash
rm -rf /run/httpd/* //清除缓存
exec /usr/sbin/apachectl -D FOREGROUND //执行apache
[root@localhost apache]# echo "this is test web" > index.html //创建页面信息
[root@localhost apache]# ls
Dockerfile index.html run.sh
[root@localhost apache]# docker build -t httpd:centos . //执行创建镜像
[root@localhost apache]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd centos b267aaf2c395 22 seconds ago 401MB
[root@localhost apache]# docker ps -a //此时没有容器生成
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost apache]# docker run -d -p 1234:80 httpd:centos //创建映射,创建容器
34c424efdab9e381116de697c4971200b1564b1e38644407cc58d5ba8923a0ea
[root@localhost apache]# docker ps -a //容器开启,1234是外部端口,80是内部端口
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
34c424efdab9 httpd:centos "/run.sh" 9 seconds ago Up 7 seconds 0.0.0.0:1234->80/tcp great_williamson
公有仓库与私有仓库
- 随着创建的镜像日志增多,就需要有一个保存镜像的地方,这就是仓库。目前主要有两种仓库:公共仓库、私有仓库。最方便的就是使用公共仓库上传和下载镜像,下载公共仓库中的镜像不需要注册,但是上传是需要注册的:公共仓库网址
公有仓库
//需要注册docker账号
//将创建好的 httpd:centos 镜像。上传到刚申请的公共仓库中:
docker tag httpd:centos xu/httpd:centos
docker push xu/httpd:centos
私有仓库
[root@localhost ~]# docker pull registry //下载 registry镜像
[root@localhost ~]# vim /etc/docker/daemon.json
"insecure-registries": ["192.168.13.128:5000"], //指定仓库地址和端口号
"registry-mirrors": ["https://3a8s9zx5.mirror.aliyuncs.com"] //镜像加速
[root@localhost ~]# systemctl stop docker //停止docker,开启docker
[root@localhost ~]# systemctl start docker
[root@localhost ~]# docker create -it registry /bin/bash //创建registry镜像容器
209dadd90f5c555ba328fae5763a61ae5fe4489acc4bfb945a99bb2307a9f139
[root@localhost ~]# docker ps -a //查看容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
209dadd90f5c registry "/entrypoint.sh /bin…" 4 seconds ago Created admiring_dewdney
34c424efdab9 httpd:centos "/run.sh" 13 minutes ago Exited (137) 35 seconds ago great_williamson
[root@localhost ~]# docker start 209dadd90f5c //开启容器
209dadd90f5c
[root@localhost ~]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry //创建映射端口和数据卷,宿主局的/data自动挂载容器重点的/tmp
fd4185499dfa29f1a1133f59b706a5524572ae3f22140137214ab4c8212ea8a4
[root@localhost ~]# docker images //查看一下当前的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd centos b267aaf2c395 17 minutes ago 401MB
centos latest 0f3e07c0138f 3 months ago 220MB
registry latest f32a97de94e1 10 months ago 25.8MB
[root@localhost ~]# docker tag httpd:centos 192.168.13.128:5000/httpd //修改标签
[root@localhost ~]# docker push 192.168.13.128:5000/httpd ##上传镜像
[root@localhost ~]# curl -XGET http://192.168.13.128:5000/v2/_catalog //获取私有仓库列表
"repositories":["httpd"]
[root@localhost ~]# docker pull 192.168.13.128:5000/httpd //通过私有仓库下载
Docker 网络通信
- docker 提供了映射容器端口到宿主机和容器互联机制来为容器提供网络服务。
端口映射
- Docker 提供端口映射机制来将容器内的服务提供给外部网络访问,实质上就是将宿主机的端口映射到容器中,使得外部网络访问宿主机的端口便可访问容器内的服务。
[root@localhost ~]# docker run -d -P nginx //随机指定端口 [root@localhost ~]# docker ps -a //查看容器 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bcd11c99804e nginx "nginx -g ‘daemon of…" 13 seconds ago Up 13 seconds 0.0.0.0:32768->80/tcp
利用浏览器访问32768端口
容器互联(使用centos镜像)
[root@localhost ~]# docker run -itd -P --name web1 centos /bin/bash //创建web1容器
87c58af3100fbc112bf344a421942dd53451c0c663b697a55a8d410868f314bf
[root@localhost ~]# docker run -itd -P --name web2 --link web1:web1 centos /bin/bash //创建web2连接web1容器
7a84075802b5689912c323196b5af398fb5912316efda014921c0e23d3e9cdd2
[root@localhost ~]# docker ps -a //查看容器信息
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7a84075802b5 centos "/bin/bash" 6 seconds ago Up 5 seconds web2
87c58af3100f centos "/bin/bash" 42 seconds ago Up 41 seconds web1
[root@localhost ~]# docker exec -it 7a84075802b5 /bin/bash //进入web2容器
[root@7a84075802b5 /]# ping web1 //pingweb1看是否互联互通
PING web1 (172.17.0.5) 56(84) bytes of data.
64 bytes from web1 (172.17.0.5): icmp_seq=1 ttl=64 time=0.090 ms
64 bytes from web1 (172.17.0.5): icmp_seq=2 ttl=64 time=0.089 ms
docker数据管理(数据卷容器/镜像创建)(代码片段)
Docker数据管理一.数据卷二.数据卷容器三.端口映射四.容器互联(使用centos镜像)五.Docker镜像创建1.基于现有镜像创建2.基于本地模板创建3.基于Dockerfile创建六.Docker案例管理Docker容器中数据主要有两种方式:数据卷ÿ... 查看详情
docker数据管理(数据卷容器/镜像创建)(代码片段)
Docker数据管理一.数据卷二.数据卷容器三.端口映射四.容器互联(使用centos镜像)五.Docker镜像创建1.基于现有镜像创建2.基于本地模板创建3.基于Dockerfile创建六.Docker案例管理Docker容器中数据主要有两种方式:数据卷ÿ... 查看详情
docker之容器管理常用命令篇(代码片段)
常用命令如下表:选项描述ls列出容器inspect查看一个或多个容器详细信息exec在运行容器中执行命令commit创建一个新镜像来自一个容器cp拷贝文件/文件夹到一个容器logs获取一个容器日志port列出或指定容器端口映射top显示一个容器... 查看详情
话说docker数据管理与端口映射(代码片段)
聊一聊docker数据管理与端口映射前言?前面两篇文章讲述的是构建docker镜像的三种方式以及如何搭建docker私有仓库,而本文将讲述有关docker中的数据管理及端口映射的内容。docker数据管理什么是docker的数据管理??先想一想关于Linu... 查看详情
docker基础之网络管理
...,可以通过-P或-p参数来指定端口映射。当使用-P标记时,Docker会随机映射一个49000~49900的端口到内部容器开放的网络端口。-p(小写的)则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有 ... 查看详情
docker——端口映射与容器互联
...器来说,容器之间就需要相互访问。除了网络访问之外,docker还提供了另外两种方式来满足服务的访问。 一:允许映射容器内应用的服务端口到本地宿主机; 二:互联网机制实现多个容器间通过容器名来快速访问;&nbs... 查看详情
docker之容器管理常用命令
dockercontainertopnginx01查看容器中运行的进程dockercontainerexec-itnginx01sh连接到容器内部dockercontainercommitbsbusybox:v2运行的容器bs增加了内容请如果想保存,可以用commit重新生成一个镜像,不过一般不建议这么做如果要改变镜像可以用docke... 查看详情
7.docker技术入门与实战---端口映射与容器互联(代码片段)
第7章 端口映射与容器互联 docker除了通过网络访问外,还提供两个很方便的功能来满足服务访问的基本需求: 1.允许映射容器内的应用端口到本地宿主机; 2.互联机制实现多个容器间通过容器名来快速访问。7.1 端口映射实... 查看详情
docker镜像管理1之镜像和容器的区别
之所以在之前没有讲什么是镜像和容器是因为如果你没有一个最初的认识,那么你就很难理解镜像和容器以及它们的区别。我相信在前面一章中的讲述中,你应该稍有体会容器是基于镜像构建的,同时构建了容器之后如果不删除... 查看详情
docker端口映射
...pd),然后再使用新镜像创建容器,并指定端口映射例子:dockercommit-m"centos_httpd"-a"aminglinux"313centos_httpd:hu说明:centos_httpd是容器的名字,hu 查看详情
修改docker容器的端口映射
大家都知道dockerrun可以指定端口映射,但是容器一旦生成,就没有一个命令可以直接修改。通常间接的办法是,保存镜像,再创建一个新的容器,在创建时指定新的端口映射。有没有办法不保存镜像而直接修改已有的这个容器呢... 查看详情
docker容器修改端口
...个端口进行映射)来指定宿主机和容器端口的映射,例如dockerrun-it-d--name[container-name]-p8088:80[image-name]这里是将容器内的80端口映射到宿主机的8088端口参数说明-d表示后台运行容器-t为docker分配一个伪终端并绑定到容器的标准输入... 查看详情
docker数据管理容器互联与镜像的创建编译(dockerfile)(代码片段)
目录前言一、Docker数据管理1.1数据卷1.2数据卷容器(--volumes-from)二、容器互联(--link)三、Docker镜像的创建3.1基于现有镜像创建新的镜像(commit)3.2使用本地模板创建(导入)镜像(import)... 查看详情
docker创建容器镜像端口映射失败
...创建多个容器,并映射端口出现以下错误,该怎么解决?docker:Errorresponsefromdaemon:driverfailedprogrammingexternalconnectivityonendpointmysql2(039404f00f8dc0059a1e2f9e1db0e1b5da82a3ae14f3117fbac8af6a0c6fe119):Errorstartinguserlandproxy:mkdir/port/tcp:0.0.0.0:3308:tcp:172.17.0.... 查看详情
docker端口映射与容器互联(代码片段)
...通过-P或-p参数来指定端口映射。当使用-P(大写)标记时,Docker会随机映射一个端口(端口范围在Linux系统使用的端口之外,一般都过万)到内部容器的开放网络端口:[[email protected]_0_9_centos~]#dockerrun-d-Ptraining/webapppythonapp.py5ebb13... 查看详情
docker实践之镜像启动及常用命令
参考技术A前面简单的介绍了如何在Linux中安装Docker,这节内容,我们学习Docker镜像启动我们Docker启动镜像从哪里来呢?镜像由我们自己或者他人构建,构建好的镜像可以直接放在本地或者上传到远程镜像仓库。当我们运行一个Doc... 查看详情
02docker命令大全(代码片段)
Docker命令大全说明:此文章内容来自于www.runoob.com网站整合;容器生命周期管理runstart/stop/restartkillrmpause/unpausecreateexec容器操作psinspecttopattacheventslogswaitexportport容器rootfs命令commitcpdiff镜像仓库loginpullpushsearch本地镜像管理imagesrmitagb... 查看详情
docker基础(代码片段)
1.一般虚拟机与docker2.docker的基本使用docker是cs架构,可以认为,镜像是Docker生命周期中的构建或者打包阶段,而容器则是启动或者执行阶段,容器基于镜像启动。Docker容器就是:一个镜像格式;一些列标准操作;一个执行环境。docker... 查看详情