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构建步骤:
- 编写一个dockerfile文件
- docker build构建成为一个镜像
- docker run 运行镜像
- docker push 发布镜像(dockerHub,阿里云镜像仓库)
基础知识
- 每个保留关键字(指令)都必须是大写字母
- 执行从上到下顺序执行
- ’#‘ 表示注释
- 每个指令都会创建提交一个新的镜像层,并提交!
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 流水线