前言
容器命令[部分]
docker run
–name=“nginx-lb”
这个就是为容器起一个名称
以前是随机起的名称
docker run -d --name mynginx1 nginx:1.24.0
docker ps
这样就可以看到我们起的名字了
docker stop mynginx1
这个就可以停掉指定名字的容器了,但不是删除这个容器,docker ps -a还是可以看到的
-h “mars”
这个就是指定容器的hostname
docker run -it centos:7 bash
这个就是交互式运行
如果不指定-h就是随机生成的hostname
docker run -it -h mycentos7 centos:7 bash
放在centos的参数是针对的centos的命令
这个就是指定的hostname了
-e username=“ritchie”
这个就是设置环境变量
docker run -it -h mycentos7 -e myenv=test centos:7 bash
这个表示我们的环境现在是测试环境
我们用env这个命令检查环境变量
env | grep myenv
这个就成功了
输入env就可以查看所有的环境变量
–cpuset-cpus=“0-2” or --cpuset-cpus=“0,1,2”
就是把这个容器绑定到具体的某个核某个cpu去跑
docker run -d --name mynginx1 --cpuset-cpus=“0-1” nginx:1.24.0
这个就是使用0或者1核
我们先到另一个shell看看cpu信息
cat /proc/cpuinfo
这个是运行前cpu的信息
可以看出cpu单核的
我们一运行就会报错
因为只有一个核
只能指定一个
docker run -d --name mynginx1 --cpuset-cpus=“0” nginx:1.24.0
但是运行又出错了
因为这个mynginx1的名字已经被其他容器使用了
docker ps -a
所以换个名字
docker run -d --name mynginx2 --cpuset-cpus=“0” nginx:1.24.0
这样就可以了
-m
就是容器使用内存的最大值
docker run -d --name mynginx3 nginx:1.24.0
我们先不指定使用内存
我们用
docker stats mynginx3
可以看出我们最大值为1.93G
在另一个shell中
输入
free -m
可以看出服务器最大只有1.9G
所以默认最大的内存就是服务器的使用的内存
docker run -d --name mynginx4 -m 500m nginx:1.24.0
这个就是指定只能用500m
docker stats mynginx4 mynginx3
可以看出这个就有区别了
–link=[]
这个就是把一个容器链接到另一个容器
docker run -it --name mycentos1 centos:7 bash
再打开另一个shell
docker run -it --name mycentos2 --link mycentos1:mywebsite1 centos:7 bash
这个就是把容器mycentos2 链接到mycentos1,然后取个别名mywebsite1
这样的话我们就可以在mycentos2 中访问mycentos1的网络了
我们直接ping mycentos1
这个指令是测试网络的
我们也可以ping mywebsite1
mywebsite1 和mycentos1是一样的
输入cat /etc/hosts
这里就有那个链接的信息
但是这个链接是单向的
意思就是
mycentos1不能pingmycentos2
cat /etc/hosts输入这个也不会有链接的信息
不会存储另一个容器的ip
本质就是在/etc/hosts存储了另一个容器的ip所以才可以链接的
–rm
这个就是容器暂停退出的时候自动删除容器
docker run -it --name mycentos3 centos:7 bash
docker ps -a是查看的运行中的容器
exit只是暂停这个容器的运行
docker run -it --name mycentos4 --rm centos:7 bash
然后再在另一个容器中输入docker ps -a,能看到mycentos4
但是我们在mycentos4 里面exit之后,
再在另一个容器中docker ps -a,就看不到mycentos4 了
这个就是自动清理容器删除容器了
docker ps
- docker ps
• 功能
列出容器
• 语法
docker ps [OPTIONS]
• 别名
docker container ls, docker container list, docker container ps
• 关键参数
○ -a :显示所有的容器,包括未运行的。
○ -f :根据条件过滤显示的内容。
○ --format :指定返回值的模板文件。如json或者table
○ -l :显示latest的容器。
○ -n :列出最近创建的n个容器。
○ --no-trunc :不截断输出。
○ -q :静默模式,只显示容器编号。
○ -s :显示总的文件大小。
• 样例
docker ps -a
-f
就是根据docker ps里面的属性列进行过滤
docker ps -f name=mynginx4
–format
可以指定返回的模版
docker ps --format json
默认返回的是表格
-l
就是显示最近的那个容器
docker ps -l
-n
docker ps -n 2
就是显示最近的n个容器
–no-trunc
就是不截断输出
比如id不截断
-q
docker ps -q
就是只返回id
还可以与-a配合,就是返回所有容器的id
-s
就是顺便把容器的大小都返回了
docker ps -s
最后一列就是大小
实战
搭建一个nginx服务
查找nginx镜像
docker search nginx
但是一般还是在docker.hub官网上去找
选取镜像的时候还是要去选取上面的已认证的镜像
然后看tags那边
选取镜像
第二步就是拉取镜像了
docker pull nginx:1.24.0
我们如何验证拉取过来了没呢
docker images nginx
这个是把nginx过滤来查看
我们如何看一个镜像的详细信息呢
docker image inspect nginx:1.24.0
我们看出ExposePorts暴露的是80的tcp端口
我们还可以看出启动命令
启动镜像,修改首页
docker run -p 80:80 --name myweb2 -h myweb1.cm -e myenv=test nginx:1.24.0
一运行
但是Ubuntu上的服务器上已经布置了一个80端口了
docker run -p 8099:80 --name myweb2 -h myweb1.cm -e myenv=test nginx:1.24.0
但是这样又错了
为什么呢,因为上一次已经创建了容器myweb2 ,只不过创建失败了,但是名字已经被占用了
docker run -p 8099:80 --name myweb3 -h myweb1.cm -e myenv=test nginx:1.24.0
这个就是nginx的启动信息
打印出来了这个,就说明了我们是在前台运行的
因为没有-d,这个就只能看看,什么都干不了
这样就可以了
如果我们ctrl+c或者关掉了shell
就停止了这个容器了
所以我们要后台运行
docker run -p 8099:80 --name myweb4 -h myweb1.cm -e myenv=test -d nginx:1.24.0
这样就成功了
ctrl+c也没用了
现在开始改首页
—》要交互运行才可以,因为要在里面搞事情,修改东西
docker run -p 8100:80 --name myweb6 -h myweb1.cm -e myenv=test -it nginx:1.24.0 bash
-it对应就有一个bash在后面,为什么要添加bash呢,添加bash的目的就是能够使用ll这种命令
然后就是要改名字,改端口
这样我们就进去了
我们进入了nginx的交互,进入了这个nginx容器里面
,但是nginx并没有启动的,我们还要手动启动才可以,但是后台运行的话,就不用我们来手动启动了
这样我们的nginx就启动起来了
这样我们访问8100端口就可以访问里面的nginx的默认页面了
我们可以进入这个nginx的默认页面
就在nginx容器里面进入nginx的默认页面
cd /usr/share/nginx/html/
这里面有一个index.html
的页面
修改它就可以修改默认显示的页面了
直接输入echo “hello nginx docker” > index.html
这样的话,里面的内容就变成这一句话了,这个是因为echo是覆盖性的
但是我们还没有学习怎么在后台运行,然后进入这个容器,修改这个容器的内容
Docker hub上创建自己私有仓库
Busybox
BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件。BusyBox 包含了一
些简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具,例
grep、find、mount以及telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。
简单的说BusyBox就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也
包含了 Linux 系统的自带的shell。busybox是一个集成了一百多个最常用linux命令和
工具的软件,他甚至还集成了一个http服务器和一个telnet服务器,而所有这一切功能却
只有区区1M左右的大小.因海外带宽较小,我们拉取该镜像推送到自己的仓库。
意思就是我们拿进去这个Busybox的命令,那么那些简简单单的rz命令我们都不用下载了,原生是没有的,需要下载,而且这个大小很小,推仓库很快
安装Busybox
我们直接敲busybox
就知道我们有没有busybox了
然后开始卸载
apt --purge autoremove busybox
然后就是安装
apt install busybox -y
安装和卸载都比较慢
我们输入busybox检查一下
可以正常运行就可以了
这样我们就可以使用busybox来使用它里面的指令了
比如
busybox ls /
查找根目录
busybox ping www.baidu.com
这些命令都是可以正常运行的
输入which busybox
就可以知道安装在哪里了
ls -lh /usr/bin/busybox
这样加了-h就知道大小了
发现才七百多k
创建仓库
要创建仓库的话,首先要在docker.hub上有一个账号才可以
但是有两个问题
第一这是海外的,我们要网络加速才可以
第二就是,我们的QQ邮箱是国内的邮箱,国外无法发邮箱信息过来
所以我们注册不了
当然也创建不了账号
所以得换国内的仓库了
我们可以拉取一下busybox
docker pull busybox:1.36.0
综合实战三、腾讯云创建自己的私有仓库
创建腾讯云账号
官网
点击右上角的注册就可以了
然后我们搜索容器镜像服务
点击立即选购
这个是要钱的
买了就会进去这个页面
点击镜像仓库
新建那里就可以建造仓库了
创建的时候它要一个命令空间
点击命名空间这里进行命名
现在就可以创建镜像仓库了
这样就创建好了
点击快捷指令
这里就给出了命令
我们推送镜像之前先登录
直接复制上面图片的命令就可以了
docker login ccr.ccs.tencentyun.com --username=100014125284
然后输入密码
然后就是打tag,打标签
也是复制
docker tag busybox:1.36.0 ccr.ccs.tencentyun.com/maxhou6/busyboxbymaxhou:v1.0
或者用id来tag都是可以的
我们在看一下效果
dicker images | grep busybox
这样就有1.0和2.0的tag了
其实id都是一样的
然后就是推送了
docker push ccr.ccs.tencentyun.com/maxhou6/busyboxbymaxhou:v1.0
这样就可以了
还有就是tag重复的,只会push成功一个
并不会全部一样的都push上去,
docker push ccr.ccs.tencentyun.com/maxhou6/busyboxbymaxhou -a
-a就是把 tag为ccr.ccs.tencentyun.com/maxhou6/busyboxbymaxhou全部push上去
看前台我们就看到了,三个不同的tag都push上去了
我们如何拉取呢
docker pull ccr.ccs.tencentyun.com/maxhou6/busyboxbymaxhou:v1.0
这样就可以拉取下来了
然后就是登出了
docker logout ccr.ccs.tencentyun.com
v1.0是tag
busyboxbymaxhou是仓库名称
maxhou6是命名空间的名称
ccr.ccs.tencentyun.com是镜像仓库统一的对外的地址
登出之后就不能push和pull了
不能pull是因为这个镜像是一个私有的镜像
阿里云创建自己的私有仓库
官网
还是搜索容器镜像服务
这个比腾讯云的好,因为有个人版的,不要钱,腾讯云没有个人版,它的个人版用不了了
这里可以设置docker登录的密码
创建镜像仓库之前,先创建命名空间
然后就是创建镜像仓库
代码源我们选取本地仓库就可以了
本地仓库就是通过docker push和docker pull来操作
而且命令阿里云都提供好了
docker images busybox确保本地有镜像
登录去复制然后输入密码
然后就是打tag
docker images | grep busybox过滤查看
然后push还是复制,但是tag不能复制
我们多打几个tag
然后-a就是一起push
就都进去了
退出来也是一样的
拉取的命令也是复制
这个不需要登录,如果我们的镜像是公开的话
这样就完成了
没有登录当然就不能push了
Docker Image(镜像)
Docker 镜像是什么
Docker image本质上是一个 read-only 只读文件, 这个文件包含了文件系统、
源码、库文件、依赖、工具等一些运行application所必须的文件。
• 我们可以把Docker image理解成一个模板或者类, 可以通过这个模板实例化出来很多
容器。
• image 里面是一层层文件系统Union FS。联合文件系统,可以将几层目录挂载到
一起,形成一个虚拟文件系统。
每一层文件系统我们叫做一层 layer,联合文件系统可以对每一层文件系统设置三
种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但是 docker
镜像中每一层文件系统都是只读的。
构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层
的修改,增加了一层文件系统。一层层往上叠加,上层的修改会覆盖底层该位置的可
见性,这也很容易理解,就像上层把底层遮住了一样。当你使用的时候,你只会看到
一个完全的整体,你不知道里面有几层,也不清楚每一层所做的修改是什么。
镜像可以弄java也可以是c++
为什么需要镜像
在部署应用时,通过手工或写一些脚本的方式进行部署。这样部署面临问题就是云端
和本地环境一致问题。用户为每个应用打包过程比较繁琐,需要配置和给中修改等操
作,非常费劲。
然而,Docker 镜像就是为了解决这个小小的打包功能,突然一夜之间成名。那么,你
可能说 Docker 镜像就是个压缩包,是的,你猜对了,它就像一个压缩包文件。它是如
何解决 Paas 时代所面临的云端和本地一致性问题?很简单,它是把一个镜像制作成
一个完整的操作系统所有文件和对应的目录结构,这样的压缩包是跟你本地和测试环
境用的操作系统一摸一样。
docker 最大的贡献就是定义了容器镜像的分层的存储格式,docker镜像技术的基础
是联合文件系统(UnionFS),其文件系统是分层的。这样既可以充分利用共享层,又可
以减少存储空间占用。
docker 镜像提供了一种打包应用程序和预配置服务器环境的便捷方式,可以很方便的
将其用于个人用途或与其他 Docker 用户公开共享
把jdk那些东西一起打包好的东西
dockefile:docker镜像制作的标准
而且镜像只需要存一份,就可以镜像出很多份
镜像存过来的时候,就不会把centos存两份,因为是分层的
底层的东西已经有了的话,就只需要pull最上面的东西就可以了,这就是镜像分层的好处,节省了存储空间,直到找到不一样的层为止,就可以pull了
所有镜像层数越深,浪费时间越多
镜像命令详解
这个是docker的命令,所以用ubuntu和centos是没有区别的
- 镜像命令清单
docker images
docker image
ls/docker
image list
列出本地镜像
docker tag
docker image tag
给镜像打标签,
可用于推送镜像
仓库
docker pull
docker image pull
从镜像仓库拉取
镜像
和镜像仓库命令相同,也可以
归类为镜像操作命令,必须掌
握,参考镜像命令此处不赘述
docker push
docker image push
推送镜像到仓库 和镜像仓库命令相同,也可以
归类为镜像操作命令必须掌
握,参考镜像命令此处不赘述
docker rmi
docker image rm/ docker
image remove
删除本地镜像
docker build
docker image build
通过dockerfile制作镜像
docker save
docker image save
将指定镜像保存
成 tar 归档文件
docker load
docker image load
导入使用
docker save 命
令导出的镜像
docker image inspect
查看镜像详细信息
docker history
docker image history
查看镜像历史
docker import
docker image import
从归档文件
docker export
中创建镜像。
docker image prune
删除不使用的镜像
docker rmi
功能
删除本地镜像。
• 语法
docker rmi [OPTIONS] IMAGE [IMAGE…]
IMAGE [IMAGE…] 这个表示我们可以一次或者删除多个镜像
• 别名
docker image rm, docker image remove
• 关键参数
○ -f :强制删除;
○ --no-prune :不移除该镜像的过程镜像,默认移除;
这两个参数一般不用
docker images busybox
删除的话第一中可以通过id来删除
docker rmi imageId
这个删除指令显示后面的意思就是,我们先删除了标签,然后就是删除
这样就删除了
我们还可以通过名字+tag删除
docker rmi busybox:1.35.0
但是如果这个镜像被引用了,也就是被run起来了,生成了·容器,这样的话是不能删除镜像的
docker run -it --name mybusybox busybox:1.35.0 sh
如果没有这个镜像会先pull,后面的sh的意思就是进入这个容器的shell
和centos的后面的bash是一样的效果
docker ps -a | grep mybusybox
也是可以正常退出的
但是这个时候,这个容器对应的镜像就不能删除了
docker rmi busybox:1.35.0
因为生成了一个容器,也就是对象,那你怎么能删除类呢
接下来我们就只能强制删除了
-f,
就是不管有没有容器都删除镜像
docker rmi -f busybox:1.35.0
正常的话不要这样删除
我们要先删除容器
rm就是删除容器的意思,i就是image的意思
docker rm 容器id
然后再删镜像
正常删镜像时会报err,err里面有对应容器的id
我们直接docker ps -a | grep busybox:1.35.0
就可以看到所有使用这个镜像的容器了
然后删除就可以了
最后就是删除镜像了
docker rmi busybox:1.35.0
docker save
功能
将指定镜像保存成 tar 归档文件。
因为镜像是一个文件系统,他就是把镜像打包成一个tar文件
• 语法
docker save [OPTIONS] IMAGE [IMAGE…]
[IMAGE…]表示我们一次可以打包多个
• 别名
docker image save
• 关键参数
○ -o :输出到的文件。
先创建一个个人的目录
mkdir -p /data/maxhou
然后进去
docker images busybox
docker save -o mybusybox1.tar busybox:1.36.0
然后我们还可以保存多个文件
docker save -o mybusybox2.tar busybox:1.36.0 busybox:1.34.0
ll -h就可以看大小了
而且镜像也不会消失的,就算打了包
docker load
功能
导入使用 docker save 命令导出的镜像。
• 语法
docker load [OPTIONS]
• 别名
docker image load
• 关键参数
○ --input , -i : 指定导入的文件,代替 STDIN。
○ --quiet , -q : 精简输出信息。
我们导入这两个tar包的话
要先删除原来的镜像,不然效果不明显
dockerr rmi busybox:1.36.0 busybox:1.34.0
然后就是加载了
docker load -i mybusybox2.tar
这样就会加载出两个镜像了
然后又删除这两个镜像
开始用-q
docker load -i mybusybox2.tar -q
这个就是安静模式加载,意思就是不会显示出额外没用的信息,没用进度条了
docker history
功能
显示镜像历史。 就是看镜像每层都是怎么盖上去的
• 语法
docker history [OPTIONS] IMAGE
• 别名
docker image history
• 关键参数
○ -H , --human :大小和日期采用人容易读的格式展现 ,这个是默认的开启
○ --no-trunc :显示全部信息,不要隔断; --》不隔断的话会很难看,很乱
○ -q, --quiet: 只显示镜像id信息;
docker history busybox:1.36.0
看的出来就盖了两层
第一列id
第二列创建时间
第三列创建命令
四列是大小
最后一列是注释
docker history nginx:1.24.0 -q
只显示id
docker image prune
功能
删除不使用的镜像。 —》第一容器没有使用的镜像,但是很危险,因为后面可能还会用,第二就是空悬镜像,就是这个镜像的某个层不被任何镜像使用
• 语法
docker image prune [OPTIONS]
• 关键参数
○ -a , --all : 删除全部不使用的镜像;
○ --filter filter:指定过滤条件; —》时间过滤或者标签过滤
○ -f, --force :不提示是否删除;
docker image prune
它会警告说这个会删除空悬镜像
docker image prune -a
会警告删除没有使用容器的镜像—》危险
镜像操作案例
通过busybox查看一个容器和启动ip,然后就是删除镜像
查找镜像 下载镜像
docker search busybox
但是我们这个没有tag就是没有版本
所有去网站上找
docker pull docker:1.36.0
如何查看呢
docker images
或者docker images busybox
查看镜像及列表存储位置
这些镜像的信息默认存在/var/lib/docker
这里是因为我改过了根目录
然后进入image里面
里面有overlay2
这个就是docker的存储驱动
在进去
里面有一个json文件
看一下
我们再把这个json在线格式化一下
这个就看出了我们下了busybox,centos
说明docker把我们的镜像列表存到了一个docker里面
查看镜像详细信息
docker image inspect busybox:1.36.0
这个是启动命令,就是sh
-it时候的启动命令就要在这里看
docker history busybox:1.36.0
这个是看楼
或者在官网也是可以看的
打标签 推送镜像
然后就是又要建仓库了
docker tag busybox:1.36.0 maxhou/mytest:v1.0
docker tag busybox:1.36.0 maxhou/mytest:v2.0
然后就是push上去—》官网下载
docker push maxhou/mytest -a
我们有没有登录怎么看呢
cart /root/.docker/config.json
当然也能拉取下来了
docker pull maxhou/mytest:v2.0
这里默认使用的是dockerhub上的
运行容器 删除镜像
这里我们运行的是自己从仓库远程拉取下来的
docker run -it maxhou/mytest:v1.0 sh
这样就运行起来了
再打开一个shell
docker ps
看的出来我们的容器跑起来了
我们要查看ip,直接输入ifconfig
还可以ping www.baidu.com
exit
就可以退出了
docker ps -a | grep maxhou/mytest就可以找到了
docker rmi maxhou/mytest:v1.0
但是这样并不是删除了镜像
只是untag了
并没有delete
说明只是删除了tag,并没有删除空间
docker run -it maxhou/mytest:v1.0 sh
然后我们运行已经rmi的tag
就会说本地没有这个镜像,会去远程拉取的
这样就又有了
但是这个容器是另一个容器,不是原来的容器
什么意思呢
意思就是原来的docker run -it maxhou/mytest:v1.0 sh会生成一个容器
rmi的时候只是删除了tag,没有删除空间,也没有删除对应容器
docker ps -a | grep maxhou/mytest:v1.0
查看一下就知道有两个了
然后我们再去删除这个镜像
还是只删除了标签
docker ps -a | grep maxhou/mytest:v1.0
我们再去过滤一下
结果什么都没有了
docker ps -a
我们发现了第二列本应该是tag的,但是变成了镜像id
而且这个镜像id就是busybox和maxhou/mytest的镜像id
意思就是把已经停止了的镜像的容器的tag变成了镜像的id
我们继续删除2.0
docker rmi maxhou/mytest:v2.0
还是只删除了id
然后就是消失了
再来删除
docker rmi busybox:1.36.0
这时候删除就报错了
因为这已经是最后一个id了,最后一个镜像,还有对应的容器,所以就会出错
我们通过镜像的名称已经过滤不出来了容器,因为删除了它本来的镜像的tag,tag变成了镜像的id
怎么过滤呢
我们通过id过滤就可以了
docker ps -a | grep 7cfbbec8963d
这样就找到了容器了
要删除镜像就要先删除容器了,,删除只能删除容器的id了,因为没有tag
第一列就是容器的id
第二列就是镜像的tag,现在变为id了
docker rm 容器id 容器id
直接删两个
最后才是docker rmi busybox:1.36.0
就可以了
因为还显示了delete的
所有成功了
容器的id是唯一的
tag1多样的
实战一、离线迁移镜像
就是断网的情况下
在ubuntu的环境中保存一个镜像,然后拷贝到centos的服务器上,然后加载起来运行
我们先来拉自己的镜像
docker pull maxhou/mytest:v2.0
然后保存为tar文件
docker save -o mytestv2.0.tar maxhou/mytest:v2.0
然后就是一个centos的环境
注意这个迁移的环境一定要安装docker,不然是迁移不了的
两个服务器之间的拷贝是scp
在ubuntu中
scp mytestv2.0.tar root@43.138.128.166:/data/maxhou
43.138.128.166是centos的ip,然后就是root账户,/data/maxhou就是拷贝到的目录
然后输入centos的密码
就可以了
然后centos就有这个文件了
docker load -i mytestv2.0.tar
就可以了
、
然后就是启动这个镜像成一个容器
docker run -it maxhou/mytest:v2.0 sh
这样就可以了
研发的操作系统是ubuntu,生产的是centos,说明docker是跨平台运行的
实战二、镜像存储的压缩与共享
拉取nginx镜像,如果本地没有,镜像是从仓库拉取,如果有会提示镜像已经存
在,并且是最新的。
先看镜像在远端和本地是怎么存储对的
然后就是看pull一千份镜像,会不会放一千份呢
远端存的是镜像是压缩过的
pull到本地的是解压过的
打了标签的镜像,只是tag不一样了,id还是一样的,而且打了tag也不会改变镜像的大小
然后就是本端的push到远端,只会自动进行压缩的
我们把同一个镜像打多个tag
然后push到仓库去
它发现nginx库里面有这个版本,所以直接就去nginx库里面导入到我们的仓库了
我们再导入一个
这个直接就告诉你我们的仓库里面已经有这个镜像了
然后仓库里面就只是存了一个tag,不是存了很多个镜像,镜像只存了一种