Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。文章课程链接:【狂神说Java】Docker最新超详细版教程通俗易懂
我们都知道,一个新技术的出现,必然是为了解决某些问题,Docker也一样,有开发经验的朋友可能知道,我们在自己电脑上开发好的程序,放到服务器上或别人的电脑上就出问题了(某些环境不一样)。其次,我们部署一些环境,如redis、ES、nginx等的集群是很费时费力的。Docker的出现,就很好的帮我们解决了这些问题,它可以在我们发布时,将我们的项目环境(镜像)一起带上,解决环境不一致的问题。
总结:
2010年,几个年轻人在美国成立了一家公司——dotCloud,做一些pass的云计算服务,他们将自己基于 LXC 的容器化技术命名为Docker
后来,他们混不下去了,于是…
2013年,开源了Docker,大家发现它很好用,于是大火,更新迭代的速度也变得非常快了
2014年4月9日,Docker1.0发布
Docker为什么会这么火?答案是它非常的轻巧(针对虚拟机来说),在容器技术之前,我们都是使用的虚拟机技术,我们常常使用Vmware来开一台或多台虚拟机,一个电脑开不了几台,因为它需要占用不少资源。容器技术也是一种虚拟化技术,它占用的资源非常小,小到几M甚至达到kb级别,继而启动的速度也非常快了,几秒钟就行。最后,我们需要知道几个网址,仓库存的是我们的Docker镜像,我们可以像git一样,上传和拉取镜像
文档地址:https://docs.docker.com/
仓库地址:https://hub.docker.com/
前面我们讲到了虚拟机和容器技术,可能大家还不是很理解,这里上个图来看看
虚拟机,一个内核,然后通用的环境,最上层是应用
容器,区别就是环境不再通用,跟着我们的应用走,应用直接运行在操作系统上,充分利用系统资源
总结一下他们之间的不同
DevOps
前面我们引出一个观念,就是要用更简单的方式来发布应用,不在像传统的那样,打个jar包给运维人员,让运维人员来发布运行应用。现在,我们开发好,自己就可以运用docker进行发布了,这样的模式就称为 DevOps,它有什么好处呐,这里难得抄,就贴个图吧 >-<
镜像(image):Docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像->运行->tomcat01 容器,通过这个镜像可以创建多个容器,最终服务的运行就是在容器中的
容器(container):Docker利用容器技术,独立运行一个或者一组应用(通过镜像来创建的),容器的基本操作包括:启动、停止、删除,可以将容器理解为一个简易的linux
仓库(repository):仓库是存放镜像的地方,仓库分为公用仓库和私有仓库,这点和git、maven一样,都有一个国际统一的仓库,Docker的就是Docker Hub,但国际仓库速度是很慢的,所以有国内的公司提供这样的服务,比如阿里、华为等,配置的时候需要像maven一样,将仓库配置为国内厂商的
这里推荐大家先去看看官方文档,毕竟文档才是最完整准确的,可以根据不同的操作系统选择安装,如图
这里,我们选择安装centos版本,点击绿钩进入文档,按照文档步骤完成安装,注意,centos的版本必须是7或者8
1.卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2.需要的安装包
sudo yum install -y yum-utils
3.设置镜像的仓库
# 文档中默认是国外的,速度非常慢,我们这里换一下,改成阿里的
sudo yum-config-manager \
--add-repo \
# https://download.docker.com/linux/centos/docker-ce.repo
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装前,我们可以先更新yum软件包索引
yum makecache fast
4.安装Docker
# docker-ce 社区版 ee 企业版,如果不想安装最新版本,可以更改,见官网
sudo yum install docker-ce docker-ce-cli containerd.io
5.启动Docker
sudo systemctl start docker
# 执行过后,可通过命令查看是否成功
docker version
6.测试hello world
sudo docker run hello-world
# 执行后会先下载镜像
7.查看一下下载的镜像
docker images
补充,卸载docker,可查阅文档
sudo yum remove docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
如果你买了服务器,例如阿里的服务器,我们可以使用阿里云提供的镜像加速,加快镜像的下载速度,这里就不多讲了
官网命令地址:点击 https://docs.docker.com/reference/
docker version # 版本
docker info # docker的系统信息,包括镜像和容器的数量
docker 命令 --help # 万能命令
查看镜像
docker images # 查看所有本地主机上的镜像
docker images --help # 查看有哪些命令,所有的命令都可以这样查阅
# 可选项
-a --all # 列出所有的镜像
-q --quiet # 只显示镜像的id
输入命令如图,显示镜像的名称、版本、id等,这个id只显示了前半截
搜索镜像
# docker search 镜像名
docker search mysql #搜索镜像mysql
# 可选项
--filter=STARS=3000 # 过滤STARS大于3000的
下载镜像
# docker pull 镜像名:tag
docker pull mysql # 下载mysql,不写tag,默认为 latest
docker pull mysql:5.7 # 下载5.7版本的(版本必须要存在)
删除镜像
# docker rmi -f 镜像名称或者id,如果同时删除多个,格式为:-f id id id
docker rmi -f e2345353bd5353 # rm image,删除id为e2345353bd5353的镜像
docker rmi -f $(docker images -aq) # 删除全部的镜像
注意,容器创建的前提是我们得有镜像,容器是通过镜像来创建的,下面我们就下载一个centos的镜像来操作一下
先下载一个镜像
docker pull centos
新建容器并启动
# docker run 可选参数 镜像名
docker run -it centos /bin/bash # 启动并进入到容器中
参数说明
–name=“自己取个名” 容器名称 tomcat01 tomcat02等,用来区分容器
-d 后台方式运行,类似于 nohup java -jar ***.jar &
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080,具体使用有下面几种
-p ip:主机端口:容器端口
-p 主机端口:容器端口 (常用)
-p 容器端口
-p 空缺(随机指定端口)
执行命令上述命令 docker run -it centos /bin/bash 后,我们就进入到容器中了,我们ls一下,如图
你会发现,它包含了centos的目录结构(一个独立的centos),其实它就是一个小型的centos,在centos中的一个centos,但它们之间没有任何关系
# docker run -d 镜像名称
上面我们讲到,这个命令是后台启动容器,但你会发现,启动后,再通过 docker ps 发现没有这个容器,这是由于docker后台运行必须要有一个前台进程,不然就会自动停止
列出所有运行的容器
先要退回到主机,输入命令
exit
退出后就可以输入命令查看了
# docker ps 可选命令
docker ps # 列出当前所有运行的容器
可选命令
缺省 列出当前运行的所有容器
-a 列出当前运行的所有容器+带出历史运行过的容器
-n=? 列出最近创建的容器,n=1就是最近的一个
-q 只显示容器的编号
从容器中退回主机
exit # 容器停止并退出
# 快捷键 ctrl + P + Q 容器不停止退出
进入当前正在运行的容器
进入一般是修改一些配置
# docker exec -it 容器id bashshell
docker exec -it 1309fwef3951 bin/bash
# docker attach 容器id
docker attach 4534ftjf324dw
exec:进入容器后开启一个新的终端,可以在里面操作(常用)
attach:进入容器正在执行的终端,不会启动新的进程
比较模糊,待实际运用时深入理解
删除容器
# docker rm 容器id
docker rm 3254dwdw464278 # 删除指定的容器,不能强制删除正在运行的,如果偏要 rm -f
docker rm -f $(docker ps -aq) # 删除所有的容器
docker ps -a -q|xargs docker rm # 删除所有的容器
启动和停止容器
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行的容器
docker kill 容器id # 强制停止当前容器
查看日志
# docker logs -f -t --tail n 容器id
docker logs -f -t --tail 10 635fwew97453 # 显示容器的最后10条日志,-f:打印时间戳
查看容器中的进程信息
# docker top 容器id
docker top 234fe75f1697
查看镜像/容器的元数据
这个命令可以查看到镜像或容器的很多信息
# docker inspect 镜像或容器id
从容器内拷贝文件到主机上
此命令在主机上运行,不在容器内
# docker cp 容器id:容器内的路径 主机路径
docker cp 7suge87e2fss:/home/test.java /home
还不会nginx的小伙伴可以看看我的这篇文章:Nginx由浅到深-尚硅谷nginx教程
1、搜索镜像
建议到官网进行搜索,官网有相关的详细信息和帮助文档
# 能搜索到才能下载,具体版本号上官网查询
docker search nginx
2、拉取镜像
docker pull nginx
3、查看是否下载成功(可省略)
docker images
4、启动容器
# -d:后台运行 --name:容器名字 -p:宿主机端口:容器内部端口
docker run -d --name nginx01 -p:999:80 nginx
5、查看启动的容器
docker ps
6、测试nginx
curl localhost:999
然后可以通过自己的端口在浏览器访问nginx
首先,我们进入到官网,看看tomcat的相关信息,可以看到有非常多的版本供我们使用
我们继续浏览文档,下方给出了下载命令(run之前会自动去下载)
# 这种方式一般用来测试,用完就会删掉容器,我们在前面使用的方式为后台
docker run -it --rm tomcat:9.0
这里,我们不用这种方式,开始操作
1、下载并启动
docker pull tomcat # 下载,最新版
docker images # 查看下载好的镜像
docker run -d -p 888:8080 --name tomcat01 tomcat # 启动运行
2、测试访问
我们在浏览器输入地址 http://ip:888,进入到tomcat,但你会发现没有进入到tomcat页面,而是显示404,这里的原因是官方提供的镜像是不完整的(linux命令不全,webapps下没有内容),我们可以进入到容器中进行查看
docker exec -it tomcat01 /bin/bash # 进入到容器的操作页面
ls # 然后查看下Tomcat的目录结构
阿里云镜像,默认是最小的镜像,所以不必要的都被移除了,保证最小的可运行环境,如何解决,其实它的相关文件被放到了一个叫 webapps.dist 下,我们需要将其拷贝(cp webapps.dist/* webapps)到 webapps 下,然后就可以访问到tomcat的页面了
docker的可视化工具有很多,包括docker UI,shipyard,portainer,Rancher等,我们这里使用portainer
1、下载
输入命令
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
2、测试访问
浏览器输入 http://ip:8088,进入后的页面操作等可以百度
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、库、环境变量和配置文件等,所有的应用打包docker镜像,就可以直接运行起来
如何获取镜像:
镜像用到的是UnionFS(联合文件系统),它是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,例如,我们有两个镜像tomcat和mysql,它们都需要centos,我们先去拉取tomcat的镜像,它就会下载好需要每一层(包括centos),下次我们再去拉取mysql镜像时,它发现已经有了centos,就不再去下载了,如图,我们拉取一个redis的镜像
它需要下载一层一层的资源,其中第一个已经存在(前面拉取镜像已经下载了),然后下载了其他没有的,拉取操作完成后,我们也可以通过命令 docker inspect 镜像或容器id 查看,如图,这就是redis镜像拉取的每一层
docker的提交命令和git相似
# docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:版本号
docker commit # 提交容器成为一个新的副本
实践
启动一个默认的tomcat(webapps下没有任何内容)
拷贝webapps.dist的内容到webapps下,我们的webapps下就有内容了
下面,我们执行提交命令 docker commit ***,如图
提交过后,执行docker images,你会发现出现了我们提交的容器,它已经成为了一个新的镜像,当我们想要保存自己容器的状态时,可以将其提交,成为一个镜像,下次直接用
Docker是怎么工作的?
Docker是一个Client - Server 结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!
Docker-Server 接收到 Docker-Client 的指令,就会执行这个命令,如图
Docker为什么比VM快?
1、Docker有着比虚拟机更少的抽象层
2、Docker利用的是宿主机的内核,vm 需要的是 Guest OS,新建容器时,docker就不需要像虚拟机一样重新加载一个操作系统内核。
如图
如果总结的还行,就点个赞呗 @_@ 如有错误,欢迎指点,下一篇Docker学习——docker高级···