docker中的容器实际上就是宿主机中的一个进程
目录
1 创建并启动容器 docker run
1.1 如果没有指定的镜像的话,docker会尝试从源拉取
1.2 给容器起名字 --name
1.3 交互方式启动(-i)与弹出客户端(-t)
1.4 指定端口 -p
1.5 自动分配端口 -P
1.6 后台运行(以守护进程方式运行) -d
2 查看运行中的容器 docker ps
3 以新的进程进入正在启动的容器内部 docker exec -it [容器ID] /bin/bash
4 删除容器 docker rm
5 以当前的进程进入正在启动的容器内部 docker attach
6 启动容器 docker restart
7 停止容器 docker stop
8 显示容器在宿主机的运行情况 docker top
9 查看日志docker logs
9.1 从指定时间到现在的日志 --since
9.2 最后n行 --tail
9.3 从日志的开头到指定的时间 --until
9.4 添加日志的时间戳 -t
9.5 获得动态日志 -f
9.6 其他参数
10 宿主机与容器复制文件 docker cp
10.1 从宿主机复制文件到容器中
10.2 从容器复制文件到宿主机
11 将容器保存为镜像 docker commit
12 将容器保存为tar文件 docker export
13 将docker export生成的tar文件加载为镜像 docker import
14 暂停容器对外的服务 docker pause
15 停止暂停容器对外的服务 docker unpause
16 强制停止容器 docker kill
17 仅创建容器 docker create
如果源里面没有就会报错
比如我像给hello-world这个镜像启动的容器命名为something
我们以ubuntu的镜像为例,如果你直接运行ubuntu的镜像就会退出,因为镜像中没有需要执行的应用
运行后我们发现路径就变了,此时我们已经进入到了ubuntu这个镜像的系统中
可以输入 exit 然后按回车退出
/bin/bash是在容器中运行bash shell(可以理解为打开一个终端),有时候需要加,有时候不用加。比如ubuntu你不用加也能打开,不过你加上之后也没有什么问题。加与不加主要是看dockerfile,有的dockerfile中的最后一句人家有写你就不用加,他要是没写且你想进终端你就得加
/bin/bash对应的是这里的command
我们以tomcat:8.5.49为例,tomcat是一种java web服务器解决方案。对标python的话可以理解为uwsgi,uwsgi是一种python web服务器解决方案
输入 docker run -p 8888:8080 tomcat:8.5.49
使用宿主机访问 127.0.0.1:8888 可以看到tomcat
如果你在启动的时加入了-it,那么运行后按ctrl+p+q,那么就会将docker的服务放到后台运行,并且你也能退到docker中干点儿别的
按下ctrl+p+q后,可以看一下该容器的状态,发现它并不是Exit,而是正在执行的状态。并且在PORTS的位置可以看到端口状况,8888是宿主机的端口,8080是docker内部的端口。前面0.0.0.0是IPV4的写法,后面连续三个冒号是IPV6的写法
按下ctrl+p+q后,使用宿主机访问127.0.0.1:8888依然可以访问到tomcat
输入docker run -it -P tomcat:8.5.49
按ctrl+p+q退出来,之后查看docker ps -a,之后发现系统自动分配了一个端口32769
之后使用宿主机访问127.0.0.1:32769可以访问tomcat
docker run -d -p 8888:8080 tomcat:8.5.49
访问 127.0.0.1:8888 可以正常访问
可以加入参数-a查看所有容器
可以加入参数-s查看容器大小。实际73.6kB,虚拟出来507MB
除-a,-s之外,还有其他参数,比如
我们以tomcat:8.5.50为例,以tomcat:8.4.49的方式启动tomcat:8.5.50后访问127.0.0.1:8888会显示404
能显示404代表容器已经启动成功了
我们可以进入该容器
出现404的原因是webapps这个文件夹没有东西
我们现在讲webapps.dist覆盖掉webapps。首先删除webapps这个文件夹,然后给webapps.dist改名为webapps
替换后等待一会儿可以访问到tomcat的主页
在终端中输入 exit 然后按回车可以退出容器内部
除了-it以外常用的参数还有-u、-w
-u是选择用户的,-w可以选择进入后的工作目录
最后的 /bin/bash 是进入容器,如果你不希望进入容器但又希望查询容器内部的某些信息,那么你可以将命令替换掉/bin/bash,比如我现在想看看进入工作目录后有哪些文件,那么我就用ls替换掉/bin/bash
一般我们会直接使用 docker rm -f [容器ID]
比如我现在想删除 98f8 这个容器
删除后98f8这个容器就没了
当容器正在运行状态的时候仅使用rm不能删除
docker rm -f 可以强制删除
我们现在后台运行一个ubuntu,进入ubuntu,按ctrl+p+q让其后台运行。此时的容器是开着的
docker exec是以一个新的进程进去容器内部,我们退出exec并不会关闭容器
docker attach是以当前的进程进入正在启动的容器内部,退出attach就会关闭容器
如果容器和tomcat一样是一直交互的那种,attach之后就不会给你打字的地方,因为这个容器现在正在阻塞的状态
你按ctrl+c可以终止阻塞的状态,然后再查看容器的状态就发现容器已经关闭了
有三个参数分别是
使用start也行,一般我们都使用restart,因为restart可以替代start的功能
我们在宿主机中查看进程对比一下,发现信息是一致的
我们简单说一下top中的内容
我们查看help发现没有和其他的指令一样,写着有什么参数。这里我们可以看到[ps OPTIONS],[ps OPTIONS]表明和linux命令中ps的参数一致
比如我们使用ps -ef ,在这里也可以使用 docker top [容器ID] -ef
可以查看启动容器的日志,也可以查看未启动容器的日志,比如查看未启动的ubuntu
下面是查看启动的tomcat
--since 显示从什么时候开始的日志,比如我只想看2小时前到现在的日志,那么我就写 docker logs e025 --since '120m'
也可以给时间戳,时间戳的格式可以照着help文档中的内容来写
比如 docker logs e025 --since '2023-12-13T9:20:00Z'
比如我现在只想看最后3行的内容,那么就写 docker logs [容器ID] --tail 3
比如 docker logs e025 --until '2023-12-13T9:26:00z'
我们做个对比
-f只能查看运行中的容器,通过-f查看日志后,终端会一直监听该容器
此时我们可以通过 docker attach 该容器,然后进行一些操作,比如输入 ps -ef 然后按回车
之后我们发现logs也会显示相同的内容
使用cp命令不能在容器与容器间复制文件
我现在宿主机的home下有一个test.txt
里面的内容的hello world
我现在复制到 3c57 这个容器的/home下
发现可以成功复制进去
我现在在容器中创建 do_something.txt 内容为 do something
将do_something.txt复制到宿主机上
发现可以成功复制
我们首先准备一个容器,这个容器的/home下有一个test.txt,内容为 hello world
我们目前有如下镜像
在使用docker commit之前,我们先看一下参数
我们下面简单用一下。docker commit -a "[作者名称与邮箱]" -m "[提交信息]" [容器ID] [镜像的名称与tag]
发现可以成功添加,之后我们运行一下,运行后发现可以找到 /home/test.txt 并且内容正确
镜像的作者与提交的信息可以通过查看镜像元信息找到
比如现在我想把 3805 这个容器转换为 tar 文件
执行 docker export -o [tar文件名称] [容器ID]
执行过后发现产生了suyu_ubuntu.tar这个文件
使用export导出的tar文件是不能通过docker load 读取的
通过export导出的tar文件可以通过docker import 生成镜像
docker import参数如下
我们下面用上面export出来的tar文件做个例子,导入之前的镜像列表是这样的
执行 docker import [export导出的tar文件] [镜像名:标签]
docker的暂停状态是 容器依然在运行,但里面的服务就停止了,比如你访问tomcat的首页,此时会一直转,不报错,但也没有响应结果
参数与docker run 相似,我们简单用一下
启动的时候就当关闭的容器启动就行了
启动后可以访问到tomcat的主页