Docker 入门篇
🏝️ 博主介绍
大家好,我是一个搬砖的农民工,很高兴认识大家 😊 ~
👨🎓 个人介绍:本人是一名后端Java开发工程师,坐标北京 ~
🎉 感谢关注 📖 一起学习 📝 一起讨论 🌈 一起进步 ~
🙏 作者水平有限,欢迎各位大佬指正留言,相互学习进步 ~
目录
- 🏝️ 博主介绍
- 一、什么是Docker?🚀
- 🌈 1、背景
- 🌈 2、Docker三要素
- 🌈 3、Docker四个组成部分
- 二、Docker安装步骤 🚀
- 🌈 1、VM虚拟机下载
- 🌈 2、centrOS 8下载
- 🌈 3、安装docker
- 🌈 4、安装docker - compose
- 🌈 5、配置阿里云镜像加速器
- 🌈 6、docker run 执行顺序
- 🌈 7、docker和虚拟机比较
- 三、docker常用命令 🚀
- 四、docker镜像分层 🚀
- 五、本地镜像发布到阿里云仓库 🚀
- 六、容器卷 🚀
一、什么是Docker?🚀
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
- ⭐ docker官网:https://docs.docker.com/
- ⭐ Docker Hub官网: https://hub.docker.com/
🌈 1、背景
在docker出现之前,是把java代码打包成jar文件后,上传到测试或者生产环境。但是由于测试或者生产跟本地的开发环境不一致(jdk版本、mysql版本、redis版本等)。就很容易出现在本地能跑起来的项目,一上传到测试就跑不起来了。docker的出现就是为了解决这一问题,使用docker后会将你的代码、运行环境、配置文件、第三方插件等全部打包成一个镜像文件。一次镜像,处处运行
,docker仅能在linux上面安装。
🌈 2、Docker三要素
- ⭐ 仓库
仓库是集中存放镜像的地方
,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。世界最大的公开仓库是Docker Hub,国内有阿里云、网易云等。
- ⭐ 镜像
是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容
,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件
。
- ⭐ 容器
只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。
可以把容器看做是一个简易版的Linux环境
(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
🌈 3、Docker四个组成部分
- Docker Client客户端
- Docker Daemon守护进程
- Docker Image镜像
- Docker Container容器
如下图,Client是客户端
,向Docker Daemon守护进程
发送一个run
命令,守护进程先查询本地有没有该image镜像
文件,如果没有就去远程仓库拉取到本地,然后再生成Container容器
二、Docker安装步骤 🚀
🌈 1、VM虚拟机下载
VMware17安装包
链接:https://pan.baidu.com/s/1Dq5-IG8GuhVwgw5y0bfQyA
提取码:7zb0
🌈 2、centrOS 8下载
链接:https://pan.baidu.com/s/1k3z41SyqAfPGrtp41Q7R7g
提取码:6b6t
centos8报错:
Failed to download metadata for repo 'AppStream'
Error: Failed to download metadata for repo 'AppStream'
解决方案参考:
https://blog.csdn.net/lxcw_sir/article/details/140185068
https://blog.csdn.net/weixin_61690271/article/details/142177236
🌈 3、安装docker
🍨 1、确定使用CentOS7及以上镜像版本
cat /etc/redhat-release
🍨 2、卸载旧版本
如果之前有安装过docker,需要先卸载旧版再安装
yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
🍨 3、yum安装gcc
yum -y install gcc
yum -y install gcc-c++
🍨 4、安装stable镜像仓库
yum install -y yum-utils
// 这里使用阿里的,如果从国外的仓库安装会超时
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
🍨 5、更新yum软件包索引
// centos7 命令
yum makecache fast
// centos8 命令
yum makecache
🍨 6、安装docker ce
yum install docker-ce docker-ce-cli containerd.io
🍨 7、启动docker
systemctl start docker
🍨 8、测试
docker version
// 本地找不到镜像会去仓库拉取,然后生成容器实例
docker run hello-world
🍨 9、卸载 docker
systemctl stop docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf/var/lib/containerd
🌈 4、安装docker - compose
// 安装(这里是v2.27.3版本,可根据docker版本进行修改)
sudo curl -L "https://github.com/docker/compose/releases/download/v2.27.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
// 赋权
sudo chmod +x /usr/local/bin/docker-compose
// 查看是否安装成功
docker-compose --version
// 如果查看报错,可以删除后重装合适版本
sudo rm /usr/local/bin/docker-compose
🌈 5、配置阿里云镜像加速器
🍨 1、找到‘弹性计算’下面的‘容器镜像服务’
🍨 2、创建个人版
🍨 3、点击‘镜像加速器’,选择CentOs找到加速器命令
🍨 4、执行如下命令配置成功
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{// "registry-mirrors": ["https://85mem738.mirror.aliyuncs.com"]"registry-mirrors": ["使用自己生成的加速器url"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
如果加了阿里云镜像加速器还是超时,报错如下:
Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
可以尝试下面的方法: 参考:
https://blog.csdn.net/weixin_46028606/article/details/142663559
https://blog.csdn.net/Liiiiiiiiiii19/article/details/142438122
🌈 6、docker run 执行顺序
🌈 7、docker和虚拟机比较
1、虚拟机(Hypervisor)除了在宿主操作系统上运行外,还需要依赖于一个镜像(比如在MVware上面运行虚拟机需要选择一个Centos镜像,这个镜像包括了整个操作系统需要的配置,一般好几个G)。
而docker是直接依赖宿主操作系统。因此在cpu、内存利用率上docker有明显优势
2、新建一个docker实例的时候,不需要像虚拟机一样加载一个操作系统内核,一般虚拟机加载OS是分钟级的,而docker直接利用宿主机OS仅需要几秒钟就能生成一个docker实例
三、docker常用命令 🚀
⚡ docker常用命令请参考另外一篇博客:Docker常用命令
四、docker镜像分层 🚀
🍨 1、什么是UnionFS
UnionFS (联合文件系统) : Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统
,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtualfilesystem)。 Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承
,基于基础镜像(没有父镜像) ,可以制作各种具体的应用镜像。
🍨 2、docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFSbootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs (root file system) ,在bootfs之上。包含的就是典型Linux系统中的/dev, /proc, /bin, /etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu, Centos等等。
Docker镜像层都是只读的,容器层是可写的
·当容器启动时,一个新的可写层被加载到镜像的顶部这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。所有对容器的改动-无论添加、删除、还是修改文件都只会发生在容器层
中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。
🍨 3、镜像分层原理
Docker镜像分层,支持通过扩展现有镜像,创建新的镜像。类似于Java继承于一个Base基础类,自己再按需扩展。
🍨 4、示例
先,创建一个ubuntu实例,并创建一个a.txt文件,用vim命令进入编辑时,提示这个命令不存在。
然后,执行如下命令,在ubuntu容器上面安装vim
#先更新我们的包管理工具
apt-get update
#然后安装我们需要的
vimapt-get install vim
然后,安装完成后执行vi a.txt
,编辑如下后保存退出:wq!
。
然后,将容器生成一个新的镜像,该镜像包含该容器所有文件。
语法:docker commit -m="[提交描述]" -a="[作者]" [容器ID] [镜像名]:[版本号]
最后,在ubuntu上面安装了一个vim生成了一个新的ubuntu。就相当于扩展了基础镜像。
🍨 5、镜像分层优点
- 资源共享
- 方便复制迁移
五、本地镜像发布到阿里云仓库 🚀
1.创建命名空间
2.创建镜像仓库
3.根据提示提送本地镜像到阿里云仓库
六、容器卷 🚀
Docker容器卷是将容器的文件系统路径映射到主机文件系统路径
的一种方法。它允许在容器和主机之间共享数据
,使得数据的持久化存储和备份变得更加容易。
Docker容器卷有以下几个作用:
- 数据持久化:容器卷将数据存储在主机文件系统中,即使容器被删除或重新创建,数据也可以保留。
- 数据共享:容器卷允许主机和容器之间共享数据,这使得容器之间的数据共享变得更加容易。
- 备份和恢复:使用容器卷可以将容器中的数据备份到主机中,也可以从备份中恢复容器中的数据。
语法:docker run -v <主机目录>:<容器目录> <镜像id>:<镜像版本>
要实现Docker容器卷,可以使用以下命令来创建一个卷:
docker volume create myvolume
这将创建一个名为myvolume的卷。可以通过将-v选项添加到docker run命令中来将卷挂载到容器中:
docker run -d -v myvolume:/path/to/mount myimage
这将从主机文件系统的myvolume路径挂载到容器中的/path/to/mount路径。现在容器和主机之间可以共享数据了。
另外,Docker还支持将主机文件系统的路径直接挂载到容器中。例如,要将主机文件系统的/path/on/host路径挂载到容器中的/path/to/mount路径:
docker run -d -v /path/on/host:/path/to/mount myimage
这将从主机文件系统的/path/on/host路径挂载到容器中的/path/to/mount路径。
⚡ 需要对Docker容器卷有更深的理解,请参考: 深入理解 Docker 容器卷