目录
5.2.1 docker images # 查看所有本地的主机上的镜像
一、Docker概述
1.什么是Docker
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
2.Docker为什么出现?
一款产品:开发--上线两套环境!应用环境,应用配置!
开发---运维。 问题:我在我的电脑上可以运行!版本更新,导致服务不可用!对于运维来说,考验十分大?
环境配置是十分的麻烦,每一个机器都要背书环境(集群Redis、ES、Hadoop。。。)!费时费力
发布一个项目jar(Redis、MySQL jdk ES 等包,有时需要安装包需要很多时间),项目能不能带上环境安装打包(这样不就省时间了)!
之前在服务器配置一个应用的环境Redis MySQL jdk ES Hadoop,配置超麻烦了,不能够跨平台。
传统:开发jar,运维来做@
现在:开发打包部署上线,一套流程昨晚!
java --》apk--》发布(应用商店)--》张三使用apk---安装即可用!
java --》jar(环境) ---打包项目带上环境(镜像)---(Docker仓库:商店)---下载我们发布的镜像---直接运行即可
Docker给以上的问题,提出了解决方案!
Docker思想来源于集装箱!
JRE--多个应用((端口冲突)--原来都是交叉的!
隔离:Docker核心思想! 打包装箱! 每个箱子是互相隔离的
Docker通过隔离机制,可以将服务器利用到极致!
本质:所有的技术都是来源我们需要解决的问题,才去学习!
3.Docker的历史
2010年,几个搞IT的年轻人,就在美国成立了一个公司dotCloud
做一些pass的云计算服务! LXC有关的容器技术!
他们将自己的技术(容器化技术)命名就是Docker!
Docker刚刚诞生的时候,没有引起行业的注意!dotCloud,就活不下去!
然后想到开源(开发源代码!)
2013年,docker开源!
Docker越来越多的人发现了docker的优点!火了,Docker每个月会更新一个版本!
2014年4月9日,Docker1.0发布
Docker为什么这么火?
在容器技术出来之前,我们都是使用虚拟机技术!
虚拟机:在window中装一个Vmaware,通过这个软件我们可以虚拟出来一台或者多台电脑!笨重!
虚拟机也是属于虚拟化技术,Docker容器技术,也是一种虚拟化技术!
vm:linux centos原来镜像(一个电脑)隔离,需要开启多个虚拟机! 几个G 几分钟
docker:隔离,镜像(最核心的环境4m+jdk+mysql)十分的小巧,运行镜像就可以了!小巧! 几个 秒级启动!
二、聊聊Docker
Docker是基于Go语言开发的
官网:www.docker.com
文档地址:https://docs.docker.com/Docker的文档是超级详细的!
三、Docker能干嘛
之前的虚拟机技术:
虚拟机技术缺点:
1.资源占用十分多
2.冗余步骤多
3。启动很慢
容器化技术:
容器化技术不是模拟虚拟机的
比较docker喝虚拟机技术的不同:
- 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
- 容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
- 每个容器间是互相隔离,每个容器都有一个属于自己的文件系统,互不影响
DevOps(开发、运维)
应用更快捷的交付和部署
传统:一堆帮助文档,安装程序
Docker:打包镜像发布测试,一键运行
更便捷eider升级和扩缩容
使用了Docker之后,我们部署应用就和搭积木一样!
项目打包为一个镜像,扩展 服务器A!服务器B上可以直接运行服务器A达到扩容
更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的
更高效的计算资源利用:
Docker是内核级别的虚拟化,可以在一个物理机上可以运行很多的容器实例!服务器的性能被挤压到极致。
三、Docker安装
1.Docker的基本组成
镜像(image):
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像---》run---》tomcat01容器(提供服务器),通过这个镜像可以创多个容器(最终服务运行或者项目运行就是在容器中的)
容器(container):
Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的。
启动,停止,删除,基本命令!
目前就可以把这个容器理解为就是一个简易的linux系统
仓库(repository):
仓库就是皴法镜像的地方!
仓库分为共有仓库和私有仓库!
docker Hub(默认是国外的)
阿里云、、、都有容器服务(配置镜像加速!)
!
2.Ubuntu安装docker教程并配置阿里云镜像加速
https://blog.csdn.net/qq_43648470/article/details/108171050
3.Ubuntu配置docker的阿里云镜像加速器
https://blog.csdn.net/weixin_43142797/article/details/105877375
四、回顾helloWorld
4.1底层原理
Docker怎么工作的?
Docker是一个Client-Server结构的系统,Docker的守护进行运行在主机上。通过Socket聪客户端访问
DockerSever接收到Docker-Client命令,就会执行这个命令
Docker为什么比VM快?
1.Docker有着比虚拟机更少的抽象层
2.docker利用的是宿主机的内核,VM需要是Guest OS
所以说,新建一个容器的时候,dockers不需要像虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是今安在Guest OS,分种级别的,而docker是利用宿主机的操作系统,省略了许多复杂过程,秒级!
五、Docker常用命令
5.1 帮助命令
docker version # 显示docker的版本信息
docker info # 显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help # 帮助命令
帮助文档的地址:https://docs.docker.com/engine/reference/run/
5.2 镜像命令:
5.2.1 docker images # 查看所有本地的主机上的镜像
root@bianbian-Lenovo-XiaoXin-700-15ISK:/home/bianbian# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d1165f221234 2 months ago 13.3kB
# 解释
REPOSITORY 镜像的仓库源
TAG 镜像的ID
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小
# 可选项
Options:
-a, --all # 列出所有的镜像
-q, --quiet # 只显示镜像的ID
5.2.2 docker search 搜索镜像
d1165f221234
root@bianbian-Lenovo-XiaoXin-700-15ISK:/home/bianbian# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10856 [OK]
# 可选择,通过收藏来过滤
--filter=STARS=3000 搜索大于3000的
5.2.3 docker pull mysql 下载镜像
# 下载镜像docker pull 镜像名[:tag]
root@bianbian-Lenovo-XiaoXin-700-15ISK:/home/bianbian# docker pull mysql
Using default tag: latest # 如果不写tag,默认就是latest
latest: Pulling from library/mysql # 分层下载,docker image的核心联合文件系统
69692152171a: Pull complete
1651b0be3df3: Pull complete
951da7386bc8: Pull complete
0f86c95aa242: Pull complete
37ba2d8bd4fe: Pull complete
6d278bb05e94: Pull complete
497efbd93a3e: Pull complete
f7fddf10c2c2: Pull complete
16415d159dfb: Pull complete
0e530ffc6b73: Pull complete
b0a4a1a77178: Pull complete
cd90f92aa9ef: Pull complete
Digest: sha256:d50098d7fcb25b1fcb24e2d3247cae3fc55815d64fec640dc395840f8fa80969 # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址
docker pull mysql
等价
docker.io/library/mysql:latest
# 指定版本下载
root@bianbian-Lenovo-XiaoXin-700-15ISK:/home/bianbian# docker pull mysql:5.7
5.7: Pulling from library/mysql
69692152171a: Already exists
1651b0be3df3: Already exists
951da7386bc8: Already exists
0f86c95aa242: Already exists
37ba2d8bd4fe: Already exists
6d278bb05e94: Already exists
497efbd93a3e: Already exists
a023ae82eef5: Pull complete
e76c35f20ee7: Pull complete
e887524d2ef9: Pull complete
ccb65627e1c3: Pull complete
Digest: sha256:a682e3c78fc5bd941e9db080b4796c75f69a28a8cad65677c23f7a9f18ba21fa
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
# 查看版本
root@bianbian-Lenovo-XiaoXin-700-15ISK:/home/bianbian# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 2c9028880e58 4 hours ago 447MB
mysql latest c0cdc95609f1 4 hours ago 556MB
hello-world latest d1165f221234 2 months ago 13.3kB
5.2.4 docker rmi -f 删除镜像
# 通过ID删除指定的镜像
root@bianbian-Lenovo-XiaoXin-700-15ISK:/home/bianbian# docker rmi 2c9028880e58
# 删除全部的镜像
root@bianbian-Lenovo-XiaoXin-700-15ISK:/home/bianbian# docker rmi -f $(docker images -aq)
5.3 容器命令:
说明:我们有了镜像才可以创建容器,linux,下载一个centos镜像来测试学习
docker pull centos
5.3.1 新建容器并启动
dokcer run [可选参数] image
# 参数说明
--name="Name" 容器名字 tomcat01 tomcat02, 用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口 (常用)
-p 容器端口
# 启动并进入容器
root@bianbian-Lenovo-XiaoXin-700-15ISK:/home/bianbian# docker run -it centos /bin/bash
[root@654eaac0b726 /]#
# 查看容器内centos,基础版本,很多命令是不完善的
[root@654eaac0b726 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
# 从容器内退出
[root@654eaac0b726 /]# exit
exit
root@bianbian-Lenovo-XiaoXin-700-15ISK:/home/bianbian# ls
anaconda3 default.conf nginx.conf zlib-1.2.11.tar.gz 模板 图片 下载 桌面
cmake-3.9.2 examples.desktop zlib-1.2.11 公共的 视频 文档 音乐
root@bianbian-Lenovo-XiaoXin-700-15ISK:/home/bianbian#
5.3.2 列出所有的运行的容器
# docker ps 命令
# 列出当前正在运行的容器
-a # 列出当前正在运行的容器+带出历史运行过的容器
-n=? # 显示最近创建的容器
-q # 只显示容器的编号
root@bianbian-Lenovo-XiaoXin-700-15ISK:/home/bianbian# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@bianbian-Lenovo-XiaoXin-700-15ISK:/home/bianbian# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
654eaac0b726 centos "/bin/bash" 5 minutes ago Exited (0) 55 seconds ago trusting_jennings
d0de4bfd0262 centos "/bin/ba" 5 minutes ago Created nice_vaughan
36ceb02cbc8e d1165f221234 "/hello" 5 hours ago Exited (0) 5 hours ago agitated_wing
5.3.3 退出容器
exit # 直接容器停止退出
ctrl+q+p # 容器不停止退出
5.3.4 删除容器
docker rm 容器id # 删除指定的容器,不能删除正在运行的容器,若强制删除rm -f
docker rm -f $(docker ps -aq) # 删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
5.3.5 启动和停止容器的操作
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止容器
docker kill 容器id # 杀掉容器
5.4 常用其它命令
5.4.1 后台启动容器
# 命令 docker run -d 镜像名!
root@bianbian-Lenovo-XiaoXin-700-15ISK:/home/bianbian# docker run -d centos
# 问题docker ps,发现 centos 停止了
# 常见的坑:docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就自动停止
# nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
5.4.2 查看日志
docker logs -f -t -n --tail 容器ID
# 退出日志
ctrl + c
# 自己编写一段shell脚本
root@bianbian-Lenovo-XiaoXin-700-15ISK:/home/bianbian# docker run -d centos /bin/sh -c "while true;do echo bianbian;sleep 1;done"
# 显示日志
-tf # 显示日志
--tail # 要显示日志条数
root@bianbian-Lenovo-XiaoXin-700-15ISK:/home/bianbian# docker logs -f -t -n --tail 93679179fbc6
5.4.3 查看容器里进程信息
# 命令 docker top 容器id
root@bianbian-Lenovo-XiaoXin-700-15ISK:/home/bianbian# docker top 93679179fbc6
UID PID PPID C STIME TTY TIME CMD
root 4704 31266 0 09:58
root 31266 31238 0 09:42
5.4.4 查看镜像里的语言数据
# 命令 docker inspect 容器id
root@bianbian-Lenovo-XiaoXin-700-15ISK:/home/bianbian# docker inspect 93679179fbc6
5.4.5 进入当前正在进行的容器
# 通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
# 命令
docker exec -it 容器ID bashshell
# 测试
root@bianbian-Lenovo-XiaoXin-700-15ISK:/home/bianbian# docker exec -it 93679179fbc6 /bin/bash
[root@93679179fbc6 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 01:42 ? 00:00:00 /bin/sh -c while true;do echo bianbian;sleep 1;done
root 1440 0 0 02:06 pts/0 00:00:00 /bin/sh
root 1680 0 0 02:10 pts/1 00:00:00 /bin/bash
root 1730 0 1 02:11 pts/2 00:00:00 /bin/bash
root 1748 1 0 02:11 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root 1749 1730 0 02:11 pts/2 00:00:00 ps -ef
[root@93679179fbc6 /]#
# 方式二
docker attach 容器id
# dokcer exec # 进入容器后开启一个新的终端,可以进去操作
# docker attach # 进入容器正在执行的终端,不会启动新的进程
5.4.6 从容器内拷贝文件主机上
[root@3e2d361730a0 home]# ls
# 在容器内新建一个文件
[root@3e2d361730a0 home]# touch test.java
[root@3e2d361730a0 home]# exit
exit
root@bianbian-Lenovo-XiaoXin-700-15ISK:/home# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@bianbian-Lenovo-XiaoXin-700-15ISK:/home# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3e2d361730a0 centos "/bin/bash" 3 minutes ago Exited (0) 23 seconds ago thirsty_borg
# 将这个文件拷贝到主机
root@bianbian-Lenovo-XiaoXin-700-15ISK:/home# docker cp 3e2d361730a0:/home/test.java /home
root@bianbian-Lenovo-XiaoXin-700-15ISK:/home# ls
bianbain.java bianbian lost+found test.java
root@bianbian-Lenovo-XiaoXin-700-15ISK:/home#
# 拷贝是一个手动过程,未来使用-v卷的技术,可以实现同步
六、Docker常用命令总结:
docker images | 作用 |
---|---|
docker images -a | 查看所有镜像 |
docker images -q | 查看所有镜像的ID |
docker images -aq | 查看所有镜像并且只显示ID |
docker rmi | 作用 |
---|---|
docker rmi -f hello-world:latest | 根据容器名称删除镜像 |
docker rmi -f 容器id | 根据容器ID删除镜像 |
docker rmi -f 容器id 容器id 容器id | 删除多个容器 |
docker rmi -f $(docker images -aq) | 递归删除所有容器 |
命令 | 作用 | |
---|---|---|
docker run -d -it -p 8080:9090 -v Myvolume:/home/nginx myCentos image | 启动名为myCentos的Docker容器并将自身容器的9090端口与服务器的8080端口进行映射,同时将该容器下的/home/nginx文件夹挂载到服务器的Myvolume文件夹下 | |
docker run -d centos* | 在后台启用Docker | |
docker search 镜像名 | 搜索镜像 | |
docker pull 镜像名 | 下载镜像 | |
docker rm 容器Id | 删除指定容器,不能删除正在运行的容器,如果要强制删除,使用 rm -f | |
docker rm -f $(docker ps -aq) | 递归删除所有的容器 | |
docker ps -a -q | xargs docker rm | 删除所有的容器 |
docker ps | 列出所有运行中的容器 | |
docker ps -a | 列出当前正在运行的容器 + 带出历史运行过的容器 | |
docker ps -n | 显示最近创建的容器 | |
docker ps -q | 只显示当前容器的ID | |
docker start 容器id | 启动容器 | |
docker restart 容器 id | 重启容器 | |
docker stop 容器id | 停止当前正在运行的容器 | |
docker kill 容器id | 强制停止当前容器 | |
docker logs -tf —tail 10 140b84067c43 | 显示id为140b84067c43的容器的前10条日志 | |
docker top 容器 id | 查看容器中进程信息 | |
docker inspect 60e4c99e0c | 查看镜像元数据 | |
docker exec -it 767a7b65b54d /bin/bash | 进入容器内部并开启一个新的终端,(常用) | |
docker attach 767a7b65b54d | 进入容器正在执行的终端,不会启动新的进程 | |
docker cp tomcat.bak/* /home/qingtian | 复制容器中的tomcat.bak文件到服务器的/home/qingtian目录下 | |
docker cp 767a7b65b54d:/home/java_test /home | docker cp 容器id: 容器内路径 目的位置主机路径 | |
docker stats Id | 查看服务状态 | |
docker commit -a=”qingtian” -m=”add webapps app” 9452c3dbc44c tomcat01:1.0 | -a:作者信息,-m:提交信息 | |
docker volume | 查看所有volume的情况 | |
docker commit -a=”qingtian” -m=”add webapps app” 9452c3dbc44c tomcat01:1.0 | 提交id为 9452c3dbc44c 的Docker容器 作者为qingtian 提交信息为 “add webapps app” Tag信息 tomcat01:1.0 | |
docker network ls id | 查看Docker网络信息 |
参考:
https://www.kuangstudy.com/bbs/1362640018950189058
https://blog.csdn.net/pbrlovejava/article/details/80357744?ops_request_mis