学习视频
docker视频地址:https://b23.tv/BV1og4y1q7M4/p1
Docker 学习
入门 :常用命令、commit容器
docker精髓:容器数据卷、DockerFile、Docker网络
企业实战:Docker Compose(容器的整合管理),Docker swarm(管理docker 集群),CI/CD(持续集成持续部署) jenkins流水线。
Docker 概述
Docker 为什么出现?
一款产品:开发-上线 两套环境!应用环境,应用配置!
开发 — 运维。问题:我在我的电脑上可以运行!版本更新,导致服务不可用!对于运维来说,考验就十分大
环境配置是十分麻烦的,每一个机器都要部署环境(集群Redis,ES,Hadoop。。。)费时费力
发布一个项目(jar + (Redis MySql JDK ES)),项目能不能带上换件安装打包!
之前在服务器配置一个应用的环境Reids MySql jdk ES Hadoop 配置超麻烦,不能够跨平台。
Windows 最后发布到linux!
传统:开发jar,运维来做环境的配置!
现在:开发导包部署上线,一套流程做完!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sm2FQSKM-1590407845895)(docker.images/image-20200517141924417.png)]
Docker 通过隔离机制,可以将服务器利用到极致!
Docker 历史
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2S0A6Wjb-1590407845897)(docker.images/image-20200517144653924.png)]
聊聊 Docker
Docker 是基于GO 语言开发的!开源项目!
官网:https://hub.docker.com/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4rps2Bpw-1590407845898)(docker.images/image-20200517145103799.png)]
文档地址:https://docs.docker.com/ Docker文档是超级详细的!
仓库地址:https://hub.docker.com/ git push pull
Docker 能干嘛
虚拟机技术
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EfNA7mmQ-1590407845899)(docker.images/image-20200517150519941.png)]
虚拟机技术缺点:
1、资源占用十分多
2、冗余步骤多
3、启动很慢!
容器技术
容器化技术不是模拟的一个完成的操作系统,是运行在操作系统上的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oZyAbv0T-1590407845901)(docker.images/image-20200517150425922.png)]
比较Docker 和 虚拟机技术的不同:
- 传统的虚拟机,虚拟出硬件(内核、cpu、内存),在虚拟的硬件上运行一个完整的操作系统,然后在这个系统上安装和运行软件。
- 容器技术,容器内的应用直接运行在宿主机上,容器是没有自己的内核的用的是操作系统的内核,所以很轻便。
- 每个容器间是相互隔离的,每个容器内都有一个属于自己的文件系统,互不影响。
- 容器能极大的利用资源
DevOps(开发、运维)
应用更快速的交付和部署
传统:一堆帮助文档,安装程序
Docker:打包镜像,发布测试,一键运行
更便捷的升级和扩缩容
使用了Docker 之后,我们部署应用就和搭积木一样!
项目打包为一个镜像,扩展服务器。拿到镜像到服务器上运行即可。
更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的。
更高效的计算资源利用
Docker 是内核级别的虚拟化,可以再一个物理机上运行很多的容器实例!服务器的性能可以被压榨到极致。
Docker 安装
Docker 的基本组成
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kJ3YWw37-1590407845901)(docker.images/image-20200517152504543.png)]
- docker 客户端可以构建镜像,拉取镜像,运行镜像(变成容器)
- docker 服务器,他是一个后台进程,里面有很多的image。我们运行image会产生一个容器。可以把image理解成类,容器就是类的实例对象。也就是说每个image运行产生的容器是不一样。
- docker 仓库就是存放镜像的地方。
- 镜像(image)
- docker 镜像就好比是一个模板,可以通过这个模板来创建容器服务。tomcat镜像==>run==>tomcat容器(理解成一台服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。
- 容器(container)
- Docker 利用容器技术,可以独立运行一个或者一个组应用。容器是通过镜像来创建的。
- 启动,停止,删除,基本命令!
- 目前可以把这个容器理解为一个简易的linux 系统。
- 仓库(repository)
- 仓库就是存放镜像的地方!
- 仓库分为共有仓库和私有仓库!
- Docker hub (默认是国外的)
- 阿里云,网易云…都有容器服务器(加速镜像下载)
安装Docker
官方文件:https://docs.docker.com/engine/install/centos/
# 这里的操作系统是CentOS7.6
# 查看内核版本,内核版本大于3.10及以上 才能安装新版的docker
uname -r
# 查看系统的详细信息
cat /etc/os-release
# 更新yum软件包索引
sudo yum makecache fast
# 删除以前的版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 需要安装的包
sudo yum install -y yum-utils
# 设置镜像的仓库
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 这是官方文档提供的,国外的下载很慢,选用国内的 https://download.docker.com/linux/centos/docker-ce.repo
# 安装docker docker-ce 社区 ee是企业版本的
# 公式里面也是设置版本的
sudo yum install docker-ce docker-ce-cli containerd.io
# 启动docker
sudo systemctl start docker
# 查看docker 的信息
docker version
# 测试hello world
docker run hello-world
# 可以发现,如果在本地仓库找不到镜像,就会从远程拉取
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U5As6W3p-1590407845902)(docker.images/image-20200517155636126.png)]
了解:卸载docker
# 卸载依赖
sudo yum remove docker-ce docker-ce-cli containerd.io
# 删除目录
sudo rm -rf /var/lib/docker
# /var/lib/docker docker默认资源路径
设置阿里云镜像加速
阿里云地址:https://homenew.console.aliyun.com/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WpUdRhDM-1590407845903)(docker.images/image-20200517143928718.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MFwpdHme-1590407845903)(docker.images/image-20200517144041281.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TlSJG3Pr-1590407845904)(docker.images/image-20200517155833265.png)]
回顾HelloWorld流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OZDYhEfN-1590407845904)(docker.images/image-20200517155636126.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-knfTJ6sS-1590407845905)(docker.images/image-20200517160525638.png)]
底层原理
Docker是怎么工作的?
Docker 是一个Clien-Server 结构的系统,Docker 的守护进程运行主机上。我们可以通客户端访问(Socket)!
DockerServer 接收到DockerClient 的指令,就会执行这个命令!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lEpY6Qm5-1590407845905)(docker.images/image-20200517160941516.png)]
Docker 为什么比虚拟机快?
1、Docker 有着比虚拟机更少的抽象层
2、 Docker 利用的是宿主机的内核,VM 需要 Guest OS(客户端操作系统)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OhQ5pzni-1590407845906)(docker.images/image-20200517161224766.png)]
所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导, 虚拟机是加载Guest OS,分钟级别的启动速度。而Docker 是利用宿主机的操作系统(内核),省略了这个复杂的过程,秒级!
下面的图有问题:现在docker也支持windows系统了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aabp26cM-1590407845908)(docker.images/image-20200517161702738.png)]
Docker 常用命令
帮助命令
docker version # 显示docker的信息
docker info # 显示docker的系统信息,包括镜像和容器的数量
docker --help
docker 命令 --help # 万能命令
帮助文档的地址 https://docs.docker.com/reference/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-13rfbCK1-1590407845909)(docker.images/image-20200517162441151.png)]
镜像命令
**docker images **
# 查看本地安装的镜像,不能看到一些docker 内部的镜像
$ docker images
# 查看所有的镜像
$ docker images -a
# 查看所有镜像的id
$ docker images -q -a
$ docker images -aq
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4iPYE1t5-1590407845910)(docker.images/image-20200517163106594.png)]
docker search image
一般都是去hub上找,都不用search命令找镜像
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lzUiShcJ-1590407845911)(docker.images/image-20200517163401687.png)]
docker pull image
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BoBAB7eE-1590407845912)(docker.images/image-20200517163711374.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-112EHT9p-1590407845913)(docker.images/image-20200517163732938.png)]
docker rmi image
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wKGuE8jp-1590407845913)(docker.images/image-20200517164344184.png)]
# 删除镜像
$ docker rmi 容器id|容器名字
# 删除全部镜像
$ docker rmi -f `docker images -qa`
# 或者是
$ docker rmi -f $(docker images -qa)
# rmi 删除镜像
# -f 强制删除,镜像有容器也能删除(停止的容器)
容器命令
说明:我们有了镜像才可以创建容器,linux,下载一个conteos来测试学习
docker pull centos
新建容器并启动
docker run [可选参数] image
# 参数说明
--name=xxx 容器名字,用来区分容器
-d 后台方式运行
-it(-i -t) 使用交互方式运行,可以使用镜像运行成容器,在使用容器直接执行我们的命令
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P 随机指定端口(暴露出所有的端口)
# 测试 : 启动并进入容器(启动bash执行器,centos默认也是bash)
[root@haitao ~]# docker run -it centos /bin/bash
[root@12f33dcf0796 /]# echo $SHELL # 查看当前的shell执行器
/bin/bash
[root@74d8a9107de7 /]# ls # 查看容器内的centos,基础版本,很多命令都是不完整的!
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@12f33dcf0796 /]# exit # 退出交互模式
exit
列出容器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-daf7mX95-1590407845914)(docker.images/image-20200517171117069.png)]
退出容器
exit # 交互模式下,直接退出,停止容器
ctrl + p + q # 已进入容器的shell的情况下,退出容器(不停止容器)
删除容器
docker rm 容器id|容器名字 # 只能删除停止的容器,可以递归删除
docker rm -f 容器id|容器名字 # 删除容器,强制删除,容器正在运行也能删除
docker rm [-f] $(docker ps -qa) # 删除全部的容器
docker rm [-f] `$(docker ps -qa)` # 删除全部的容器
docker ps -qa | xargs docker rm [-f] # 删除全部的容器
# xargs 是Linux提供的将管道的输出结果作为下一个命令的输入
启动和停止容器的操作
docker start 容器id|容器名字 # 启动容器
docker restart 容器id|容器名字 # 重启容器
docker stop 容器id|容器名字 # 停止当前正在运行到容器
docker kill 容器id|容器名字 # 强制停止当前容器(stop停止)
常用其他命令(对容器的操作)
后台启动容器
# 命令 docker run -d 镜像名|镜像id
[root@haitao /]# docker run -d centos
# 问题docker ps。发现容器停止了
# 常见问题,docker 容器使用后台运行,就必须要有一个前台进程(-it进入交互模式就是前台进程)。docker发现没有应用,就会自动停止。
# 比如nginx 容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了。
查看日志命令
[root@haitao /]# docker logs --help
Usage: docker logs [OPTIONS] CONTAINER # 容器的表示
Fetch the logs of a container
Options:
--details Show extra details provided to logs
-f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
--tail string Number of lines to show from the end of the logs (default "all")
-t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
# 自己编写shell脚本(产生日志)
# /bin/bash 指定linux 默认的shell执行器
# -c 在容器的控制台执行内容
[root@haitao /]# docker run -d centos /bin/bash -c "while true;do echo haitaoss;sleep 1; done;"
1d18de7e76d39bea90cb95baf77a26aff22e1085ee01c1be7940f9cf7ee3476e
# 查看容器的日志,-f --tail -t 都是帮助文档提示的
[root@haitao /]# docker logs -f --tail 10 -t 1d18de7e76d39bea90cb95baf77a26aff22e1085ee01c1be7940f9cf7ee3476e
2020-05-17T09:44:13.484858554Z haitaoss
2020-05-17T09:44:14.486079085Z haitaoss
2020-05-17T09:44:15.488527532Z haitaoss
2020-05-17T09:44:16.489815756Z haitaoss
查看容器的进程信息
[root@haitao /]# docker run -d centos /bin/bash -c "sleep 10;" # 运行一个容器,为了防止别太快退出,先休眠10秒
04bffaecd07049b42b42a0e1bee2c883677e0caf0fbdfabdcf5f7fcf8bcd8ade
[root@haitao /]# docker top 04bffaecd # 查看容器里面的进程信息
UID PID PPID C STIME TTY TIME CMD
root 72759 72742 0 17:52 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 10
查看容器的元数据
# 命令 docker inspect --help
[root@haitao /]# docker inspect --help
Usage: docker inspect [OPTIONS] NAME|ID [NAME|ID...]
Return low-level information on Docker objects
Options:
-f, --format string Format the output using the given Go template
-s, --size Display total file sizes if the type is container
--type string Return JSON for specified type
# 具体使用
docker inspect 容器id:容器名字
# 测试
[root@haitao /]# docker run -d centos /bin/bash -c "while true;do echo haitaoss;sleep 10;done;"
[root@haitao /]# docker inspect 70b883
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OtrfO6b8-1590407845916)(docker.images/image-20200517180817919.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kTmlYD8E-1590407845916)(docker.images/image-20200517180923233.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y019kI2h-1590407845918)(docker.images/image-20200517181130845.png)]
进入当前正在运行的容器
# 通常我们的容器都是使用后台方式运行的,需要进入容器,修改一些配置
# 命令
docker exec -it 容器id|容器名字 命令
# 测试
[root@haitao /]# docker exec --help
Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
Run a command in a running container # 需要输入要执行的命令才能成功进入,即容器后面时必须接命令的
Options:
-d, --detach Detached mode: run command in the background
--detach-keys string Override the key sequence for detaching a container
-e, --env list Set environment variables
-i, --interactive Keep STDIN open even if not attached
--privileged Give extended privileges to the command
-t, --tty Allocate a pseudo-TTY
-u, --user string Username or UID (format: <name|uid>[:<group|gid>])
-w, --workdir string Working directory inside the container
[root@haitao /]# docker exec -it 953c57a1ab3d /bin/bash
# /bin/bash 的执行效果就是生成一个bash命令的的shell。可以在linux 中测试
# 方式二
docker attach 容器id|容器名字
# docker exec # 使用容器内正在运行的终端,执行我们输入的命令(可以利用这个打开新的终端,方便我们操作)
# docker attach # 进入容器当前运行的终端。不会启动新的进程!(不能输入命令只能静静的看着)
从容器内拷贝文件到主机上
#