Docker学习——docker入门

Docker入门

  • 前言
  • 一、Docker介绍
    • 引入
    • 历史
    • Docker能做什么
    • Docker中的名词概念
  • 二、Docker基础
    • (一)Docker的安装
    • (二)Docker的常用命令
      • 镜像命令
      • 容器命令
      • 其他常用命令
    • (三)Docker实践
      • 安装nginx
      • 安装tomcat
    • (四)Docker可视化工具
    • (五)Docker镜像
      • 镜像的原理
      • 镜像的提交
  • 三、Docker基本原理
  • end...

前言

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。文章课程链接:【狂神说Java】Docker最新超详细版教程通俗易懂

一、Docker介绍

引入

我们都知道,一个新技术的出现,必然是为了解决某些问题,Docker也一样,有开发经验的朋友可能知道,我们在自己电脑上开发好的程序,放到服务器上或别人的电脑上就出问题了(某些环境不一样)。其次,我们部署一些环境,如redis、ES、nginx等的集群是很费时费力的。Docker的出现,就很好的帮我们解决了这些问题,它可以在我们发布时,将我们的项目环境(镜像)一起带上,解决环境不一致的问题。
总结:

  1. 镜像-复制:Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等),解决运行环境不一致所导致的问题。这样就不会产生“本地运行没问题,可一到服务器上就不行了”的情况。
  2. 容器-集装箱:限定最大的cpu使用内存硬盘,起到隔离的作用。

历史

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/

Docker能做什么

前面我们讲到了虚拟机和容器技术,可能大家还不是很理解,这里上个图来看看
虚拟机,一个内核,然后通用的环境,最上层是应用
Docker学习——docker入门_第1张图片
容器,区别就是环境不再通用,跟着我们的应用走,应用直接运行在操作系统上,充分利用系统资源
Docker学习——docker入门_第2张图片
总结一下他们之间的不同

  • 传统虚拟机,虚拟出一套硬件,运行一个完整的操作系统,然后在系统上安装和运行软件
  • 容器内的应用直接运行在宿主主机上,容器没有自己的内核,没有虚拟硬件,所以轻便
  • 每个容器间相互隔离,每个容器内都有一个属于自己的文件系统,互不影响

DevOps
前面我们引出一个观念,就是要用更简单的方式来发布应用,不在像传统的那样,打个jar包给运维人员,让运维人员来发布运行应用。现在,我们开发好,自己就可以运用docker进行发布了,这样的模式就称为 DevOps,它有什么好处呐,这里难得抄,就贴个图吧 >-<
Docker学习——docker入门_第3张图片

Docker中的名词概念

镜像(image):Docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像->运行->tomcat01 容器,通过这个镜像可以创建多个容器,最终服务的运行就是在容器中的
容器(container):Docker利用容器技术,独立运行一个或者一组应用(通过镜像来创建的),容器的基本操作包括:启动、停止、删除,可以将容器理解为一个简易的linux
仓库(repository):仓库是存放镜像的地方,仓库分为公用仓库和私有仓库,这点和git、maven一样,都有一个国际统一的仓库,Docker的就是Docker Hub,但国际仓库速度是很慢的,所以有国内的公司提供这样的服务,比如阿里、华为等,配置的时候需要像maven一样,将仓库配置为国内厂商的

二、Docker基础

(一)Docker的安装

这里推荐大家先去看看官方文档,毕竟文档才是最完整准确的,可以根据不同的操作系统选择安装,如图
Docker学习——docker入门_第4张图片
这里,我们选择安装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

如果你买了服务器,例如阿里的服务器,我们可以使用阿里云提供的镜像加速,加快镜像的下载速度,这里就不多讲了

(二)Docker的常用命令

官网命令地址:点击 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

最后,我们通过一张图来看看docker的命令操作
Docker学习——docker入门_第5张图片

(三)Docker实践

安装nginx

还不会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

首先,我们进入到官网,看看tomcat的相关信息,可以看到有非常多的版本供我们使用
Docker学习——docker入门_第6张图片
我们继续浏览文档,下方给出了下载命令(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的可视化工具有很多,包括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镜像

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、库、环境变量和配置文件等,所有的应用打包docker镜像,就可以直接运行起来
如何获取镜像:

  • 从远程仓库下载
  • 从其他地方拷贝
  • 自己制作一个

镜像的原理

镜像用到的是UnionFS(联合文件系统),它是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,例如,我们有两个镜像tomcat和mysql,它们都需要centos,我们先去拉取tomcat的镜像,它就会下载好需要每一层(包括centos),下次我们再去拉取mysql镜像时,它发现已经有了centos,就不再去下载了,如图,我们拉取一个redis的镜像
Docker学习——docker入门_第7张图片
它需要下载一层一层的资源,其中第一个已经存在(前面拉取镜像已经下载了),然后下载了其他没有的,拉取操作完成后,我们也可以通过命令 docker inspect 镜像或容器id 查看,如图,这就是redis镜像拉取的每一层
Docker学习——docker入门_第8张图片

镜像的提交

docker的提交命令和git相似

# docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:版本号
docker commit # 提交容器成为一个新的副本

实践

启动一个默认的tomcat(webapps下没有任何内容)
拷贝webapps.dist的内容到webapps下,我们的webapps下就有内容了

下面,我们执行提交命令 docker commit ***,如图
Docker学习——docker入门_第9张图片
提交过后,执行docker images,你会发现出现了我们提交的容器,它已经成为了一个新的镜像,当我们想要保存自己容器的状态时,可以将其提交,成为一个镜像,下次直接用

三、Docker基本原理

Docker是怎么工作的?
Docker是一个Client - Server 结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!
Docker-Server 接收到 Docker-Client 的指令,就会执行这个命令,如图
Docker学习——docker入门_第10张图片

Docker为什么比VM快?
1、Docker有着比虚拟机更少的抽象层
2、Docker利用的是宿主机的内核,vm 需要的是 Guest OS,新建容器时,docker就不需要像虚拟机一样重新加载一个操作系统内核。
如图
Docker学习——docker入门_第11张图片

end…

如果总结的还行,就点个赞呗 @_@ 如有错误,欢迎指点,下一篇Docker学习——docker高级···

你可能感兴趣的:(中间件/工具,docker,容器,运维)