Docker学习笔记
1、为什么docker比VM快?
1)因为docker有着比VM更少的抽象层。
2)docker利用的是宿主机的内核,VM需要的是Guest OS。
所以说新建一个容器的时候,docker不需要像VM那样重新加载一个操作系统内核,避免引导,省略了复杂的过程,是秒级的。
2、docker常用命令
1)帮助命令
docker info:显示docker的系统信息,包括镜像和容器的数量。
docker --help:帮助提示命令。
2)镜像命令
docker images:显示所有本地的主机上的镜像。
-a:列出所有镜像。
-q:只列出镜像ID。
docker search:搜索镜像。
--filter=STARS=3000:搜索STARS大于3000的镜像。
docker pull:下载命令(后不加版本默认最新版本,注意一定要选择官网存在的镜像)。
docker imi -f 镜像ID:删除镜像,后面可以接多个ID,用空格分隔。
docker rmi -f $(docker images -aq):删除所有镜像。
3)容器命令
docker run [可选参数] image
--name="Name":容器名字,用来区分容器。
-d:后台方式运行。
-it:使用交互式方式运行,进入容器查看内容。
-p:指定容器的端口。 主机端口:容器端口。
docker start 容器ID:启动容器。
docker restart 容器ID:重启容器。
docker stop 容器ID:停止正在运行的容器。
docker kill 容器ID:强制停止当前容器。
ctrl+p+q:不停止退出容器。
exit:直接停止退出容器。
docker ps:列出当前运行的容器。
-a:列出正在运行和历史运行的容器。
-n=?:列出新建的容器。
-q:只显示容器编号。
docker rm 容器ID:删除容器,不能删除正在运行的容器,需要用-f来删除。
-f $(docker ps -aq):删除所有容器。
4)其他命令
docker run -d centos:发现docker ps中的centos停止了,因为后台运行必须要有前台进程,没有的话docker就自动停止。
nginx,容器启动后发现自己没有提供服务,就会立刻停止没有程序了。
docker logs -f -t --tail 条数 容器ID:查看日志
docker top 容器ID:查看容器中的进程信息。
UID:用户ID PID:进程ID PPID:父进程ID
docker inspect 容器ID:查看容器元数据信息。
进入当前正在运行的容器:
我们通常都是后台方式运行的,需要进入容器修改一些配置。
docker exec -it 容器ID bashshell:进入容器后开启一个新终端,可以在里面操作(常用)。
docker attach 容器ID:进入容器正在执行的终端,不会启动新的进程。
从容器拷贝文件到主机上:
docker cp 容器ID:文件路径 拷贝到的当前主机路径
3、可视化
1)portainer
Docker图形化界面管理工具,提供一个后台界面供我们操作。
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
2)Rancher(CI/CD)
4、Docker镜像讲解
镜像是一种轻量级、可执行的独立软件包,用来打包软件运环境和基于运行环境开发的软件,它包含某个软件所需的所有内容,包括代码、运行时库、环境变量和配置文件。
所有的应用直接打包docker镜像,就可以直接跑起来。
commit镜像
docker commit 提交容器成为一个新的副本
docker commit -m=“提交的描述信息” -a=“作者” 容器ID 目标镜像名:[TAG]
5、容器数据卷
让数据在容器删除后可以持久化:卷技术,目录的挂载,将容器的目录挂载到Linux上。
容器的持久化和同步操作,容器之间可是可以数据共享的(双向绑定)。
以后修改只需要在本地即可,容器内会自动同步。
1)使用数据卷
docker run -it -v 主机目录:容器内目录
docker volume -ls:查看所有的volumn的情况
2)具名和匿名挂载
docker run -d -P -v 卷名:容器内路径 镜像名
-P:随机映射地址。
匿名就是不指定卷名,直接写容器路径。
可以通过docker volume inspect 卷名查看卷信息。
通过具名挂载可以方便找到卷,大多数都会使用具名挂载。
3)扩展:
docker run -d -P -v 卷名:容器内路径:ro 镜像名
docker run -d -P -v 卷名:容器内路径:rw 镜像名
如果不是rw(可读可写)是ro(只读)的话,只能在宿主机操作,容器内都是无法操作的。
4)数据卷容器:
通过 --volume -from让字容器继承父容器。
容器之间配置信息的传递,数据卷的生命周期会一致持续到没有容器使用它为止,换言之,只要有一个容器仍在使用该数据卷,该数据卷一直都可以进行数据共享,通俗地来说,如果此时我们把父容器关闭掉,两个字容器之间依旧可以进行数据共享,而且通过继承子容器生成的新容器,一样可以与子容器进行数据共享。这就是docker容器间的数据传递共享。
6、DockerFile
就是用来构建docker镜像的构建文件。是命令参数脚本。
1)DockerFile构建过程
a)编写一个dockerfile文件
b)docker builder构建成为一个镜像
c)docker run运行镜像
2)DockerFile构建基础知识
a)每个保留关键字(指令)都必须是大写字母。
b)命令从上到下执行。
c)#表示注释。
d)每个指令都会创建提交一个新的镜像层并提交。
DockerFile是面向开发的,以后要发布项目,就需要编写DockerFile文件,这文件就十分简单。Docker镜像逐渐成为企业交付的标准。
3)DockerFile指令
FROM #基础镜像,一切从这里开始构建
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN #镜像构建时需要运行的命令
ADD #步骤
WORKDIR #镜像的工作目录
VOLUME #挂载的目录
EXPORT #暴露端口配置
CMD #指定这个容器启动时候需要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动时候需要运行的命令,可以追加命令
ONBUILD #当构建一个被继承的这个时候就会运行ONBUILD触发指令
COPY #类似ADD,将我们文件拷贝到镜像中
ENV #构建时候设置环境变量
Docker Hub中99%的镜像都是从这个基础镜像来的FROM scratch,然后来构建。
通过docker build进行构建:
docker build -f dockerfile文件路径 -t 目标镜像 .
docker history:查看当前镜像如何被做出来的
7、Docker网络
每启动一个Docker容器,docker就会给这个容器分配一个IP,我们只要安装了Docker,就会有一个网卡Docker0,桥接模式,使用的技术是veth-pair技术。
发现新建的容器带来的网卡都是一对对的。
veth-pair就是一对的虚拟设备接口,它们都是成对出现的,一段连接着协议,一段彼此相连,正因为有这个特性,veth-pair充当一个桥梁,连接各种虚拟网络设备。
容器和容器,容器和主机都是可以ping通的。
所有容器不指定网络的情况下,都是由docker0路由的,docker会给我们的容器分配一个默认可用IP。
Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥,docker0。
只要容器删除,对应网桥一对就没了。
docker run -d -P --name 容器名 --link 另一个容器名 镜像名
在ip会换的情况下,通过--link让这个容器可以通过容器名连通另一个容器,但是反向还是不行(--link就是在这个容器的hosts配置中增加了另一个容器的ip映射)。
现在已经不建议使用--link了!
自定义网络
docker network ls:查看所有的docker网络。
1)网络模式:
a)brige:桥接(默认)
b)none:不配合网络
c)host:和宿主机共享网络
d)container:容器内网络连通(局限性很大用得少)
直接启动其实指定了默认网络 --net brige
docker0的特点:默认域名不能访问,需要--link打通。
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
在创建容器时用--net 自定义网络名 来创建的容器都可以互相ping通。
不同集群使用不同的网络。保证集群是安全和健康的。
这就涉及网络之间的连通问题。
2)网络连通:
网卡之间是不能连通的,但是可以将网络中的一个容器连接到另一个网卡上。
让一个容器有两个ip地址。