入门Docker
Docker简介(构建、安装、运行、任何应用在任何地点)
是什么
解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术
Docker三要素:仓库Docker Hub存放镜像、镜像、容器
能干嘛
有了容器,就可以将软件运行所需的资源环境打包到一个隔离的容器中
容器内没有自己的内核,而且也没有进行硬件虚拟,因此容器要比传统虚拟机更轻便
缩小版浓缩版Linux系统
虚拟机的缺点:资源占用多、冗余步骤多、启动慢,
Linux容器不是模拟一个完整操作系统,而是对进程进行隔离,
去哪下
Docker安装
前提条件:运行在CentOS-7上,要求系统为64位,系统内核版本为3.10以上 查看版本:uname -r
运行在CentOS-6.5或更高的版本上,要求系统为64,内核版本为2.6.32-431或更高版本
Docker架构
Client Containers / Images Registry(阿里云、网易云)
docker build 容器Redis 镜像含 仓库中含
docker pull 容器Nginx Redis、Nginx Redis、Nging
docker run 容器Rs+Nx 镜像
镜像/容器/仓库
镜像就是一个只读的模板,镜像可以创建多个Docker容器,如:类和对象/容器好比是镜像的一个个实例
容器可以看做简易版Linux环境(中包括root用户权限、进程空间、用户空间、网络空间)和运行在其中的应用程序;Docker版CentOS仅为170M,只用了Linux内核
仓库分为公开库和私有库两种形式,国内公开库一般使用阿里云和网易云
有镜像才能创建容器,这是根本
安装步骤(CentOS-6.8)
yum install -y epel-release
yum install -y docker-io
安装后的配置文件:/etc/sysconfig/docker
启动Docker后台服务:service docker start
验证:docker version
安装步骤(CentOS-7)
HelloWorld官方提供的测试用!
阿里云镜像加速:配置步骤 (CentOS-6.8)
登录阿里云淘宝号即可
获得加速器地址链接
配置本地Docker运行镜像:/etc/sysconfig/docker
重新启动Docker服务:service docker restart
Linux系统下检查配置是否生效:ps -ef|grep docker
配置步骤 (CentOS-7)
vim /etc/docker/daemon.json
"registry"-mirrors":["https://aa25jngu.mirror.aliyuncs.com"]
systemctl daemon-reload
systemctl restart docker
网易云镜像加速:和阿里云类似
docker run hello-world运行后会提示:Pulling from hello-world表示:本地没有改镜像,会自动下载hello-world镜像并在容器内运行。
Docker是怎么工作的?
Docker是Client-Server结构的,Docker守护进程运行在主机上,
通过Socket连接从客户端访问守护进程,接收命令并管理运行在主机上的容器
为什么Docker运行比vm快?
镜像较大 镜像小
面向硬件的 面向软件的
虚拟机是分钟级的,Docker是秒级的不需要硬件虚拟,而不像vm需要处理cpu/内存消耗
Docker常用命令
技术都是想通的、万变不离其宗
命令分类:镜像命令、容器命令、帮助命令
帮助命令:
docker version 版本
docker info 版本描述
docker --help 帮助命令
(Linux:man帮助、marik创建目录、touch创建文件、pwd当前位置)
镜像命令(好几层!,分层)
docker images 列出本地所有镜像:REPOSITORY:标识镜像的仓库源,TAG镜像的标签,IMAGEID镜像ID,CREATED镜像创建时间,SIZE:镜像大小
-a 列出本地所有镜像的(中间层)
-q 只显示镜像ID
--digests
--no-trunc、
docker search 某个xxx镜像名称:如tomcat
-s 30 tomcat 过滤列出超过点赞数量的
docker pull tomcat 下载下来
docker rmi -f hello-world:3.2 (-f:强制删除)
docker rmi -f hello-world nginx (-f:删除多个)
容器命令
docker run -it centos 新建并启动交互式容器
--name mycentos0115 centos 容器别名
-i 以交互模式运行容器
-t 为容器分配终端, 通常和-i同时使用
-d 后台运行容器,返回容器ID,即为守护式容器
-P 随机端口映射
-p 指定端口映射,有以下四种格式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
docker ps 查看已启动的容器
-a 历史运行记录
-l 上一次运行的
-n 3 上3次运行的
-q 只显示容器编号
exit 容器退出停止
Ctrl+P+Q 容器退出不停止
docker start 容器ID编号, 启动容器
docker restart 容器ID编号,重启容器
docker stop 容器ID编号,关闭容器
docker kill 容器ID编号,强制关闭容器
docker rm 容器ID编号,删除容器
重点 docker run -d centos 启动容器守护进程 (有些需要运行后台或前台,Docker容器后台运行,必须有一个前台进程)
docker run -d centos /bin/sh -c"while true;do echo hello zzyy;sleep 2;done"
docker logs -t -f --tail 3 容器ID编号, 查看容器日志
docker top 容器ID编号,查看容器内运行的进程
docker inspct 容器ID编号,查看容器内部细节
docker attach 容器ID编号,进入正在运行的容器并以命令行交互
exec -t 容器ID编号,ls /../.. 在外边操作容器
docker cp 容器ID编号:/tmp/yum.log /root,从容器内拷贝文件到主机上(容器中数据持久化)
Docker镜像(轻量级,可独立运行的软件包)
UnionFS(联合文件系统)(花卷)
Docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS
在Docker镜像的最底层是bootfs,
分层的镜像
分层特点:资源共享(下载多次得以体现)
Docker镜像commit操作
docker run -it -p 8888:8080 tomcat
docker run -it iP tomcat
docker commit提交容器副本使之成为一个新的镜像
docker commit -a="作者" -m="提交的描述信息" 容器ID 要创建的目标镜像名:[标签名 ]
docker commit -a="zzyy" -m="del tomcat docs" 容器iD编号 atguigu/mytomcat:1.2
Docker容器数据卷(-v 添加容器卷)
做持久化,容器间的共享数据,类似rdb,aof
特点:
数据卷可在容器之间共享或重用数据
卷中的更改可以直接生效
数据卷中的更改不会包含在镜像的更新中
数据卷的生命周期一直持续到没有容器使用它为止
容器内添加
命令:
1.docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
docker run -it -v /myDataVolume:/dataVolumeContainer centos
2.查看数据卷是否挂载成功
docker inspect 容器ID编号
3.容器和宿主机之间数据共享
vi host.txt,同步(容器)也会创建
4.容器停止退出后,主机修改后数据是否同步
exit
vi host1.txt
是同步
5.命令(带权限)
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos:只允许容器读,不可写
JavaEE Hello.java ==> Hello.class
Docker images ==> DockerFile
DockerFile方式 添加 容器数据卷
1.根目录下新建mydocker文件夹进入
2.可在Dockerfile中使用"VOLUME指令"来给镜像添加一个或多个数据卷
3.DockerFile构建
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,----------success1" 打印
CMD /bin/bash
4.build后生成镜像
docker build -f /mydocker/Dockerfile -t zzyy/centos .
docker images
5.run容器
docker run -it zzyy/centos
(通过DockerFile方式没有指定宿主机目录也会默认有)
docker ps
docker inspect 容器ID编号
vi host1.txt
数据卷容器(容器间传递共享--volumes-from)
容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止!
docker run -it --name dc01 zzyy/centos(//zzyy/centos自己的新建的容器)
docker run -it --name dc02 --volumes-from dc01 zzyy/centos
docker run -it --name dc03 --volumes-from dc01 zzyy/centos
docker attach dc01
pwd
ll
父到子容器,子到父容器都可共享
删除父容器子容器不受影响
DockerFile解析
DockerFile是用来构建Docker镜像的构建文件,由一系列命令和参数构成的脚本。
构建三步骤:编写DockerFile文件、Docker buile构建、docker run运行
FROM scratch //元镜像、祖先镜像
MAINTAINER The CentOS Project <cloud-ops@centos.org>//作者邮箱
ADD c68-docker.tar.xz / //压缩
LABEL name="CentOS Base Image" \//说明
vendor = "CentOS" \
license = "GPLv2" \
build-date = "2016-06-02"
#
CMD ["/bin/bash"]//
Dockerfile面向开发、Docker镜像为交付标准、Docker容器则涉及部署与运维,缺一不可,Docker体系基石
DockerFile体系结构(保留字指令)
FROM 继承、当前镜像基于那个镜像
MAINTAINER 描述
RUN 容器构建时需要运行的命令,如要需下载的命令
EXPOSE 容器对外暴露的端口
WORKDIR 启动时容器时的根目录,默认是:/ 根目录(pwd)
ENV 设置环境变量
ADD 拷贝压缩文件
COPY 拷贝
VOLUME 创建容器数据卷、用于数据保存/持久化工作
CMD 容器启动时运行的命令(可有多个、但只最后一个生效)
ENTRYPOINT 和CMD类似、CMD在人工写了时候会被覆盖、ENTRYPOINT会追加并不覆盖
ONBUILD 类似于触发器
自定义镜像(案例)
编写 from centos
MAINTAINER 王路凯 18303051935@163.com
ENV mypath /tmp
Workdir $mypath
RUN yum -y install vim
RUN yum -y install net-tools
Expose 80
CMD "bin/bash"
build
docker build -f /mydocker/Dockerfile2 -t mycentos:1.3
docker images
run
docker run -it mycentos:1.3
-ls (会覆盖CMD)
查看镜像生成时变更历史:
docker history 容器ID编号
案例定义tomcat9镜像
留给自己将来的作业!!!
--privileged=true//写软权限不够的话加
docker exec 容器ID编号 java -version
主机中改了项目,容器中的web项目也改(通过容器卷)
push 没讲呢(发布阿里云用)
Docker常用安装
自己安装Tomcat
自己安装Mysql
自己安装Redis
本地镜像发布到阿里云
创建镜像两种方式:Dockerfile ,commit
找脑图!
------------------------------------------------------------------------------