Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。具体的这边就不介绍了,主要是docker基础操作命令。
一、基础 操作命令
1)启动关闭docker
systemctl start docker (启动docker)
systemctl stop docker (关闭docker)
2)docker帮助命令
docker --version (查看docker版本号)
docker info (查看docker容器安装后的描述)
docker --help (帮助命令)
3)docker基础命令
docker images (查看镜像)
-a 参数:显示所有本地镜像(含中间层)
-q 参数:显示镜像ID
-qa:合起来显示本地所有镜像的镜像ID
docker search nginx (从git上面搜寻镜像 https://hub.docker.com)
-s 参数:显示点赞数
4)下载所需镜像
docker search -s 30 nginx (查寻点赞数超过30的点赞数)
docker pull redis (下载最新版redis镜像)
docker pull nginx:1.16.1 (指定下载nginx1.16.1版本)
5)删除镜像
docker rmi centos:xc (删除一个镜像,不加标签的话就是删除所有的centos镜像,xc是我镜像的标签)
docker rmi ashince/tomcat8:latest nginx:1.16.1 (一次删除多个镜像)
docker rmi -f $(docker images -qa) (删除所有的镜像)
6)交互式启动容器
docker pull centos (首先拉取一个centos镜像做实验)
docker run -it 0d120b6ccaa8 (通过centos的id启动,启动后就是一个容器,或者通过镜像名+镜像标签启动:docker run -it centos:latest)
-i 参数:以交互模式运行容器,通常与t同时使用
-t 参数:为容器重新分配一个伪终端,通常与i同时使用
–name 参数:为容器指定一个名称,不指定则使用系统默认(docker run -it --name ‘centos-test’ centos:latest)
7)退出容器相关命令
exit:退出并关闭容器
ctrl+p+q:容器不停止退出
8)查看容器命令
docker ps (查看正在运行的容器)
-a 参数:列出当前所有正在运行的容器+历史上运行过的容器(docker ps -a )
-n [数字参数] 将上几次运行过的容器显示:docker ps -n 3 查看上3次运行的容器
-q 参数:静默模式,直线式容器编号 (docker ps -q)
-l 参数:显示最近创建的容器(docker ps -l)
9)启动关闭重启容器
如果使用exit退出容器的,可以查看然后启动。
从上图可以看见我们这个容器不是处于开启状态,首先我们将他开启。
docker start [容器ID]
docker restart [ID] (重启容器)
docker stop [id] (关闭容器)
docker kill [id] (强制关闭容器)
10)删除容器
docker rm -f e3984ec5e07a (删除一个已经在运行的容器)
如果在运行的容器删除时不加-f会报错,如果容器已经使用stop停止,删除时可以不加-f。
docker rm -f $(docker ps -qa) (删除所有在运行的容器)
10)以守护的形式启动容器
在上面6的内容中,使用的是交互式启动容器并登录进容器。如果我们不想交互式登录,只想启动一个容器就需要使用守护形式启动容器,需要的时候在进行登陆。
docker run -itd centos:latest (交互式登录并以守护的方式启动运行)
-d 参数:以守护的方式启动,可以跟-i,-t同时使用
11)进入正在运行的容器以命令交互
如果你退出容器了,或者使用的是守护式启动,需要进入就使用如下命令。
docker attach 29cea4f77830 (进入一个启动在运行的容器,进入使用ls查看与本地centos文件没什么两样,因为是简易版的centos)
docker exec -it 29cea4f77830 ls /root (不用进入容器,直接得到结果)
docker exec -it 29cea4f77830 /bin/bash (也可以进入容器操作,后面要运行/bin/bash)
attach:直接进入容器启动命令终端,不会启动新的进程
exec :是在容器打开新的终端,并且可以启动新的进程,在容器外边就可以使用命令操作。
12)拷贝文件查看进程及,容器内部细节
将宿主机/root目录下的文件拷贝至容器的tmp目录下,需要将本地的文件上传至容器中就使用该命令。
docker cp /root/tmpfile.txt 29cea4f77830:/tmp
docker cp 宿主机文件 [容器ID]:容器的具体目录
将容器内的文件拷贝至宿主机的/root目录下,需要备份容器中的数据,就可以使用此命令将容器内的数据拷贝至宿主机
docker cp 29cea4f77830:/tmp/ks-script-xm1o5azb /root/
docker cp [容器id]:容器具体目录 宿主机目的目录
查看容器内运行的进程
docker top [已经运行的容器ID]
查看容器细节
docker inspect [容器id] (已经在运行的容器详细信息)
13) 主机提供端口外部访问
docker run -it -p 80:80 nginx
-p 参数:-p指定一个端口访问nginx -p 外部提供访问的端口:容器的端口
通过浏览器访问
docker run -it -P nginx:latest
-P 参数:随机分配一个端口
查看是否随机分配端口
测试使用外部的32769查看是否能访问nginx
14)commit 从容器创建一个新的镜像
commit就是将一个运行的容器,做过修改的,重新提交成一个新的镜像。在做批量部署时直接运行即可。
做一个测试演示,我在本地创建一个index.html的文件上传至docker,然后将这个运行的容器创建成一个新的镜像。
启动一个tomcat容器
然后本地创建一个index.html到tomcat的docs目录然后访问
然后我们通过浏览器访问
我们自己定义的网页已经访问成功,但是想将这个运行的容器创建成一个镜像,批量部署时直接运行就行。
docker commit -a ‘zuozhe’ -m ‘create docs file’ 0abac4750b5e test/tomcat:1.2
作者 提交文字说明 正在运行容器 新镜像的名字
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。
启动通过tomcat容器创建的新镜像
访问测试
15)存出镜像,载入镜像
上面已经知道如何commit镜像了,commit后怎么传给其他服务器呢,或者分享给你的朋友,这时就可以使用save,跟load下载及上传。
导出本地的镜像
docker save -o /root/test-tomcat.tar test/tomcat:1.2
导出添加路径名字及后缀 导出指定镜像
删除原有的镜像,我们尝试导入。
删除后我们导入我们刚刚导出的镜像,就像是一个备份一样。
docker load -i /root/test-tomcat.tar
root目录下镜像载入
在导出镜像时定义的名称不影响镜像的名称,在docker中镜像的名称是什么载入后就是什么。
导入的镜像使用docker images查看与你导出的是一样的,运行起来也是一样的。
二、数据卷,数据卷容器
1、数据卷可在容器之间共享或者重用数据、卷中的更改可以直接生效、数据卷中的更改不会包含在镜像更新中、数据卷的生命周期一直持续到没有容器使用它为止。实现容器间继承及数据共享。
docker run -it -v /data:/mydata centos
docker run -it -v /宿主机绝对路径:/容器内目录 centos
将本地的/data目录共享至容器/mydata
docker inspect 04d637defda9 通过inspect查看运行的容器目录是否挂载成功。
测试文件是否能从宿主机同步至容器中
容器内查看
可多个容器共享一个/data,启动时都指定这一个目录。
2、数据卷容器,各容器之间共享(volumes-from)
以案例说明,这边三台服务使用同一个共享目录,首先启动一个主服务并指定数据卷,就好比是一个父容器卷,后面启动的继承父容器的数据卷。
docker run -itd --name server1 -v /data:/mydata centos (server1是父容器卷)
docker run -it --name server2 --volumes-from server1 centos (启动server2并进入查看,我们并没有设置数据卷但是通过volumes-from继承的server1的数据卷)
在启动一个server3看是否还能继承server1的容器卷。
docker run -it --name server3 --volumes-from server1 centos
当在一个容器中的容器卷中修改,三个容器都是同步。
在真实项目中如果后期项目变更,由原来的三台服务器改为两台时,需要将server1干掉,server2-server3是否还能继承容器卷。我们将server1容器删除做测试。
进入server3或者server2查看是否容器卷还在。
tos
当在一个容器中的容器卷中修改,三个容器都是同步。
在真实项目中如果后期项目变更,由原来的三台服务器改为两台时,需要将server1干掉,server2-server3是否还能继承容器卷。我们将server1容器删除做测试。
进入server3或者server2查看是否容器卷还在。
由此可见删除父容器后对,子容器是不影响的,除非你删除一个不剩。