Docker基础学习文档

下一篇Docker文章:Dockerfile学习

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

  • 卸载原系统存在的Docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
  • 下载Docker的yum repo
# 推荐使用国内的(此处以阿里云的为例)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • 更新yum并下载docker
# 更新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
# 启动docker
systemctl start docker

# 将docker加入开机自启
systemctl enable docker

在Ununtu20上安装Docker(如果非管理员记得所以命令前加sudo)

  • 卸载原系统上存在的Docker
sudo apt-get remove docker docker.io docker-doc docker-compose podman-docker containerd runc
  • 更新apt,下载运行依赖工具包
# 更新apt
sudo apt-get update
# 下载依赖工具包
sudo apt-get install ca-certificates curl gnupg
  • 设置官方GPG key
# 依次执行以下命令
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
  • 安装Docker
# 再次更新apt
sudo apt-get update
# 安装docker
sudo apt-get install docker-ce
  • 启动Docker
# 启动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 images
# 列出当前Docker下的所有镜像 
docker images
  • docker pull
# 将仓库镜像从中央仓库下载到本地,比如下载Redis
# 不带版本下载最新的
docker pull redis

# 带版本
docker pull redis:6.0.2

# 指定远程仓库
docker pull xxx.xxx/redis:6.0.2
  • docker push
# 将镜像推送到远程仓库
docker push my-redis:v1.0
  • docker rmi
# 删除本地仓库指定镜像
docker rmi redis:6.0.2

# id删除
docker rmi 镜像id

# 删除多个
docker rmi image1 image2

# 删除未使用的镜像
docker rmi prune

容器管理类命令

  • docker run
# 运行一个镜像(镜像不存在的话就会去下载)
# 直接运行,容器名称就是镜像名称(加上-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/

  • docker start
# 按容器名称启动容器
docker start myredis

# 按容器id启动容器
docker start xxxx
  • docker stop
# 按容器名称停止容器
docker stop myredis

# 按容器id停止容器
docker stop xxxx
  • docker restart
# 按容器名称重启容器
docker restart myredis

# 按容器id重启容器
docker restart xxxx
  • docker rm
# 前提是容器已经停止了
# 按容器名称删除容器
docker rm myredis

# 按容器id删除容器
docker rm xxxx
  • docker ps
# 列出正在运行的容器
  • docker ps -a
# 列出所有的容器,包括已停止的容器。
  • docker cp
# 将docker容器中文件拷贝到宿主机
docker cp 容器id:文件/文件夹 主机路径

# 将主机文件拷贝到docker容器
docker cp 宿主机文件/文件夹 容器id:容器内路径

# 除了使用文件拷贝外,容器与宿主机之间还可以通过-v绑定volume

容器日志和执行类命令

  • docker logs
# 按容器名称查看容器日志
docker logs myredis

# 按容器id查看容器日志
docker logs xxxx
  • docker exec -it
# 进入容器内部使用bash解释器
docker exec -it 容器名称|容器id bash

# 进入容器内部使用sh解释器
docker exec -it 容器名称|容器id sh

镜像构建和管理类命令

  • docker build -t
# 根据当前路径下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
  • docker tag
# 更换标签便于容器的管理
# 根据容器名称,给名为myredis:v1.0的容器创建一个名为myredis:latest标签的副本
docker tag myredis:v1.0 myredis:latest

# # 根据容器名称,给id为a1b2c334的容器创建一个名为myredis:latest标签的副本
docker tag a1b2c334 myredis:latest
  • docker commit
# 根据当前容器的状态创建一个新的容器
docker commit 容器名|容器id 新容器名称

网络和存储管理类命令

  • docker network ls
# 列出当前Docker网络
# 以下为各网络的特点

  • docker network create
# 创建一个名为mynet的自定义网络,也叫自定义Bridge,其实docker网络就是一个虚拟网桥
docker network create mynet
  • docker volume ls
# 列出当前的volume卷
# 卷就是容器与宿主机间共享的数据,容器损坏后,防止数据丢失
  • docker volume create
# 创建一个名为myvolume的卷
docker volume myvolume

Docker Compose 相关命令

  • docker-compose up
# 启动docker-compose.yml中定义的一系列服务(docker-compose.yml在当前目录下)
# -d是指以守护进程模式运行,就是在后台运行
docker-compose up -d
  • docker-compose stop
# 停止docker-compose.yml中定义的一系列服务(docker-compose.yml在当前目录下)
docker-compose stop
  • docker-compose down
# 删除docker-compose.yml中定义的一系列服务,包括其中的容器,自定义网络,自定义卷等
# docker-compose.yml在当前目录下
docker-compose down

关于Docker的其它命令,以后用到了再做补充……