(四)容器

itmahy
itmahy
发布于 2024-01-18 / 30 阅读
0
0

(四)容器

容器的介绍

Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。就像是Java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。从镜像容器角度来看,可以把容器看做是一个简易版的Linux 环培(包括root用户权限、进程空间、用户间和网络空间等)和运行在其中的应用程序。

Docker容器的特点:

  1. 隔离性:Docker利用Linux内核的命名空间和控制组技术,实现了容器之间的隔离。每个Docker容器都有自己独立的文件系统、进程空间、网络空间等,使得容器之间互不干扰。

  2. 可移植性:Docker容器可以在不同的操作系统和平台上运行,包括Linux、Windows和Mac等。这意味着开发者可以在本地开发和测试容器,然后将其部署到生产环境中,而无需担心环境差异导致的问题。

  3. 快速部署:Docker容器可以快速启动和停止,通常只需要几秒钟的时间。这使得开发者可以更加高效地进行开发、测试和部署工作,大大缩短了应用程序的交付时间。

  4. 资源利用率高:由于Docker容器共享宿主机的操作系统内核,因此它们相比于传统的虚拟机更加轻量级。这意味着可以在同一台物理机上运行更多的容器,提高了资源利用率。

  5. 版本控制和复用:Docker容器可以通过镜像进行版本控制和复用。开发者可以将容器打包成镜像,然后在不同的环境中使用相同的镜像进行部署。这样可以确保应用程序在不同环境中的一致性。

Docker容器提供了一种轻量级、可移植和高效的应用程序打包和部署方式,使得开发者可以更加方便地构建、交付和运行应用程序。

常用命令

  1. 新建+运行容器 Docker使用run命令运行镜像生成容器,在创建时,容器就会直接运行,如果使用 -it 参数,则可以进入交互界面,如果使用 -d 参数,容器则会在后台运行。
    -it参数时,退出交互界面会有以下差别: (1)使用 exit退出,容器就会停止运行。(2)如果使用ctrl+p+q快捷键退出,容器就不会停止运行。

[root@localhost ~]docker run [OPTIONS] [镜像名称:TAG/容器ID] [COMMAND] [ARG...]
[OPTIONS]
--name=容器名称 为容器指定一个名字
-d 后台云信容器并返回容器ID,也即启动守护式容器(后台运行)
-i 以交互模式运行容器,通常有-t同时使用
-t 为容器重新分配一个伪输入终端,通常与-i同时使用,也即启动交互式容器
-P 随机端口映射,大写P
-p 指定端口映射,小写p
--restart=always 
--restart的参数说明:
    no - 容器退出时,不重启容器;
    on-failure - 只有在非0状态退出时才从新启动容器;
    always - 无论退出状态是如何,都重启容器;

[示例]
[root@localhost ~]docker run -it ubuntu /bin/bash
[root@localhost ~]docker run -it  --name=myubuntu ubuntu /bin/bash
/bin/bash: 放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。要退出终端,直接输入 exit:

小写p参数详解

参数

说明

-p hostPort:containerPort

端口映射 -p 8080:80

-p ip:hostPort:containerPort

配置监听地址-p 10.0.0.100:8080:80

-pip::containerPort

随机分配端口-p 10.0.0.100::80

-p hostPort:containerPort:udp

指定协议-p 8080:80:tcp

-p 81:80 -p 443:443

指定多个

操作示例:

  1. 列出所有容器 查看所有的容器,如果不添加参数,只查看运行的容器,如果查看所有的容器(包含停止的容器),使用-a参数进行查看

[root@localhost ~]docker ps [OPTIONS]
[OPTIONS]
-a 列出当前所有正在运行的容器+历史上运行的
-l 显示最近创建的容器
-n 显示最近n个创建的容器
-q 静默模式,只显示容器编号

操作示例:

  1. 退出容器

  • exit

    使用 exit 退出,容器停止

  • 快捷键

    ctrl+p+q,使用快捷键退出,容器不停止

  1. 启动已停止运行的容器

docker start 容器ID或者容器名
  1. 重启容器

docker restart 容器ID或者容器名
  1. 停止容器

docker stop 容器ID或者容器名
  1. 强制停止容器

docker kill 容器ID或者容器名
  1. 删除已停止的容器

docker rm 容器ID或者容器名称
  1. 强制删除容器(未停止的容器)

docker rm -f 容器ID或者容器名称
  1. 一次性删除多个容器实例

docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
  1. 前台和后台启动

  • 前台交互式启动

docker run -d ubuntu
  • 后台守护式启动

# 这样启动会导致启动失败,
# 原因是 Docker容器后台运行,
# 就必须有一个前台进程容器运行的命令如
# 果不是那些一直挂起的命令(比如运行top,tail) ,
# 就是会自动退出的
docker run -d ubuntu
# 这样启动就OK
docker run -it ubuntu /bin/bash

问题: 然后 docker ps -a 进行查看,会发现容器已经退出。
原因: Docker容器后台运行,就必须有一个前台进程容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail) ,就是会自动退出的。 这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下我们配置启动服务只需要启动响应的service即可。例如service nginx start但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用这样的容器后台启动后,会立即自杀因为他觉得他没事可做了.所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行常见就是命令行模式,表示我还有交互操作,别中断。

  1. 查看容器日志

docker logs 容器ID
# 添加 -f 参数是实时输出日志
docker logs -f 容器ID
  1. 查看容器内运行的进程

docker top 容器ID
  1. 查看容器的内部细节

docker inspect 容器ID
  1. 进入正在运行的容器并以命令行交互

docker exec -it 容器ID bashShell

说明:exec是在容器中打开新的终端,并且可以启动新的进程用exit退出,不会导致容器停止

docker attach 容器ID

说明:attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止

  1. 从容器拷贝文件到主机

docker cp 容器ID:容器内的路径 目标主机的路径
# 示例
[root@localhost /]# docker cp bcf01f555d60:/tmp/laoma.txt /laoma
Successfully copied 1.54kB to /laoma
[root@localhost /]# cd laoma/
[root@localhost laoma]# ll
总用量 0
-rw-r--r--. 1 root root 0 6月  27 16:22 laoma.txt
  1. 导入和导出容器

  • export导出容器

docker export 容器ID >  abcd.tar
示例:
[root@localhost laoma]# docker export bcf01f555d60 > ubuntu_01.tar
[root@localhost laoma]# ll
总用量 73400
-rw-r--r--. 1 root root        0 6月  27 16:22 laoma.txt
-rw-r--r--. 1 root root 75159040 6月  27 16:29 ubuntu_01.tar
  • import 导入镜像

[root@localhost ~]cat 文件名.tar | docker import - 镜像用户/镜像名:版本号

[root@localhost laoma]# cat ubuntu_01.tar | docker import - itmahy/ubuntu:1.0
sha256:b1393a1efe8273e62bcec62f21b694e44566a7efcc39ef15e63285068509b241
[root@localhost laoma]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
itmahy/ubuntu   1.0       b1393a1efe82   9 seconds ago   72.8MB
redis           latest    7614ae9453d1   18 months ago   113MB
ubuntu          latest    ba6acccedd29   20 months ago   72.8MB
redis           6.0.8     16ecd2772934   2 years ago     104MB

[root@localhost laoma]# docker run -it itmahy/ubuntu:1.0 /bin/bash
root@454737d833e1:/# [root@localhost laoma]# docker ps
CONTAINER ID   IMAGE               COMMAND                   CREATED          STATUS          PORTS      NAMES
454737d833e1   itmahy/ubuntu:1.0   "/bin/bash"               18 seconds ago   Up 18 seconds              upbeat_cerf
53d9b032b518   redis               "docker-entrypoint.s…"   44 minutes ago   Up 44 minutes   6379/tcp   objective_wright
  1. 镜像分层

UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a sindle virtualtesystem)。Union 文件系统是 Docker 像的基础。镜像可以过分层求进行继承,基于尽础错像(没有父错像),可以制作各具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的

  • Docker镜像加载原理: docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。bootfis (boot fle system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加软bootfs文件系统,在Docker饶像的最底层是引导文件系统boots。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。 rootfs (root file system),在bootfs之上。包含的就是典型 Linux 系统中的 /dev,/proc,/bin,/etc 等标准目录和文件。rootis就是各和不同的操作系统发行版,比如Ubuntu,Centos等等。

  • 为什么镜像采用分层结构

    镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。 比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像. 同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

  • 重点

    Docker镜像层都是只读的,容器层是可写的当容器启动时,个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

    当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。 所有对容器的改动·无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。

  1. commit提交容器生成新镜像

命令的作用是:提交容器副本使之成为一个新的镜像

docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名(版本号)]

[root@localhost /]# docker commit -m="install vim tool" -a="itmahy" 454737d833e1 itmahy/ubuntu:1.1
sha256:c2581804e19230cc2f8184762ef6d314daae9e6e09a78e460502234e71900b35
[root@localhost /]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
itmahy/ubuntu   1.1       c2581804e192   4 seconds ago    185MB
itmahy/ubuntu   1.0       b1393a1efe82   38 minutes ago   72.8MB
redis           latest    7614ae9453d1   18 months ago    113MB
ubuntu          latest    ba6acccedd29   20 months ago    72.8MB
redis           6.0.8     16ecd2772934   2 years ago      104MB


评论