docker安装、核心架构、常用命令、镜像原理

124 阅读12分钟

docker

docker简介

1. 什么是docker?

官网定义:

  • We help developers and development teams build and ship apps.
    翻译:我们帮助开发人员和开发团队构建和发布应用

  • we have a complete container solution for you -no matter who you are and where you are on your containerization journey.
    翻译: 我们为你提供了一个完整的容器解决方案, 不管你是谁, 不管你在哪, 你都可以开始容器的旅程。

定义:

docker容器技术 => 帮助我们更好构建和发布应用 => (容器) 水杯  书包 => 容器内部装东西
application (javaweb) ---> mysql redis mq ...  自己在自己机器安装服务
application (javaweb) ---> Docker容器 mysql容器 redis容器 ...
早期docker定义: 运行你的应用不需要你的环境

容器里装的是什么?
一个一个的软件服务。

2. 为什么是Docker

  1. 当这些其中某一项版本不一致的时候,可能就会导致应用程序跑不起来这种情况 ===> 环境一致、高效迁移
  2. 如果你的程序重要性不是特别高的话,公司基本上不可能让你的程序独享一台服务器的,这时候你的服务器就会跟公司其他人的程序共享一台服务器,所以不可避免地就会受到其他程序的干扰,导致自己的程序出现问题。
    Docker就很好解决了环境隔高的问题,别人程序不会影响到自己的程序进程级隔离、容器独立
  3. 镜像机制,便于部署

Docker优势

  • 环境一致、高效迁移
    如: 我们一个java Web应用程序涉及很多东西,比如jdk、tomcat、mysql等软件环境。当这些其中某一项版本不一致的时候,可能就会导致应用程序跑不起来这种情况。
    Docker则将程序以及使用软件环境直接绑定在一起,无论在哪个机器上保证了环境一致。
  • 进程级隔离、容器独立
    如: 服务器自己的程序挂了,结果发现是别人程序出了问题把内存吃完了,自己程序因为内存不够就挂了这种也是一种比较常见的情况,如果你的程序重要性不是特别高的话,公司基本上不可能让你的程序独享一台服务器的,这时候你的服务器就会跟公司其他人的程序共享一台服务器,所以不可避免地就会受到其他程序的干扰,导致自己的程序出现问题。
    Docker就很好解决了环境隔离的问题,别人程序不会影响到自己的程序。
  • 镜像机制、便于部署
    公司要弄一个活动,可能会有大量的流量进来,公司需要再多部署几十台服务器。
    在没有Docker的情况下,要在几天内部署几十台服务器,这对运维来说是一件非常折磨人的事,而且每台服务器的环境还不一定一样,就会出现各种问题,最后部署地头皮发麻,用Docker的话,我只需要将程序打包到镜像,你要多少台服务,我就给跑多少容器,极大地提高了部署效率。

image.png

image.png

3. Doker和虚拟机对比

  1. 对于docker 官方logo解读
    a. docker 官方吉祥物 鲸鱼 --> 代表Docker运行引擎
    b. 在鲸鱼身上背着一个个小箱子 箱子之间互不影响 独立运行 --> 容器(软件服务) mysql服务 redis服务

image.png

  1. Docker引整和传统虚拟机对比

image.png

image.png

image.png

比较上面两张图,我们发现虚拟机是携带操作系统,本身很小的应用程序却因为携带了操作系统而变得非常大,很笨重。
Docker是不携带操作系统的,所以Docker的应用就非常的轻巧。
另外在调用宿主机的CPU、磁盘等等这些资源的时候,拿内存举例,虚拟机是利用Hypervisor去虚拟化内存,整个调用过程是虚拟内存 -> 虚拟物理内存 -> 真正物理内存,但是Docker是利用Docker Engine去调用宿主的的资源,这时候过程是虚拟内存 -> 真正物理内存。

image.png

4. docker起源

  • Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 开放容器联盟(OCI)。
  • Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目 已经超过 5 万 7 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,dotCloud 公司决定改名为 Docker。Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Google 也在其 PaaS 产品中广泛应用 Docker。
  • Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 OverlayFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。

docker引擎安装

引擎就是软件
Docker:加速容器应用程序开发

image.png

image.png\

image.png

image.png

官网安装步骤
Install Docker Engine on CentOS | Docker Docs

安装docker (centos7.x)

跟linux发行版本无关

  • 卸载原始docker
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
  • 安装docker依赖
$ sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
  • 设置docker的yum源
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
  • 安装最新版的docker
$ sudo yum install docker-ce docker-ce-cli containerd.io
  • 指定版本安装doker
$ yum list docker-ce --showduplicates | sort -r
$ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
$ sudo yum install docker-ce-18.09.5-3.el7 docker-ce-cli-18.09.5-3.el7 containerd.io
  • 启动dokcer
$ sudo systemctl enable docker
$ sudo systemctl start docker
  • 关闭docker
$ sudo systemctl stop docker
  • 测试docker安装
$ sudo docker run hello-world

bash安装(通用所有平台-Linux)

  • 在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,CentOs 系统上可以使用这套脚本安装,另外可以通过--mirror选项使用国内源进行安装:
    执行这个命令后,脚本就会自动的将一切准备工作做了,并且把 Docker 的稳定(stable) 版本安装在系统中。
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun

sudo代表以管理员方式执行

a) 执行下载doker引擎的脚本文件(拉取脚本,不是安装)

image.png

image.png

image.png

image.png

下载doker引擎
curl -fsSL get.docker.com -o get-docker.sh
image.png

b) 执行脚本,通过脚本下载 设置阿里云镜像下载加速
sudo sh get-docker.sh --mirror Aliyun
image.png

c) 启动docker
systemctl enable docker   #将docker加入开机自启动列表
systemctl start docker   #启动docker服务 (restart重启)status状态 stop停止

d) 推荐将当前用户加入Docker组

image.png

  1. 创建docker组
    groupadd docker

  2. 将当前用户加入docker
    sudo usermod -aG docker $USER  修改过程中自动创建docker groupadd docker

  3. 查看docker引擎
    docker info
    docker version

docker引擎本身只是个服务,这个服务一直运行,日后docker服务里面运行的是一个个容器。
如何让docker服务中运行容器?
要通过客户端向docker引擎发命令。

docker分为客户端和服务端,要在客户端中写命令去操作服务端。

image.png

客户端写命令去操作服务端,CS模型

docker info: docker的详细信息
image.png

docker核心架构

image.png

  • 镜像 Image
    一个镜像代表一个应用环境, 他是一个只读的文件, 如 mysql镜像, tomcat镜像, nginx镜像等
  • 容器 Container
    镜像每次运行之后就是产生一个容器, 就是正在运行的镜像,特点就是可读可写
  • 仓库
    用来存放镜像的位置, 类似于maven仓库, 也是镜像下载和上传的位置
  • 本地仓库
    用来存储在使用doker过程中的相关镜像
  • dockerFile
    docker生成镜像配置文件, 用来书写自定义镜像的一些配置
  • tar
    一个对镜像打包的文件, 日后可以还原成镜像

docker配置阿里云镜像加速

docker 运行流程
image.png

远程仓库非常慢,建议设置阿里云镜像加速 image.png

  1. 登录到阿里云官方网站
  2. 控制台
  3. 搜索镜像加速服务
  4. 阿里云提供镜像加速
    访问阿里云登录自己账号查看docker镜像加速服务

每个人的镜像加速都不一样,可以自己去aliyun注册哦

`mkdir -p /etc/docker`
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://uy35zvn6.mirror.aliyuncs.com"]
}
EOF 
//重启docker 
sudo systemctl daemon-reload  
sudo systemctl restart docker  
  1. 验证docker的镜像加速是否生效
    docker info:
    image.png

测试速度

image.png

docker第一个程序

docker中三个重要概念

  1. 仓库
    a. 远程仓库: docker公司在世界范围内维护一个中心,用来集中管理docker中镜像 ====> 搜索仓库docker hub
    b. 本地仓库: 用来存储自己使用过镜像,在中心仓库下载镜像存储到本地 /var/lib/docker

  2. 镜像 image
    定义:一个镜像就是一个软件 mysql镜像 jdk镜像 redis镜像
    特点:镜像是只读,不能进行写操作

mysql镜像 就是Linux精简操作系统 + mysql
tomcat镜像 就是Linux精简操作系统 + tomcat

  1. 容器 container
    定义:镜像每运行一次就会生成一个容器,一个容器代表一个正在运行软件服务
    特点:容器可读可写

docker入门应用

docker run hello-world

image.png

run的是镜像,从而形成容器

docker执行流程

image.png

常用命令

辅助命令

docker version  用来查看docker客户端引擎和server端引擎版本信息
docker info   用来查看docker引擎详细信息
docker --help   用来帮助信息

images镜像命令

  1. 查看当前本地仓库中存在哪些镜像
    docker image ls  或者 docker images

image.png

镜像 --> 名称: tag (tomcat: 8.0) --> 镜像id

  1. 下载一个镜像  docker pull 镜像名称
    获取最新版本:docker pull redis --> docker pull redis: latest(最新版本)
    获取指定版本:docker pull tomcat: 9.0

image.png

image.png

  1. 搜索镜像 docker search 镜像名称

image.png

docker search 镜像名称,只能看镜像是否存在,看不到版本 image.png

  1. 删除镜像 docker image rm 镜像名 (name:tag) | 镜像id
    正常删除: docker image rm 镜像名 (name:tag) | 镜像id(要求:必须是没有运行过的镜像)
    强制删除: docker image rm -f 镜像名 (name:tag) | 镜像id
    批量删除镜像: docker image rm -f $(docker images tomcat -q)

正常删除:
docker image rm 镜像名 (name:tag) | 镜像id image.png

image.png

强制删除:在删除镜像的同时把容器也删了
docker image rm -f 镜像名 (name:tag) | 镜像id image.png

容器是基于image(镜像)的

组合命令: 强制删除tomcat的镜像Id
docker image rm -f $(docker images tomcat -q)

image.png

条件查询
docker images tomcat
image.png

只列出镜像Id:
docker images -p
image.png

Contrainer 容器命令

操作容器命令格式: docker 命令 [选型]

运行容器

运行一个容器 docker run 镜像名|镜像id

docker run 镜像名 -------------------------- 镜像名新建并启动容器
--name -------------------------- 别名为容器起一个名字
-d -------------------------- 启动守护式容器(在后台启动容器)
-p -------------------------- 映射端口号:原始端口号   (指定端口号启动)

例:docker run -it --name myTomcat -p 8888:8080 tomcat
 docker run -d --name myTomcat -p tomcat

docker run -d -p 宿主机端口:容器端口 --name tomcat01 tomcat:8.0
-d: 后台运行
image.png

docker run tomcat:8.0|(imageId)
简单运行tomcat镜像  (这种方式直接运行容器,容器内无法访问)
image.png

docker run运行,容器跑在自己的操作系统中,外界访问不到。所以一定要让容器的端口与宿主机的端口进行映射

外部访问不到tomcat,检查防火墙
systemctl status firewalld
image.png

运行tomcat容器,同时设置容器与宿主机端口的映射关系 -p

报错的话开启防火墙哦
docker在启动服务时,它会把8080端口利用防火墙加到防火墙的开放列表中,不需要关闭网络防火墙服务

两个容器端口都是8080但是互不影响,因为是操作系统的隔离 image.png

查看运行的容器

docker ps --------------------------列出所有正在运行的容器
-a -------------------------- 正在运行的和历史运行过的容器
-q -------------------------- 静默模式,只显示容器编号

docker ps  列出所有正在运行的容器 image.png

docker ps -a  查看所有容器(包括停止的容器)

image.png

docker ps -aq  查看所有的容器id
image.png

docker ps -q  查看正在运行容器id
image.png

停止|关闭|重启容器

docker start 容器名字或者容器id --------------- 开启容器
docker restart 容器名或者容器id --------------- 重启容器
docker stop 容器名或者容器id ------------------ 正常停止容器运行
docker kill 容器名或者容器id ------------------ 立即停止容器运行

删除容器

docker rm 容器id|容器名 ----------------- 删除已经停止容器
docker rm -f 容器id|容器名 ----------------- 强制删除(即使正在运行的容器也能删除掉)
docker rm -f $(docker ps -aq) -------------------------- 删除所有容器

查看容器内进程

docker top 容器id或者容器名 ------------------ 查看容器内的进程

查看查看容器内部细节

docker inspect 容器id或者容器名 ------------------ 查看容器内部细节

查看容器的运行日志

docker logs [OPTIONS] 容器id或容器名 ------------------ 查看容器日志
-t ------------------ 加入时间戳
-f ------------------ 跟随最新的日志打印
--tail 数字 ------------------ 显示最后多少条

docker logs -f 容器id|name   实时监控容器内服务的日志

进入容器内部

docker exec [options] 容器id 容器内命令 ------------------ 进入容器执行命令
-i ------------------ 以交互模式运行容器,通常与-t一起使用
-t ------------------ 分配一个伪终端 shell窗口 bash

docker exec -it(交互模式)容器id|name
交互模式:操作一开始是在宿主机操作系统,交互后会把终端切换到容器里面

bash: 已交互的模式进入容器的bash窗口

退出容器:exit

容器和宿主机之间复制文件

docker cp 文件|目录 容器id:容器路径 ----------------- 将宿主机复制到容器内部
docker cp 容器id:容器内资源路径 宿主机目录路径 ----------------- 将容器内资源拷贝到主机上

从容器内拷贝文件到宿主机
image.png 从容器拷贝目录到宿主机
image.png

从宿主机拷贝到容器内
docker cp /root/readme.txt tomcat01:/usr/local/tomcat

如何部署一个web项目  war项目

  1. 先把war包传入linux
  2. 通过docker cp命令将test.war复制到tomcat的webapps目录中
  3. 使用ip端口进行测试访问即可

image.png

docker cp /root/test.war tomcat01:/usr/local/tomcat/webapps

数据卷(volum)实现与宿主机共享目录

数据卷 Data volume
作用:用来实现容器中数据和宿主机中数据进行映射的(同步的)
数据卷使用必须在容器首次启动时设置

docker run -v 宿主机的路径|任意别名:/容器内的路径 镜像名

image.png

使用:

  1. 使用绝对路径设置数据卷
    docker run -v 宿主机绝对路径:容器内路径:ro(radeonly)
    注意:这种方式会将容器路径的原始内容完全清空,始终以宿主机路径为主
  • ro:read only 如果在设置数据卷时指定ro,代表日后容器内路径是只读的
    如:docker run -d -p 8081:8080 --name tomcat01 -v /root/apps:/usr/local/tomcat/webapps tomcat:8.0:ro

宿主机: /root/apps image.png

docker run -d -p 8081:8080 --name tomcat01 -v /root/apps:/usr/local/tomcat/webapps tomcat:8.0 image.png

image.png

  1. 使用别名方式设置数据卷
    docker run -v aa:/usr/local/tomcat/webapps
    aa是什么
    a. aa代表docker数据卷中别名 注意:这个别名如果存在docker直接使用,aa不存在自动创建
    b. 使用别名方式保留容器路径原始内容,前提别名对应路径不能存在内容
    注意:docker根据别名创建目录默认在 /var/lib/docker/volums/

打包镜像

docker save 镜像名 -o 名称.tar

载入镜像

docker load -i 名称.tar

容器打包成新的镜像

docker commit -m "描述信息" -a "作者信息" (容器id或者名称)打包的镜像名称:标签

docker镜像原理

镜像是什么?

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

为什么一个镜像会那么大?

解释:容器独立操作系统(精简linux操作系统 + 软件服务)===> 镜像运行 ===> 镜像(操作系统 + 软件服务)

image.png

镜像就是花卷

  • UnionFS(联合文件系统):
    Union文件系统是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。
    原理: 就是一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录 。

image.png

image.png

Docker镜像原理

docker的镜像实际是由一层一层的文件系统组成。

  • bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。在docker镜像的最底层就是bootfs。这一层与Linux/Unix 系统是一样的,包含boot加载器(bootloader)和内核(kernel)。当boot加载完,后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时会卸载bootfs。
  • rootfs(root file system),在bootfs之上,包含的就是典型的linux系统中的/dev,/proc,/bin,/etc等标准的目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu/CentOS等等。
  • 我们平时安装进虚拟机的centos都有1到几个GB,为什么docker这里才200MB?对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令,工具,和程序库就可以了,因为底层直接使用Host的Kernal,自己只需要提供rootfs就行了。由此可见不同的linux发行版,他们的bootfs是一致的,rootfs会有差别。因此不同的发行版可以共用bootfs。

image.png

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

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

  • 比如:有多个镜像都是从相同的base镜像构建而来的,那么宿主机只需在磁盘中保存一份base镜像。同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。Docker镜像都是只读的。当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称为容器层,容器层之下都叫镜像层。
参考 编程不良人

1.Docker Hub的使用与镜像加速器的配置_hub.docker.dom-CSDN博客
2.编程不良人.docker