一、Docker介绍

1、三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等,可以把容器看成是一个简易版的linux环境
  • 仓库(Repository):仓库可看着一个代码控制中心,用来保存镜像。

2、架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kjLuWSw1-1605699186060)(E:\软件学习\学习笔记\images\docker架构.png)]

概念 说明
Docker 镜像(Images) Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。
Docker 容器(Container) 容器是独立运行的一个或一组应用,是镜像运行时的实体。
Docker 客户端(Client) Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。
Docker 主机(Host) 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker Registry Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
Docker Machine Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

二、安装(CentOS7)

0、查看系统内核(3.10以上)

$ uname -r

1.卸载旧版本

$ yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine

2、yum安装gcc相关

$ yum -y install gcc
$ yum -y install gcc-c++
查看gcc 版本
$ gcc -v

3、安装软件包

$ yum install -y yum-utils device-mapper-persistent-data lvm2

4、设置stable镜像仓库

$ yum-config-manager \--add-repo \http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

5、更新yum软件包索引

$ yum makecache fast

6、安装docker CE

$ yum -y install docker-ce

7、启动docker

$ systemctl start docker

8、测试

  • 查看版本号
$ docker version
  • 运行 hello-world
$ docker run hello-world
  • 查看镜像
$ docker images

9、配置阿里云加速器

$ mkdir -p /etc/docker
$ vim  /etc/docker/daemon.json
在文件中添加如下配置
#网易云镜像加速器
{"registry-mirrors": ["http://hub-mirror.c.163.com"] }
#阿里云镜像加速器
{"registry-mirrors": ["http://自己的编码.mirror.aliyuncs.com"] }
{"registry-mirrors": ["https://5d17jo71.mirror.aliyuncs.com"]}
$ systemctl daemon-reload
$ systemctl restart docker

10、卸载

$ systemctl stop docker
$ yum -y remove docker-ce
$ rm -rf /var/lib/docker

三、命令

1、帮助命令

  • docker version ----查看版本号
  • docker info -----查看信息
  • docker --help ----查看帮助

2、镜像命令

  • docker images -----列出本地主机上的镜像

    • Option说明

      • -a:列出本地所有的镜像
      • -q:只显示镜像ID
      • –digests:显示镜像的再要信息
      • –no-trunc:显示完整的镜像信息
  • docker search 某个镜像的名字 ----------从hub.docker.com上查找镜像

    • Option说明:

      • -s:列出点赞数不小于指定值的镜像
      • –no-trunc:显示完整的镜像信息
      • –automated:只列出automated build 类型的镜像
  • docker pull 某个镜像的名字 -----下载镜像

    • docker pull 某个镜像的名字:TAG
  • docker rmi 某个镜像的名字 /ID

    • docker rmi -f 镜像ID:TAG ---------删除单个
    • docker rmi -f 镜像ID1:TAG 镜像ID2:TAG 镜像ID3:TAG---------删除多个
    • docker rmi -f $(docker images -qa)---------删除全部

3、容器命令

(1)新建并启动容器

  • docker run [OPTIONS] IMAGE [COMMAND] [ARG…]

    • OPTIONS

      • –name=“容器名字”:为容器指定一个名称
      • -d:后台运行容器,并返回容器ID(启动守护式容器)
        • 注意:docker容器后台运行,就必须有一个前台进程,容器运行的命令如果不是那些一直挂起的命令(top,tail),就会自动退出
      • -i:以交互模式运行容器,通常与-t同时使用
      • -t:为容器重新分配一个伪输入终端,通常与-i同时使用
      • -P:随机端口映射
      • -p:指定端口映射,有以下四种格式
        • ip:hostPort:containerPort
        • ip::containerPort
        • hostPort:containerPort
        • containerPort

(2)列出正在运行的容器

  • docker ps [OPTIONS]

    • OPTIONS

      • -a:列出当前所有正在运行的容器+历史上运行过的容器
      • -l:显示最近创建的容器
      • -n:显示最近n个创建的容器
      • -q:静默模式,只显示容器编号
      • –no-trunc:不截断输出

(3)退出容器

  • exit-----容器停止退出

  • ctrl+P+Q-----容器不停止退出

  • docker attach 容器ID ------进入容器

  • docker exec [OPTIONS] CONTAINER COMMAND [ARG…] ------进入容器

    • 推荐使用 docker exec 命令,因为此命令会打开新的进程,退出容器终端时不会导致容器的停止

      docker exec -t 容器ID /bin/bash

(4)容器的启动、停止与删除

  • docker start 容器ID或者容器名------启动一个容器
  • docker restart 容器ID或者容器名-----重启一个容器
  • docker stop 容器ID或者容器名-----停止一个容器
  • docker kill 容器ID或者容器名-----强制停止一个容器
  • docker rm 容器ID或者容器名-----删除一个容器
  • docker rm -f $(docker ps -a -q)—一次性删除所有容器

(5)其他重要的命令

  • docker logs -f -t --tail n 容器ID -----------查看容器日志

    • -t:加入时间戳
    • -f:跟随最新的日志打印
    • –tail n:数字显示最后n条
  • docker top 容器ID -------------查看容器内运行的进程
  • docker inspect 容器ID ----------查看容器内部细节
  • docker cp 容器ID:容器内路径 目的主机的路径 ---------从容器拷贝文件到主机

四、镜像

1、定义

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

(1)UnionFS(联合文件系统)

  • Union文件系统(UnionFS)是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次一次提交来一层一层的叠加,同时将不同目录挂载到同一个虚拟文件系统下(union serveral directories into a single virture filesystem).Union文件系统是docker镜像的基础。镜像可以通过分层进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

  • 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件会包含所有的底层的文件和目录。

(2) Docker镜像加载原理

  • docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

  • bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。

  • 这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

  • rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q5E1LIWJ-1605699186063)(E:\软件学习\学习笔记\images\bootf-rootfs.png)]

平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M??

原因:对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。

(3)分层的镜像

以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载

拉取ubuntu镜像:

hadoop@Docker:~$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
473ede7ed136: Pull complete
c46b5fa4d940: Pull complete
93ae3df89c92: Pull complete
6b1eed27cade: Pull complete
Digest: sha256:29934af957c53004d7fb6340139880d23fb1952505a15d69a03af0d1418878cb
Status: Downloaded newer image for ubuntu:latest
hadoop@Docker:~$

以tomcat为例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ScWJrbhF-1605699186066)(E:\软件学习\学习笔记\images\tomcat-docker.png)]

(4)为什么 Docker 镜像要采用这种分层结构呢?

  • 最大的一个好处就是 - 共享资源

  • 比如:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,同时内存中也只需加载一份 base 镜像,就可以 为所有容器服务了。而且镜像的每一层都可以被共享。

2、特点

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

3、Docker镜像commit操作补充

  • docker commit提交容器副本使之成为一个新的镜像
docker commit 5133726067ed nju/mytomcat:1.1
  • docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
docker commit -a="zzyy" -m="tomcat without docs" 5133726067ed nju/mytomcat:1.2

详情见:https://blog.csdn.net/kaizuidebanli/article/details/83750972

五、Docker容器数据卷

https://blog.csdn.net/kaizuidebanli/article/details/83754627

1、定义

  • Docker的理念:

    • 将运行的代码和运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
    • 容器之间希望有可能共享数据
  • Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。为了能保存数据在docker中我们使用卷。

2、作用

  • 容器的持久化
  • 容器间继承+共享数据

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

3、特点

  • 数据卷可在容器之间共享或重用数据
  • 卷中的更改可以直接生效
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止

4、数据卷–容器内添加

(1)直接命令添加

  • 添加

    • docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名 -------可读写
docker run -it -v /myDataVolume:/dataVolumeContainer centos
  • 查看数据卷是否挂载成功

  • docker inspect 容器ID

  • 容器和宿主机之间数据共享

    • 在docker主机目录/myDataVolume上创建一个文件,并添加一些内容:
    vi hello.txt// 文件内容如下
    hadoop@Docker:/myDataVolume$ cat hello.txt
    hao
    lasfhadoop@Docker:/myDataVolume$
    
    • 查看容器上的/dataVolumeContainer目录下是否有hello.txt文件
    [root@45b281cc22d4 dataVolumeContainer]# ls
    hello.txt
    [root@45b281cc22d4 dataVolumeContainer]# cat hello.txt
    hao
    lasf[root@45b281cc22d4 dataVolumeContainer]#
    
  • 容器停止退出后,主机修改后数据是否同步

    • 我们把容器关闭之后。测试修改docker主机下/myDataVolume的内容,容器/dataVolumeContainer目录下的内容是否会同步更新
    • centos主机已经关闭了,我们修改docker主机的内容。
    • 重新启动centos容器,查看。
    • 文件内容是同步修改了的。
  • 命令(带权限)

    • docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 ---------容器只能读不能写

      docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos
      

(2)DockerFile添加

  • 根目录下新建mydocker文件夹并进入

    mkdir mydocker
    cd mydocker
    
  • 可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷

    VOLUME["/dataVolumeContainer1","/dataVolumeContainer2"]
    
  • File构建

    vim Dockerfile#  volume test
    FROM centos
    VOLUME["/dataVolumeContainer1","/dataVolumeContainer2"]
    CMD echo "finish,--------------------success "
    CMD /bin/bashhadoop@Docker:/mydocker$ 
  • build后生成镜像

    docker build -f /mydocker/Dockerfile -t zzyy/centos .# 参数说明
    -f : 指明Dockerfile所在的位置
    -t : 命名空间
    .  : 表示当前路径
    
  • 查看Docker主机的image

  • run容器

  • 查看对应的主机容器

    docker inspect 容器ID

Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied

解决办法:在挂载目录后多加一个–privileged=true参数即可

5、数据卷容器

https://blog.csdn.net/kaizuidebanli/article/details/83756663

(1)定义

  • 命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。也就是,活动硬盘上面挂活动硬盘,实现数据的传递依赖。

(2)容器间传递共享(–volumes-from)

  • 先启动一个父容器dc01

    docker run -it --name dc01 镜像ID
    docker start dc01
  • dc02/dc03继承自dc01

    ocker run -it --name dc02 --volumes-from dc01 镜像ID
    docker run -it --name dc03 --volumes-from dc01 镜像ID
    
  • 回到dc01可以看到02/03各自添加的都能共享了

  • 删除dc01,dc02修改后dc03可以访问

  • 删除dc02后dc03可否访问:依然可以访问

  • 新建dc04继承dc03后再删除dc03

结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止

六、Dockerfile

1、定义

  • Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。

2、构建步骤

  • 编写Dockerfile文件
  • docker build
  • docker run

3、文件样子

FROM scratch   ## 所有镜像文件的祖先类
ADD centos-7-docker.tar.xz /LABEL org.label-schema.schema-version="1.0" \org.label-schema.name="CentOS Base Image" \org.label-schema.vendor="CentOS" \org.label-schema.license="GPLv2" \org.label-schema.build-date="20181006"CMD ["/bin/bash"]

七、实例

1、安装tomcat

docker run -p 8080:8080 --name mytomcat \
-v /lixp/tomcat/webapps:/usr/local/tomcat/webapps \
-d tomcat:9.0.31-jdk8

2、安装mysql

  • 下载mysql

    docker pull mysql:5.6
    
  • 安装mysql

    docker run -p 3306:3306 --name mysql \
    -v /lixp/mysql/conf:/etc/mysql/conf.d \
    -v /lixp/mysql/logs:/logs \
    -v /lixp/mysql/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=root@123456 \
    -d mysql:5.6

2、安装redis

  • 下载redis

    docker pull redis:3.2
    
  • 安装

    docker run -p 6379:6379 \
    -v /lixp/redis/data:/data \
    -v /lixp/redis/conf/redis/conf:/usr/local/etc/redis/redis.conf \
    -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf \
    -- appendonly yes
    

八、本地镜像发布到阿里云

Docker基础学习和使用方法相关推荐

  1. docker基础学习中遇到的一些问题

    docker基础学习中遇到的有关tomcat的一些问题 最近在学docekr,对docker的基础操作有了一些认识,并试着做了一些实操,但是在实操过程中遇到了一些问题.有些已经解决,有些还未解决.现在 ...

  2. 零基础学习Java的方法有哪些?

    零基础学Java只要方法得当,依然有机会学习好Java编程.初学Java就像交朋友从陌生到熟悉再到铁杆搭档一生相伴,随着学习的深入,你会发现学Java并不是想象的那样枯燥和困难,甚至还有一些美妙之感, ...

  3. Docker基础学习笔记( 搭建web漏洞检测环境和容器中运行Django项目)

    目录 一.Docker技术的学习 1.1.docker安装(ubuntu16.04) 1.1.1.apt-get换国内清华源 1.1.2.安装最新版本的Docker 1.2.docker容器与镜像使用 ...

  4. Docker基础学习

    入门docker在网上查了很多的资料,也看了不少视频,最后都是云里雾里的,最终也是看到这位大佬写的关于docker的技术文档,觉得很受用,推荐和宣传一下 Docker -- 从入门到实践 如果觉得基础

  5. Docker基础学习笔记

    Docker 理念 Docker是基于Go语言实现的云开源项目. 基本概念 容器:实例对象,是一个集装箱,可以把容器看作简易版的Linux环境: 镜像:只读的模板,用来创建容器.可以创建多个容器,例如 ...

  6. python基础学习——函数和方法的区别与联系

    以下是综合多家说法的个人理解总结,仅为做到理解它们的区别与联系,不保证严谨. 函数 函数是封装了一些独立的功能,可以直接调用,python内置了许多函数,同时可以自建函数来使用. 独立的函数是函数(像 ...

  7. python函数和方法概念_python基础学习——函数和方法的区别与联系

    以下是综合多家说法的个人理解总结,仅为做到理解它们的区别与联系,不保证严谨. 函数 函数是封装了一些独立的功能,可以直接调用,python内置了许多函数,同时可以自建函数来使用. 独立的函数是函数(像 ...

  8. Docker基础学习笔记02:Docker基本操作

    文章目录 一.Docker镜像操作 (一)拉取镜像到本地 1.命令格式 2.操作演示 (二)查看本地镜像 (三)删除本地镜像 任务1:删除本地指定镜像 任务2:删除全部本地镜像 任务3.拉取镜像到本地 ...

  9. Docker基础学习笔记01:Docker安装

    文章目录 一.Docker概述 (一)Docker为何物 (二)Docker思想 1.集装箱 2.标准化 3.隔离性 二.在私有云上创建虚拟机 (一)登录OpenStack私有云 1.查看[概览] 2 ...

最新文章

  1. 聊聊前后端分离的接口规范
  2. C#读取文本文件和C# 写文本文件
  3. Linux Mint Root
  4. android右上角设置按钮,Android:如何在右上角的按钮角添加三角形
  5. Laravel入门:MVC框架
  6. 【BZOJ1452】【JSOI2009】count
  7. 深度学习推荐模型-DeepFM
  8. 遍历python字典几种方法
  9. 学子商城实训项目总结
  10. oracle建表的方法,oracle建表语句
  11. 同样磁盘数,不同raid级别的随机IO性能差异对比
  12. win7指定网络名不再可用
  13. 哈夫曼实现文件压缩解压缩(c语言)
  14. 【juns项目】信用卡数据项目2-1:需求和效果展示
  15. C++11新特性——std::bind参数绑定
  16. 拿走不谢,最全匹配中国大陆手机号码的正则表达式
  17. 中国哲学史(先秦部分)-------简答
  18. pyTest官方手册(Release 4.2)之蹩脚翻译(9)
  19. 流量、技术、超级APP,百度吹响国潮IP进攻号
  20. bootstrap框架之面包屑导航(Breadcrumbs)

热门文章

  1. 基于Origin2019:多Y轴图绘制
  2. 怎样更改计算机网络密码怎么办,宽带密码修改后wifi上不了网怎么办?
  3. 猫咪去哪儿了(GIS版)——用Google Earth上的GPS追踪喵星人
  4. 了解sql server、SSIS、SSAS、SSRS
  5. 百度飞浆-语音转文字、语音识别使用过程的问题
  6. 蓝桥杯试题:核桃的数量(C/C++)
  7. 对于刚工作不久的毕业生想换工作的一些个人见解
  8. 5G NR 频率范围和工作频段
  9. 用html浮雕效果图,浮雕设计效果图大全
  10. iphone 屏幕转动 字体变化