Docker概述
基本介绍
- Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
- Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
- 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
- Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。
- 官网:docs.docker.com/
应用场景
- Web 应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
- 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
Docker的优势
- Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
1、快速,一致地交付您的应用程序。Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
- 容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:
- 您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
- 他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
- 当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
- 测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。 2、响应式部署和扩展
- Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
- Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。 3、在同一硬件上运行更多工作负载
- Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。
虚拟化技术和容器化技术
- 虚拟化技术特点:
1.资源占用多
2.冗余步骤多
3.启动很慢
- 容器化技术:容器化技术不是模拟的一个完整的操作系统
比较Docker和虚拟机的不同
- 传统虚拟机,虚拟出硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件。
- Docker容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟硬件。
- 每个容器都是相互隔离的,每个容器都有属于自己的文件系统,互不影响。
容器化带来的好处
Docker的基本组成
Docker的基本组成图如下
说明
Docker的安装
查看系统的内核
uname -r
3.10.0-957.21.3.el7.x86_64
查看系统配置
cat /etc/os-release
卸载旧版本
yum remove docker
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
下载需要的安装包
yum install -y yum-utils
设置镜像的仓库
# 国外的地址
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 设置阿里云的Docker镜像仓库(推荐)
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新yum软件包索引
yum makecache fast
安装docker相关的配置
- docker-ce 是社区版,docker-ee 企业版
yum install docker-ce docker-ce-cli containerd.io
- 出现了completed即安装成功。
启动Docker
# 启动
systemctl start docker
# 查看当前版本号,是否启动成功
docker version
# 设置开机自启动
systemctl enable docker
-
结果
-
下载hello-world镜像进行测试
docker run hello-word
- 查看下载的hello world镜像
docker images
Docker的卸载
# 1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 2. 删除资源 . /var/lib/docker是docker的默认工作路径
rm -rf /var/lib/docker
配置阿里云镜像加速
- 进入阿里云官网,搜索容器镜像服务
- 依次执行官方的这四条命令
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["你自己的加速器地址"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker常用命令
基础命令
docker version #查看docker的版本信息
docker info #查看docker的系统信息,包括镜像和容器的数量
docker 命令 --help #帮助命令(可查看可选的参数)
docker COMMAND --help
- 命令的帮助文档地址: docs.docker.com/engine/refe…
镜像命令
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 镜像的大小
# 可选参数
1.列出所有镜像
-a/--all
2.只显示镜像的id
-q/--quiet
搜索镜像
docker search
[root@Dongguhua ~]# 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 Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
#搜索收藏数大于3000的镜像
[root@Dongguhua ~]# 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]
下载镜像
docker pull 镜像名[:tag]
[root@Dongguhua ~]# 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
- 指定版本下载
[root@iZwz99sm8v95sckz8bd2c4Z ~]# 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.7
删除镜像
#1.删除指定的镜像id
[root@Dongguhua ~]# docker rmi -f 镜像id
#2.删除多个镜像id
[root@Dongguhua ~]# docker rmi -f 镜像id 镜像id 镜像id
#3.删除全部的镜像id
[root@Dongguhua ~]# docker rmi -f $(docker images -aq)
容器命令
说明:有镜像才能有容器,我们可以使用centos的镜像来测试,就是虚拟一个centos。
docker pull centos
创建容器命令
docker run [OPTIONS] IMAGE [COMMAND][ARG...]
- 创建容器命令下的常用参数说明
--name="Name" #给容器指定一个名字
-d # 后台方式运行容器,并返回容器的id!
-i # 以交互模式运行容器,通过和 -t 一起使用
-t # 给容器重新分配一个终端,通常和 -i 一起使用
-P # 随机端口映射(大写)
-p # 指定端口映射(小结),一般可以有四种写法如下:
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort (常用)
containerPort
现在我们已经下载下来了centos的镜像,开始运行并进入容器:
我们可以发现,服务器的地址已经变了,说明我们已经用交互模式进入到了容器内部。
退出容器命令
exit # 容器停止退出
ctrl+P+Q # 容器不停止退出
列出容器命令
- 列出正在运行的容器
docker ps [OPTIONS]
- 常用参数说明
# 常用参数说明
-a # 列出当前所有正在运行的容器 + 历史运行过的容器
-l # 显示最近创建的容器
-n=? # 显示最近n个创建的容器
-q # 静默模式,只显示容器编号。
启动停止容器
docker start (容器id or 容器名) # 启动容器
docker restart (容器id or 容器名) # 重启容器
docker stop (容器id or 容器名) # 停止容器
docker kill (容器id or 容器名) # 强制停止容器
进入容器
# 在容器中打开新的终端,并且创建新的进程
docker exec -it 容器id bashShell
# 进入容器启动命令的终端,不会创建新的线程
docker attach 容器id
删除容器
docker rm 容器id # 删除指定没运行的容器
docker rm -f 容器id # 删除指定的容器,不管是什么状态
docker rm -f $(docker ps -q) # 删除所有正在运行的容器
docker ps -a -q|xargs docker rm # 删除所有容器
容器常用的其他命令
# 查看日志
docker logs -f -t --tail 容器id
# 查看容器中运行的进程
docker top 容器id
# 查看容器的元数据
docker inspect 容器id
# 将容器内文件拷贝到我们服务器上
docker cp 容器id:容器内路径 我们主机路径
常用命令的归纳
# 当前shell下attach连接指定运行镜像
attach
# 通过Dockerfile定制镜像
build
# 提交当前容器为新的镜像
commit
# 从容器中拷贝指定文件或者目录到宿主机中
cp
# 创建一个新的容器,同run,但不启动容器
create
# 查看docker容器变化
diff
# 从docker服务获取容器实时事件
events
# 在已存在的容器上运行命令
exec
# 导出容器的内容流作为一个 tar 归档文件[对应 import ]
export
# 展示一个镜像形成历史
history
# 列出系统当前镜像
images List images
# 从tar包中的内容创建一个新的文件系统映像[对应export]
import
# 显示系统相关信息
info
# 查看容器详细信息
inspect
# kill 指定 docker 容器
kill
# 从一个 tar 包中加载一个镜像[对应 save]
load
# 注册或者登陆一个docker 源服务器
login
# 从当前 Dockerregistry 退出
logout
# 输出当前容器日志信息
logs
# 查看映射端口对应的容器内部源端口
port
# 暂停容器
pause
# 列出容器列表
ps
# 从docker镜像源服务器拉取指定镜像或者库镜像
pull
# 推送指定镜像或者库镜像至docker源服务器
push
# 重启运行的容器
restart
# 移除一个或者多个容器
rm
# 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
rmi
# 创建一个新的容器并运行一个命令
run
# 保存一个镜像为一个tar 包[对应 load]
save
# 在docker hub中搜索镜像
search
# 启动容器
start
# 停止容器
stop
# 给源中镜像打标签
tag
# 查看容器中运行的进程信息
top
# 取消暂停容器
unpause
# 查看 docker 版本号
version
# 截取容器停止时的退出状态值
wait
Docker镜像的理解
镜像是什么
- 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
Docker镜像加载原理
-
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual fifilesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。其特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
-
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统叫UnionFS(联合文件系统)。bootfs(boot fifile system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。rootfs (root fifile system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
-
对于一个精简的OS,rootfs 可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。
容器数据卷
什么是容器数据卷
docker的理念回顾:
- 将应用和运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对于数据的要求,是希望能够持久化的!就好比,你安装一个MySQL,结果你把容器删了,就相当于删库跑路了,这TM也太扯了吧!所以我们希望容器之间有可能可以共享数据,Docker容器产生的数据,如果不通过docker commit 生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了!这样是行不通的!为了能保存数据在Docker中我们就可以使用卷!让数据挂载到我们本地!这样数据就不会因为容器删除而丢失了!
作用:
- 卷就是目录或者文件,存在一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过 Union File System , 提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
特点:
- 1、数据卷可在容器之间共享或重用数据
- 2、卷中的更改可以直接生效
- 3、数据卷中的更改不会包含在镜像的更新中
- 4、数据卷的生命周期一直持续到没有容器使用它为止 所以:总结一句话: 就是容器的持久化,以及容器间的继承和数据共享!
使用数据卷
努力码字中。。。