文章目录
Docker概述
什么是docker
Docker本质上是一个采用虚拟化技术的容器,基于Linux容器进行再封装,使用户不用关心容器的管理,而简化应用操作。
Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。
docker 为什么会出现?
背景介绍:
一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发+运维之间的协助我们需要关心的问题很多,这也是很多互联网公司不得不面对的问题,
特别是各种版本的迭代之后,不同版本环境的兼容,对运维人员都是考验。
Docker之所以发展如此迅速,也是运维它给出了一个标准化的解决方案。
环境配置如此麻烦,换一台机器,就要重新来一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境
一模一样的复制过来。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。
之前在服务器配置一个应用的运行环境,要安装各种软件,安装和配置这些东西有多麻烦就不必多说了。
它还不能跨平台。假设我们是在Windows上安装的这些环境,到了Linux又得重新安装。况且就算不跨操作系统,换另一台同样的操作系统的服务器,要移植应用也是非常的麻烦的。
Docker镜像的设计,使得Docker得以打破过去【程序即应用】的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。
解决运行环境不一致所导致的问题。这样就不会产生“本地运行没问题,可一到服务器上就不行了”的情况。限定最大的cpu使用内存硬盘,这样就起到了隔离的作用,避免产生“一块代码产生死循环,把磁盘占满了,其它程序也挂了”的情况。
总结成一句话:docker的标准化让快速扩展,弹性伸缩变得简单
docker应用场景
1、场景一:节省项目环境部署时间
1)单项目打包
-
每次部署项目到测试、生产等环境,都要部署一大堆依赖的软件、工具,时间久,出错概率大。
-
Docker主要理念就是环境打包部署,可在任意Docker Engine运行。
-
我们只需要将每个项目环境打包到镜像,push到镜像仓库,当有需要部署这个项目时,直接pull镜像启动容器,这个项目就可以访问了!一次构建多次部署,一劳永逸。
2)整套项目打包
-
比如有一个产品可以整套部署到客户那里,以往都是派一名实施工程师到客户那部署。
-
如果用了Docker,我们可以前期将这套项目封装打包起来,实现一键部署,分分钟钟搞定,就不需要再派人过去了。比如官方的Docker Compose编排工具。
3)新开源技术试用
- 有时,我们想调研一些开源项目,我们可以直接从公共镜像仓库pull项目官方做好镜像启动容器即可。
2、场景二:环境一致性
-
项目在开发电脑本地运行没问题,到了测试或生产环境就运行不起来。
-
Docker将项目环境打包成镜像,可以在任何Docker Engine部署。
3、场景三:持续集成
-
一个项目版本快速迭代的测试场景,需要一个合理的CI(持续集成)/CD(持续部署)环境支撑。
-
CI/CD是一个周期性自动化项目测试流程,包括构建、部署、测试、发布等工作,很少需要人工干预。
-
Docker通过项目镜像构建和快速部署,打通测试环境与生产环境,高度保持多个环境之间一致性。
4、场景四:微服务
-
微服务指尽可能细粒度拆分业务程序架构,由多个独立服务组成业务系统。
-
Docker容器作为这些独立服务的部署单元,每个服务单独部署到一个docker容器中。
docker的历史
2010年,几个搞IT的年轻人在美国成立以一家公司docCloud,做一些pass的云计算服务,他们将自己的容器化技术,命名为Docker,刚诞生的时候没有引起行业的注意,由于公司活不下去,2013年Docker开源,从此走入开发者的视野,开源后每个月都会更新一个版本
2014年4月9日,Docker1.0发布
在容器技术之前,我们都是使用虚拟机技术VM
虚拟机十分笨重,容器十分轻巧
docker中的名词概念
镜像(image)
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务
容器(container)
Docker利用容器技术,独立运行一个或者一组应用, 可以理解为一个简易的Linux系统。
仓库(repository)
仓库就是存放镜像的地方
分为公有仓库和私有仓库
Docker Hub(默认是国外的仓库)
可以通过阿里云等配置国内镜像加速
Docker安装
# 1)安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 2)移除系统中的旧版本的docker
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
# 3)添加Docker软件包源(否则doker安装的不是新版本)
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 切换docker的镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新软件包索引
yum makecache fast
# 4)安装Docker CE docker客户端 容器
yum install docker-ce docker-ce-cli containerd.io
# 5)启动Docker服务并设置开机启动
systemctl start docker
systemctl enable docker
# 5)测试docker是否安装成功(hello-world是官方提供的一个测试镜像)
docker run hello-world
# 6)查看docker基本信息
docker info
docker version
# 移除docker
yum remove docker-ce docker-ce-cli containerd.io
# 删除docker的文件
rm -rf /var/lib/docker
配置docker加速器
# 修改daemon配置文件/etc/docker/daemon.json来使用加速器
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://1evgikmo.mirror.aliyuncs.com"]
}
EOF
# 重新加载
systemctl daemon-reload
# 重新启动docker
systemctl restart docker
hello-world运行流程
底层原理
Docker是怎么工作的?
1、Docker是一个Client-Server结构 的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!
DockerServer接收到Docker的指令,执行命令。
Docker为什么比VM快?
1、Docker有着比虚拟机更少的抽象层。
2、Docker 用的是宿主机的内核,vm需要的是GuestOS
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
Docker容器 | 虚拟机(VM) | |
---|---|---|
操作系统 | 与宿主机共享OS | 宿主机OS上运行宿主机OS |
存储大小 | 镜像小,便于存储与传输 | 镜像庞大(vmdk等) |
运行性能 | 几乎无额外性能损失 | 操作系统额外的cpu、内存消耗 |
移植性 | 轻便、灵活、适用于Linux | 笨重、与虚拟化技术耦合度高 |
硬件亲和性 | 面向软件开发者 | 面向硬件运维者 |
Docker常用命令
帮助命令
docker version # docker 版本信息
docker info # docker 的系统信息,包括镜像和容器的数量
docker 命令 --help # 帮助命令
帮助命令地址:
https://docs.docker.com/engine/reference/commandline/cli/
docker镜像命令
docker images
查看本地主机上所有的镜像
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8EQfJB5P-1623681473980)(images/image-20210614143019666.png)]
REPOSITORY: 镜像的仓库源
TAG: 镜像的标签
IMAGEID: 镜像的id
CREATED: 镜像的创建时间
SIZE: 镜像的大小
可选参数:
-a 查看当前docker中的所有的镜像
-q 仅查看镜像的id
docker search imagesname
使用docker搜索镜像
docker search mysql
NAME 搜索结果的名称
DESCRIPTION 描述
STARS 收藏
可选项, 通过stars来过滤
--filter=STARS=3000 # 搜索STARS大于3000的
docker pull
拉取镜像
docker pull mysql
[root@jiyun-clone-111 ~]# docker pull mysql
Using default tag: latest # 如果不写tag, 默认是latest
latest: Pulling from library/mysql
69692152171a: Pull complete # 分层下载 docker images的核心 联合文件系统
1651b0be3df3: Pull complete
951da7386bc8: Pull complete
0f86c95aa242: Pull complete
37ba2d8bd4fe: Pull complete
6d278bb05e94: Pull complete
497efbd93a3e: Pull complete
f7fddf10c2c2: Pull complete
16415d159dfb: Pull complete
0e530ffc6b73: Pull complete
b0a4a1a77178: Pull complete
cd90f92aa9ef: Pull complete
Digest: sha256:d50098d7fcb25b1fcb24e2d3247cae3fc55815d64fec640dc395840f8fa80969 # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址
docker pull mysql 等价于 docker pull docker.io/library/mysql:latest
通过tag指定版本下载
docker pull mysql:5.7
指定的版本必须是存在的
docker rmi -f
rmi remove images 移除镜像
-f # 按id删除
docker rmi -f d1165f221234
docker rmi -f 镜像id1 镜像id2
删除多个
docker rmi -f $(docker images -aq)
删除全部镜像
容器命令
拉取centos镜像
docker pull centos
新建容器并启动
docker run [可选参数] image
# 参数说明
--name="Name" # 容器名称,容器启动以后用来区分的名称
-d # 以后台方式运行
-it # 以交互方式运行, 进入容器查看内容
-p # 指定容器的端口 -p 8080:8080
-p 四种用法
-p ip:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口
-P # 随机指定端口
# 测试,启动并进入容器
docker run -it centos /bin/bash
# 退出容器
exit
# 只退出不停止容器
ctrl + p + q
列出所有的容器
docker ps
# docker ps 命令
# 列出当前正在运的容器
-a # 列出当前正在运行的容器(包含历史运行的容器)
-n=?# 显示最近创建的容器
-q # 只显示容器的编号
删除容器
# 删除容器
docker rm 容器id # 删除指定的容器, 不能删除正在运行的容器
docker rm -f 容器id # 强制删除指定的容器id
docker rm -f $(docker ps -aq) # 递归删除所有的容器
docker -a -q | xargs docker rm # 删除所有的容器
启动和停止容器
# 启动和停止容器
docker strat 容器id # 启动停止的容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止容器id
docker kill 容器id # 杀死容器
常用的其它命令
后台启动容器
docker run -d centos
# -d 启动容器以后,使用dokcer ps发现容器停止了
# docker 默认认为当前容器没有被使用,所以自动结束了进程
查看日志
docker logs -tf 容器
# 编写脚本: docker run -d centos /bin/sh -c "while true;do echo haishangyueming;sleep 1; done"
# 显示日志
-tf # 显示日志
--tail number # 要显示日志条数
docker logs -tf --tail 10 容器id
查看容器中的进程信息
docker top 容器id
[root@server ~]# docker top 81abcd607f77
UID PID PPID C STIME TTY
root 1474 1458 0 21:18 pts/0
查看镜像的元数据
[root@jiyun-clone-111 ~]# docker ps -q
27273fe99438
# docker inspect 容器id
docker inspect 27273fe99438
进入正在运行的容器
docker exec -it 容器id /bin/bash # 以交互模式进入正在运行的容器
docker attach 容器id # 进入正在运行的容器
# 区别
docker exec # 进入容器后开启一个新的终端(常用)
decker attach # 进入容器正在执行的终端,不会启动新的进程
从容器内拷贝文件到本地
docker cp 容器id:容器内路径 本地路径
docker cp 81abcd607f77:/home/test.py /home