【Docker核心技术】:Docker基础篇笔记

hello, docker

  • 资料
  • 简介
    • 是什么
    • 能干什么
    • Docker 三要素
    • 阿里云/网易云镜像加速
    • 运行底层原理
  • 常用命令
  • 镜像
    • 镜像原理
    • 镜像commit
  • 容器数据卷
    • 添加数据卷:数据共享
  • Dockerfile
    • Dockerfile构建过程解析
    • Dockerfile 体系结构(保留字指令)
    • Dockerfile案例
      • 自定义镜像mycentos
      • 命令案例
      • 自定义 tomcat9

资料

文档:【官网】【中文文档】
视频:【尚硅谷_Docker核心技术(基础篇):课堂导图见评论】

简介

是什么

Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。

能干什么

  • 虚拟机
    虚拟机模拟了一个完整的操作系统。
    缺点:资源占用多;冗余步骤多;启动慢。

  • 容器
    另一种虚拟化技术:Linux容器。
    Linux容器:将软件运行所需的所有资源打包到一个隔离的容器。与虚拟机不同,不需要捆绑整个操作系统,只需要软件工作所需的库资源和设置。
    特点:

  1. 系统更加高效轻量,并保证部署任何环境中的软件都能始终如一地运行。
  2. 每个容器之间互相隔离,每个容器都有自己的文件系统,容器之间进程不会互相影响,能区分计算资源。

Docker 三要素

  • 架构
    docker 客户端、主机、仓库

  • 三要素

  1. 镜像(Image):相当于只读模板,用来创建Docker容器。
  2. 容器(container):实例,独立运行的一个或一组应用。仅包含运行环境,相当于一个简易版的Linux环境。
  3. 仓库(repository):集中存放镜像文件的场所。例如Docker Hub或者阿里云容器服务。

阿里云/网易云镜像加速

docker run hello-world

docker run :查看本地有无hello-world镜像。有的话,以该镜像为模板生产容器实例运行。如果没有,则自动去阿里云下载这一镜像到本地,并以该镜像为模板生产容器实例运行。

运行底层原理

service docker restart
  • Docker 比VM快
  1. 更少的抽象层。不需要实现硬件资源虚拟化。
  2. 利用的宿主机的内核。

插图

常用命令

  • 帮助命令:
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

镜像

镜像原理

  • 含义

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件。包含润兴某个软件所需的所有内存,包括代码、运行时、库、环境变量和配置文件。

镜像加载原理:镜像内部的文件系统,为联合文件系统,就像花卷,层层包含。

分层镜像:多层镜像构成。一层一层地打包,构成精简版的某一镜像。

特点:

  1. 镜像都是只读的
  2. 当容器启动时,一个新的可写层被加载到镜像的顶部,这一层被称作“容器层”,容器层之下的都叫做镜像层。

镜像commit

docker commit 提交容器副本,成为一个新的镜像。

# 访问docker
# -p(主机端口):docker(容器端口);-P:随机分配端口
docker run -it -p 8888:8080 tomcat
# 浏览器打开localhost:8888,显示tomcat

# 修改之后,提交
docker commit -a="作者名" -m="提交的描述信息" 容器ID 目标镜像名:[版本标签]

容器数据卷

  • 是什么
  1. 关闭容器,数据可能丢失,因此需要数据持久化。
  2. 容器之间希望头可能共享数据。

为了保存数据,需要使用卷。类似于Redis中的rdb和aof文件。

  • 能干嘛
  1. 容器的持久化
  2. 容器间继承+共享数据

特点:
3. 数据卷可在容器之间共享和重用数据
4. 卷中的更改可直接生效。
5. 数据卷中的更改不会包含在镜像的更新中。
6. 数据卷的生命周期一直持续到没有容器使用它为止。

添加数据卷:数据共享

数据卷在容器内添加。
两种添加方式:

  • 直接命令行添加
  • DockerFile添加

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参数即可。

数据卷容器:活动硬盘上挂载活动硬盘,实现数据的传递依赖。

  • 以上一步新建的镜像zzyy/centos为模板并运行容器dc01/dc02/dc03
  • 它们已经具有容器卷("/dataVolumeContainer1", “/dataVolumeContainer2”)
'''容器间传递共享(--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

  • 概念:Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
  • 三步骤:编写Dockerfile文件、docker build、docker run。
  • 可用过www.hub.docker.com查看Dockerfile文件

Dockerfile构建过程解析

Dockerfile的基础知识:

  1. 每条保留字指令都必须为大写字母且后面要跟随至少一个参数。
  2. 指令按照从上到下,顺序执行。
  3. #表示注释
  4. 每条指令都会创建一个新的镜像层,并对镜像进行提交。

大致流程:
1 docker 从基础镜像运行一个容器。
2 执行一条指令并对容器作出修改。
3 执行类似 docker commit 的操作提交一个新的镜像层。
4 docker 再基于刚提交的镜像运行一个新容器。
5 执行 dockerfile 中的下一指令直到所有指令都执行完成。

Dockerfile : 软件的原材料
Dockerfile镜像:软件的交付品
Dockerfile容器:软件的运行态

Dockerfile 体系结构(保留字指令)

  • FROM : 基础镜像,基于哪个镜像
  • MAINTAINER:镜像维护者的姓名和邮箱
  • RUN: 容器构建时需要运行的指令
  • EXPOSE: 当前容器对外暴露出的端口
  • WORKDIR: 指定在创建容器后,终端默认登录的工作目录
  • ENV: 用来在构建镜像过程中设置环境变量
  • ADD: 将宿主目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
  • COPY: 类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置。例如:COPY src dest 或者 COPY ["src", "dest"]
  • VILUME: 容器数据卷,同于数据保存和持久化工作
  • CMD: 指定一个容器启动时要运行的命令。Dockerfile 中可有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数替换
  • ENTRYPOINT:指定一个容器启动时要运行的命令(追加指令)。ENTRYPOINT的目的与COPY一样,都是在指定容器启动程序及参数
  • ONBUILD: 当构建一个被继承的Dockerfile时运行命令,父镜像在被子镜像集成后父镜像的onbuild被触发。

Dockerfile案例

自定义镜像mycentos

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 .

自定义 tomcat9

步骤:

  1. 创建目录: mkdir -p /atom/mydockerfile/tomcat9
  2. 在上述目录下 touch c.txt
  3. 将jdk 和 tomcat 安装的压缩包拷贝进上一步目录(apache-tomcat-9.0.8.tar.gz、jdk-8u171-linux-x64.tar.gz)
  4. 在/atom/mydockerfile/tomcat9目录下新建Dockerfile文件
'''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

你可能感兴趣的:(云计算,Docker)