1.关系
Docker | 面向对象 |
---|---|
镜像 | 类 |
容器 | 对象 |
2.查看容器
docker ps -aq
-a #列出正在运行+历史运行过的容器
-q #只列出容器id
-l #显示最近创建的容器
-n=3 #列出n个最近创建的容器
3.启动容器
docker run [参数] 镜像名[:版本] 执行的命令
参数:
-it # 使用交互命令进入容器(前台交互式运行)
-i: 以交互式方式运行容器
-t: 为容器分配一个伪终端
--name="centos_test" # 容器名称,用来区分容器,唯一
--rm #容器启动后,执行命令/程序完成后就销毁
-d #后台运行容器并返回容器ID,即守护式容器(后台运行)
-p #指定端口
-p ip:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口
-P #随机端口
-e 设置环境变量
-v 数据卷
如:
docker run -d --name tomcat7 -p 8080:8080 tomcat /bin/bash
启动前台交互式运行
docker run -it 镜像名:版本 /bin/bash
启动守护式容器
大部分场景下,我们希望docker的服务是在后阳台运行的,通过-d指定后台运行
docker run -d 镜像名:版本
注意
docker容器后台运行,必须有一个前台进程
如果运行的不是一直挂起的命令(如top、cat、tail),就会自动退出,这就是docker的机制
后台运行centos7
docker run -d centos:7
使用docker ps -a查看,容器已经退出
run和start区别
docker run 只在[第一次运行时]使用,将镜像放到容器中,以后再次启动这个容器时,只需要使用命令docker start 即可。
docker run相当于执行了两步操作:将镜像放入容器中(docker create),然后将容器启动,使之变成运行时容器(docker start)。
4.启动容器
STATUS 的状态
Exited
变为Up
docker start 容器ID/名字 # 启动指定容器
docker start $(docker ps -aq) # 启动所有容器
5.停止容器
优雅停止容器
STATUS 的状态
Up
状态变为Exited
docker默认会允许容器中的应用程序有10秒的时间用以终止运行,在
docker stop
命令执行的时候,会先向容器中PID为1的进程发送系统信号SIGTERM,然后等待容器中的应用程序终止执行,如果等待时间达到设定的超时时间,或者默认的10秒,会继续发送SIGKILL的系统信号强行kill掉进程。
docker stop 容器ID/名字 # 停止指定容器
docker stop $(docker ps -aq) # 停止所有容器
强制停止容器
杀掉一个运行中的容器。
默认情况下,
docker kill
命令不会给容器中的应用程序有任何等待的机会。它会直接发出SIGKILL
的系统信号,以强行终止容器中程序的运行。
docker kill 容器ID/名字 # 停止指定容器
6.删除容器
删除已经停止的容器
docker rm 容器ID/名字 # 删除指定容器(离线状态)
docker rm $(docker ps -aq) # 删除所有的容器(离线状态)
删除正在运行的容器
docker rm -f 容器ID/名字 # 强制删除指定容器(运行状态)
docker rm -f $(docker ps -aq) # 强制删除所有的容器(运行状态)
7.进入容器
exec
docker exec [参数] 容器ID/名字 /bin/bash
参数
-d 在后台运行命令
-i 即使没有附加也保持 STDIN 打开,和 -t 配合
-t 进入容器的 CLI 模式
-e 设置环境变量
--env-file 读入环境变量文件
-w 需要执行命令的目录
-u 指定访问容器的用户名
attach
docker attach 容器ID/名字
exec和attach区别
attach直接进入容器终端,不会启动新的进程,用exit退出会导致容器停止
exec在容器中打开新的终端,并且可以启动新的进程,用exit退出不会导致容器停止
一般用-d后台启动的程序,使用exec进入容器
8.退出容器
exit退出
run进入容器,exit退出,容器停止
# 现在在容器中
root@43ad0be59cf3:/usr/local/tomcat/webapps/ROOT# exit
exit
[root@ai-test-ai ~]
ctrl+p+q退出
run进入容器,ctrl+p+q退出,容器不停止
Mac: control+p+q
~ docker exec -it ccc /bin/bash
[root@09bf640491c0 /]# read escape sequence
9.查看容器内进程
docker top [容器ID/名字]
10.查看容器内部信息
在docker网络和网桥的时候经常用到
docker inspect [容器ID/名字]
11.查看容器日志
docker logs [容器ID/名字]
12.拷贝容器和宿主机传文件
主要对资料进行备份什么的
# 容器复制到宿主机
docker cp [容器ID/名字]:[路径path] /root
# 宿主机复制到容器
docker cp /root/a.txt [容器ID/名字]:[路径path]
13.导入和导出容器
备份整个容器
适用场景:主要用来制作基础镜像,比如从一个ubuntu镜像启动一个容器,然后安装一些软件和进行一些设置后,使用docker export保存为一个基础镜像。然后把这个镜像分发给其他人使用,作为基础的开发环境。(因为export导出的镜像只会保留从镜像运行到export之间对文件系统的修改,所以只适合做基础镜像)
注意事项:
会丢弃历史记录和元数据。
启动export与import命令导出导入的镜像必须加/bin/bash或者其他/bin/sh,否则会报错。
export
导出一个容器快照
# 导出容器的内容留做一个tar归档文件
docker export 容器ID > 文件名.tar
~ docker export 95aa7fc4eef2 > test_centos7.tar
~ ls
install.sh md nginx p.py test_centos7.tar
import
导入一个容器快照到本地镜像库
# 从tar包中的内容创建一个新的文件系统,再导入作为镜像
cat 文件名.tar | docker import - [镜像用户/镜像名:镜像版本]
# 等同命令
docker import [文件名.tar] [镜像用户/镜像名:镜像版本]
~ cat test_centos7.tar | docker import - nkippis/centos:670
~ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nkippis/centos 670 8cae7c50e48f 23 seconds ago 204MB
14.commit
docker镜像层都是只读的,容器层是可写的
当容器启动时,一个新的可写成被加载到镜像的顶部
这一层通常被叫容器层,容器层下的都被叫镜像层
commit把容器变成一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID [新的镜像名]:[版本号]
选项说明:
-a:提交的镜像作者
-c:使用dockerfile指令来创建镜像
-m:提交时的说明文字
-p:在commit的时候,将正在运行的容器暂停
适用场景:主要作用是将配置好的一些容器复用,再生成新的镜像。
commit是合并了save、load、export、import这几个特性的一个综合性的命令,它主要做了:
将container当前的读写层保存下来,保存成一个新层
和镜像的历史层一起合并成一个新的镜像
# 查看容器
~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f66378f7dae centos:7 "/bin/bash" 14 seconds ago Up 13 seconds lucid_wright
# 在容器内部安装vim
[root@3f66378f7dae /]# yum install vim
# 安装完后退出容器
[root@3f66378f7dae /]# exit
# 生成镜像
~ docker commit -m='add vim centos' -a='lxd670' 3f66378f7dae nkippis/centos_vim:7.1
sha256:ca5adee0ac8536e199406284b2956cdfda5fb6672f0ce1cd89ac2e1e5a7cb607
# 查看镜像
~ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nkippis/centos_vim 7.1 ca5adee0ac85 7 seconds ago 436MB
centos 7 eeb6ee3f44bd 11 months ago 204MB