镜像:Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
容器
命令:
docker run --name=x y//run 是启动一个镜像y成为docker容器,并起名为x
实例:
docker run --name=container01 -i -t ubuntu /bin/bash //解释:启动一个ubuntu镜像并且起别名为container01 -i是能够输入 -t是tty终端模拟, /bin/bash 是启动ubuntu的一个命令行
docker ps -a -l //展示所有容器 -a 全部容器包括未运行的,-l(lastest)显示最近的容器
docker inspect xx xx可以是container id 也可以是run 镜像时起的别名
docker start -i xx 启动已经建立过的容器xx
docker rm xx 删除xx容器,xx容器必须是没有运行的容器
守护式容器:就是在后台一直运行的容器,不像之前的交互式容器。两种容器可以相互转换
一些基本操作
当我们建立了一个交互式容器后
使用CTRL+P --> CTRL+Q 将其转为守护式容器,会在后台一直跑
如何回到交互式容器:
docker attach xx(容器名称)
直接启动一个守护容器:
docker run -d
docker log //查看一个容器的日志
docker top xx(容器名称)//查看一个运行中容器的进程
docker exec (-t) (-i) //为运行的容器启动一个新的进程
docker stop //等待容器执行完,进行关闭
docker kill //不等待容器的执行,直接关闭
查看帮助命令
例: man docker run xxxxxxxx
利用docker部署一个静态网页:
首先开启一个ubuntu容器,在里面写一个静态页面, 然后下载nginx监听80端口 ,以守护式容器退出,访问本地加上端口就可以访问到
如何创建映射式端口?
这四种映射模式:
第一种是开放docker的80端口,宿主机的对应端口为随机
第二种是开放docker的80端口,宿主机的端口为对应的8080
第三种为指定docekr80端口和宿主机id,端口号随机(经过测试这个方法并不行)
第四种为指定docker80端口,宿主机ip地址和宿主机端口
大写P是表示开放docker的所有端口
注意:当我们结束一个容器时,这个容器启动的进程也停止,如果使用start重启仍不会启动之前启动的服务,我们就需要使用exec命令来重启,像刚才的例子容器重启后,nginx会被关闭,我们需要使用 docker exec web(容器名称) nginx
docker的cs架构:
其实docker的运行是这样的:
宿主机有一个守护进程,客户端也就是我们起的ubuntu的bash命令,也可以理解为docker容器,当我们向客户端执行操作时,客户端会向服务端守护进程发起命令,服务端完成操作后返回相应的结果给客户端。
dockerfile的命令:
FROM:from <image> //指定要运行的镜像,这个镜像时候后面所有命令的基础镜像,必须是非注释指令的第一条语句
MAINTAINER: maintainer xx //xx就是作者信息
RUN :后面跟我们真正要执行的语句,他执行的命令是我们运行时的命令
EXPOSE: expose xx 后面跟运行该镜像的容器使用的端口
CMD命令:它执行的命令,是构建时的命令,如果run启动一个容器,run后的命令会覆盖cmd里的命令
ENTRYPOINT:也是构建时需要执行的命令,但是不会被覆盖,如果cmd后面跟的是一个参数,那么可以和Entrypoint结合,entrypoint是要执行的语句,cmd后加参数组合的模式 ,只有最后一条生效
dockerfile中可以有多条cmd命令,但只是最后一条有效
dockerFile的构建过程:
每执行一条命令就会新生成一个镜像,这个镜像会有一个id,并且会构建一个容器,如果执行了下面的命令,就会删除这个容器,并且在刚才的镜像上再建一个镜像生成一个id,以此类推完成创建,注意:删除之前的中间层容器并不会删除之前的中间层镜像,我们可以使用中间层的镜像id进行启动来调试错误
因为上面的步骤很繁琐,因此docker使用了缓存技术,启动第二次时会使用缓存为基础构建,也可以关闭缓存,也可以再dockerfile中设置缓存时间