文档:【官网】【中文文档】
视频:【尚硅谷_Docker核心技术(基础篇):课堂导图见评论】
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。
虚拟机
虚拟机模拟了一个完整的操作系统。
缺点:资源占用多;冗余步骤多;启动慢。
容器
另一种虚拟化技术:Linux容器。
Linux容器:将软件运行所需的所有资源打包到一个隔离的容器。与虚拟机不同,不需要捆绑整个操作系统,只需要软件工作所需的库资源和设置。
特点:
架构
docker 客户端、主机、仓库
三要素
docker run hello-world
docker run :查看本地有无hello-world镜像。有的话,以该镜像为模板生产容器实例运行。如果没有,则自动去阿里云下载这一镜像到本地,并以该镜像为模板生产容器实例运行。
service docker restart
插图
docker version
# 详细信息
docker info
# 帮助命令
docker --help
Docker:鲸鱼背上有集装箱
生活在蓝色大海里--------宿主机系统(Linux)
鲸鱼---------------docker
集装箱------------容器实例(来自镜像模板)
# 列出本地主机上的镜像
# -a:all(所有镜像,含中间镜像层,千层饼);-q:只显示镜像ID;--digests:显示摘要信息;--no-trunc:显示完整的镜像信息
docker images
# 查找Docker Hub某个镜像名字,例如tomcat
# -s 30:点赞数
docker search tomcat
# 拉取镜像
# 版本号缺省为lastest
docker pull
# 删除某个镜像,例如:hello-world
# -f:强制删除;空格级联可删除多个镜像;$(docker images -q):删除全部
docker rmi hello-world
# 启动容器
# -i:交互模式启动;-t:伪终端(可通用shell命令)
docker run -it [镜像ID/]
# 列出正在运行的容器进程
# -l:上一个容器;-n 3:上三次运行过的容器
docker ps
# 退出容器:两种方式
# exit:容器停止并退出
# ctrl+P+Q:容器不停止退出
# 重新以新名字启动容器
docker run -it --name hello hello-world
# 启动容器
docker start [已关闭的容器ID]
# 重启容器
docker restart [容器ID]
# 停止容器:慢慢关机
docker stop [容器ID]
# 停止容器:强制
docker kill [容器ID]
# 删除已停止的容器
docker rm [容器ID]
# 一次性删除所有容器
docker rm -f $(docker ps -a -q)
# 以守护方式启动(必须有前台进程,才能在docker ps显示)
docker run -d [容器]
# 查看容器日志
# -t:加入时间戳;-f:跟随最新的日志打印;--tail 数字:显示最后多少条
docker logs -f -t --tail [容器ID]
# 在centos终端sh执行循环每间隔2秒输出hello zzyy
docker run -d centos /bin/sh -c "while true;do echo hello zzyy;sleep 2;done"
# 查看容器中正在运行的进程
docker top [容器]
# 查看容器内部细节
docker inspect [容器ID]
'''进入正在运行的容器并以命令行交互(两种方式)'''
# attach:直接进入容器启动命令的终端,不会启动新的进程。
docker attach 容器ID
# exec:在容器中打开新的终端,并且可以启动新的进程。
docker exec
# 在宿主机外执行,直接看到结果
docker exec -t 容器ID ls -l /tmp
'''容器内拷贝文件到主机'''
# 拷贝容器/tmp/yum.log到主机root目录
docker cp 容器ID:/tmp/yum.log /root
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件。包含润兴某个软件所需的所有内存,包括代码、运行时、库、环境变量和配置文件。
镜像加载原理:镜像内部的文件系统,为联合文件系统,就像花卷,层层包含。
分层镜像:多层镜像构成。一层一层地打包,构成精简版的某一镜像。
特点:
docker commit 提交容器副本,成为一个新的镜像。
# 访问docker
# -p(主机端口):docker(容器端口);-P:随机分配端口
docker run -it -p 8888:8080 tomcat
# 浏览器打开localhost:8888,显示tomcat
# 修改之后,提交
docker commit -a="作者名" -m="提交的描述信息" 容器ID 目标镜像名:[版本标签]
为了保存数据,需要使用卷。类似于Redis中的rdb和aof文件。
特点:
3. 数据卷可在容器之间共享和重用数据
4. 卷中的更改可直接生效。
5. 数据卷中的更改不会包含在镜像的更新中。
6. 数据卷的生命周期一直持续到没有容器使用它为止。
数据卷在容器内添加。
两种添加方式:
DockerFile:Docker images的源码级描述。
'''1 直接命令添加数据卷'''
# 1. 连接宿主机目录和容器内目录
# -v:新建
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
# 2. 查看数据是否挂载成功
docker inspect 容器ID
# 3. 容器和宿主之间的数据共享:两者分别touch 新文件
# 4. 容器停止后,主机修改后数据是否同步:是完全同步
# 5. 添加(带权限)
# ro:只读
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
'''2 DockerFile添加数据卷'''
# 根目录下新建mydocker文件夹并进入
mkdir /mydocker
# 在DockerFile中使用 VOLUME指令 来给镜像添加一个或多个数据卷
# 1. DockerFile构建
vim Dockerfile
'
FROM centos
VOLUME ["/dataVolumeContainer1", "/dataVolumeContainer2"]
CMD echo "finished,----------success1"
CMD /bin/bash
'
# 2. build后生成一个新镜像
docker build -f /mydocker/Dockerfile -t zzyy/centos .
# 3. run 新的镜像
# 默认的交互共享目录,可通过docker inspect 容器ID 查看
注:Docker挂载主机目录Docker访问出现:cannot open dir:Permission denied。
解决办法:挂载目录后多加一个--privileged=true
参数即可。
数据卷容器:活动硬盘上挂载活动硬盘,实现数据的传递依赖。
'''容器间传递共享(--volumes-from)'''
# 1. 先启动一个父容器dc01
# --name:指定名字
docker run -it --name dc01 zzyy/centos
# 在容器卷中touch 新文件
# 2. dc02/dc03 继承自dc01
docker run -it --name dc02 --volumes-from dc01 zzyy/centos
docker run -it --name dc03 --volumes-from dc01 zzyy/centos
# 继承了之后,子容器修改也会影响父容器。实现继承和共享
# 删除dc01后,dc02修改后,dc03依然可以访问。
# 删除dc02后,dc03依然可以访问
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
Dockerfile
是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。www.hub.docker.com
查看Dockerfile文件Dockerfile的基础知识:
大致流程:
1 docker 从基础镜像运行一个容器。
2 执行一条指令并对容器作出修改。
3 执行类似 docker commit 的操作提交一个新的镜像层。
4 docker 再基于刚提交的镜像运行一个新容器。
5 执行 dockerfile 中的下一指令直到所有指令都执行完成。
Dockerfile
: 软件的原材料
Dockerfile镜像
:软件的交付品
Dockerfile容器
:软件的运行态
COPY src dest
或者 COPY ["src", "dest"]
docker run -it centos /bin/bash
# 初始centos运行镜像,进入的默认工作目录是/
# 默认不支持vim
# 默认不支持ifconfig
# 1. 编写dockerfile 文件
`
FROM centos
MAINTAINER atom<[email protected]>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD /bin/bash
`
# 2. 利用dockerfile构建镜像
docker build -f /mydocker/Dockerfile -t mycentos:1.2 .
# 3. 运行
docker run -it 新镜像名字:TAG
# 4. 列出镜像的变更历史
docker hository 镜像名
CMD
:容器运行时执行的命令,只能一次,会覆盖命令。
ENTRYPOINT
:容器运行时执行的命令,追加命令
'''CMD'''
`新 dockerfile 文件
FROM centos
RUN yum install -y curl
CMD ["curl", "-s", "http://ip.cn"]
`
`新加 -i 显示详细信息不好使
FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl", "-s", "http://ip.cn"]
`
# -i 带有报文头
docker run myip2 -i
'''ONBUILD'''
`
FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl", "-s", "http://ip.cn"]
ONBUILD RUN echo "father onbuild"
`
docker build -f /mydocker/Dockerfile -t myip_father:1.2 .
步骤:
mkdir -p /atom/mydockerfile/tomcat9
'''Dockerfile'''
FROM centos
MAINTAINER zzyy<[email protected]>
#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY c.txt /usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.8.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out
'''构建'''
docker build -t zzyytomcat9 .
'''run'''
docker run -d -p 9080:8080 --name myt9 -v /zzyyuse/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test -v /zzyyuse/mydockerfile/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.8/logs --privileged=true zzyytomcat9
'''验证'''
浏览器:localhost:9080