docker学习笔记一篇就通系列(持续更新)
docker三要素
- 仓库
- 镜像
- 容器
仓库
仓库用来存放docker的镜像,类似于github存放代码医养
镜像
镜像是一个模板,封装了应用程序和配置依赖的可交付的运行环境,这个打包好的运行环境就是镜像文件,只有通过这个镜像文件才能生成docker容器,镜像文件可以看作是容器的模板,docker根据镜像文件生成容器的实例,同一个镜像文件可以生成多个同时运行的容器实例。image文件生成的容器实例,本身也是一个文件,称为镜像文件
容器
docker通过运行镜像文件生成的实例交作容器,每个容器之间相互隔离
docker在centos上的安装
centos7以前的版本(docker对centos有最低版本限制,不是所有版本的centos都能够安装)
yum install -y epel-release
yum install -y docker-io
service docker start
docker version
如果第四步出现了版本信息则代表安装成功。
centos7以后的版本
CentOS7 系统CentOS-Extras 库中已带 Docker,可以直接安装:
yum install docker
docker常用命令
docker常用命令
- docker version
- docker info
- docker --help
docker镜像命令
-
docker images
列出本机的镜像 其中repository代表镜像源,tag代表镜像的标签,可以通过repository:tag来唯一确定一个镜像。option参数
-a
代表列出本地的所有镜像-q
代表只显示镜像id--digests
显示镜像的摘要信息--no-trunc
显示镜像的完整信息,此时id比较长,因为id没有被截取 -
docker search
查找镜像,从官方库查找,search后面跟镜像名称,例如docker search tomcat
option参数
--filter
过滤参数比如想要查找星星大于30的则使用docker search --filter=stars=30 tomcat
--no-trunc
显示查找结果时不要截断描述部分(description) -
docker pull
获取镜像 后面跟着[镜像名称:tag名称] 如docker pull tomcat
等价于tomcat pull tomcat:latest
即如果不指定tag则默认最新的 -
docker rmi
删除镜像 如docker rmi hello-world
,可以删除多个镜像,镜像名称用空格隔开docker rmi -f hello-world:latest tomcat:latest
option参数
-f
强制删除,适用于运行过 直接删除删不掉的情况批量删除,可以先查询出要删除的然后获取到id批量删除:
docker rmi -f $(docker images -q)
这种先通过查询id然后再引用id删除 -
docker run [OPTIONS] IMAGE [COMMAND] [ARGS...]
启动容器option参数
-i
要与容器进行交互式访问 此命令要配合-t
一起使用 可以简写为-it
如果不指定则无法和容器进行交互,典型问题就是敲了命令没反应-t
启动容器后开启终端 此命令要配合-i
一起使用 可以简写为-it
-p [主机端口]:[容器端口]
将容器的端口映射到主机端口上来,例如 docker run -it -p 8888:8080 tomcat则将docker里面运行的tomcat的端口映射到主机的8888端口上来,通过docker ps
可以查看到具体的端口映射情况-P
随机分配端口-d
以守护进程的方式启动容器,此时不会进入到容器系统 通过docker ps
也看不到容器,但是容器是在后台运行着的--name [name名称]
启动容器时指定容器的名称,这样以后可以通过docker start 容器名称
来重新启动容器,注意只有第一次运行的时候用run,后面都可以用docker start 容器id或者容器名称
来启动容器 -
结束容器 可以使用
exit
(直接终止容器) 或者ctrl+p+q
快捷键(退出终端但是不终止容器的运行) -
docker ps
查询正在运行的容器option参数
-q
代表只显示镜像id-a
列出所有的历史容器,包括已经关闭的容器-n [数字]
列出所有历史容器的前XX个,例如列出前5个docker ps -n 5
-
docker start [容器编号或者容器名称]
启动容器(镜像没有运行过时需要用run,运行过一次之后就可以用docker start
命令来启动容器了)例如docker start 00adfefads01
-
docker restart [容器编号或者容器名称]
重启容器 例如docker restart 00adfefads01
-
docker stop [容器编号或者容器名称]
停止容器,通过正常的方式停止,相当于正常关闭 例如docker stop 00adfefads01
-
docker kill [容器编号或者容器名称]
强制停止容器 例如docker kill 00adfefads01
-
docker rm [容器编号]
删除已经停止的容器 例如docker rm 00adfefads01
option参数
-f
强制删除,容器正在运行时也可以删除(内部先kill再删除)例如docker rm -f 00adfefads01
一次性删除多个容器
docker rm -f $(docker ps -q -a)
或者docker ps -q -a|xargs docker rm
-
docker logs [容器编号或者容器名称]
查看容器的日志option参数
-t
显示每一条日期的时间-f
不停的追加显示最新的日志-tail n
n代表条数:查看最新的n条日志 -
docker top [容器编号或者容器名称]
查看容器内部运行的进程,如果容器运行的是tomcat那么可以查看到tomcat的进程,类似于linux的top命令 -
docker inspect [容器编号或者容器名称]
查看当前正在运行的容器的内部细节 -
docker attach [容器编号或者容器名称]
重新进入容器(通过ctrl+p+q
退出的或者后台运行的容器) -
docker exec [options] [容器编号或者容器名称] COMMAND [args...]
在宿主机上对容器执行命令,可以不进入容器中就能执行命令,例如启动centos并通过ctrl+p+q
退出 然后执行docker exec -t 043fdc418430 ls -l /tmp
命令即可列出容器内/tmp
目录内的文件信息。例如:通过docker exec -t 043fdc418430 /bin/bash
可以在外面启动容器中的终端(一个新的进程)option参数
-i
要与容器进行交互式访问 此命令要配合-t
一起使用 可以简写为-it
如果不指定则无法和容器进行交互,典型问题就是敲了命令没反应-t
启动容器后开启终端 此命令要配合-i
一起使用 可以简写为-it
docker attach和docker exec的区别
:attach直接进入容器启动命令的终端,不会启动新的进程。exec是在容器中打开新的终端并且可以启动新的进程 -
docker cp [容貌编号或者容器名称]:[容器内路径] [主机路径]
将容器内的数据文件复制到主机当中,例如docker cp 3c2a4af21ffa:/usr/a.log /root
将容器中的/usr/a.log文件复制到主机的/root下面 -
docker commit -m="描述信息" -a="作者信息" [容器编号] [新镜像名称]:[标签名]
修改运行的容器之后提交生成一个新的镜像实例 1.从docker hub上下载一个tomcat并运行 docker run -it -p 8888:8080 tomcat
2.故意删除上一步镜像所产生的容器中tomcat的文档 docs文件夹 docker exec -it [容器标号] /bin/bash , ls -l找到webapps文件夹 ,cd webapps , rm -rf docs删除docs文件夹,此时访问localhost:8888/docs则显示404
3.执行提交操作 docker commit -m="注释" -a="作者" [容器编号] [新镜像名称]:[标签名]
4.此时如果再运行原来的镜像和新的镜像 两者各自独立互不相关。
docker容器数据卷
卷用于保存容器所产生的数据,能够持久化,容器停止运行之后可以重新从卷中加载数据,卷由docker挂载到容器当中,卷不属于UFS系统,容器被删除时不会删除其挂载的数据卷。
PS:容器数据卷就相当于把容器内和主机上的文件夹做了映射,双方任何一个修改都能反映进去,容器停止之后再重新启动依然能够看到最新的数据
1.卷可以在容器之间共享或者重用数据
2.卷中的更改可以直接生效
3.数据卷中的更改不会包含在镜像的更新之中
4.数据卷的生命周期一直持续到没有容器使用它为止。
docker run -it -v [本机绝对路径]:[容器内绝对路径] [镜像名]
挂载容器卷,如果两端的路径不存在则会自动创建,挂载完毕之后 宿主机路径里面的内容发生变更会同步到容器中,容器里面发生的变化也会同步到宿主机当中。
PS 如果在容器里面没有操作数据卷的权限则需要在启动时加上一个参数:--privileged=true
,例如:docker run --privileged=true -it -v /docker/volumhost:/volumcontainer:rw centos
。此时可以通过docker inspect命令查看容器的详细信息 里面能够看到绑定的信息和是否可写的信息:
如果只想让容器内部的数据卷处于只读状态则可以在运行时增加"Mounts": [ { "Type": "bind", "Source": "/docker/volumhost",//宿主机路径 "Destination": "/volumcontainer",//容器内路径 "Mode": "rw",//读写都可以 "RW": true, "Propagation": "rprivate" } ],
:ro
参数:docker run --privileged=true -it -v /docker/volumhost:/volumcontainer:ro centos
。 :rw代表可读可写,:ro代表只读
通过dockerfile添加数据卷卷
Dockerfile内容:
```
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished---------------success1"
CMD /bin/bash
```
上面的命令解释:利用centos镜像,并添加2个数据卷/dataVolumeContainer1和/dataVolumeContainer2 然后输出一句话,然后执行/bin/bash命令。
执行以下命令构建这个镜像:docker build -f /xxx/Dockerfile -t test/centos .
注意最后有个点"."
然后 通过 docker images
可以查看到镜像。
运行镜像:docker run -it test/centos
进入容器后可以看到2个容器卷文件夹都建立好了,通过这种方式创建的数据卷并没有指定宿主机的文件夹,docker会默认给数据卷绑定宿主机的某个文件夹,通过docker inspect 容器id
可以看到数据请绑定的宿主机路径。
"Mounts": [
{
"Name": "52e480a497c7ea056fdfcb05e9896b4bc0c0aa29a9f2ff349a4a7d17e15b1d75",
"Source": "/var/lib/docker/volumes/52e480a497c7ea056fdfcb05e9896b4bc0c0aa29a9f2ff349a4a7d17e15b1d75/_data",
"Destination": "/dataVolumeContainer1",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Name": "80e882554d9e4a6f2a242c5fb7253f4a074d3d426c33bf190d79d42c77c71162",
"Source": "/var/lib/docker/volumes/80e882554d9e4a6f2a242c5fb7253f4a074d3d426c33bf190d79d42c77c71162/_data",
"Destination": "/dataVolumeContainer2",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
数据卷容器
某个容器中挂在了数据卷,其他容器运行时可以通过--volumes-from=容器ID或名称
来挂载这个容器的数据卷来实现数据卷的共享,数据卷共享之后不会因为数据卷容器关闭而停止共享数据。就相当于一个硬盘5个机器在用,关掉某个机器其他机器一样可以读写数据,数据依然存在。