一、简介
容器:容器是一种轻量级、可移植、并将应用程序进行打包的技术,使应用程序可以在不同的地方以相同的方式运行。本质就是镜像文件运行后的实例,具有一定的生命周期。
容器的生命周期如下:
二、容器与虚拟机的比较
1、相似或相同点:
- 都是对物理硬件资源进行共享使用
- 生命周期也比较相似
- 可以安装各种应用,如redis、python、mysql等
- 创建后会存储在宿主机上,linux上是位于/var/lib/docker/containers下
2、不同点:
- 虚拟机是基于一个完整的操作系统,即一个虚拟机一个操作系统,容器则是基于宿主机的内核上,即多个容器共用主机的操作系统,本质上有点类似于进程。
- 容器是属于轻量级的,虚拟机是属于重量级的,因为容器不需要额外的资源来管理(如Hypervisor等),虚拟机需要,操作也比虚拟机方便。
三、容器的操作
1、容器创建和启动
(1)创建docker create
# 命令格式:docker create [OPTIONS] IMAGE [COMMAND] [ARG...] # OPTIONS: -t, --tty 分配一个伪TTY,也就是分配虚拟终端 -i, --interactive 即使没有连接,也要保持STDIN打开 --name 为容器起名,如果没有指定将会随机产生一个名称 # 命令参数(COMMANDARG): COMMAND 表示容器启动后,容器会执行该命令命令,如ps、ls 等命令 ARG 表示执行 COMMAND 时需要提供的一些参数,如ps 命令的 aux、ls命令的-a等等 # 案例: [root@192 ~]# docker create --name=hello hello-world ps -A 6b72d911e4aad66bcd088b6f0fe07c306db94322065507fc446a2cecd26bd4d9 docker create -ti --name test-container2 centos /bin/bash
(2)容器启动 docker start
# 命令格式: docker start [OPTIONS] CONTAINER [CONTAINER...] #OPTIONS: -a, --attach 将当前shell的 STDOUT/STDERR 连接到容器上 -i, --interactive 将当前shell的 STDIN连接到容器上
2、容器创建并启动 docker run(重点)
参数说明:
- -i:表示运行容器
- -t:表示容器启动后会进入其命令行(类似我们在cmd执行mysql一样)。加入ti这两个参数后,容器创建就能登录进去。即分配一个伪终端。
- --name :为创建的容器命名。
- -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
- -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
- -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
其他常见参数:
-u, --user="", 指定容器的用户 -a, --attach=[], 登录容器(必须是以docker run -d启动的容器) -w, --workdir="", 指定容器的工作目录 -c, --cpu-shares=0, 设置容器CPU权重,在CPU共享场景使用 -e, --env=[], 指定环境变量,容器中可以使用该环境变量 -m, --memory="", 指定容器的内存上限 -P, --publish-all=false, 指定容器暴露的端口 -p, --publish=[], 指定容器暴露的端口 -h, --hostname="", 指定容器的主机名--volumes-from=[], 给容器挂载其他容器上的卷,挂载到容器的某个目录 --cap-add=[], 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities --cap-drop=[], 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities --cidfile="", 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法 --cpuset="", 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU --device=[], 添加主机设备给容器,相当于设备直通 --dns=[], 指定容器的dns服务器 --dns-search=[], 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件 --entrypoint="", 覆盖image的入口点 --env-file=[], 指定环境变量文件,文件格式为每行一个环境变量 --expose=[], 指定容器暴露的端口,即修改镜像的暴露端口 --link=[], 指定容器间的关联,使用其他容器的IP、env等信息 --lxc-conf=[], 指定容器的配置文件,只有在指定--exec-driver=lxc时使用 --name="", 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字 --net="bridge", 容器网络设置: bridge 使用docker daemon指定的网桥 host //容器使用主机的网络 container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源 none 容器使用自己的网络(类似--net=bridge),但是不进行配置 --privileged=false, 指定容器是否为特权容器,特权容器拥有所有的capabilities --restart="no", 指定容器停止后的重启策略: no:容器退出时不重启 on-failure:容器故障退出(返回值非零)时重启 always:容器退出时总是重启 --rm=false, 指定容器停止后自动删除容器(不支持以docker run -d启动的容器) --sig-proxy=true, 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
(1)交互式方式创建容器
(2)守护式方式创建容器,也就是挂后台
[root@192 ~]# docker run -di --name=python1 python:3.6 21030b865834a84f29d7dd536f1b4d937b4256e081ad98a0542eb76af54d9609
(3)目录挂载创建容器
docker run -di -v 宿主机目录:容器目录 --name=mycentos centos:7 # 注意:centos7中安全模块selinux把权限禁掉了,可以通过添加参数 --privileged=true来解决挂载的目录没有权限的问题
(4)端口映射创建容器
docker run -di -p 6377:6379 redis:latest
3、容器查看
docker ps #查看正在运行的容器 docker ps -a # 查看所有容器 docker ps -l #查看最后一次运行的容器 # -f 是筛选的指定的容器 docker ps -f status=exited # 查看停止的容器
4、容器删除、重启
# -----------容器删除------------ docker rm 容器名字/容器ID # -f 强制删除 -v 同时删除绑定在容器上的数据卷 # -----------容器重启---------------- docker restart 容器名字/ID 参数 -t , --time int 重启前,等待的时间,单位秒,默认是10s
5、容器暂停与关闭、终止
# --------容器暂停---------- docker pause 容器名字/ID #容器暂停 docker unpause 容器名字/ID # 容器取消暂停 # ---------容器关闭---------- docker stop 容器名字/ID # 参数 -t, --time int 关闭前等待的时间,单位秒,默认是10s # ---------容器终止---------- docker kill 容器名字/ID # 参数 -s ,--signal string 指定发送给容器的关闭信号,默认是kill信号 #----------socker kill 和socker stop的区别-------- ''' 1、kill 是直接发送SIGKILL信号关闭容器,可以通过参数-s修改发出的信号 2、stop 是先发出SIGTERM信号给进程,告诉进程即将会被关闭,在-t指定的等待时间过了之后,将会立即发出SIGKILL信号,直接关闭容器 3、stop在等待时间内,如果终止等待,则容器没有关闭,而kill是无法撤销的 '''
扩展知识点:
linux的两种终止进程的信号:SIGTERM和SIGKILL
SIGKILL信号:立即终止进程,不进行清理和暂存工作,该信号无法被阻塞、忽略、处理,也就是一发出就无法停止,它可以杀死任何进程
SIGTERM信号:程序终结信号,它可以被阻塞和终止,程序在退出前可以保存工作或清理临时文件等。
6、容器信息查看
(1) 查看容器详细信息
docker container inspect 容器名字/ID # 参数:-f, --format string 利用特定Go语言的format格式输出结果 # -s, --size 显示总大小
(2)查看容器日志信息
docker logs 【参数】 容器名字/ID ''' 参数 --details 显示日志的额外信息 -f, --follow 动态跟踪显示日志信息 --since string 只显示某事时间节点之后的 --tail string 显示倒数的行数(默认全部) -t, --timestamps 显示timestamps时间 --until string 只显示某事时间节点之前的 # 注意:容器日志中记录的是容器主进程的输出STDOUTSTDERR '''
(3)容器重命名
docker rename 容器名字/ID 新的容器名 [root@192 ~]# docker rename 21030 python3
7、运行中的容器操作
(1) 容器连接
将当前终端的STDIN、STDOUT、STDERR绑定到正在运行的容器的主进程上实现连接
docker attach [options] 容器名字/ID # 参数:--no-stdin 不绑定STDIN
例子:
[root@192 ~]# docker attach --no-stdin e181da [root@e181da14a5da /]# [root@192 ~]# docker attach e181da [root@e181da14a5da /]#
(2)容器中执行新命令
docker exec [options] 容器名字/ID 新的命令 ''' 参数 -d, --detach 后台运行命令 -i, --interactive 即使没连接容器,也将当前的STDIN绑定上 -t, --tty 分配一个虚拟终端 -w, --workdir string 指定在容器中的工作目录 -e, --env list 设置容器中运行时的环境变量 '''
8、docker文件拷贝
# 将文件拷贝到容器内 docker cp 需要拷贝的文件或目录 容器名字:容器目录 # 将文件从容器内拷贝出来 docker cp 容器名字:容器目录 需要拷贝的文件或目录
四、容器与镜像
1、容器与镜像之间的关系
2、容器提交
docker commit [options] 容器名字/ID 镜像名字:标签 ''' options: -a, --author string 作者 -c, --change list 为创建的镜像加入Dockerfile命令 -m, --message string 提交信息,类似git commit -m -p, --pause 提交时暂停容器 (default true) ''' # 例子: [root@192 ~]# docker commit -m 'test' 2c802254 testcentos:lastest sha256:e301ffd319d50b33196ac49c20fcd3d78fcc242836fe9390f2a8ba72b4c77bb2 [root@192 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE testcentos lastest e301ffd319d5 6 seconds ago 204MB
3、容器导出、导入
# ----------------容器导出--------------- docker export [option] 容器名字 # 参数:-o, --output string 指定写入的文件,默认是STDOUT # 例子 [root@192 ~]# docker export -o test.tar redis1 [root@192 ~]# ls anaconda-ks.cfg nginx-1.15.12 nginx-1.15.12.tar.gz test.tar # ----------------容器包导入--------------- docker import [option] file/url 镜像名字:标签 ''' option -c ,--change list 为创建的镜像加入Dockerfile命令 -m, --message string 导入时,添加提交信息 ''' # 例子 [root@192 ~]# docker import test.tar redis1:laste sha256:229019cc634aebce781dca74454a0c641097bb342d5c7650eb0fa2fc00899cec [root@192 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE redis1 laste 229019cc634a 11 seconds ago 101MB
五、总结:
注意事项:容器必须要有夯住的命令,不然它不会一直运行,如果是我们自己制作的镜像,运行容器的时候,必须要有个可以夯住的命令