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地址。

 

posted @ 2021-03-05 09:30  Leil_blogs  阅读(50)  评论(0编辑  收藏  举报