一、简介
1.1、是什么
Docker是·基于GO语言实现的云开源项目
Docker的主要目标是“Bulid,Ship and Run Any APP, Anywhere”,也就是通过对应用组件的封装、分发、部署、运行生命周期的管理。使用户的APP(可以是一个WEB应用或者数据库应用等)机器运行环境能够做到“一次封装,到处运行”。
解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
1.2、能干嘛
之前的虚拟机技术
它可以是在一种操作系统中运行的另一种操作系统,比如在windows系统中运行Linux系统,虚拟机看起来跟真实的操作系统一模一样,因为它虚拟了软件硬件以及内核内库等。但是会出现资源占用多、冗余步骤多、启动慢等缺点。
容器虚拟化技术
由于存在前面虚拟机这些缺点,Linux发展出另一种虚拟化技术:Linux容器。
Linux容器不是模拟一个完整的操作系统,二十对进程进行隔离,有了容器,就可以将软件运行所需的所有资源大宝到一个隔离的容器中。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
1.3、去哪下
Docker官网>>https://www.docker.com/
二、Docker安装
2.1、前提条件
CentOS Docker安装
Docker支持一下的CentOS版本:CentOS 7(64-bit)\CentOS6.5(64-bit)或更高版本
查看自己的内核
uname命令用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)。
[root@hadoop100 ~]# uname -r 3.10.0-1160.36.2.el7.x86_64
查看自己已安装的CentOS版本信息
[root@hadoop100 ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)
2.2、架构图
Docker的基本组成
- 镜像(image)就是一个只读的模板,镜像可以用来创建Docker容器,一个镜像可以创建很多容器。
- 容器(container)容器是用镜像创建的运行实例,它可以被启动开始停止删除。每个容器都是相互隔离的,保证安全的平台。可以把容器看成是一个简易版的Linux环境和运行在其中的应用程序。
- 仓库(repository)是集中存放镜像文件的场所,
2.3、Docker 安装
centOS6.8安装Docker
- yum install -y epel-release
- yum install -y docker-io
- 安装后的配置文件:/etc/sysconfig/docker
- 启动Docker后台服务:service docker start
- docker version验证
centOS7 安装Docker
- 卸载旧版本
$ sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
- 设置仓库
安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
$ sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
使用以下命令来设置稳定的仓库。
$ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
可选项,设置 edge 和test仓库
$ sudo yum-config-manager --enable dockerce-edge
$ sudo yum-config-manager --enable dockerce-test
- 安装最新版本的 Docker Engine-Community 和 containerd
$ sudo yum install docker-ce docker-ce-cli containerd.io
- 启动docker
$ sudo systemctl start docker
配置阿里云镜像加速器
- 打开阿里云官网,注册一个账号,找容器镜像服务,点开镜像加速器
- 修改daemon配置文件
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://******.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
- 运行 hello-world 镜像
$ sudo docker run hello-world
使用docker images查看本地主机上的镜像
[root@hadoop100 docker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 8 months ago 13.3kB
二、Docker常用命令
1、帮助命令
docker -v 查看docker版本
docker version 查看docker版本以及详情
docker info 查看 运行的docker更详细的信息
docker --help 查看docker常用命令的帮助文档
2、镜像命令
1)docker images
列出本地主机上的镜像
OPTIONS说明:-a 列出本地所有的镜像(含中间映像层)
-q 只显示镜像ID
-digests 显示镜像的摘要信息
--no-trunc 显示完整的镜像信息
2)docker searchXXX镜像名
从docker hub上查找镜像 >> https://hub.docker.com
docker search [OPTIONS] 镜像名
OPTIONS说明:--no-trunc 显示完整的镜像信息
-s 列出收藏数不小于指定值的镜像
-automated 只列出automated build类型的镜像
[root@hadoop100 docker]# docker search tomcat NAME DESCRIPTION STARS OFFICIAL AUTOMATED tomcat Apache Tomcat is an open source implementati… 3326 [OK] tomee Apache TomEE is an all-Apache Java EE certif… 97 [OK] bitnami/tomcat Bitnami Tomcat Docker Image 45 [OK] kubeguide/tomcat-app Tomcat image for Chapter 1 35 arm32v7/tomcat Apache Tomcat is an open source implementati… 11 arm64v8/tomcat Apache Tomcat is an open source implementati… 7 rightctrl/tomcat CentOS , Oracle Java, tomcat application ssl… 7 [OK] amd64/tomcat Apache Tomcat is an open source implementati… 4 jelastic/tomcat An image of the Tomcat Java application serv… 3 tomcat2111/pisignage-server PiSignage Server 3 [OK] oobsri/tomcat8 Testing CI Jobs with different names. 2 cfje/tomcat-resource Tomcat Concourse Resource 2 chenyufeng/tomcat-centos tomcat基于centos6的镜像 1 [OK] ppc64le/tomcat Apache Tomcat is an open source implementati… 1 appsvc/tomcat 1 tomcat0823/auto1 0 softwareplant/tomcat Tomcat images for jira-cloud testing 0 [OK] tomcatengineering/pg_backup_rotated Clone of martianrock/pg_backup_rotated but w… 0 tomcat2111/papercut-mf PaperCut MF Application Server 0 tomcat2111/phpredisadmin This is a Docker image for phpredisadmin 0 [OK] s390x/tomcat Apache Tomcat is an open source implementati… 0 misolims/miso-base MySQL 5.7 Database and Tomcat 8 Server neede… 0 semoss/docker-tomcat Tomcat, Java, Maven, and Git on top of debian 0 [OK] secoresearch/tomcat-varnish Tomcat and Varnish 5.0 0 [OK] tomcat2111/bitbucket-pipelines-elasticsearch Elasticsearch for Bitbucket's Pipelines 0
3)docker pull XXX镜像名
下载镜像 docker pull 镜像名[:TAG]
docker pull tomcat 等价于 docker pull tomcat:latest
4)docker rmi XXX镜像名
删除镜像 只能删除非运行状态的镜像
docker rmi -f 镜像名/镜像ID 强制删除镜像
docker rmi -f 镜像名1/镜像ID1:TAG 镜像名2/镜像ID2:TAG 删除多个镜像
docker rmi -f ${docker image -qa} 删除全部镜像
思考:结合我们Git的学习,大家猜猜是否会有docker commit / docker push 命令
3、容器命令
有镜像才能创建容器,这是根本前提(下载一个CentOS镜像演示) docker pull centos
1)新建并启动容器
docker run [OPTIONS] 镜像名 [COMMAND][ARG...]
OPTIONS说明:有些是一个- 有些是两个--
--name="容器新名字" 为容器指定一个名称
-d 后台运行容器,并返回容器ID
-i 已交互模式运行容器,通常与-t同时使用
-t 为容器重新分配一个伪输入终端,通常与-i同时使用。
-P 随机端口映射
-p 指定端口映射,有一下四种格式:
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
2)列出本机正在运行的镜像
docker ps [OPTIONS]
OPTIONS说明:
-a 列出当前所有正在运行的容器+历史上运行过的容器
-l 显示最近创建的容器
-n 显示最近n个创建的容器
-q 静默模式,只显示容器编号
--no-trunc 不截断输出
3)退出容器
- exit 容器停止退出
- ctrl+P+Q 容器不停止退出
4)启动容器
docker start 容器ID/容器名
5)重启容器
docker restart 容器ID/容器名
6)停止容器
docker stop 容器ID/容器名
7)强制停止容器
docker kill 容器ID/容器名
8)删除已停止的容器
docker rm [-f] 容器ID/容器名 删除、强制删除容器
docker rm -f ${docker ps -a-q} 删除所有的容器
docker ps -a-q | xargs docker rm 删除所有的容器
9)启动守护式启动
- docker run -d 容器名 启动守护式启动
- docker logs -f -t --tail n 容器ID 查看容器日志
-t 加上时间戳 -f 往后面追加 --tail n 查看倒数n条日志 - docker top 容器ID 查看你容器内运行的进程
- docker inspect 容器ID 查看容器内部细节
- docker exec -it 容器ID bashShell 已命令行交互的形式启动容器
重新进入守护docker容器 docker attach 容器ID
区别:attach 直接进入容器启动命令的终端,不会启动新的进程
exec 是在容器中打开新的终端,并且可以启动新的进程 - docker exec -t 容器ID ls -l /tmp 可以在容器外面对容器内进行操作。
- docker cp 容器ID:容器内路径 目的主机路径 从容器内拷贝文件到主机上
三、Docker镜像
1、联合文件系统(UnionFS)
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
知道个概念就行,貌似只有docker才用到联合文件系统。
2、Docker 镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统通过UnionFS构成了一个完整的镜像。
bootfs(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等等。
3、分层的理解
[root@laytao~]# docker pull tomcat Using default tag: latest latest: Pulling from library/tomcat 0e29546d541c: Pull complete 9b829c73b52b: Pull complete cb5b7ae36172: Pull complete 6494e4811622: Pull complete 668f6fcc5fa5: Pull complete dc120c3e0290: Pull complete 8f7c0eebb7b1: Pull complete 77b694f83996: Pull complete 0f611256ec3a: Pull complete 4f25def12f23: Pull complete Digest: sha256:9dee185c3b161cdfede1f5e35e8b56ebc9de88ed3a79526939701f3537a52324 Status: Downloaded newer image for tomcat:latest docker.io/library/tomcat:latest [root@laytao~]#
这是下载一个tomcat镜像,可以看出,tomcat镜像是有很多个文件组成,下载镜像的时候它是一层一层下载的。
然后我们刚下载的是tomcat最新版本,我们又下了个其他版本的。
[root@laytao~]# docker pull tomcat:8.5 8.5: Pulling from library/tomcat 0e29546d541c: Already exists 9b829c73b52b: Already exists cb5b7ae36172: Already exists 6494e4811622: Already exists 668f6fcc5fa5: Already exists dc120c3e0290: Already exists 8f7c0eebb7b1: Already exists 77b694f83996: Already exists b7c26350ecc2: Pull complete 7365b3b02e1b: Pull complete Digest: sha256:421c2a2c73f3e339c787beaacde0f7bbc30bba957ec653d41a77d08144c6a028 Status: Downloaded newer image for tomcat:8.5 docker.io/library/tomcat:8.5 [root@laytao~]#
可以看出,其他文件显示已存在,就没有在拉取,只是拉取了部分文件。
小总结
从两次下载tomcat我们可以看到,对于已经存在的层就没有必要再次下载了,而是实现了资源的共享。我们可以引申为所有的镜像都是如此,多个镜像都从相同的Base镜像构建而来,那么宿主机只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。
我们从外部看到的镜像好像是一个文件,但是其内部是由多个文件一层一层包裹而来。
这就对应上了镜像的特性:Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!这一层就是我们通常说的容器层,容器之下的都叫镜像层!
4、Docker镜像commit操作
docker commit 提交容器副本使之成为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
四、容器数据卷
为了使容器中的数据持久化,我们使用容器数据卷
作用:容器的持久化,容器间继承+共享数据
1、直接命令添加
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
会在宿主机和容器内生成一个共享文件夹
可以通过 docker inspect 容器id 验证容器卷是否添加成功
2、使用DockerFile添加
3、volumes-from实现容器之间的文件夹共享
五、DockerFile讲解
1、是什么
dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
构建三步骤
编写dockerfile--docker build -- dicker run
2、dockerfile的解析过程
dockerfile内容的基础知识
1)每条保留字指令必须为大写字母且后面要跟随至少一个参数
2)指令按照从上到下,顺序执行
3)#表示注释
4)每条指令都会创建一个新的镜像层,并对镜像进行提交。
docker执行DockerFile的大致流程
1)docker从基础镜像运行一个容器
2)执行一条指令对容器做出修改
3)执行类似docker commit的操作提交一个新的镜像层
4)docker再基于刚提交的镜像运行一个容器
5)执行dockerfile中的下一条指令直到所有指令都执行完成
小总结
dockerfile、docker镜像、docker容器三者之间的关系
dockerfile是docker的基础,dockerfile通过 build 生成一个docker镜像,docker镜像通过run 生成一个docker容器。
3、dockerfile体系结构(保留字指令)
FROM基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER镜像维护者姓名和邮箱地址
RUN容器构建时需要运行的命令
EXPOSE对外暴露的端口
WORKEIR指定在创建容器后,终端默认登录进来的工作目录,一个落脚点。默认根目录
ENV用来构建镜像过程中设置环境变量
ADD将宿主机目录下的文件拷贝进镜像且add命令会自动处理URL和解压tar压缩包
COPY类似add,拷贝文件和目录到镜像中
VPLUME容器数据卷,用于数据保存和持久化工作
CMD指定一个容器启动时要运行的命令;dockerfile中可以有多个cmd指令,但只有最后一个生效cmd会被docker run之后的参数替换
EMTRYPOINT指定一个容器启动时要运行的命令;多个时在后面追加。
ONBUILD当构建一个被继承的DockerFile时运行命令,父镜像在被子镜像继承后,父镜像的onbuild触发
感谢您的阅读,如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮。本文欢迎各位转载,但是转载文章之后必须在文章页面中给出作者和原文连接。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)