Docker

Docker

Docker 学习

  • Docker概述
  • Docker安装
  • Docker命令
    • 镜像命令
    • 容器命令
    • 操作命令
  • Docker镜像!
  • 容器数据卷
  • DockerFile
  • Docker网络原理
  • IDEA整合Docker
  • Docker Compose(企业)
  • Docker Swarm(企业)

Docker概述


Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、 bare metal、OpenStack 集群和其他的基础应用平台。

Docker利用隔离机制,将服务器利用到极致

Docker是基于Go语言开发的!开源的!

Docker能干嘛

虚拟机技术缺点:

1、资源占用十分多

2、冗余步骤多

3、启动慢

容器化技术

容器化技术不是模拟的一个完整的操作系统

虚拟机与Docker的区别

  • 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装与运行软件

  • 容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了

  • 每个容器间是互相隔离的,每个容器内都有一个属于自己的文件系统,互不影响

更快速的交付和部署

传统:一堆帮助文档,安装程序

Docker:打包镜像发布测试,一键运行

更便捷的升级和扩缩容

项目打包成一个镜像,扩展 服务器A! 服务器B

更高效的系统运维

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

更高效的计算资源利用

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

Docker的安装


Docker的组成

镜像(image):

镜像是一种轻量级、可执行的独立软件包。用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件

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

容器(container):

Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的

启动,停止,删除,基本命令

仓库(repository):

存放镜像的地方!

仓库分为公有仓库和私有仓库!

Docker Hub(默认是国外的)

阿里云…都有容器服务器(配置镜像加速!)

Docker镜像加载原理

在这里插入图片描述

分层理解

分层的镜像

下载一个镜像,可以看到的是一层一层的在下载

好处:资源共享!比如有多个镜像从相同的Base镜像构建而来,那么宿主机只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有容器服务了,而且镜像的每一层都可以被共享!

查看镜像分层方式可以通过 docker image inspect 镜像名 版本号 命令

docker image inspect redis:latest

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

特点

Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部

这一层就是我们通常所说的容器层,容器之下就是镜像层

在这里插入图片描述

安装Docker

环境准备

  • windows安装成功

在这里插入图片描述

查看一下下载的hello-world镜像

输入docker images

在这里插入图片描述

# /var/lib/docker docker的默认工作路径!
阿里云镜像加速

在这里插入图片描述

Run的流程图

在这里插入图片描述

底层原理

Docker是怎么工作的?

Docker是一个Client - Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!

DockerServer接收到Docker-Client的指令,就会执行这个命令!

在这里插入图片描述

Docker为什么比VM快?

1、Docker有着比虚拟机更少的抽象层

2、docker利用的是宿主机的内核,vm需要的是Guest OS

在这里插入图片描述

所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导操作。虚拟机是加载Guest OS,分钟级别的,而docker是利用宿主机的操作系统,省略了这个复杂的过程,秒级的!

Docker的常用命令


帮助命令
docker version	    #显示docker的版本信息
docker info		    #显示docker的系统信息,包括镜像和容器数量
docker --help  #帮助命令

帮助文档地址:

官网底部Docs–>标题栏Reference

镜像命令

docker images :查看所有镜像

    PS C:\Users\Administrator> docker images                                                                
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    hello-world         latest              bf756fb1ae65        7 months ago        13.3kB

    #解释
    REPOSITORY 镜像的仓库源
    TAG        镜像的标签
    IMAGE ID   镜像的id
    CREATED    镜像的创建时间
    SIZE       镜像的大小

    # 可选项
      -a, --all             # 列出所有镜像
      -q, --quiet           # 只显示镜像的id

docker search :搜索镜像

PS C:\Users\Administrator> docker search mysql                                                                           
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   9790                [OK]              
mariadb                           MariaDB is a community-developed fork of MyS…   3572
[OK] 

# 可选项,过滤搜索
--filter=STARS=3000

docker pull:下载镜像

# 下载镜像 docker pull 镜像名[:tag]
docker pull mysql #若不写tag,默认是最新版 等价于docker pull docker.io/library/mysql:latest
				  #下载方式:分层下载,image的核心 联合文件系统
				  #下载中会包含签名(防伪标志)、真实地址
#指定版本下载
docker pull mysql:5.7 #版本要真实存在,可在docker Hub网站中验证

docker rmi :删除镜像

docker rmi -f [id号]         	    #根据镜像id删除
docker rmi -f [id号] [id号]           #根据多个镜像id删除
docker rmi -f $(docker images -aq)   #删除全部容器

commit提交镜像

docker commit : 提交容器成为一个新的副本
# 命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
# 例:提交修改后的tomcat
docker commit -a="panwei" -m="add webapps app" 8a1e924ce0fa tomcat02:1.0
容器命令

说明:有了镜像才可以创建容器!

docker pull centos

新建容器并启动

docker run [可选参数] image

# 参数说明
--name Name    #容器名 tomcat01...
-d             #后台方式运行
-it			   #使用交互方式运行,进入容器查看内容
-p			   #指定容器的端口 -p 8080:8080
	-p ip:主机端口:容器端口
	-p 主机端口:容器端口
	-p 容器端口
-P			   #随机指定端口

#测试,启动并进入容器
PS C:\Users\Administrator> docker run -it centos /bin/bash                                                                  
[root@327434c3d4fe /]#  ls #查看容器内的centos,基础命令都是不完善的
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@327434c3d4fe /]#  

#从容器中退回主机
[root@327434c3d4fe /]# exit

列出所有运行的容器

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

PS C:\Users\Administrator> docker ps                                                                                        
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
PS C:\Users\Administrator> docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
327434c3d4fe        centos              "/bin/bash"         6 minutes ago       Exited (0) 4 minutes ago                       stupefied_sutherland
039c97f52825        bf756fb1ae65        "/hello"            7 hours ago         Exited (0) 7 hours ago                         optimistic_lovelace
PS C:\Users\Administrator> docker ps -aq
327434c3d4fe
039c97f52825

退出容器

exit #直接容器停止并退出
快捷键:Ctrl+p+q #容器不停止退出

删除容器

docker rm 容器id  				 #根据id删除容器,不能删除正在运行的容器,如果强制删除 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 run -d 镜像名
PS C:\Users\Administrator> docker run -d centos
# 问题:docker ps,发现centos 停止了

# 常见的坑,docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
# nginx ,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了

查看日志

docker logs -f -t --tail 容器,没有日志

# 自己编写一段shell脚本
"while true;do echo panwei;sleep 1;done"
PS C:\Users\Administrator> docker run -d centos /bin/sh -c "while true;do echo panwei;sleep 1;done" 

#PS C:\Users\Administrator> docker ps -aq                                                                                                                 
1cb14667ab46

#显示日志 PS C:\Users\Administrator> docker logs -tf --tail 10 1cb14667ab46
	-tf           # 显示带时间戳的日志
	--tail number # 要显示日志条数
2020-08-02T15:05:50.068530165Z panwei
2020-08-02T15:05:51.071068964Z panwei
2020-08-02T15:05:52.072645462Z panwei
2020-08-02T15:05:53.075210960Z panwei
2020-08-02T15:05:54.077268158Z panwei
2020-08-02T15:05:55.079279756Z panwei
2020-08-02T15:05:56.081093654Z panwei
......
注意:Ctrl+break 停止脚本

查看容器中进程信息 ps

# 命令 docker top 容器id
PS C:\Users\Administrator> docker top 32127da460bb
PID                 USER                TIME                COMMAND
9232                root                0:00                /bin/sh -c while true;do echo panwei;sleep 1;done
9290                root                0:00                {sleep} /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/slecep 1

查看镜像元数据

# 命令 docker inspect 容器id

进入当前正在运行的容器

# 命令 
docker exec -it 容器id /bin/bash

# 测试
PS C:\Users\Administrator> docker exec -it 94f8d945a7bc /bin/bash
[root@94f8d945a7bc /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@94f8d945a7bc /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 05:04 pts/0    00:00:00 /bin/bash
root        14     0  0 05:04 pts/1    00:00:00 /bin/bash
root        28    14  0 05:05 pts/1    00:00:00 ps -ef

# 方式二
docker attach 容器id
# 测试
PS C:\Users\Administrator> docker attach 94f8d945a7bc

# 区别
docker exec   # 进入容器后开启一个新的终端,可以在里面操作(常用)
docker attach # 进入容器正在执行的终端,不会启动新的进程!

从容器内拷贝文件到主机上

docker cp 容器id:容器内路径 

# 测试
# 进入docker容器内部
PS C:\Users\Administrator> docker attach 4d2d06c3e95b                                                                   
[root@4d2d06c3e95b /]# cd /home
# 在容器内新建一个文件
[root@4d2d06c3e95b home]# touch panwei.java
[root@4d2d06c3e95b home]# ls
panwei.java  test.java
[root@4d2d06c3e95b home]# exit
exit
PS C:\Users\Administrator> cd home 
# 将文件拷贝出来到主机上
PS C:\Users\Administrator\home> docker cp 4d2d06c3e95b:/home/panwei.java C:/Users/Administrator/home                    
PS C:\Users\Administrator\home> ls                                                                                      

    目录: C:\Users\Administrator\home


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----         2020/8/3     13:41              0 panwei.java

# 拷贝是一个手动过程
小结

在这里插入图片描述

练习

装一个nginx

1,安装nginx镜像

docker pull nginx

2,运行镜像

docker run -it --name nginx01 -p 3344:80 nginx

端口暴露的概念(端口转发)

在这里插入图片描述

装一个tomcat

# 官方使用
docker run -it --rm tomcat # 用完即删
#---------------------------------------------
# 下载启动
PS C:\Users\Administrator> docker pull tomcat
PS C:\Users\Administrator> docker run -it --name tomcat01 -p 3344:80 tomcat

# 进入容器
PS C:\Users\Administrator> docker exec -it tomcat01 /bin/bash

# 发现问题:1、linux命令少了。2、没有webapps 
# 原因:阿里云镜像,默认最小的镜像,所有不必要的都剔除掉
# 保证最小可运行的环境!

# 找到webapps.dist
root@b5d4e966acfe:/usr/local/tomcat# ls
BUILDING.txt     LICENSE  README.md      RUNNING.txt  conf  logs            temp     webapps.dist
CONTRIBUTING.md  NOTICE   RELEASE-NOTES  bin          lib   native-jni-lib  webapps  work

# 将文件复制到webapps文件下
root@b5d4e966acfe:/usr/local/tomcat# cd webapps
root@b5d4e966acfe:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager
root@b5d4e966acfe:/usr/local/tomcat/webapps# cd ..
root@b5d4e966acfe:/usr/local/tomcat# cp -r webapps.dist/* /usr/local/tomcat/webapps
root@b5d4e966acfe:/usr/local/tomcat# cd webapps
root@b5d4e966acfe:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager  webapps.dist

部署 es + kibana

# es 暴漏的端口很多!
# es 十分耗内存!
# es 数据一般需要放置在安全目录!挂载
# --net somenetwork #网络配置
docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" 
elasticsearch:7.6.2

# 下载启动elasticsearch
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" 
elasticsearch:7.6.2

# 启动后会比较卡
docker stats #查看 cpu状态

# 环境配置修改,限制内存
-e
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" 
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
可视化
  • portainer

    docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock --restart=always --name prtainer portainer/portainer
    
  • Rancher(CI/CD)

什么是portainer ?

Docker图形化界面管理工具!提供一个后台面板供我们操作

容器数据卷

容器的持久化和同步操作!容器间也是可以数据共享的!

# 方式一:直接使用命令来挂载 -v

docker run -it -v 主机目录:容器内目录

# 测试
PS E:\home> docker run -it -v /home/ceshi:/home centos /bin/bash

# 启动时通过 docker inspect 容器id查看是否挂载

在这里插入图片描述

实战:安装MySQL
# 启动
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字
docker run -d -p 3310:3306 -v /e/home/mysql/conf:/etc/mysql/conf.d -v /e/home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
具名和匿名挂载
# 匿名挂载
-v 容器内路径!
docker run -d -P --name ngnix01 -v /ect/nginx nginx

# 查看所有的 volume 的情况
docker volume ls

# 具名挂载
-v 卷名:容器内路径
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
docker volume ls
DRIVER		VOLUME NAME
local 		juming-nginx

# 查看卷的路径
docker volume inspect juming-nginx

所有的docker容器内的卷,没有指定目录的情况下都是在==/var/lib/docker/volumes/xxxx/_data==

我们通过具名挂载可以方便找到我们的卷,大多数情况使用的是具名挂载

# 
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载 docker volume ls 是查看不到的

扩展:

# 修改读写权限
ro readonly # 只读 说明只能通过宿主机操作,容器内部无法操作!
# 一旦设置了这个权限,容器对我们挂载出来的内容就有了限定!
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
rw readwrite # 可读可写
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

DockerFile

就是用来构建docker镜像的构建文件!命令脚本!

通过脚本生成镜像!

# 创建一个dockerfile文件
vim dockerfile1 (linux系统)

# 文件中的内容 指令(大写) 参数
FROM centos
VOLUME ["volume01","volume02"] # 自动挂载的目录
CMD echo "----end----"
CMD /bin/bash
# 每一个命令,就是镜像的一层

docker build -f /dockerfile1 -t xxx/centos:1.0 .

在这里插入图片描述

DockerFile构建步骤:
  1. 编写一个dockerfile文件
  2. docker build构建成为一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像(dockerHub,阿里云镜像仓库)

基础知识

  1. 每个保留关键字(指令)都必须是大写字母
  2. 执行从上到下顺序执行
  3. ’#‘ 表示注释
  4. 每个指令都会创建提交一个新的镜像层,并提交!

在这里插入图片描述

dockerfile是面向开发的,发布项目,做镜像,需要编写dockersfile文件

DockerFile:构建文件,定义了一切的步骤,源代码

DockerImages:通过DockerFile 构建生成的镜像,最终发布和运行的产品

Docker容器:容器就是镜像运行起来提供服务器

DockerFile指令
FROM  			# 基础镜像 centos
MAINTAINER 		# 镜像作者 姓名+邮箱
RUN				# 镜像构建的时候需要运行的命令
ADD				# 步骤,例:tomcat镜像,tomcat压缩包! 添加内容
WORKDIR			# 镜像的工资目录
VOLUME			# 挂载的目录
EXPOSE			# 保留端口配置
CMD 			# 指定容器启动时要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT		# 指定容器启动时要运行的命令,可以追加命令
ONBUILD			# 当构建一个被继承DockerFile ,此时会运行ONBUILD 的指令。触发指令
COPY			# 类似ADD,将文件拷贝到镜像
ENV				# 构建的时候设置环境变量

在这里插入图片描述

Docker网络

企业实战

Docker Compose

Docker Swarm

层,并提交!

[外链图片转存中…(img-BI5Lik2u-1600184128133)]

dockerfile是面向开发的,发布项目,做镜像,需要编写dockersfile文件

DockerFile:构建文件,定义了一切的步骤,源代码

DockerImages:通过DockerFile 构建生成的镜像,最终发布和运行的产品

Docker容器:容器就是镜像运行起来提供服务器

DockerFile指令
FROM  			# 基础镜像 centos
MAINTAINER 		# 镜像作者 姓名+邮箱
RUN				# 镜像构建的时候需要运行的命令
ADD				# 步骤,例:tomcat镜像,tomcat压缩包! 添加内容
WORKDIR			# 镜像的工资目录
VOLUME			# 挂载的目录
EXPOSE			# 保留端口配置
CMD 			# 指定容器启动时要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT		# 指定容器启动时要运行的命令,可以追加命令
ONBUILD			# 当构建一个被继承DockerFile ,此时会运行ONBUILD 的指令。触发指令
COPY			# 类似ADD,将文件拷贝到镜像
ENV				# 构建的时候设置环境变量

[外链图片转存中…(img-CDqyrXik-1600184128134)]

Docker网络

企业实战

Docker Compose

Docker Swarm

CI/CD jekins 流水线

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值