4.docker容器

docker

容器是Docker容器又一核心概念。
容器是独立运行的一个或一组应用。可以理解为模拟运行的一整套操作系统。

创建容器

使用docker create创建的容器处于停止状态,可以使用docker start来进行启动。
格式:docker create IMAGE [COMMAND]
语法同docker run

新建并启动容器

格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

1
docker run -it -d --name="test_ubuntu" d27b9ffc5667 /bin/bash
  • OPTIONS选项说明:

-d:指定容器运行于后台,默认为前台
-i:打开STDIN,用于控制台交互
-t:分配tty设备,该可以支持终端登录,默认为false,通常与-i一起使用
-p(小写):端口映射,格式为:主机(宿主)端口:容器端口
- -name=:为容器指定一个名称
-u: 指定容器的用户
-w:指定容器的工作目录
-e:指定环境变量,容器中可以使用该环境变量,-e NUM=11,一个-e后只能跟一个环境变量定义
-m:指定容器的内存上限
-h:指定容器的主机名
-v:给容器挂载存储卷,挂载到容器的某个目录,宿主机目录:容器目录
-c:设置CPU权重
- -restart=always :无论容器因何种原因退出(包括正常退出),就立即重启

在执行docker run时,Docker在后台运行的标准操作包括

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个 ip 地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止

限制容器对内存的使用

-m :设置内存的使用限额,默认没有限制
–menory-swap= :设置 内存+swap 的使用限额,默认没有限制
-m 300M --menory-swap=400M为内存限制300M,swap限制100M

限制容器对CPU的使用

默认情况下容器可以平等的使用cpu资源并且没有限制。
-c可以设置CPU权重,默认为1024,这个数字并不是CPU资源的绝对数量,能够获取到多少资源取决于这个数字占所有容器CPU权重的比例
-c 1024-c 512 第一个可以获取到第二个的两倍资源,这只是在CPU资源紧张的情况时,当第一个处于空闲状态时,第二个也可以获取到所有的CPU资源

限制容器对磁盘IO

--blkio-weight 与限制CPU一样这只是一个权重,默认为500。

限制bps与iops

bps 是 byte per second,每秒读写的数据量。
iops 是 io per second,每秒 IO 的次数。
--device-read-bps,限制读某个设备的 bps。--device-read-bps /dev/sda:30MB
--device-write-bps,限制写某个设备的 bps。
--device-read-iops,限制读某个设备的 iops。
--device-write-iops,限制写某个设备的 iops

后台运行容器

使用docker run -d 镜像ID将一个镜像的容器放在后台运行,若该镜像有输出结果,此时因在后台执行,所以不会将输出结果打印在屏幕上,但可以使用docker logs 容器查看容器日志。
容器是否会长久运行,是和 docker run 指定的命令有关,和 -d 参数无关。例如一个后台运行的容器的主进程只是将一串字符输出,那么当这一串字符输出完毕后容器就会自动停止

容器相关操作

docker stop 容器ID 终止容器
docker start 容器ID启动容器
docker restart 容器ID 重启容器
docker pause 容器ID 暂停容器
docker unpause 容器ID 恢复运行
docker rename 容器ID重命名容器名

进入容器

在使用当使用docker run -d新建一个容器时,有些时候需要进入到容器中进行操作,可以使用docker attach或者docker exec,推荐使用docker exec进入到容器

docker attach

当使用docker attach 容器ID进入到一个后台运行的容器中后,使用exit退出会导致容器中终止

docker exec

使用docker exec -it 容器ID进入到一个后台运行的容器中后,退出不会导致容器中终止

导出和导入容器

导出容器

如果要导出本地某个容器,可以使用docker export 容器ID命令。

1
docker export 7691a814370e > ubuntu.tar

这样将导出容器快照到本地文件。

导出容器快照

可使用docker import从容器快照文件中再导入为镜像,并可以重新指定标签等元数据信息(容器快照文件将丢弃历史数据、元数据信息)

1
docker import nginx-test.tar nginx:imp

docker load 可以将镜像存储文件导入到本地镜像库,镜像存储文件将保存完整记录,体积较大

export、import、save、load区别

  1. export命令导出的tar文件略小于save命令导出的。
  2. export命令是从容器(container)中导出tar文件,而save命令则是从镜像(images)中导出。
  3. 基于第二点,export导出的文件再import回去时,无法保留镜像所有历史(即每一层layer信息,不熟悉的可以去看Dockerfile),不能进行回滚操作;而save是依据镜像来的,所以导入时可以完整保留下每一层layer信息。

删除容器

1
docker rm 容器

可以删除已经停止的容器。若要删除一个运行中的容器可以添加-f选项

清理所有处于终止状态的容器

用以下命令来查看所有已经创建的包括终止状态的容器。

1
2
3
docker ps -a

docekr container ls -a`

使用以下命令来删除所有处于终止状态的容器

1
docker container prune

查看容器

查看容器详情

docker inspect 容器ID查看容器的详细信息,结果以json格式返回。

查看容器内进程

docker top 容器ID类似于linux中的top命令,会打印出容器内的进程信息。

查看统计信息

docker stats 容器ID查看CPU、内存、存储、网络等使用情况的统计信息。

其他容器命令

复制文件

docker cp 源文件路径 目标路径在容器和宿主机本地之间复制文件,容器路径格式:容器ID:容器中的路径

查看容器的具体改动

docker diff 容器名/容器ID

查看端口映射

docker port 容器ID查看容器的端口映射情况。
输出内容为: 宿主机端口 -> 容器端口

实现容器的底层技术

具体查看 Namespace