【学习笔记】学习Docker,看完这篇超详细的教程就足够了

本文为观看B站狂神的视频学习Docker时所整理的笔记,中间加了一些自己的理解,如果对大家有所帮助,还希望点赞支持一下,后续我会继续将自己遇到的Docker问题以及学习的新的知识全部整理添加到本文后面或者整理发布新的文章,如果感兴趣可以关注一波。

目录
Docker的概述为什么需要Docker?简述虚拟机和Docker容器的区别Docker中的DevOps(开发、运维)Docker的基本组成
Docker的安装前期准备(看看即可)开始安装如何卸载Docker(了解即可)配置阿里云镜像加速Run的流程以及Docker原理
Docker的常用命令查看信息和帮助命令镜像命令容器命令常用的其他命令后台启动容器查看系统CPU状态查看日志查看容器中进程信息查看镜像中的元数据进入当前正在运行的容器从容器中拷贝文件到主机上

常用命令小结练习练习一:使用Docker安装Nginx练习二:使用Docker部署Tomcat练习三:使用Docker部署Elasticsearch、Kibana

Docker的概述

【学习笔记】学习Docker,看完这篇超详细的教程就足够了
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker的官网地址:https://www.docker.com/
文档地址:https://docs.docker.com/
仓库地址:https://hub.docker.com/

为什么需要Docker?

传统的开发问题:

环境(切换/配置)麻烦
在开发一个产品的途中,时常会出现的问题就是:“在我的电脑上可以运行,而到了另外一个开发人员的电脑上就不能使用的问题”,或者是因为版本更新导致服务不可用等等,这对于运维人员来说,压力十分大,而环境配置是一个非常头疼的问题,每一个机器都需要部署环境(Redis集群、ES…)十分麻烦且费时费力,并且配置的环境不能跨平台,非常不方便。应用之间的冲突(隔离性)
假如我们将开发的两个应用部署到同一个服务器上,如果一个应用出了问题,导致CPU出问题上升到了100%,那么第二个应用也会受到关联;并且如果两个应用分别使用不同的语言或者技术栈,当安装在同一个服务器上的时候可能就会造成各种冲突/无法兼容,到时候调试就非常头疼。如下图所示:

Docker的出现解决以上问题

关于环境问题解决方案
Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。将环境构建打包成一个镜像发布到网上,想要用这个环境的时候就直接拉取一份就OK了。

解决应用之间隔离问题
Docker核心思想就是使用容器化技术,打包装箱,每个箱子是互相隔离的。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。如下图所示:
【学习笔记】学习Docker,看完这篇超详细的教程就足够了

简述虚拟机和Docker容器的区别

这里引用知乎上大佬的说法:https://www.zhihu.com/question/48174633
服务器虚拟化解决的核心问题是资源调配,而容器解决的核心问题是应用开发、测试和部署。

使用Docker容器和使用虚拟机在运行多个相互隔离的应用时对比,Docker要简洁很多;Docker守护进程可以直接与主操作系统进行通信,为各个Docker容器分配资源;它还可以将容器与主操作系统隔离,并将各个容器互相隔离。虚拟机启动需要数分钟,而Docker容器可以在数毫秒内启动。由于没有臃肿的从操作系统,Docker可以节省大量的磁盘空间以及其他系统资源。虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。而Docker通常用于隔离不同的应用,例如前端,后端以及数据库。传统的虚拟机,首先是虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件;Docker容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻巧了很多;
Docker中的DevOps(开发、运维)

(1)应用更快速的交付和部署:

传统:一堆的帮助文档和安装程序Docker:打包镜像发布测试,一键运行

(2)更快捷的升级和扩缩容

使用了Docker以后我们部署应用就像搭积木一样;项目打包成一个镜像

(3)更简单的系统运维

在容器话之后我们的开发、测试环境都是高度一致的

(4)更高效的计算资源利用

Docker是内核级别的虚拟化,可以再一个物理机上可以运行很多的容器实例!服务器的性能可以被压榨到极致。
Docker的基本组成

【学习笔记】学习Docker,看完这篇超详细的教程就足够了

镜像(image):docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像—>run—->tomcat01容器(提供服务),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中运行的)。

容器(container):docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的,启动、停止、删除、基本命令,目前就可以把这个容器理解为就是一个简易的Linux系统。

仓库(repository):仓库就是存放镜像的地方,仓库分为公有仓库和私有仓库,Docker Hub(默认是国外的)、阿里云…都有容器服务器(配置镜像加速)

Docker的安装
前期准备(看看即可)

不一样的话也行,主要是看Centos的版本
运行环境:阿里云服务器 Centos 7
连接工具:XShell 5
需要掌握:Linux的基本命令
由于这里的运行环境是Centos 7,与Centos 6的命令还是有一些区别的,但是区别不大,后面我会将命令详细的介绍。

查看环境:

系统内核是3.10以上的

[root@oldou ~]#  uname -r
3.10.0-957.21.3.el7.x86_64

查看系统的版本:
cat /etc/os-release
【学习笔记】学习Docker,看完这篇超详细的教程就足够了
开始安装

这里可以参考官网的帮助文档进行安装
【学习笔记】学习Docker,看完这篇超详细的教程就足够了
【学习笔记】学习Docker,看完这篇超详细的教程就足够了
地址:https://docs.docker.com/engine/install/centos/

第一步:卸载旧版本(运行以下代码即可)

 yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

【学习笔记】学习Docker,看完这篇超详细的教程就足够了
第二步:安装yum工具包
命令:yum install -y yum-utils

第三步:设置镜像仓库

yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 这里默认是国外的,十分的慢,我们用以下阿里云的地址

yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 这是阿里云的docker镜像地址,建议使用这个

【学习笔记】学习Docker,看完这篇超详细的教程就足够了
更新一下yum索引:
命令:yum makecache fast
【学习笔记】学习Docker,看完这篇超详细的教程就足够了
第四步:安装Docker
docker-ce:社区版 ee:企业版
命令:yum install docker-ce docker-ce-cli containerd.io
【学习笔记】学习Docker,看完这篇超详细的教程就足够了
注意:以上是安装Docker最新的版本,如果想要安装指定的版本,就需要进行以下命令:
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
这里的<VERSION_STRING>表示版本。
【学习笔记】学习Docker,看完这篇超详细的教程就足够了
第五步:启动Docker
命令:systemctl start docker
注意:Centos6使用的是service,而Centos7使用的都变成了systemctl

第六步:查看Docker是否安装成功
命令:docker version
【学习笔记】学习Docker,看完这篇超详细的教程就足够了
查看Docker的状态: systemctl status docker
【学习笔记】学习Docker,看完这篇超详细的教程就足够了
第七步:测试hello-word
命令:docker run hello-world
【学习笔记】学习Docker,看完这篇超详细的教程就足够了
第八步:查看一下刚刚下载的hello-word的这个镜像
命令:docker images
【学习笔记】学习Docker,看完这篇超详细的教程就足够了

如何卸载Docker(了解即可)

官网中有介绍,下面我给出来:
第一步:卸载依赖
命令:yum remove docker-ce docker-ce-cli containerd.io

第二步:删除资源 安装的资源都在/var/lib/docker目录下
命令:rm -rf /var/lib/docker

这样就OK了。

配置阿里云镜像加速

由于我们拉取镜像的时候,使用国外的下载太慢了,当然我们这里是使用国内阿里云的,所以肯定比国外的访问和下载快,这个时候再配个加速器就美滋滋。

第一步:登录我们的阿里云控制台,然后找到容器镜像服务
【学习笔记】学习Docker,看完这篇超详细的教程就足够了
第二步:找到镜像加速器---->镜像加速地址
【学习笔记】学习Docker,看完这篇超详细的教程就足够了
第三步:配置使用(直接复制命令运行即可)

(1)在服务器中创建一个目录:sudo mkdir -p /etc/docker

(2)编辑配置文件

sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://7ih0bv9h.mirror.aliyuncs.com"]
}
EOF

【学习笔记】学习Docker,看完这篇超详细的教程就足够了
(3)将服务重启:sudo systemctl daemon-reload

(4)启动docker:sudo systemctl restart docker

这样就配置完成了。

Run的流程以及Docker原理

回顾hello-word的流程
【学习笔记】学习Docker,看完这篇超详细的教程就足够了
就拿我们运行hello-word来说,一开始我们运行hello-word的时候,Docker会在本机中寻找镜像,而本机中没有这个镜像,所以就回去我们配置的Hub上去下载镜像,如果找到了就将镜像下载到本地运行,如果没有就返回错误。如下所示:
【学习笔记】学习Docker,看完这篇超详细的教程就足够了
底层原理

(1)Docker是怎么工作的?

Docker是一个Client-Server结构的系统,Docker的守护进程运行在本机上(运行在后台,和mysql一样),通过Socket从客户端访问。DockerServer接收到Docker-Client的指令,就会执行这个命令。
【学习笔记】学习Docker,看完这篇超详细的教程就足够了
(2)Docker为什么比虚拟机(VM)快?
【学习笔记】学习Docker,看完这篇超详细的教程就足够了Docker利用的是宿主机的内核,VM需要的是Guest OS
所以说,新建一个容器的时候,Docker不需要像虚拟机那样重新加载一个操作系统内核,避免引导,虚拟机是加载Guest OS,是分钟级别的,而Docker利用的是宿主机的操作系统,省略了这个复杂的过程。
【学习笔记】学习Docker,看完这篇超详细的教程就足够了
Docker的常用命令

官方帮助文档:https://docs.docker.com/engine/reference/run/

查看信息和帮助命令

命令:docker version # 查看docker的版本信息
【学习笔记】学习Docker,看完这篇超详细的教程就足够了
命令:docker info # 显示Docker的系统信息,包括镜像和容器的数量

命令:docker xxx --help #帮助命令,可以显示docker的所有命令

镜像命令

查看镜像
命令:docker images # 查看所有本地的主机上的镜像
【学习笔记】学习Docker,看完这篇超详细的教程就足够了

REPOSITORY  :镜像的仓库源
TAG :镜像的标签
IMAGE ID :镜像的ID
CERATED :镜像的创建时间
SIZE :镜像的大小

docker images [可选项]
-a , --all # 列出所有镜像
-q , --quiet # 只显示镜像的ID

搜索镜像
命令:docker search 镜像名 # 搜索镜像

可选项,通过搜过过滤
--filter-STARS=3000 #搜索出来的镜像修饰STARS大于3000的

【学习笔记】学习Docker,看完这篇超详细的教程就足够了
下载镜像
命令:docker pull 镜像名 [:tag]# 下载镜像,默认是下载最新版 latest 。
【学习笔记】学习Docker,看完这篇超详细的教程就足够了
如果是下载指定版本的镜像,那么就需要指定:版本号,如下所示:
docker pull mysql:5.7 # 指定版本下载 下载mysql5.7

删除镜像

# 删除镜像  -f就是全部删除,后面的条件是根据什么来删除,这里是根据容器的id进行删除
docker rmi -f 容器id

# 删除多个镜像
docker rmi -f 容器id 容器id 容器id

# 删除所有的镜像
docker rmi -f $(docker images -aq)

容器命令

说明:我们有了镜像才可以去创建容器,Linux,下载一个centos镜像来进行学习。

下载centos镜像
命令:docker pull centos

新建容器并启动
命令:docker run [可选参数] image

参数说明:
--name="Name" : 容器名字 ,tomcat01、tomcat02,用来区分容器
-d :后台方式运行
-it:使用交互方式运行,进入容器查看内容
-p :指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用方式)
-p 容器端口
容器端口
-p: 随机指定端口

测试,启动并进入容器
命令:docker run -it centos /bin/bash #启动容器
命令: ls # 查看容器内的centos,基础版本,很多命令都是不完善的
命令:exit # 从容器中退回到主机

列出所有运行中的容器
命令:docker ps [可选参数] # 列出当前正在运行的程序

-a             #列出当前正在运行的容器+带出历史运行过的容器
-n=? #显示最近创建的容器
-p #只显示容器的编号

【学习笔记】学习Docker,看完这篇超详细的教程就足够了

退出容器
命令:

exit                     # 直接停止容器并退出
Ctrl + P + Q # 容器不停止退出

删除容器

docker rm  容器id        # 删除指定的容器,不能删除正在运行的容器
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 run -d 镜像名

docker run -d centos            # 后台启动centos

问题:使用docker ps查看,发现 centos停止了

常见的坑:docker容器使用后台运行的时候就必须要一个前台线程,不然docker发现没有应用就会自动停止

例如:nginx容器启动后,发现自己没有提供服务就会立刻停止,就是没有程序了。

查看系统CPU状态

命令:docker stats [容器id]
【学习笔记】学习Docker,看完这篇超详细的教程就足够了

查看日志

命令:docker logs -tf --tail 容器,没有日志

编写一段shell脚本

docker run -d centos /bin/sh -c "while true; do echo oldouTest;sleep 1;done"

使用docker ps去查看显示日志 :docker logs -tf --tail number 容器id

-tf                  #显示日志
--tail number #要显示日志条数

例如:docker logs -tf --tail 10 容器id

查看容器中进程信息

命令:docker top 容器id

查看镜像中的元数据

命令:docker inspect 容器id

进入当前正在运行的容器

我们的容器通常都是使用后台方式运行的,需要进入容器,修改一些配置
方式一:
命令:docker exec -it 容器id bashShell
例如:docker exec -it bb6ddb943ea5 /bin/bash
【学习笔记】学习Docker,看完这篇超详细的教程就足够了
方式二:
命令:docker attach 容器id
【学习笔记】学习Docker,看完这篇超详细的教程就足够了
两种方式的对比:

docker exec: 进入容器后开启一个新的终端,可以在里面操作(常用)docker attach:进入容器正在执行的终端,不会启动新的进程
从容器中拷贝文件到主机上

【学习笔记】学习Docker,看完这篇超详细的教程就足够了

# 进入到容器内:
[root@oldou home]# docker exec -it bb6ddb943ea5 /bin/bash
[root@bb6ddb943ea5 /]# cd home
[root@bb6ddb943ea5 home]# ls

# 创建一个java文件
[root@bb6ddb943ea5 home]# touch Test.java
[root@bb6ddb943ea5 home]# ls
Test.java

# 退出容器回到主机
[root@bb6ddb943ea5 home]# exit
exit

#查看当前运行的容器
[root@oldou home]# docker ps

# 将容器内/home目录下的Test.java文件拷贝到主机的home目录下
[root@oldou home]# docker cp bb6ddb943ea5:/home/Test.java /home
[root@oldou home]# ls
Test.java

拷贝只是一个手动的过程,后面学习了 -v 卷的技术时,可以实现同步数据

常用命令小结

【学习笔记】学习Docker,看完这篇超详细的教程就足够了

命令 英文描述 中文意思

attachAttach to a running container当前shell下attach连接指定运行镜像buildBuild an image from a Dockerfile通过Dockerfile定制镜像commitCreate a new image from a container changes提交当前容器为新的境像cpcopy files/folders from the containers filesystem to the host path从容器中拷贝指定文件或者目录到宿主机中createCreate a new container创建一个新的容器,同run.但不启动容器diffInspect changes on a container’s filesystem查看docker容器变化eventsGet real time events from the server从docker服务中获取容器实时事件exportStream the contents of a container as a tar archive导出容器的内容流作为一个 tar归档文件[对应import]historyShow the history of an image展示一个境像形成历史imagesList images列出系统当前所有镜像importCreate a new filesystem image from the contents of a tarball从tar包中的内容创建一个新的文件系统映像[对应export]infoDisplay system-wide information显示系统相关信息inspectReturn low-level information on a container查看容器详细信息killKill a running containerkill指定docker容器loadLoad an image from a tar archive从—个 tar包中加载一个镜像[对应save]loginRegister or Login to the docker registry server注册或者登陆一个docker源服务器logoutLog out from a Docker registry server从当前Docker registry退出logsFetch the logs of a container输出当前容器日志信息portLookup the public-facing port which is NAT-ed to PRIVATE_PORT查看映射端口对应的容器内部源端pausePause all processes within a container暂停容器psList containers列出容器列表pullPull an image or a repository from the docker registry server从docker镜像服务器中拉取指定镜像或者库镜像pushpush an image or a repository to the docker registry server推送指定镜像或者库镜像至docker源服务器restartRestart a running container重启运行的容器rmRemove one or more containers移除—个或者多个容器rmiRemove one or more images移除一个或多个境像[无容器使用该镜像才可删除,否则需删除相关容器才可能继续或者 -f 强制删除runRun a command in a new container创建—个新的容器并运行一个命令saveSave an image to a tar arehive保存一个镜像为—个tar包「对应load]searchSearch for an image on the Docker Hub在docker hub中搜索镜像startstart a stopped containers启动容器stopstop a stopped containers停止容器tagTag an image into a repository给源中镜像打标签topLookup the running processes of a container查看容器中运行的进程信息unpauseUnpause a paused container取消暂停容器versionshow the docker version information查看docker版本号waitBlock until a container stops,then print its exit code截取容器停止时的退出状态值
练习
练习一:使用Docker安装Nginx

官网:https://hub.docker.com/_/nginx

第一步:搜索镜像(这里建议去docker Hub上查找一下版本信息,上面还有帮助文档介绍)
命令:docker search nginx

第二步:下载镜像
命令:docker pull nginx

第三步:查看镜像并且启动
命令:docker images # 查看所有镜像

**命令:docker run -d --name nginx01 -p 3344:80 nginx

-d 表示后台运行,--name 表示给容器起名字,而nginx01表示起的名字,
-p 宿主机端口 :容器内部端口

后面的3344表示主机开发的3344端口,80表示容器内部的端口,这里表示将80端口映射到外部的3344,
可以通过公网的3344访问到docker里面的80端口,后面的nginx表示的是镜像名字。

【学习笔记】学习Docker,看完这篇超详细的教程就足够了
第四步:查看容器并且运行测试
命令:docker ps #查看是否启动
命令:curl localhost:3344
【学习笔记】学习Docker,看完这篇超详细的教程就足够了
关闭防火墙:systemctl stop firewalld

到这一步的时候我们就可以使用 公网ip:3344 在浏览器访问了
【学习笔记】学习Docker,看完这篇超详细的教程就足够了
第五步:进入Nginx容器
命令:docker exec -it nginx01 /bin/bash #进入容器

命令:whereis nginx

命令:cd /etc/nginx

命令:ls查看

命令:exit #退出

命令:docker stop 容器id #停止Nginx容器
【学习笔记】学习Docker,看完这篇超详细的教程就足够了
端口暴露的概念:
【学习笔记】学习Docker,看完这篇超详细的教程就足够了
思考问题:我们每次改动nginx配置文件,都需要进入容器内部?十分的麻烦,我要是可以在容器外部提供一个映射路径,达到在容器修改文件名,容器内部就可以自动修改?
使用 -v数据卷。

练习二:使用Docker部署Tomcat

官网:https://hub.docker.com/_/tomcat

方式一:

官方给出的命令:
docker run -it --rm tomcat:9.0 # 下载并启动
上面介绍Nginx的启动都是后台启动,停止了容器以后,容器还是可以查到,并且占用着配置的端口。
使用官方给出的 docker run -it --rm tomcat:9.0 ,一般用于测试,用完停止就删除。

方式二:
还是使用之前的方式。

第一步:搜索镜像(这里建议去docker Hub上查找一下版本信息,上面还有帮助文档介绍)
命令:docker search tomcat

第二步:下载镜像
命令:docker pull tomcat # 这是下载最新版的tomcat
命令: docker pull tomcat:7.0 # 指定版本号

第三步:查看镜像并且启动
命令:docker images # 查看所有镜像
命令:docker run -d --name tomcat01 -p 3355:8080 tomcat:7.0

-d 表示后台运行,--name 表示给容器起名字,而tomcat01表示起的名字,
-p 宿主机端口 :容器内部端口

后面的3355表示主机开发的3355端口,8080表示容器内部的端口,这里表示将8080端口映射到外部的3355,
可以通过公网的3355访问到docker里面的8080端口,后面的tomcat表示的是镜像名字。

我们这个时候去浏览器访问发现,报了404异常,那我们进入到tomcat容器内部查看一下原因.

第四步:进入容器查看原因
命令:docker exec -it tomcat01 /bin/bash
当我们使用ll命令时竟然不能使用,只能使用ls命令查看,同时进入到webapps目录下发现这个目录竟然是空的。

发现问题:
1、Linux的命令少了;
2、webapps目录下没有文件;

原因:
阿里云的镜像默认是最小的镜像,它把所有不必要的都剔除掉了。保证最小可运行的环境。

解决办法:
在tomcat目录下有一个webapps.dist目录,这个目录下有我们所需要的文件,也就是webapps目录所需要的文件,我们将这个文件中的内容全部拷贝到webapps下。

第五步:拷贝资源
命令:cp -r webapps.dist/* webapps

这样我们再去浏览器中去访问就可以访问到了。

思考问题:我们以后要部署项目,如果每次都要进入容器是不是十分麻烦?要是可以在容器外部提供一个映射路径,webapps ,我们在外部放置项目,就自动同步到内部就好了!

练习三:使用Docker部署Elasticsearch、Kibana

由于暂时没有学过Elasticsearch,所以暂时没有做这个部分的笔记,只是暂时看了一遍,后续补上…

后续笔记待更新中…

原创:https://www.panoramacn.com
源码网提供WordPress源码,帝国CMS源码discuz源码,微信小程序,小说源码,杰奇源码,thinkphp源码,ecshop模板源码,微擎模板源码,dede源码,织梦源码等。

专业搭建小说网站,小说程序,杰奇系列,微信小说系列,app系列小说

【学习笔记】学习Docker,看完这篇超详细的教程就足够了

免责声明,若由于商用引起版权纠纷,一切责任均由使用者承担。

您必须遵守我们的协议,如果您下载了该资源行为将被视为对《免责声明》全部内容的认可-> 联系客服 投诉资源
www.panoramacn.com资源全部来自互联网收集,仅供用于学习和交流,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。 敬请谅解! 侵权删帖/违法举报/投稿等事物联系邮箱:2640602276@qq.com
未经允许不得转载:书荒源码源码网每日更新网站源码模板! » 【学习笔记】学习Docker,看完这篇超详细的教程就足够了
关注我们小说电影免费看
关注我们,获取更多的全网素材资源,有趣有料!
120000+人已关注
分享到:
赞(0) 打赏

评论抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

您的打赏就是我分享的动力!

支付宝扫一扫打赏

微信扫一扫打赏