Docker容器操作

一、简介

容器:容器是一种轻量级、可移植、并将应用程序进行打包的技术,使应用程序可以在不同的地方以相同的方式运行。本质就是镜像文件运行后的实例,具有一定的生命周期。

容器的生命周期如下

 二、容器与虚拟机的比较

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

五、总结:

注意事项:容器必须要有夯住的命令,不然它不会一直运行,如果是我们自己制作的镜像,运行容器的时候,必须要有个可以夯住的命令

不将就
原文地址:https://www.cnblogs.com/nq31/p/14406402.html