Docker基础学习文档
Docker介绍
什么是Docker
引用Docker官网的介绍
Docker是一个用于开发、发布和运行应用程序的开放平台。Docker使您能够将应用程序从基础设施中分离出来,以便快速交付软件。使用Docker,您可以像管理应用程序一样管理基础架构。通过利用Docker的方法来交付、测试和部署代码,您可以显著减少编写代码和在生产环境中运行代码之间的延迟。
而以我个人通俗的理解呢
Docker是一个安装在操作系统上的虚拟机,是一个特别的虚拟机,这个虚拟机只能运行容器;一个容器就像一个环境集合。
就像MySQL容器,里面包含了MySQL运行所需要的所有环境,对这个环境进行打包,就是一个镜像;将这个镜像在Docker上运行,就生成了一个MySQL服务,这个服务就是容器。
什么是镜像
什么是镜像呢?就像有一天你在路上看到一片很好看的晚霞,你把这片晚霞用相机保存下来,生成了一张照片;照片保存了这一时刻的晚霞,他不随着时间流逝,你可以将这张照片分享给任何人。
回过头来看,我把MySQL运行所需要的环境保存下来,进行打包,而打成的包就成了一个镜像,你可以将镜像给任何人,他就能在Docker上运行这个镜像;因此你可以把镜像看成是一个安装包。
什么是容器
接着上面:我们把安装包分享给了别人,别人得安装吧,要不然怎么使用这个软件,而使用安装包被安装后就成为了我们手机/电脑上的软件。
那么显而易见,镜像就相当于安装包,容器就是安装后的软件,只不过这个安装包有点特殊,只能安装在Docker上。我们将这个镜像分享给别人,别人使用这个镜像就能安装生成容器了。
什么是镜像仓库呢
还是我们的安装包为例子:有一天你想要一个有趣的软件的安装包,可是你没有,但是小明有,你去找小明要,小明就将它发给你,但是后来,越来越多的人发现,你用着有趣的安装包,他们也想要,于是他们就都去找小明,显然小明是忙不过来的,于是他就将这个安装包上传到了应用商店,人人都可以去上面下载了。
而镜像仓库就像这个软件商店类似,人们在上面上传一些镜像,供所有人下载;可是镜像仓库又分为公共仓库和私有仓库:
公共仓库:
就是任何人都能在上面下载镜像,一般常用服务的官方镜像也在这个上面,比如:Docker的官方镜像仓库。
私有仓库:
一般由个人或则公司搭建的私有仓库,自能供有权限的人下载。
为什么要使用Docker呢
**为什么要使用Docker呢:**有这样一个场景,你们团队准备开发一款App,那么便涉及到了多个外部服务,像数据库,缓存,消息队列,不同编程语言环境等,这样的话在开发过程中你们开发,运维,测试都需要安装这样一套环境,可能第一次还好,如果哪天环境中软件的版本需要变动,可能需要重新安装一遍;安装过这种服务的同学都知道,那是相当刺激的,因此对谁来说都不乐意了。
可能有同学会说,我们可以使用虚拟机啊,一个虚拟机克隆几份;是的,是可以用虚拟机,Docker的本质也是虚拟机;但是传统的虚拟机太笨重了,每次启动都要好久,且占用系统资源过高,可能我运行一个虚拟机占用的内存比我一整套服务占用的内存都高,这是得不偿失的。
Docker的话相对于传统虚拟机,更加轻量化,占用内存少,启动迅速,镜像共享性高,这便是最大的有点;相对来说Docker也是有缺点的,那就是相对于传统虚拟机,虚拟化程度不高,不能做到与操作系统环境完全隔离,毕竟很多api要依赖于操作系统,但是对于我们这种对虚拟化要求不高的项目来说,用Docker是非常优的选择。
Docker的基本架构
Docker使用经典的C/S架构,分为Docker Client与Docker Server;Docker Client用于接受用户输入的指令,展示Docker运行信息等;Docker Server处理Docker Client接受的指令,运行容器,构建容器等。
一般我们都是将Docker Client与Docker Server安装在同一个操作系统上,所有感知不强;对于一些企业,Docker Client与Docker Server都安装在不同的系统上。
安装Docker
Docker是由Go语言开发的一款软件,由于Go并非是跨操作系统的语言,且官方只对Linux/Unix系统做了适配,所以Docker只能安装在这些系统上。
至于想将Docker安装在Windows上,可以看看使用适用于 Linux 的 Windows 子系统文档 | Microsoft Learn的实现方式,不过本质上还是安装在Linux上。
以下我讲讲如何分别在Centos7和Ubuntu20上安装Docker
在Centos7上安装Docker
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
|
# 推荐使用国内的(此处以阿里云的为例) yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
|
# 更新yum yum -y update # 下载运行依赖的工具 yum install -y yum-utils device-mapper-persistent-data lvm2 # 安装Docker CE(ce指Community Edition,社区版,企业版需要money的) yum install -y docker-ce
|
# 启动docker systemctl start docker
# 将docker加入开机自启 systemctl enable docker
|
在Ununtu20上安装Docker(如果非管理员记得所以命令前加sudo)
sudo apt-get remove docker docker.io docker-doc docker-compose podman-docker containerd runc
|
# 更新apt sudo apt-get update # 下载依赖工具包 sudo apt-get install ca-certificates curl gnupg
|
# 依次执行以下命令 sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
|
echo \ "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \ "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
# 再次更新apt sudo apt-get update # 安装docker sudo apt-get install docker-ce
|
# 启动docker sudo systemctl start docker
# 将docker加入开机自启 sudo systemctl enable docker
|
配置Docker仓库镜像源
- 在/etc/docker目录下新建一个daemon.json文件(有就直接编辑),添加以下内容
{ "registry-mirrors": [ "https://mirror.ccs.tencentyun.com", "https://xxxx.mirror.aliyuncs.com", "https://hub-mirror.c.163.com" ],
"log-driver":"json-file", "log-opts":{ "max-size" :"50m","max-file":"3" }
}
|
- 这个三个镜像源分别是腾讯云,阿里云,网易的,其中阿里云的需要你们登录账号自己去获取,替换xxx的部分即可
- 这个log-driver指的是设置每个容器的日志文件大小,总大小50M,最多分三个文件
Docker命令介绍
镜像管理类命令
# 列出当前Docker下的所有镜像 docker images
|
# 将仓库镜像从中央仓库下载到本地,比如下载Redis # 不带版本下载最新的 docker pull redis
# 带版本 docker pull redis:6.0.2
# 指定远程仓库 docker pull xxx.xxx/redis:6.0.2
|
# 将镜像推送到远程仓库 docker push my-redis:v1.0
|
# 删除本地仓库指定镜像 docker rmi redis:6.0.2
# 按id删除 docker rmi 镜像id
# 删除多个 docker rmi image1 image2
# 删除未使用的镜像 docker rmi prune
|
容器管理类命令
# 运行一个镜像(镜像不存在的话就会去下载) # 直接运行,容器名称就是镜像名称(加上-d便是后台模式) docker run redis docker run -d redis
# 指定镜像名称与暴露端口 # 指定名称好管理,暴露端口是便于访问,一般都暴露端口,本机端口:容器端口,将本机端口映射到容器端口 docker --name redis1 \ -p 6379:6379 \ -d redis
# 映射文件目录 # 将容器目录与本机目录进行映射 本机目录:容器目录 docker --name redis1 \ -p 6379:6379 \ -v /usr/local/redis:/usr/local/redis \ -d redis
# 设置环境变量 # 设置容器内环境变量name=xiaoming,容器服务可以使用这个环境变量 docker --name redis1 \ -p 6379:6379 \ -v /usr/local/redis:/usr/local/redis \ -e name=xiaoming \ -d redis
# 设置启动策略 # 这里设置docker启动,容器自启 docker --name redis1 \ -p 6379:6379 \ -v /usr/local/redis:/usr/local/redis \ --restart=always \ -e name=xiaoming \ -d redis
# 链接到另一个容器 # 一般这种情况是我需要访问到其它容器--link <container_name>:<alias> # 不过这个参数目前弃用了,官方更建议使用自定义网络的方式--network=<network_name> # 创建mynetwork网络 docker network create mynetwork # 使用该网络 docker --name redis1 \ -p 6379:6379 \ -v /usr/local/redis:/usr/local/redis \ --restart=always \ --network=mynetwork \ -e name=xiaoming \ -d redis
# 关于docker网络的布局,可以参考https://www.bilibili.com/video/BV1Aj411r71b/
|
![](https://blog-1306275892.cos.ap-shanghai.myqcloud.com/hexo/blogs/2023-8-23/docker-network.png)
# 按容器名称启动容器 docker start myredis
# 按容器id启动容器 docker start xxxx
|
# 按容器名称停止容器 docker stop myredis
# 按容器id停止容器 docker stop xxxx
|
# 按容器名称重启容器 docker restart myredis
# 按容器id重启容器 docker restart xxxx
|
# 前提是容器已经停止了 # 按容器名称删除容器 docker rm myredis
# 按容器id删除容器 docker rm xxxx
|
# 将docker容器中文件拷贝到宿主机 docker cp 容器id:文件/文件夹 主机路径
# 将主机文件拷贝到docker容器 docker cp 宿主机文件/文件夹 容器id:容器内路径
# 除了使用文件拷贝外,容器与宿主机之间还可以通过-v绑定volume
|
容器日志和执行类命令
# 按容器名称查看容器日志 docker logs myredis
# 按容器id查看容器日志 docker logs xxxx
|
# 进入容器内部使用bash解释器 docker exec -it 容器名称|容器id bash
# 进入容器内部使用sh解释器 docker exec -it 容器名称|容器id sh
|
镜像构建和管理类命令
# 根据当前路径下Dockerfile文件构建一个名为myredis的镜像(注意末尾的一个点代表当前路径,不能省略) docker build -t myredis .
# 根据/usr/local路径下Dockerfile文件构建一个名为myredis的镜像 docker build -t myredis -f /usr/local/Dockerfile .
# 根据url下的Dockerfile构建镜像 docker build -t myredis http://xx.xx
|
# 更换标签便于容器的管理 # 根据容器名称,给名为myredis:v1.0的容器创建一个名为myredis:latest标签的副本 docker tag myredis:v1.0 myredis:latest
# docker tag a1b2c334 myredis:latest
|
# 根据当前容器的状态创建一个新的容器 docker commit 容器名|容器id 新容器名称
|
网络和存储管理类命令
# 列出当前Docker网络 # 以下为各网络的特点
|
![](https://blog-1306275892.cos.ap-shanghai.myqcloud.com/hexo/blogs/2023-8-23/docker-network.png)
# 创建一个名为mynet的自定义网络,也叫自定义Bridge,其实docker网络就是一个虚拟网桥 docker network create mynet
|
# 列出当前的volume卷 # 卷就是容器与宿主机间共享的数据,容器损坏后,防止数据丢失
|
# 创建一个名为myvolume的卷 docker volume myvolume
|
Docker Compose 相关命令
# 启动docker-compose.yml中定义的一系列服务(docker-compose.yml在当前目录下) # -d是指以守护进程模式运行,就是在后台运行 docker-compose up -d
|
# 停止docker-compose.yml中定义的一系列服务(docker-compose.yml在当前目录下) docker-compose stop
|
# 删除docker-compose.yml中定义的一系列服务,包括其中的容器,自定义网络,自定义卷等 # docker-compose.yml在当前目录下 docker-compose down
|
关于Docker的其它命令,以后用到了再做补充……