docker入门(基本组成,常用命令,镜像,容器, DockerFile,docker网络)

一、为什么会有docker

docker 对环境配置给出了一个标准化的解决方案,能够通过docker镜像将应用程序所属要的系统环境由上而下打包,达到应用程序跨平台间的无缝接轨运作。
docker的目标是“Bulid,Ship and Run Any App, Anywhere”,也就是通过对应用组件的封装,分发,部署,运行等生命周期的管理,使用户的App及其运行环境能够做到“一次封装,到处使用”。
docker 是在linux容器技术上发展而来的,将应用运行在docker容器上,而docker容器是在任何操作系统上都是一致的,这就实现了跨平台,跨服务器,只需要一次配置环境,在其他的系统上都能一键部署,大大简化了操作。

虚拟机技术和容器技术的对比

技术名称容器化技术虚拟机技术
原理容器不是模拟一个完整的操作系统,而是对进程隔离,有了容器,就可以将软件运行时所需的所有资源都打包到一个隔离的容器中。容器不需要捆绑一整套操作系统,只需要软件工作所需的资源和设置,从而系统能够变得高效轻量并且保证部署在任何环境中的软件都能始终如一的运行。它可以在一种操作系统里运行另一种操作系统 ,比如windows里运行linux系统,应用程序对此毫无感知,因为虚拟机看上去和真实机器一摸一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其它部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统,硬件三者之间的逻辑不变。
优缺点更快速的应用交付和部署、更便捷的升级和扩缩容、更简单的系统运维、更高效的计算资源利用资源占用多、冗沉步骤多、启动慢

二、docker底层原理

1.原理

docker 是一个Client-Server结构的系统,
docker守护进程运行在主机上,然后通过socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。

在这里插入图片描述

2.为什么docker会比vm快
  1. docker有着比虚拟机更少的抽象层。由于docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的是实际物理机的硬件资源。因此在CPU,内存利用率上docker将会在效率上有明显优势。
  2. docker利用的是宿主机的内核,而不需要Guest OS。 因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核返回比较费时耗资源的过程,当新建一个虚拟机时,虚拟软件需要加载Guest OS, 返回新建过程是分钟级别的。而docker直接利用宿主机的操作系统,则省略了这个过程, 因此新建一个docker容器只需要几秒钟。
    在这里插入图片描述
3.docker与虚拟机的比较

在这里插入图片描述

三、docker 安装

  1. 参考官方安装手册(此链接是centos安装docker的手册)。
  2. yum安装gcc相关环境(确保虚拟机能够上网)
    yum -y install gcc
    yum -y install gcc-c++
    
  3. 卸载旧版本
    yum remove docker \
    docker-client\
    docker-client-laster\
    docker-common\
    docker-laster\
    docker-laster-logrotate\
    docker-logrotate\
    docker-engine
    
  4. 安装需要的软件包
    yum install -y yum-utils
    
  5. 设置镜像仓库
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-re.repo
    
  6. 更新yun软件包索引
    yum makecache fast
    
  7. 安装docker-ce
    yum install docker-ce docker-ce-cli containerd.io
    
  8. 启动docker
    systemctl start docker 
    
  9. 测试命令
    docker version 
    docker run hello-world
    docker images
    
  10. 卸载docker
    systemctl stop docker
    yum -y remove docker-ce docker-ce-cil containerd.io
    rm -rf -var/lib/docker
    

四、docker基本组成

在这里插入图片描述

1.镜像(image)

docker 镜像就是一个只读的模板。镜像是可以用来创建容器的,一个镜像可以创建很多的容器。好似编程语言中的类和对象,镜像是类,容器是对象。

2.容器(container)

docker利用容器独立运行的一个或一组应用。容器是用镜像创建的运行实例。它可以被启动,开始,停止,删除。每个容器都是相互隔离的,保证安全的平台。可以把容器看成是一个简易版的linux环境和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别就是容器最上面那层是可读可写的。

3.仓库(repository)

仓库是集中存放镜像文件的场所。仓库和仓库注册服务器是有区别的。仓库注册服务器上往往存在着许多的仓库,每个仓库中又包含了许多镜像, 每个镜像有不同的标签(tag)仓库有公开仓库和私有仓库两种形式,最大的公开仓库是docker hub

4.小结
  1. docker本身就是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打好包形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成docker容器,image文件可以看成是容器的模板,docker根据image生成容器的实例,同一个image可以生成多个容器。
  2. image 文件生成的容器实例,本身也是一个文件,称之为镜像文件。
  3. 一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,就是我们的容器。
  4. 仓库就是放了一对镜像的地方,我们可以把镜像发布到仓库中, 需要的时候从仓库中拉下来就可以了。

五、docker常用命令

1.帮助命令
docker version  # 显示docker版本信息
docker info # 显示docker系统信息,包括镜像和容器数
docker --help # docker命令帮助
2.镜像命令
docker images # 列出本地主机上的镜像
# 可选项
-a: 列出本地的所有镜像
-q: 只显示镜像id
--digests: 显示镜像的摘要信息
docker search 镜像名称 # 搜索镜像
# 可选项
--filter=stars=50: 列出收藏数不小于指定值的image
docker pull image:tag # 下载镜像,不写tag,默认为latest
docker rmi -f 镜像id # 删除指定id的镜像
docker rmi -f 镜像名:tag 镜像名:tag # 删除指定名称和版本的多个镜像
docker rmi -f $(docker image -aq) # 删除全部的镜像
3.容器命令

有镜像才能创建容器,下面的例子我们使用centos的镜像来测试。

docker run [options] image [command][arg...] # 新建容器并启动
# 常用参数说明
--name="NAME" # 给容器指定一个名称
-d # 后台方式运行容器,并返回容器id
-i # 以交互模式运行容器,通常和-t一起使用
-t # 给容器重新分配一个终端,通常和-i一起使用
-p # 随机端口映射
-P # 指定端口映射(一般四种写法)
1. 主机ip:主机端口:容器端口
2. 主机ip:容器端口
3. 主机端口:容器端口(常用)
4. 容器端口
docker ps [options] # 列出所有运行的容器
# 常用参数说明
-a # 列出当前正在运行的容器+历史运行过的容器
-l # 显示最近创建的容器
-n=? # 显示最近运行过的几个容器
-q # 静默模式,只显示容器编号
exit # 退出容器且停止
ctrl+P+Q # 容器退出但不停止
docker start (容器id or 容器名) # 启动容器
docker restart (容器id or 容器名) # 重启容器
docker stop (容器id or 容器名) # 停止容器
docker kill (容器id or 容器名) # 强制停止容器
docker rm 容器id # 删除指定容器
docker rm -f $(docker ps -aq) # 删除所有容器
docker ps -a -q |xargs docker rm # 删除所有容器
4.常用其它命令
docker run -d 容器名 # 后台启动容器
# 问题:使用docker ps 查看某些刚启动的容器时,发现已经退出?
# 解释:是因为docker容器后台运行,就必须要有一个前台进程,容器运行的命令如果不是那些一直挂起的命令, 就会自动退出,比如,你运行了nginx服务,但是docker前台没有运行任何程序应用,这种情况下,容器启动下就会自动退出,因为他觉得没有程序了,所以最好的情况是,将你的应用以前台进程的方式启动。
docker logs [options] 容器id # 查看容器日志
# 常用参数说明
-f # 跟踪日志输出
-t # 显示时间戳
--tail # 仅列出最新N条容器日志
--since # 显示某个开始时间的所有日志
docker top 容器id # 查看容器中的进程信息,支持ps 命令参数
docker inspect 容器id # 查看容器/镜像的元数据	
docker exec -it 容器id /bin/bash  # 进入正在运行的容器
docker attach 容器id # 进入正在运行的容器
# 区别
1. exec 是在容器中打开新的终端,并且可以启动新的进程
2. attach 是直接进入容器启动命令的终端,不会启动新的进程
docker cp 容器id:容器内路径 目的主机路径 # 从容器内拷贝文件到主机上
5.小结

在这里插入图片描述

6.常用命令
attach # 当前 shell 下 attach 连接指定运行镜像
build # 通过 Dockerfile 定 制镜像
commit # 提交当前容器为新的镜像
cp #从容器中拷贝指定文件或者目录到宿主机中
create # 创建一个新的容器,同 run,但不启动容器
diff # 查看 docker 容器变化
events # 从 docker 服务获取容器实时事件
exec # 在已存在的容器上运行命令
export # 导出容器的内容流作为一个 tar 归档文件[对应 import ]
history # 展示一个镜像形成历史
images # 列出系统当前镜像
import # 从 tar包中的内容创建一个新的文件系统映像[对应export]
info # 显示系统相关信息
inspect # 查看容器详细信息
kill # kill 指定 docker 容器
load # 从一个 tar 包中加载一 个镜像[对应 save]
login # 注册或者登陆一个 docker 源服务器
logout # 从当前 Docker registry 退出
logs # 输出当前容器日志信息
port # 查看映射端口对应的容器内部源端口
pause # 暂停容器
ps # 列出容器列表
pull # 从docker镜像源服务器拉取指定镜像或者库镜像
push # 推送指定镜像或者库镜像至docker源服务器
restart # 重启运行的容器
rm # 移除一个或者多个容器
rmi # 移除一个或多个镜像[无容器使用该 镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
run # 创建一个新的容器并运行 一个命令
save # 保存一个镜像为一个 tar 包[对应 load]
search # 在 docker hub 中搜索镜像
start # 启动容器
stop # 停止容器
tag # 给源中镜像打标签
top # 查看容器中运行的进程信息
unpause # 取消暂停容器
version # 查看 docker 版本号
wait # 截取容器停止时的退出状态值

六、docker镜像讲解

1.镜像是什么

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

2.docker镜像加载原理

UnionFS(联合文件系统)

Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,
它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

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等等。

在这里插入图片描述

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

3.镜像分层理解

我们可以去下载一个镜像,注意观察下载的日志输出,可以看到是一层一层的在下载!

为什么docker镜像要采用这种分层的结构呢?

最大的好处,我觉得莫过于是资源共享了!比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。

理解
所有的 Docker 镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
举一个简单的例子,假如基于 Ubuntu Linux 16.04 创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加 Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。
该镜像当前已经包含 3 个镜像层,如下图所示(这只是一个用于演示的很简单的例子)
在这里插入图片描述
在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点非常重要。下图中举了一个简单的例子,每个镜像层包含 3 个文件,而镜像包含了来自两个镜像层的 6 个文件。
在这里插入图片描述
上图中的镜像层跟之前图中的略有区别,主要目的是便于展示文件。
下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有 6 个文件,这是因为最上层中的文件7 是文件 5 的一个更新版本。
在这里插入图片描述
这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。
Docker 通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。
Linux 上可用的存储引擎有 AUFS、Overlay2、Device Mapper、Btrfs 以及 ZFS。顾名思义,每种存储引擎都基于 Linux 中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
Docker 在 Windows 上仅支持 windowsfilter 一种存储引擎,该引擎基于 NTFS 文件系统之上实现了分层和 CoW[1]。
下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。
在这里插入图片描述
特点

Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常说的容器层,容器之下的都叫镜像层!

4.镜像Commit

docker commit 从容器创建一个新的镜像。

docker commit -m="提交的描述信息" -a="作者" 容器id 要创建的目标镜像名:[标签名]

注意:commit的时候,容器的名字不能有大写,否则报错:invalid reference format

七、容器数据卷

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

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

总结一句话: 数据卷就是容器的持久化,以及容器间的继承和数据共享

1.使用数据卷
## 方式一:容器中直接使用命令来添加
docker run -it -v 宿主机绝对路径目录:容器内目录 镜像名
## 查看数据卷是否挂载成功 docker inspect 容器id
## 通过Docker File 来添加
## 说明:在编写DockerFile文件中使用 VOLUME 指令来给镜像添加一个或多个数据卷 VOLUME["/dataVolumeContainer1","/dataVolumeContainer2","/dataVolumeContainer3"]
2.匿名和具名挂载
# 匿名挂载 -v 容器内路径
# 匿名挂载的缺点,就是不好维护,通常使用命令 docker volume维护
docker volume ls
# 具名挂载 -v 卷名:/容器内路径
docker volume inspect 卷名
# 怎么判断挂载的是卷名而不是本机目录名? 不是/开始就是卷名,是/开始就是目录名
# 改变文件的读写权限
# ro: readonly 
# rw: readwrite # 指定容器对我们挂载出来的内容的读写权限
# docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:ro nginx
# docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:rw nginx
3.数据卷容器

命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。
通过 --volumes-from继承容器的挂载数据卷。

结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。存储在本机的文件则会一直保留!

八、Dockerfile

1.什么是Dockerfile?

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

2.构建步骤
3.DockerFile构建过程

基础知识:

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

流程:

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

说明:

从应用软件的角度来看,DockerFile,docker镜像与docker容器分别代表软件的三个不同阶段。
DockerFile 是软件的原材料 (代码)
Docker 镜像则是软件的交付品 (.apk)
Docker 容器则是软件的运行状态 (客户下载安装执行)
DockerFile 面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可!

在这里插入图片描述

  1. DockerFile:需要定义一个DockerFile,DockerFile定义了进程需要的一切东西。DockerFile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当引用进行需要和系统服务和内核进程打交道,这时需要考虑如何设namespace的权限控制)等等。
  2. Docker镜像:在DockerFile 定义了一个文件之后,Docker build 时会产生一个Docker镜像,当运行Docker 镜像时,会真正开始提供服务。
  3. Docker容器:容器是直接提供服务的。
4.DockerFile指令
FROM # 基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER # 镜像维护者的姓名混合邮箱地址 
RUN # 容器构建时需要运行的命令 
EXPOSE # 当前容器对外保留出的端口 
WORKDIR # 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点 
ENV # 用来在构建镜像过程中设置环境变量 
ADD # 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包 
COPY # 类似ADD,拷贝文件和目录到镜像中! 
VOLUME # 容器数据卷,用于数据保存和持久化工作 
CMD # 指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD指令,但只有最 后一个生效! 
ENTRYPOINT # 指定一个容器启动时要运行的命令!和CMD一样
ONBUILD # 当构建一个被继承的DockerFile时运行命令,父镜像在被子镜像继承后,父镜像的 ONBUILD被触发

在这里插入图片描述

九、Docker 网络讲解

1.理解Docker0

Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
Docker容器网络就很好的利用了Linux虚拟网络技术,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair)。
Docker中的网络接口默认都是虚拟的接口。虚拟接口的优势就是转发效率极高(因为Linux是在内核中进行数据的复制来实现虚拟接口之间的数据转发,无需通过外部的网络设备交换),对于本地系统和容器系统来说,虚拟接口跟一个正常的以太网卡相比并没有区别,只是他的速度快很多。
在这里插入图片描述

2.–Link

–link可以直接使用容器名访问网络

–link早都过时了,我们不推荐使用!我们可以使用自定义网络的方式

3.自定义网络
# 查看所有网络
docker network ls
网络模式配置说明
bridge模式–net=bridge默认值,在Docker网桥docker0上为容器创建新的网络栈
none模式–net=none不配置网络,用户可以稍后进入容器,自行配置
container模式–net=container:name/id容器和另外一个容器共享Network namespace。kubernetes中的pod就是多个容器共享一个Networknamespace。
host模式–net=host容器和宿主机共享Network namespace
用户自定义–net=自定义网络用户自己使用network相关命令定义网络,创建容器的时候可以指定为自己定义的网络
docker network inspect 容器id # 查看一个具体的网络的详细信息

自定义网卡

# 自定义创建一个网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
4.网络连通

在这里插入图片描述
docker0和自定义网络肯定不通,我们使用自定义网络的好处就是网络隔离:
大家公司项目部署的业务都非常多,假设我们有一个商城,我们会有订单业务(操作不同数据),会有订单业务购物车业务(操作不同缓存)。如果在一个网络下,有的程序猿的恶意代码就不能防止了,所以我们就在部署的时候网络隔离,创建两个桥接网卡,比如订单业务(里面的数据库,redis,mq,全部业务 都在order-net网络下)其他业务在其他网络。
那关键的问题来了,如何让 tomcat-net-01 访问 tomcat1?

# 命令 docker network connect [OPTIONS] NETWORK CONTAINER 跨网络操作	
docker network connect 自定义网络名 访问容器名

到此就能实现自定义网络在不同的网段操作不同的容器运行不同的应用了。
docker基本知识也就到这里就结束了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值