- 1. docker概述
- 1.1 基本介绍
- 1.2 应用场景
- 1.3 Docker 的优势
- 1.4 与传统VM特性对比:
- 2. 虚拟化技术和容器化技术
- 3. Docker的基本组成
- 4. Docker的安装
- 4.1查看系统配置
- 4.2卸载旧的版本
- 4.3下载需要的安装包
- 4.4 更新yum软件包缓存
- 4.5 安装docker相关的配置
- 4.6启动Docker
- 5. docker卸载
- 5.1 卸载依赖
- 5.2 删除资源
- 6. 配置阿里云镜像加速(非必选)(免费)
- 7. Docker容器运行流程
- 8. 底层原理
- 8.1 docker为什么比vm快
- 9. docker常用命令
- 9.1基础命令
- 9.2镜像命令
- 9.3.docker search 搜索镜像
- 9.4 删除镜像
- 9.5 下载一个mysql镜像(案例)
- 9.6 容器命令
- 9.7 其他常用命令
- 9.7.2 查看容器中进程信息
- 9.7.3 查看容器的元数据
- 9.7.4 进入当前正在运行的容器
- 9.7.5 拷贝文件
Docker概述
1.1 基本介绍Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
Docker是一种容器化技术的落地。容器作为一类操作系统层面的虚拟化技术,其目标是在单一Linux主机交付多套隔离性环境,容器共享同一套主机操作系统内核。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。官网:https://docs.docker.com/
1.2 应用场景Web 应用的自动化打包和发布。
自动化测试和持续集成、发布。
在服务型环境中部署和调整数据库或其他的后台应用。
1.3 Docker 的优势Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
1、快速,一致地交付您的应用程序。Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:
您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
2、响应式部署和扩展
Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
3、在同一硬件上运行更多工作负载
Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。
作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机方式相比具有显著优势:
Docker 容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机方式要快得多。
Docker 容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器。
Docker 通过类似Git的操作来方便用户获取、分发和更新应用镜像,指令简明,学习成本较低。
Docker 通过Dockerfile配置文件来支持灵活的自动化创建和部署机制,提高工作效率。
Docker 容器除了运行其中的应用之外,基本不消耗额外的系统资源,保证应用性能的同时,尽量减小系统开销。
Docker 利用Linux系统上的多种防护机制实现了严格可靠的隔离。从1.3版本开始,Docker引入了安全选项和镜像签名机制,极大地提高了使用Docker的安全性。
虚拟化技术特点:1.资源占用多 2.冗余步骤多 3.启动很慢
容器化技术:容器化技术不是模拟的一个完整的操作系统
比较Docker和虚拟机的不同:
1.传统虚拟机,虚拟出硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件。
2.Docker容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟硬件。
3.每个容器都是相互隔离的,每个容器都有属于自己的文件系统,互不影响。
容器化带来的好处
3. Docker的基本组成Docker的基本组成图如下:
说明:
Docker 包括三个基本概念:
镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
查看系统的内核:
uname -r
系统内核版本为3.10.0
[root@iZwz99sm8v95sckz8bd2c4Z ~]# uname -r 3.10.0-957.21.3.el7.x86_644.1查看系统配置
cat /etc/os-release
[root@iZwz99sm8v95sckz8bd2c4Z ~]# cat /etc/os-release NAME="CentOS Linux" VERSION="7 (Core)" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="7" PRETTY_NAME="CentOS Linux 7 (Core)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:centos:centos:7" HOME_URL="https://www.centos.org/" BUG_REPORT_URL="https://bugs.centos.org/" CENTOS_MANTISBT_PROJECT="CentOS-7" CENTOS_MANTISBT_PROJECT_VERSION="7" REDHAT_SUPPORT_PRODUCT="centos" REDHAT_SUPPORT_PRODUCT_VERSION="7" VERSION=7<<--------代表是centos7版本 注意安装docker必须满足centos7以上版本否则无法安装
Docker的安装步骤:
4.2卸载旧的版本yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
4.3下载需要的安装包
yum install -y yum-utils
(3.1)设置阿里云镜像的仓库(可以根据需求选择镜像产库)
- 第一种方法:
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker- ce.repo**
-
第二种方法
wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo (下载仓库配置文件)
放到/etc/yum.repos.d
注释:将软件包信息提前在本地索引缓存 用来提高搜索安装软件的速度,建议执行这个命令可以提升yum安装的速度
yum makecache fast
docker-ce 是社区版,docker-ee 企业版
yum install docker-ce docker-ce-cli containerd.io
三个包的含义:
containerd.io docker镜像文件
docker-ce 守护进程(可以理解为docker服务)
docker-ce-cli 客户端(可以理解为控制服务)
出现了completed即安装成功。
systemctl start docker
查看当前版本号,是否启动成功
docker version
结果如下图:
设置开机自启动
systemctl enable docker;
=================================================================
下载hello-world镜像进行测试一下;
docker pull 镜像名称 (拉取镜像)
docker images (查看本机拥有的镜像)
yum remove docker-ce docker-ce-cli containerd.io
5.2 删除资源rm -rf /var/lib/docker /var/lib/docker是docker的默认工作路径
6. 配置阿里云镜像加速(非必选)(免费)(1)进入阿里云官网(https://www.aliyun.com/?spm=5176.12818093.top-nav.dlogo.2c9516d0JovgfA),搜索容器镜像服务
注释:每个人的加速地址不一样,Docker镜像默认的下载地址为国外官网,国内下载太慢,为了解决这个问题,国内出现了阿里云,网易云等的镜像加速器
(2)依次执行官方的这四条命令即可
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://axvfsf7e.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
7. Docker容器运行流程
8. 底层原理
8.1 docker为什么比vm快
1.Docker有着比虚拟机更少的抽象层,由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在Cpu、内存利用率上Docker将会在效率上有明显优势。
2.Docker利用的是宿主机的内核,而不需要Guest OS,因此,当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统,避免了引导、加载操作系统内核这个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,这个新建过程是分钟级别的,而Docker由于直接利用宿主机的操作系统则省略了这个过程,因此新建一个Docker容器只需要几秒钟。
9. docker常用命令 9.1基础命令docker version #查看docker的版本信息 docker info #查看docker的系统信息,包括镜像和容器的数量 docker 命令 --help #帮助命令(可查看可选的参数)9.2镜像命令
[root@lmj ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest bf756fb1ae65 11 months ago 13.3kB
解释:
1.REPOSITORY 镜像的仓库源
2.TAG 镜像的标签
3.IMAGE ID 镜像的id
4.CREATED 镜像的创建时间
5.SIZE 镜像的大小
可选参数
-a/–all 列出所有镜像
[root@lmj ~]# docker images -a REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 7 months ago 13.3kB centos latest 5d0da3dc9764 7 months ago 231MB
-q/–quiet 只显示镜像的id
[root@lmj ~]# docker images -q feb5d9fea6a5 5d0da3dc97649.3.docker search 搜索镜像
[root@lmj ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 10308 [OK] mariadb MariaDB is a community-developed fork of MyS… 3819 [OK] mysql/mysql-server Optimized MySQL Server Docker images. Create… 754 [OK] percona Percona Server is a fork of the MySQL relati… 517 [OK] centos/mysql-57-centos7 MySQL 5.7 SQL database server 86 mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 79 centurylink/mysql Image containing mysql. Optimized to be link… 60 [OK]
#可选参数
Search the Docker Hub for images
Options:
-f, --filter filter 基于给定条件过滤输出
–format string 使用模板格式化显示输出
–limit int 最大搜索结果数
–no-trunc 禁止截断输出
–stars : 文收藏数不小于指定值的镜像
#搜索收藏数大于3000的镜像
[root@lmj ~]# docker search mysql --filter=STARS=3000 NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 10308 [OK] mariadb MariaDB is a community-developed fordockerk of MyS… 3819 [OK]9.4 删除镜像
#1.删除指定的镜像id [root@lmj ~]# docker rmi -f 镜像id #2.删除多个镜像id [root@lmj ~]# docker rmi -f 镜像id 镜像id 镜像id #3.删除全部的镜像id [root@lmj ~]# docker rmi -f $(docker images -aq)9.5 下载一个mysql镜像(案例)
[root@lmj ~]# docker pull mysql Using default tag: latest #如果不写tag默认就是latest(最新) latest: Pulling from library/mysql 6ec7b7d162b2: Pull complete #分层下载,docker image的核心-联合文件系统 fedd960d3481: Pull complete 7ab947313861: Pull complete 64f92f19e638: Pull complete 3e80b17bff96: Pull complete 014e976799f9: Pull complete 59ae84fee1b3: Pull complete ffe10de703ea: Pull complete 657af6d90c83: Pull complete 98bfb480322c: Pull complete 6aa3859c4789: Pull complete 1ed875d851ef: Pull complete Digest: sha256:78800e6d3f1b230e35275145e657b82c3fb02a27b2d8e76aac2f5e90c1c30873 #签名 Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest #下载来源的真实地址 #docker pull mysql等价于docker pull docker.io/library/mysql:latest
指定版本下载
#注释Already exists代表已经存在,docker分层下载核心精髓 [root@lmj ~]# docker pull mysql:5.7 5.7: Pulling from library/mysql 6ec7b7d162b2: Already exists fedd960d3481: Already exists 7ab947313861: Already exists 64f92f19e638: Already exists 3e80b17bff96: Already exists 014e976799f9: Already exists 59ae84fee1b3: Already exists 7d1da2a18e2e: Pull complete 301a28b700b9: Pull complete 529dc8dbeaf3: Pull complete bc9d021dc13f: Pull complete Digest: sha256:c3a567d3e3ad8b05dfce401ed08f0f6bf3f3b64cc17694979d5f2e5d78e10173 Status: Downloaded newer image for mysql:5.7 docker.io/library/mysql:5.79.6 容器命令
首先拉取一个centos镜像
docker pull centos
运行容器的命令说明:
docker run [可选参数] image #参数说明 --name="名字" 指定容器名字 -d 后台方式运行 -it 使用交互方式运行,进入容器查看内容 -p 指定容器的端口 ( -p ip:主机端口:容器端口 配置主机端口映射到容器端口 -p 主机端口:容器端口 -p 容器端口 ) -P 随机指定端口(大写的P)
运行并进入容器centos
[root@lmj ~]# docker run --name="vm" -it centos /bin/bash [root@45a00a9c40b1 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@45a00a9c40b1 /]#
退出容器命令:
#exit 停止并退出容器(后台方式运行则仅退出) #Ctrl+P+Q 不停止容器退出 [root@bd1b8900c547 /]# exit exit [root@lmj ~]#
列出运行过的容器命令:
#docker ps
# 列出当前正在运行的容器
# 列出所有容器的运行记录 -a
# 显示最近创建的n个容器 -n=?
# 只显示容器的编号 -q
[root@CENTOS7 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1680b9779cd0 centos "/bin/bash" 3 seconds ago Up 2 seconds vm
[root@CENTOS7 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
60962608650a hello-world "bash" 5 minutes ago Up 5 minutes musing_nobel
1680b9779cd0 centos "/bin/bash" 7 minutes ago Up 7 minutes vm
删除容器命令:
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,强制删除使用 rm -f docker rm -f $(docker ps -aq) #删除所有的容器 docker ps -a -q|xargs docker rm #删除所有的容器
启动和停止容器命令:
docker start 容器id #启动容器 docker restart 容器id #重启容器 docker stop 容器id #停止当前运行的容器 docker kill 容器id #强制停止当前容器9.7 其他常用命令
9.7.1 日志的查看
-f : 跟踪日志输出 -t : 显示时间戳 --since :显示某个开始时间的所有日志 --tail :仅列出最新N条容器日志 常用: docker logs -tf 容器id docker logs --tail number 容器id #num为要显示的日志条数 #docker容器后台运行,必须要有一个前台的进程,否则会自动停止 #编写shell脚本循环执行,使得centos容器保持运行状态 [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d centos /bin/sh -c "while true;do echo hi;sleep 5;done" c703b5b1911ff84d584390263a35707b6024816e1f46542b61918a6327a570dc [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c703b5b1911f centos "/bin/sh -c 'while t…" 13 seconds ago Up 10 seconds pedantic_banach [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker logs -tf --tail 10 c703b5b1911f 2020-12-27T03:34:07.255599560Z hi 2020-12-27T03:34:12.257641517Z hi 2020-12-27T03:34:17.259706294Z hi 2020-12-27T03:34:22.261693707Z hi 2020-12-27T03:34:27.262609289Z hi 2020-12-27T03:34:32.267862677Z hi 2020-12-27T03:34:37.270382873Z hi 2020-12-27T03:34:42.272414182Z hi 2020-12-27T03:34:47.274823243Z hi 2020-12-27T03:34:52.277419274Z hi9.7.2 查看容器中进程信息
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker top c703b5b1911f (容器id) UID PID PPID C STIME TTY TIME CMD root 11156 11135 0 11:31 ? 00:00:00 /bin/sh -c while true;do echo hi;sleep 5;done root 11886 11156 0 11:43 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 59.7.3 查看容器的元数据
[root@lmj ~]# docker inspect 容器id9.7.4 进入当前正在运行的容器
因为通常我们的容器都是使用后台方式来运行的,有时需要进入容器修改配置
方式一:
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker exec -it 容器id /bin/bash [root@c703b5b1911f /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@c703b5b1911f /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 03:31 ? 00:00:00 /bin/sh -c while true;do echo hi;sleep 5;done root 279 0 0 03:54 pts/0 00:00:00 /bin/bash root 315 1 0 03:56 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 5 root 316 279 0 03:56 pts/0 00:00:00 ps -ef
方式二
[root@lmj ~]# docker attach c703b5b1911f
docker exec 进入容器后开启一个新的终端,可以在里面操作
docker attach 进入容器正在执行的终端,不会启动新的进程
9.7.5 拷贝文件拷贝操作的命令如下:
#拷贝容器的文件到主机中 docker cp 容器id:容器内路径 目的主机路径 #拷贝宿主机的文件到容器中 docker cp 目的主机路径 容器id:容器内路径
#拷贝docker容器里的文件到宿主机/home下 [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker cp c703b5b1911f:/home/test.java /home [root@iZwz99sm8v95sckz8bd2c4Z ~]# ls /home hai pan test.java
命令小节的图解如下:



