一、前言
统称来说,容器是一种工具, 指的 是可以装下其它物品的工具, 以方便人类归纳 放置 物品 、存储和异地运输 具体 来说 比如人类使用的 衣柜 、行李箱、背包等可以成为容器,但今天我们所说的容器是一种IT技术。
容器技术是虚拟化、云计算、大数据之后的一门新兴的并且是炙手可热的新技术, 容器 技术提高了硬件资源利用率、 方便 了 企业 的业务快速横向扩容、 实现了业务宕机自愈功能 ,
因此未来数年会 是一个容器愈发流行的 时 代这是 一个对于IT 行业 来说非常有影响和价值的技术,而对于 IT 行业 的从业者来说, 熟练掌握容器 技术无疑是一个很有前景的行业工作机会。
容器技术最早出现 在 freebsd 叫做 jail。
二、docker 简介
1、Docker是什么?
- Docker是一个开放源代码软件项目,让应用程序布署在软件货柜下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。
- Docker利用Linux核心中的资源分离机制,例如cgroups,以及Linux核心名字空间(namespaces),来创建独立的容器(containers)。这可以在单一Linux实体下运作,避免启动一个虚拟机造成的额外负担。Linux核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括进程树、网络、用户ID与挂载文件系统,而核心的cgroup提供资源隔离,包括CPU、存储器、block I/O与网络。从0.9版本起,Dockers在使用抽象虚拟是经由libvirt的LXC与systemd - nspawn提供界面的基础上,开始包括libcontainer库做为以自己的方式开始直接使用由Linux核心提供的虚拟化的设施,
- 依据行业分析公司“451研究”:“Dockers是有能力打包应用程序及其虚拟容器,可以在任何Linux服务器上运行的依赖性工具,这有助于实现灵活性和便携性,应用程序在任何地方都可以运行,无论是公有云、私有云、单机等。
2、Docker的组成:
官方文档:https://docs.docker.com/engine/dockeroverview/
Docker主机 (Host):一个物理机或虚拟机,用于运行Docker服务进程和容器。
Docker服务端 (Server): Docker 守护 进程, 运行docker容器。
Docker客户端 (Client):客户端 使用docker命令或其他工具调用docker API 。
Docker仓库 (Registry):保存镜像的仓库,类似于git或svn这样的版本控制系
Docker镜像 (Images):镜像可以理解为创建实例使用的模板。
Docker容器 (Container ): 容器是从镜像生成对外提供服务的一个或一组服务 。
官方仓库:https://hub.docker.com/
架构图:
3、Docker对比虚拟机:
1、资源利用率更高:一台物理机可以运行数百个容器,但是一般只能运行数十个虚拟机 。
2、开销更小:不需要启动单独的虚拟机占用硬件资源。
3、启动速度更快:可以在数秒内完成启动。
使用虚拟机是为了更好的实现服务运行环境隔离,每个虚拟机都有独立的内核,虚拟化可以实现不同操作 系统 的虚拟机 ,但是 通常一个虚拟机只运行一个服务, 很明显资源利用率比较低且造成不必要的性能损耗,
我们创建虚拟机的目的是为了运行应用程序,比如 Nginx、PHP、Tomcat 等 web 程序,使用虚拟机无疑带来了一些不必要的资源开销,但是容器技术则基于减少中间运行环节带来较大的性能提升。
4、 Linux Namespace技术
namespace是Linux系统的底层概念, 在内核层实现,即有一些不同类型的命名空间被部署在核内 各个 docker 容器 运行在同一个 docker 主进程并且共用同一
个宿主机系统内核,各 docker 容器运行在 宿主机 的 用户 空间 每个 容器都要有类似于虚拟机一样的 相互 隔离的运行空间 但是 容器技术是 在一个 进程内实现
运行指定服务 的运行环境, 并且还可以 保护 宿主机内核不受其他进 程的 干扰 和影响 如 文件系统空间、网络空间、进程空间等,目前主要通过 以下技术实现
容器运行空间的相互隔离:
- namespaces 名称空间
- Control Group(cgroups) 控制组
(1)为什么centos6 版本不能使用容器?
因为centos6 内核版本是2.6;容器需要一个user的名称空间,直到内核3.8版本才有:
namespace | 系统调用参数 | 隔离内容 | 内核版本 |
UTS | CLONE_NEWUTS | 主机名和域名 | 2.6.19 |
IPC | CLONE_NEWIPC | 信号量、消息队列和共享内存 | 2.6.19 |
PID | CLONE_NEWPID | 进程编号 | 2.6.24 |
Network | CLONE_NEWNET | 网络设备、网络栈、端口等 | 2.6.29 |
Mount | CLONE_NEWNS | 挂载点(文件系统) | 2.4.19 |
User | CLONE_NEWUSER | 用户和用户组 | 3.8 |
5、MNT Namespace
每个容器都要有独立的根文件系统有独立的用户空间, 以实现 在容器里面启动服务并且使用容器的运行环境,即一个宿主机是ubuntu的服务器,可以在里面
启动一个centos 运行环境的容器并且在容器里面启动一个Nginx服务,此 Nginx运行时使用的运行环境就是centos系统目录的运行环境 但是在容器里面是不
能访问 宿主机 的资源, 宿主机 是使用了 chroot 技术把容器锁定到一个指定的运行目录里面 。
例如::/var/lib/containerd/io.containerd.runtime.v1.linux/ 容器ID
启动三个容器用于以下验证过程:
Server: Docker Engine Community Engine: Version: 18.09.7 API version: 1.39 (minimum version 1.12) Go version: go1.10.8 Git commit: 2d0083d Built: Thu Jun 27 17:26:28 2019 OS/Arch: linux/amd64 Experimental: false # docker run d name nginx 1 p 80:80 nginx # docker run d name nginx 2 p 81:80 nginx # docker run d name nginx 3 p 82:80 nginx
Debian系统安装基础命令:
# apt update # apt install procps (top 命令 # apt install i putils ping (ping 命令 # apt install net tools ( 网络工具
验证容器的根文件系统:
6、IPC Namespace
一个容器内的进程间通信允许一个容器内的不同进程的内存、缓存等数据访问,但是不能夸容器访问其他容器的数据 。
7、UTS namespace
UNIX Timesharing System包含了运行内核的名称、版本、底层体系结构类型等信息)用于系统标识,其中包含了hostname和域名domainname,
它使得一个容器拥有属于自己 hostname 标识,这个主机名标识独立于宿主机系统和其上的其他容器 。
8、PID Namespace
Linux系统中,有一个PID为1的进程 init/systemd是其他所有进程的父进程,那么在每个容器内也要有一个父进程来管理其下属的子进程,那么多个容器的进程通PID namespace进程
隔离(比如PID编号重复、器内的主进程生成与回收子进程等 )。
例如:下图是在一个容器内使用top命令看到的PID为1的进程是nginx。
容器内的Nginx主进程与工作进程:
那么宿主机的PID究竟与容器内的PID是什么关系?
查看宿主机上的PID信息:
查看容器中的PID信息:
9、Net Namespace
每一个容器都类似于虚拟机一样有自己 的网卡、 监听 端口、 TCP /IP 协议栈等。Docker使用network namespace 启动一个vethX接口,这样你的容器将拥有它自己的桥接 ip 地址,通常是 docker0,而docker0实质就是Linux的虚拟网桥,
网桥是在OSI七层模型的数据链路层的网络设备,通过mac地址对网络进行划分,并且在不同网络直接传递数据。
查看宿主机的网卡信息:
查看宿主机桥接设备:
通过brctl show 命令查看桥接设备:
10、实逻辑网络图:
11、Linux control groups
在一个容器 ,如果不对其做任何资源限制,则宿主机会允许其占用无限大的内存空间,有时候会因为代码 bug 程序会一直申请内存,直到把宿主机内存占完,为了避免此类的问题出现, 宿主机有必要对容器进行资源分配 限制,比如
CPU 、内存等, Linux Cgroups 的全称是 Linux Control Groups 它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU 、内存、磁盘、网络带宽等等。此外,还能够对进程进行优先级设置,以及将进程挂起和恢复等操作。
验证系统 cgroups
Cgroups 在内核层默认已经开启,从 centos 和 ubuntu 对比结果来看,显然 内核较新的ubuntu支持 的功能更多。
Centos 7.6 cgroups
ubuntu cgroups
cgroups 具体实现:
blkio :块设备 IO 限制。 cpu :使用调度程序为 cgroup 任务提供 cpu 的访问。 cpuacct :产生 cgroup 任务的 cpu 资源报告。 cpuset :如果是多核心的 cpu ,这个子系统会为 cgroup 任务分配单独的 cpu 和内存。 devices :允许或拒绝 cgroup 任务对设备的访问。 freezer :暂停和恢复 cgroup 任务。 memory :设置每个 cgroup 的内存限制以及产生内存资源报告。 net_cls :标记每个网络包以供 cgroup 方便使用。 ns :命名空间子系统。 perf_event :增加了对每 group 的监测跟踪的能力,可以监测属于某个特定的 group 的所有线程以及运行在特定 CPU 上的线程。
Docker优缺点
Docker优势:
快速部署:短时间内可以部署成百上千个应用 ,更快速交付到线上 。
高效虚拟化:不需要额外的hypervisor支持,直接基于linux实现应用虚拟化,相比虚拟机大幅提高性能和效率。
节省开支:提高服务器利用率,降低IT支出 。
简化配置:将运行环境打包保存至容器,使用时直接启动即可。
快速迁移和扩展:可跨平台运行在物理机、虚拟机、公有云等环境, 良好的兼容性可以方便将应用从A 宿主机迁移到B宿主机甚至是A平台迁移到B平台 。
Docker 的缺点:
隔离性:各应用之间的隔离不如虚拟机彻底 。
docker( 容器 的核心技术:
容器规范:
除了docker之外的docker技术,还有coreOS 的rkt还有阿里的 Pouch 为了保证容器生态的 标准 性和健康可持续发展, 包括 Linux 基金会 、Docker 、微软、红帽谷歌和、 IBM 、等公司 在 2015 年 6 月 共同成立了一个叫 open container OCI
的组织,其目的就是制定开放的标准的容器规范,目前 OCI 一共 发布了两个规范,分别是 runtime s pec 和 image format spec ,有了这两个规范 不同 的容器 公司开发的容器只要兼容这两个规范,就可以保证容器的可移植性和相互可操作性。
容器runtime
runtime是真正运行容器的地方,因此为了运行不同的容器 runtime 需要和操作系统内核紧密合作相互在 支持 ,以便为容器提供相应的运行环境 。
目前主流的三种 runtime:
Lxc:linux 上早期的 runtime D ocker 早期 就是采用 lxc 作为 runtime 。
runc:目前 D ocker 默认的 runtime runc 遵守 OCI 规范,因 此可以 兼容 lxc 。
rkt:是 C oreOS 开发的容器 runtime ,也符合 OCI 规范 ,所以使用 rktruntime 也可以运行 Docker 容器。
容器管理工具:
管理工具 连接 runtime 与用户,对用户提供图形或 命令 方式操作,然后管理工具将用户操作传递给 runtime 执行 。
lxc是lxd的管理工具。
Runc的管理工具是 docker engine docker engine 包含后台 deamon 和 cli 两部分 ,大家 经常提到的 D ocker 就是指的 docker engine 。
Rkt 的 管理工具是 rkt cli 。
容器定义工具:
容器定义工具允许用户定义容器的 属性 和内容,以方便容器能够被保存、共享和重建 。
Docker image:是 docker 容器 的模板, runtime 依据 docker image 创建 容器。
Docker file :包含 N 个 命令的文本文件,通过 dockerfile 创建出 docker image 。
ACI (App container image):与 docker image 类似 是 C oreOS 开发的 rkt 容器的镜像格式。
二、Docker安装及基础命令介绍
1、通过yum源安装docker-ce
阿里云官网地址:https://mirrors.aliyun.com/docker-ce/linux/centos/
[[email protected] ~]# cd /etc/yum.repos.d/ [[email protected] yum.repos.d]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #下载repo包到/etc/yun.repos.d目录下,默认安装最新版本 [[email protected] ~]# yum install docker-ce -y #安装docker
2、CentOS 7(使用 yum 进行安装制定版本)
# step 1: 安装必要的一些系统工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # Step 2: 添加软件源信息 sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # Step 3: 更新并安装Docker-CE sudo yum makecache fast sudo yum -y install docker-ce # Step 4: 开启Docker服务 sudo service docker start # 注意: # 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。 # vim /etc/yum.repos.d/docker-ee.repo # 将[docker-ce-test]下方的enabled=0修改为enabled=1 # # 安装指定版本的Docker-CE: # Step 1: 查找Docker-CE的版本: # yum list docker-ce.x86_64 --showduplicates | sort -r # Loading mirror speeds from cached hostfile # Loaded plugins: branch, fastestmirror, langpacks # docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable # docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable # docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable # Available Packages # Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos) # sudo yum -y install docker-ce-[VERSION] #查看到docker-ce的版本后,可以安装指定的版本。
启动docker服务
# systemctl start docker
查看此时docker的版本:
docker存储引擎:
1、目前docker 的默认存储引擎为 overlay2 需要 磁盘 分区支持 d type 文件分层功能 ,因此需要系统磁盘的额外支持。
官方文档关于 存储 引擎的 选择 文档:
https://docs.docker.com/storage/storagedriver/selectstorage driver/
2、Docker 官方推荐首选 存 储 引擎 为 overlay2 其次 为 devicemapper 但是devicemapper 存在 使用空间方面的一些限制, 虽然可以通过后期配置解决,
但是官方依然推荐使用overlay2 ,centos7.2版本之前的ftype都是0,以下是网上查到 的部分资料:
https://www.cnblogs.com/youruncloud/p/5736718.html
如果docker 数据目录是一块单独的磁盘分区而且是xfs格式的,那么需要在格式化的时候加上参数 -n ftype=1,否则后期在启动容器的时候会报错不支持dtype 。
报错界面:
docker服务进程
通过查看docker进程,了解docker的运行及工作方式
查看containerd进程关系:
有四个 进程:
dockerd:被client直接访问,其 父进程为宿主机的systemd守护进程 。
docker-proxy:实现容器通信,其父进程为dockerd
containerd:被dockerd进程调用以实现与runc交互
containerd-shim:真正运行容器的载体,其父进程为containerd
容器的创建与管理过程:
通信流程: 1. dockerd通过grpc和containerd模块通信,dockerd由libcontainerd负责和containerd进行交换,dockerd和containerd通信socket文件::/run/containerd/containerd.sock 。 2. containerd在dockerd启动时被启动,然后containerd启动grpc请求监听,containerd 处理grpc请求,根据请求做相应动作。 3. 若是start或是exec容器,containerd拉起一个container-shim,并进行相应的操作。 4. container-shim被拉起后,start/exec/create拉起runC进程,通过 exit、control文件和containerd通信,通过父子进程关系和SIGCHLD监控容器中进程状态。 5. 在整个容器生命周期中,containerd通过epoll监控容器文件,监控容器事件。
配置docker镜像加速
多种加速方式:
- docker cn
- 阿里云加速器
- 中国科技大学
- ... ...
(1)docker cn 加速
[[email protected] ~]# mkdir -p /etc/docker [[email protected] ~]# sudo tee /etc/docker/daemon.json <<-‘EOF‘ { "registry-mirrors": ["https://registry.docker-cn.com"] } EOF
(2)阿里云加速器
① 注册阿里云账号,专用加速器地址获得路径:
https://cr.console.aliyun.com/#/accelerator
② 添加加速器到配置文件
[[email protected] ~]# sudo tee /etc/docker/daemon.json <<-‘EOF‘ { "registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"] } EOF
③ 阿里云页面有操作步骤
2.3.3 启动docker服务
① 重载docker启动配置
[[email protected]~]# systemctl daemon-reload
② 将docker设为开机自启
[[email protected] ~]# systemctl start docker.service
③ 启动docker服务
[[email protected]~]# systemctl enable docker.service
三、docker 基础命令操作
3.1 镜像管理
3.1.1 搜索官方仓库镜像
[[email protected] yum.repos.d]# docker search nginx #不带版本号默认 latest
3.1.2 下载镜像
(1)下载需要的镜像
[[email protected] ~]# docker pull nginx # 下载nginx [[email protected] ~]# docker pull centos [[email protected] ~]# docker pull alpine
(2)查看已下载的镜像
[[email protected] ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest c7460dfcab50 3 days ago 126MB centos latest 0f3e07c0138f 3 months ago 220MB
参数解释
REPOSITORY # 镜像所属的仓库名称 TAG # 镜像版本号(标识符) 默认为 latest IMAGE ID # 镜像唯一 ID 标示 CREATED # 镜像创建时间 VIRTUAL SIZE # 镜像的大小
3.1.3 镜像导出
[[email protected] ~]# docker save nginx > /opt/nginx.tar.gz [[email protected] ~]# docker save centos -o /opt/centos.tar.gz [[email protected] ~]# ll /opt total 254248 -rw------- 1 root root 130174464 Jan 13 23:10 centos.tar.gz drwx--x--x 4 root root 28 Jan 13 15:26 containerd -rw------- 1 root root 130174464 Jan 13 23:10 nginx.tar.gz
注:
- -o:指定导出镜像的位置;
- 可以同时导出多个镜像;为一个文件;
- 指定.tar.gz 可以导出并压缩。
3.1.4 镜像导入
[[email protected] ~]# scp /opt/nginx.tar.gz 192.168.7.101: #传到另一台主机上将镜像导入 [[email protected] ~]# docker load < nginx.tar.gz # 导入镜像,也可以用-i选项导入 556c5fb0d91b: Loading layer [==================================================>] 72.48MB/72.48MB 17fde96446df: Loading layer [==================================================>] 57.67MB/57.67MB c26e88311e71: Loading layer [==================================================>] 3.584kB/3.584kB Loaded image: nginx:latest [[email protected] ~]# docker images # 查看导入的镜像内容 REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest c7460dfcab50 3 days ago 126MB
导入镜像方法二:
[[email protected] ~]# docker load -i nginx.tar.gz # 导入镜像,也可以用-i选项导入
3.1.5 删除镜像
docker rmi 容器名称/容器ID 或者 使用 docker image rm 容器名称/容器ID
docker rmi -f 容器名称/容器ID 强制删除正在运行的镜像
[[email protected] ~]# docker rmi nginx #删除nginx镜像 Untagged: nginx:latest Untagged: [email protected]:8aa7f6a9585d908a63e5e418dc5d14ae7467d2e36e1ab4f0d8f9d059a3d071ce Deleted: sha256:c7460dfcab502275e9c842588df406444069c00a48d9a995619c243079a4c2f7 Deleted: sha256:3e51598e49c550f8b212a07c6ff2ed47a09eeb637f67d1b3c5468e9a8ee646e3 Deleted: sha256:a8b9a5643b3cc8082997d3d2fbaf4b53213ff80aa4169226be8b3768ae6e3605 Deleted: sha256:556c5fb0d91b726083a8ce42e2faaed99f11bc68d3f70e2c7bbce87e7e0b3e10 [[email protected] ~]# docker images #查看此时nginx镜像已经被删除 REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 0f3e07c0138f 3 months ago 220MB
3.2 容器操作
3.2.1 启动容器
(1)格式
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
(2)options 常用命令选项
- -t :打开一个终端,像使用交换机一样使用容器
- -i:交互式访问
- --name:容器名字
- --network:指定网络
- --rm:容器一停,自动删除
- -d:剥离与当前终端的关系;否则会一直占据着终端
- -p:端口映射,将容器内服务的端口映射在宿主机的指定端口
- -p <container port>
- -p <hostport>:<container port>
- -p <hostip>:<hostport>:<container port>
[[email protected] ~]# docker run -it -d centos # 运行当前的容器,加上-d在后端运行 48f2d90121f1cd1c71d28050c3400e3884e2e20cb65c9dfd6695182c8925ce25 [[email protected] ~]# docker ps #查看当前正在运行的容器 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 48f2d90121f1 centos "/bin/bash" 8 seconds ago Up 7 seconds bold_nobel
查看所有的容器,加上-a 选项:
[[email protected] ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 48f2d90121f1 centos "/bin/bash" About a minute ago Up About a minute bold_nobel 99eee964898e centos "/bin/bash" 2 minutes ago Exited (0) About a minute ago funny_margulis ba807033b43e centos "/bin/bash" 5 minutes ago Exited (127) 5 minutes ago vibrant_rosalind
查看哪些容器退出的状态
[[email protected] ~]# docker ps -f status=exited CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 753bc5b8528f nginx "nginx -g ‘daemon of…" 10 hours ago Exited (255) 9 minutes ago 192.168.7.100:8080->80/tcp elastic_yonath 896ba395f88a nginx "nginx -g ‘daemon of…" 10 hours ago Exited (0) 9 hours ago happy_antonelli 99eee964898e centos "/bin/bash" 10 hours ago Exited (0) 10 hours ago funny_margulis ba807033b43e centos "/bin/bash" 10 hours ago Exited (127) 10 hours ago v
3.2.2 删除正在运行的容器
[[email protected] ~]# docker ps # 查看此时正在运行的容器ID CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 48f2d90121f1 centos "/bin/bash" 3 minutes ago Up 3 minutes bold_nobel [[email protected] ~]# docker rm -f 48f2d90121f1 #删除正在运行的容器ID,直接就删除了容器 48f2d90121f1
删除所有的容器,包括正在运行的容器,慎用!!!
[[email protected] ~]# docker rm -f `docker ps -a -q`
3.2.3 指定网络端口映射
[[email protected] ~]# docker run -it 192.168.7.100:8080:80 nginx # 指定本地的IP地址8080端口映射到80端口上 [[email protected] ~]# docker run -it -p 192.168.7.100:8080:80 nginx #指定80端口映射到80端口上
3.2.4 定义容器的名称
[[email protected] ~]# docker run -it --name web1 -p 8080:80 centos #定义容器的名称为web1,并将8080端口映射到容器的80端口上 [[email protected] ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6094b472014e centos "/bin/bash" 15 seconds ago Exited (127) 5 seconds ago web1
3.2.5 定义nginx多个端口映射
[[email protected] ~]# docker run -it -d --name web1 -p 80:80/tcp -p 443:443 nginx # 指定nginx多个映射端口,并命名为web1 027e950ea20b98581a78650c2b0dacd12ed689129307cda9d67fc071f8b12bba [[email protected] ~]# docker ps -a #查看此时的nginx名称 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 027e950ea20b nginx "nginx -g ‘daemon of…" 16 seconds ago Up 14 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp web1 [[email protected] ~]# docker port web1 # 查看指定的容器名称对应映射的端口号,或者输入容器的ID,也可以查询此时的端口映射关系 80/tcp -> 0.0.0.0:80 443/tcp -> 0.0.0.0:443 [[email protected] ~]#
3.2.6 查看容器的logs日志
[[email protected] ~]# curl 192.168.7.100 # 在应一台主机进行测试 [[email protected] ~]# docker ps -a # 查看容器的ID CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6094b472014e centos "/bin/bash" 5 minutes ago Exited (127) 5 minutes ago web1 6acc34edcc9e nginx "nginx -g ‘daemon of…" 7 minutes ago Up 7 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp xenodochial_turing [[email protected] ~]# docker logs 6acc34edcc9e #针对容器的ID进行分析log日志 192.168.7.101 - - [14/Jan/2020:01:35:44 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
3.2.7 创建容器并进入容器中
进去之后可以测试容器的环境变量是否正确,然后按exit退出
[[email protected] ~]# docker run -it --name test -p 8181:80/tcp nginx bash [email protected]:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var [email protected]:/# exit exit
3.2.8 单次测试容器环境
[[email protected] ~]# docker run -it --rm --name web2 -p 89:80 nginx bash # 单次运行,可以查看容器内部环境,退出后就会删除web2名称的容器 [email protected]:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var [email protected]:/# exit exit [[email protected] ~]# docker ps -a #查看此时没有web2名称的容器 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6b1593b435c7 nginx "bash" About a minute ago Up About a minute 0.0.0.0:88->80/tcp web1
3.2.9 重启容器
[[email protected] ~]# docker ps -a #查看容器ID CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9a9e5785999d nginx "bash" 17 seconds ago Exited (0) 6 seconds ago web442 f79459ede1da nginx "nginx -g ‘daemon of…" 45 seconds ago Exited (0) 30 seconds ago web22 6b1593b435c7 nginx "bash" 4 minutes ago Up 4 minutes 0.0.0.0:88->80/tcp web1 [[email protected] ~]# docker stop 9a9e5785999d #停止容器ID 9a9e5785999d [[email protected] ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9a9e5785999d nginx "bash" 29 seconds ago Exited (0) 18 seconds ago web442 f79459ede1da nginx "nginx -g ‘daemon of…" 57 seconds ago Exited (0) 42 seconds ago web22 6b1593b435c7 nginx "bash" 4 minutes ago Up 4 minutes 0.0.0.0:88->80/tcp web1 [[email protected] ~]# docker start 9a9e5785999d #启动容器ID 9a9e5785999d
3.2.10 使用exec命令进入正在运行的docker容器
[[email protected] ~]# docker ps -a # 查询此时的ID CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9a9e5785999d nginx "bash" 10 minutes ago Up 9 minutes 0.0.0.0:8111->80/tcp web442 f79459ede1da nginx "nginx -g ‘daemon of…" 10 minutes ago Exited (0) 10 minutes ago web22 6b1593b435c7 nginx "bash" 14 minutes ago Up 14 minutes 0.0.0.0:88->80/tcp web1 [[email protected] ~]# docker exec -it 9a9e5785999d bash # 通过exec命令进入正在运行的容器 [email protected]:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
3.2.11 使用nsenter和inspect命令进入到运行的容器中(推荐使用)
[[email protected] ~]# docker inspect -f "{{.NetworkSettings.IPAddress}}" 9a9e5785999d 172.17.0.3 [[email protected] ~]# docker inspect -f "{{.NetworkSettings.Gateway}}" 9a9e5785999d 172.17.0.1
使用nsenter命令,需要安装yum install util-linux -y
[[email protected] ~]# docker inspect -f "{{.State.Pid}}" 9a9e5785999d #需要先查询PID号 8000 [[email protected] ~]# nsenter -t 8000 -m -u -i -n -p # 根据查询的PID号进入到容器中 [email protected]:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
创建一个脚本直接进入到容器中,k8s中比较常用
vim docker_in.sh
#!/bin/bash docker_in(){ NAME_ID=$1 PID=$(docker inspect -f "{{.State.Pid}}" ${NAME_ID}) nsenter -t ${PID} -m -u -i -n -p } docker_in $1
执行脚本
[[email protected] ~]# docker ps -a #查看容器ID号 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 14fa729e9d46 centos "centos -g ‘daemon of…" 6 seconds ago Up 5 seconds 80/tcp admiring_ritchie [[email protected] ~]# bash docker_in.sh 14fa729e9d46 #根据容器ID号进入到容器中 [email protected]:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
3.2.11 查看容器内部的hosts文件
[[email protected] ~]# bash docker-in.sh ecb05e2a7543 [[email protected] /]# cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.3 ecb05e2a7543 [[email protected] /]# ping ecb05e2a7543 PING ecb05e2a7543 (172.17.0.3) 56(84) bytes of data. 64 bytes from ecb05e2a7543 (172.17.0.3): icmp_seq=1 ttl=64 time=0.048 ms ^C --- ecb05e2a7543 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms
3.2.12 停止和开启所有的容器
[[email protected] ~]# docker stop `docker ps -a -q` #停止所有容器 ecb05e2a7543 d75fe26c9cf5 14fa729e9d46 [[email protected] ~]# docker start `docker ps -a -q` #开启所有容器 ecb05e2a7543 d75fe26c9cf5 14fa729e9d46
3.2.13 批量强制停止docker所有容器
[[email protected] ~]# docker kill `docker ps -a -q ` ecb05e2a7543 d75fe26c9cf5 14fa729e9d46
3.2.14 批量删除已经退出状态的容器
[[email protected] ~]# docker rm -fv `docker ps -aq -f status=exited` ecb05e2a7543 d75fe26c9cf5 14fa729e9d46 [[email protected] ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3.2.15 指定容器的DNS
[[email protected] ~]# docker run -it --dns 223.6.6.6 centos bash #指定容器的阿里云的dns地址 [[email protected] /]# cat /etc/resolv.conf #查看dns的IP地址 nameserver 223.6.6.6 [[email protected] /]# ping 223.6.6.6 # ping通dns地址 PING 223.6.6.6 (223.6.6.6) 56(84) bytes of data. 64 bytes from 223.6.6.6: icmp_seq=1 ttl=127 time=84.9 ms 64 bytes from 223.6.6.6: icmp_seq=2 ttl=127 time=36.3 ms ^C --- 223.6.6.6 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 2ms
原文地址:https://www.cnblogs.com/struggle-1216/p/12187586.html