一、Docker 架构

image.png

二、命令

1、服务常用命令

  1. //查看版本:docker -v
  2. //启动:systemctl start docker
  3. //关闭:systemctl stop docker
  4. //开机启动:systemctl enable docker
  5. //查看docker服务状态:systemctl status docker
  6. //设置服务自动重启 docker update [服务Id] --restart=always

2、镜像常用命令

镜像查询:https://hub.docker.com/

  1. //查看镜像:docker images
  2. //搜索镜像:docker search redis
  3. //下载镜像:docker pull redis (默认最新)
  4. //下载指定镜像:docker pull redis:5.0.9(版本号可以再hub.docker.com查看)
  5. //删除指定镜像:docker rmi 50541622f4f1(image ID)
  6. // :docker rmi redis:latest
  7. //查看所有镜像Id:docker images -
  8. //删除所有镜像:docker rmi `docker images -q`
  9. //复制镜像中的内容:docker container cp nginx:/etc/nginx .

3、容器常用命令

3.1 容器运行

— link :alias 注释: container-name/container-id为源容器的container-name/container-id,alias为源容器在link下的别名 作用:链接两个容器,使得源容器(被链接的容器)和接收容器(主动去链接的容器)之间可以互相通信, 接收容器可以获取源容器的一些数据,eg: 源容器的环境变量
-i:保持一致运行,否则没有客户端连接时就会关闭
-t:给容器分配一个终端
-d:运行后台运行容器,及exit之后容器不会关闭;-t在exit后会关闭容器
—name=c1:给容器分配一个名字”c1”
/bin/bash:进入容器之后打开一个shell脚本,初始化

  1. //创建后直接进入容器运行:docker run -it --name=c1 centos:7 /bin/bash

image.png

  1. //创建后不直接进入:docker run -id --name=c2 centos:7
  2. //进入容器:docker exec -it c2 /bin/bash

3.2 查看正在运行的容器

-a查看历史容器,关闭和没关闭的

  1. //docker ps -a

3.3 关闭容器

  1. //docker stop c2

3.4 启动容器(后台运行)

  1. //docker start c2

3.5 删除容器

  1. //删除指定容器:docker rm c1
  2. //删除所有容器:docker rm `docker ps -aq`

3.6 查看容器信息

  1. //查看容器信息:docker inspect c2

三、Docker容器的数据卷

思考

  • Docker 容器删除后,在容器中产生的数据也会随之销毁
  • Docker 容器和外部机器可以直接交换文件吗?
  • 容器之间想要进行数据交互?

    1、数据卷概念及作用

  • 数据卷是宿主机中的一个目录或文件

  • 当容器目录和数据卷目录绑定后,对方的修改会立即同步
  • 一个数据卷可以被多个容器同时挂载
  • 一个容器也可以被挂载多个数据卷
  • 作用:容器数据持久化
    外部机器和容器间接通信
    容器之间数据交换

    2、配置数据卷

  • 创建启动容器时,使用-v参数 设置数据卷

  1. docker run ... v 宿主机目录(文件):容器内目录(文件) ...
  • 注意事项:
    1. 目录必须是绝对路径
    2. 如果目录不存在,会自动创建
    3. 可以挂载多个数据卷
  1. // 配置单核数据卷
  2. [root@iZuf6dfisey1v7so2hyzwtZ ~]# docker run -it --name=c1 -v /root/data:/root/data_container centos:7 /bin/bash
  3. [root@f42a3c582af6 /]# cd ~
  4. [root@f42a3c582af6 ~]# pwd
  5. /root
  6. [root@f42a3c582af6 ~]# ll
  7. total 4
  8. -rw------- 1 root root 3416 May 4 15:37 anaconda-ks.cfg
  9. drwxr-xr-x 2 root root 6 Aug 23 13:38 data_container
  10. // 一个容器可以挂载多个目录
  11. [root@iZuf6dfisey1v7so2hyzwtZ ~]# docker run -it --name=c2 \
  12. > -v ~/data2:/root/data2 \
  13. > -v ~/data3:/root/data3 \
  14. > centos:7
  15. [root@2b1d8b161140 /]# cd ~
  16. [root@2b1d8b161140 ~]# ll
  17. total 4
  18. -rw------- 1 root root 3416 May 4 15:37 anaconda-ks.cfg
  19. drwxr-xr-x 2 root root 6 Aug 23 13:48 data2
  20. drwxr-xr-x 2 root root 6 Aug 23 13:48 data3

3、数据卷容器

image.png

  • 创建启动c3数据卷容器,使用 –v 参数 设置数据卷

    1. // 一般都是 。。:。。 为什么这里没有冒号,因为数据卷容器默认地址
    2. docker run it --name=c3 v /volume centos:7 /bin/bash
  • 创建启动 c1 c2 容器,使用 –-volumes-from 参数 设置数据卷

    1. docker run it --name=c1 --volumes-from c3 centos:7 /bin/bash
    2. docker run -it --name=c2 --volumes-from c3 centos:7 /bin/bash

    4、小结

  • 数据卷概念

    • 宿主机的一个目录或文件
  • 数据卷作用
    • 容器数据持久化
    • 客户端和容器数据交换
    • 容器间数据交换
  • 数据卷容器

    • 创建一个容器,挂载一个目录,让其他容器继承自该容器( —volume-from )
    • 通过简单方式实现数据卷配置

      四、Dockerfile

      1、Docker 镜像原理

      思考

  • Docker 镜像本质是什么?

    • 是一个分层文件系统
  • Docker 中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个个G?
    • Centos的iso镜像文件包含bootfs和rootfs,而docker的centos镜像复用操作系统的bootfs,只有rootfs和其他镜像层
  • Docker 中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?

    • 由于docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所有整个对外暴露的tomcat镜像大小500多MB

      操作系统组成部分

  • 进程调度子系统

  • 进程通信子系统
  • 内存管理子系统
  • 设备管理子系统
  • 文件管理子系统
  • 网络通信子系统
  • 作业控制子系统

    Linux文件系统由bootfs和rootfs两部分组成

  • bootfs:包含bootloader(引导加载程序)和 kernel(内核)

  • rootfs: root文件系统,包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc等标准目录和文件
  • 不同的linux发行版,bootfs基本一样,而rootfs不同,如ubuntu,centos等

image.png
image.png

原理剖析

  • Docker镜像是由特殊的文件系统叠加而成
  • 最底端是 bootfs,并使用宿主机的bootfs
  • 第二层是 root文件系统rootfs,称为base image
  • 然后再往上可以叠加其他的镜像文件
  • 统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
  • 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。
  • 当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器

    2、镜像制作

    容器转为新的镜像

  1. # 新的镜像
  2. docker commit 容器id 镜像名称:版本号
  3. # 压缩文件 -0 outPut
  4. docker save -o 压缩文件名称 镜像名称:版本号
  5. # 压缩文件还原
  6. docker load i 压缩文件名称

image.png

实战

  1. docker commit 52e61cfa2ef0 myaipe_tomcat:1.0
  2. docker save -o myaipe_tomcat.tar myaipe_tomcat:1.0
  3. docker load -i myaipe_tomcat.tar
  4. docker run -it --name=new_tomcat myaipe_tomcat:1.0 bash

3、dockerfile概念

Dockerfile 是一个文本文件
包含了一条条的指令
每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
对于开发人员:可以为开发团队提供一个完全一致的开发环境
对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了
对于运维人员:在部署时,可以实现应用的无缝移植
网址:https://hub.docker.com

关键字 作用 备注
FROM 指定父镜像 指定dockerfile基于那个image构建
MAINTAINER 作者信息 用来标明这个dockerfile谁写的
LABEL 标签 用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看
RUN 执行命令 执行一段命令 默认是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1”,”param2”]
CMD 容器启动命令 提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD [“command” , “param1”,”param2”]
ENTRYPOINT 入口 一般在制作一些执行就关闭的容器中会使用
COPY 复制文件 build的时候复制文件到image中
ADD 添加文件 build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务
ENV 环境变量 指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV name=value
ARG 构建参数 构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数
VOLUME 定义外部可以挂载的数据卷 指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME [“目录”]
EXPOSE 暴露端口 定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp
WORKDIR 工作目录 指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径
USER 指定执行用户 指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户
HEALTHCHECK 健康检查 指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制
ONBUILD 触发器 当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大
STOPSIGNAL 发送信号量到宿主机 该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。
SHELL 指定执行脚本的shell 指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell

4、案例

4.1 自定义 centos7 镜像

要求:1、默认登录路径为 /usr 2、可以使用vim

  1. 定义父镜像:FROM centos:7
  2. 定义作者信息:MAINTAINER itheima <itheima@itcast.cn>
  3. 执行安装vim命令: RUN yum install -y vim
  4. 定义默认的工作目录:WORKDIR /usr
  5. 定义容器启动执行的命令:CMD /bin/bash
  6. 通过dockerfile构建镜像:docker bulid f dockerfile文件路径 t 镜像名称:版本
  7. # 成功
  8. Successfully built da89e23653bf
  9. Successfully tagged myaipe_centos:1
  10. [root@iZuf6dfisey1v7so2hyzwtZ docker-files]# docker images
  11. REPOSITORY TAG IMAGE ID CREATED SIZE
  12. myaipe_centos 1 da89e23653bf 2 minutes ago 351MB
  13. myaipe_tomcat 1.0 a6e0f1e75b5a 13 hours ago 530MB
  14. nginx 1.19 4bb46517cac3 13 days ago 133MB
  15. mysql 5.7 718a6da099d8 3 weeks ago 448MB
  16. tomcat 8.5 c142fa2ea808 3 weeks ago 530MB
  17. redis 5.0.9 071538dbbd71 5 weeks ago 98.3MB
  18. centos 7 b5b4d78bc90c 3 months ago 203MB
  19. [root@iZuf6dfisey1v7so2hyzwtZ docker-files]# docker run -it --name=c2 myaipe_centos:1
  20. [root@99afa13c72d6 usr]#

image.png

4.2 发布 SpringBoot 项目

  • 步骤

定义父镜像:FROM java:8
定义作者信息:MAINTAINER itheima itheima@itcast.cn
将jar包添加到容器: ADD springboot.jar app.jar
定义容器启动执行的命令:CMD java–jar app.jar
通过dockerfile构建镜像:docker bulid –f dockerfile文件路径 –t 镜像名称:版本

  1. docker run -id -p 9000:8081 app

image.png

五、Docker应用部署

docker 应用部署

六、Docker Compose

待定

七、Docker私有仓库

1、私有仓库搭建

  1. # 1、拉取私有仓库镜像
  2. docker pull registry
  3. # 2、启动私有仓库容器
  4. docker run -id --name=registry -p 5000:5000 registry
  5. # 3、打开浏览器 输入地址http://私有仓库服务器ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有仓库 搭建成功
  6. # 4、修改daemon.json
  7. vim /etc/docker/daemon.json
  8. # 在上述文件中添加一个key,保存退出。此步用于让 docker 信任私有仓库地址;注意将私有仓库服务器ip修改为自己私有仓库服务器真实ip
  9. {"insecure-registries":["私有仓库服务器ip:5000"]}
  10. # 5、重启docker 服务
  11. systemctl restart docker
  12. docker start registry

2、将镜像上传至私有仓库

  1. # 1、标记镜像为私有仓库的镜像
  2. docker tag centos:7 私有仓库服务器IP:5000/centos:7
  3. # 2、上传标记的镜像
  4. docker push 私有仓库服务器IP:5000/centos:7

3、 从私有仓库拉取镜像

  1. #拉取镜像
  2. docker pull 私有仓库服务器ip:5000/centos:7

八、Docker容器虚拟化与传统虚拟机的区别