一、前言
统称来说,容器是一种工具, 指的是可以装下其它物品的工具, 以方便人类归纳 放置 物品 、存储和异地运输 具体 来说 比如人类使用的 衣柜 、行李箱、背包等可以成为容器,但今天我们所说的容器是一种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服务器上运行的依赖性工具,这有助于实现灵活性和便携性,应用程序在任何地方都可以运行,无论是公有云、私有云、单机等。
红帽官方文档:https://www.redhat.com/zh/topics/containers/whats-a-linux-container
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 ): 容器是从镜像生成对外提供服务的一个或一组服务 。
Docker Hub 官方仓库: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 iputils 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 spec 和 image format spec ,有了这两个规范 不同 的容器 公司开发的容器只要兼容这两个规范,就可以保证容器的可移植性和相互可操作性。
容器runtime
runtime是真正运行容器的地方,因此为了运行不同的容器 runtime 需要和操作系统内核紧密合作相互在 支持 ,以便为容器提供相应的运行环境 。
目前主流的三种 runtime:
Lxc:linux上早期的runtime Docker早期就是采用lxc作为runtime 。
runc:目前Docker 默认的 runtime runc 遵守 OCI 规范,因 此可以兼容 lxc 。
rkt:是Core OS开发的容器runtime,也符合OCI规范 ,所以使用rktruntime也可以运行Docker容器。
容器管理工具:
管理工具连接 runtime与用户,对用户提供图形或 命令方式操作,然后管理工具将用户操作传递给runtime执行 。
lxc是lxd的管理工具。
Runc的管理工具是 docker engine,docker engine包含后台deamon和cli两部分 ,大家经常提到的Docker就是指的docker engine 。
Rkt 的管理工具是rktcli 。
容器定义工具:
容器定义工具允许用户定义容器的属性和内容,以方便容器能够被保存、共享和重建 。
Docker image:是docker容器 的模板,runtime依据docker image创建容器。
Docker file:包含N个命令的文本文件,通过dockerfile创建出 docker image 。
ACI (App container image):与 docker image 类似 是 Core OS开发的rkt容器的镜像格式。
二、Docker安装及基础命令介绍
1、通过yum源安装docker-ce
阿里云官网地址:https://mirrors.aliyun.com/docker-ce/linux/centos/
[root@centos-7 ~]# cd /etc/yum.repos.d/
[root@centos-7 yum.repos.d]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #下载repo包到/etc/yun.repos.d目录下,默认安装最新版本
[root@centos-7 ~]# 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
2、Docker官方推荐首选存储引擎为overlay2其次为devicemapper 但是devicemapper存在使用空间方面的一些限制, 虽然可以通过后期配置解决,
但是官方依然推荐使用overlay2 ,centos7.2版本之前的ftype都是0,以下是网上查到的部分资料:
如果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加速
[root@along ~]# mkdir -p /etc/docker
[root@along ~]# sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF
(2)阿里云加速器
① 注册阿里云账号,专用加速器地址获得路径:
https://cr.console.aliyun.com/#/accelerator
② 添加加速器到配置文件
[root@along ~]# sudo tee /etc/docker/daemon.json << 'EOF'
{
"registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"]
}
EOF
③ 阿里云页面有操作步骤
登录阿里云账号--->管理控制台----->左上角搜索:容器镜像服务----->点击最下面的镜像加速器
2.3.3 启动docker服务
① 重载docker启动配置
[root@centos7~]# systemctl daemon-reload
② 启动docker服务
[root@centos7 ~]# systemctl start docker.service
③ 将docker设置为开机启动
[root@centos7~]# systemctl enable docker.service
三、Docker基础命令操作
Docker镜像介绍:
Dokcer镜像含有启动容器所需要的文件系统及其内容,因此,其用于创建并启动docker容器。
采用分层构建机制,最底层为Bootfs,其之为rootfs。
- bootfs:用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后会被卸载以节约内存资源;
- rootfs:位于bootfs之上,表现为docker容器的根文件系统;
- docker中,rootfs由内核挂载为“只读”模式,而后通过联合挂载技术额外挂载在一个"可写"层;
docker image layer
- 位于下层的镜像成为父镜像,最底层的成为基础镜像
- 最上层为可读写层,其下的均为只读层;
3.1 镜像管理
3.1.1 搜索官方仓库镜像
[root@centos-7 yum.repos.d]# docker search nginx #不带版本号默认 latest,也就是最新版本的nginx
3.1.2 下载镜像
(1)下载需要的镜像,参见docker hub官网的tag标签下载:https://hub.docker.com,想要哪个版本直接在此搜索,然后找到对应的版本,以冒号为分隔符进行pull到docker主机上即可。
例如:docker pull nginx:1.14-alpine ,冒号后面跟上自己nginx的版本号,版本号可以在docker hub上查看,如果不跟冒号,就是默认下载最新版本。
[root@centos-7 ~]# docker pull nginx # 下载nginx
[root@centos-7 ~]# docker pull centos
[root@centos-7 ~]# docker pull alpine
(2)查看已下载的镜像
[root@centos-7 ~]# 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 镜像导出
[root@centos-7 ~]# docker save nginx > /opt/nginx.tar.gz
[root@centos-7 ~]# docker save centos -o /opt/centos.tar.gz
[root@centos-7 ~]# 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 镜像导入
[root@centos-7 ~]# scp /opt/nginx.tar.gz 192.168.7.101: #传到另一台主机上将镜像导入
[root@centos-7 ~]# 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
[root@centos-7 ~]# docker images # 查看导入的镜像内容
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest c7460dfcab50 3 days ago 126MB
导入镜像方法二:
[root@centos-7 ~]# docker load -i nginx.tar.gz # 导入镜像,也可以用-i选项导入
3.1.5 删除镜像
docker rmi 镜像名称/镜像ID 或者 使用 docker image rm 镜像名称/镜像ID
docker rmi -f 镜像名称/镜像ID 强制删除正在运行的镜像
[root@centos-7 ~]# docker rmi nginx #删除nginx镜像
Untagged: nginx:latest
Untagged: nginx@sha256:8aa7f6a9585d908a63e5e418dc5d14ae7467d2e36e1ab4f0d8f9d059a3d071ce
Deleted: sha256:c7460dfcab502275e9c842588df406444069c00a48d9a995619c243079a4c2f7
Deleted: sha256:3e51598e49c550f8b212a07c6ff2ed47a09eeb637f67d1b3c5468e9a8ee646e3
Deleted: sha256:a8b9a5643b3cc8082997d3d2fbaf4b53213ff80aa4169226be8b3768ae6e3605
Deleted: sha256:556c5fb0d91b726083a8ce42e2faaed99f11bc68d3f70e2c7bbce87e7e0b3e10
[root@centos-7 ~]# 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>
- 注:容器内的第一个进程必须一直处于运行的状态,否则这个容器,就会处于退出状态!
[root@centos-7 ~]# docker run -it -d centos # 运行当前的容器,加上-d在后端运行
48f2d90121f1cd1c71d28050c3400e3884e2e20cb65c9dfd6695182c8925ce25
[root@docker~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 0901fa9da894 7 days ago 132MB
centos 7 b5b4d78bc90c 2 months ago 203MB # 查看此时的centos镜像ID号,也可以运行
centos centos7.7.1908 08d05d1d5859 8 months ago 204MB
[root@docker~]#docker run -it --name test b5b4d78bc90c /bin/bash # 我们也可以直接创建一个centos系统的别名test容器,并进入此容器中
[root@33803226975b /]# ls
anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@33803226975b /]# uname -r
3.10.0-1127.13.1.el7.x86_64
[root@33803226975b /]# cat /etc/redhat-release #我们可以看到此时centos的版本号
CentOS Linux release 7.8.2003 (Core)
[root@centos-7 ~]# docker ps #查看当前正在运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48f2d90121f1 centos "/bin/bash" 8 seconds ago Up 7 seconds bold_nobel
查看所有的容器,加上-a 选项:
[root@centos-7 ~]# 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
激活关闭的容器
docker start
(1)格式
Usage: docker start [OPTIONS] CONTAINER [CONTAINER...]
(2)Options:
- -a:附加到当前终端
- -i:交互式
(3)示例
[root@along ~]# docker start web1
web1
[root@along ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ced78e522fd7 nginx:1.14-alpine "nginx -g 'daemon ..." 9 minutes ago Up 8 seconds 0.0.0.0:8888->80/tcp web1
查看哪些容器退出的状态
[root@centos-7 ~]# 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 删除正在运行的容器
[root@centos-7 ~]# docker ps # 查看此时正在运行的容器ID
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48f2d90121f1 centos "/bin/bash" 3 minutes ago Up 3 minutes bold_nobel
[root@centos-7 ~]# docker rm -f 48f2d90121f1 #删除正在运行的容器ID,直接就删除了容器
48f2d90121f1
删除所有的容器,包括正在运行的容器,慎用!!!
[root@centos-7 ~]# docker rm -f `docker ps -a -q`
3.2.3 指定网络端口映射
[root@centos-7 ~]# docker run -it -p 192.168.7.100:8080:80 nginx # 指定本地的IP地址8080端口映射到80端口上
[root@centos-7 ~]# docker run -it -p 192.168.7.100:80:80 nginx #指定80端口映射到80端口上
3.2.4 定义容器的名称
[root@centos-7 ~]# docker run -it --name web1 -p 8080:80 centos #定义容器的名称为web1,并将8080端口映射到容器的80端口上
[root@centos-7 ~]# 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多个端口映射
[root@centos-7 ~]# docker run -it -d --name web1 -p 80:80/tcp -p 443:443 nginx # 指定nginx多个映射端口,并命名为web1
027e950ea20b98581a78650c2b0dacd12ed689129307cda9d67fc071f8b12bba
[root@centos-7 ~]# 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
[root@centos-7 ~]# docker port web1 # 查看指定的容器名称对应映射的端口号,或者输入容器的ID,也可以查询此时的端口映射关系
80/tcp -> 0.0.0.0:80
443/tcp -> 0.0.0.0:443
[root@centos-7 ~]#
3.2.6 查看容器的logs日志
[root@centos-7 ~]# curl 192.168.7.100 # 在应一台主机进行测试
[root@centos-7 ~]# 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
[root@centos-7 ~]# 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退出
[root@centos-7 ~]# docker run -it --name test -p 8181:80/tcp nginx bash
root@8e77653b9e56:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@8e77653b9e56:/# exit
exit
3.2.8 单次测试容器环境
[root@centos-7 ~]# docker run -it --rm --name web2 -p 89:80 nginx bash # 单次运行,可以查看容器内部环境,退出后就会删除web2名称的容器
root@7394be55faca:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@7394be55faca:/# exit
exit
[root@centos-7 ~]# 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 重启容器
[root@centos-7 ~]# 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
[root@centos-7 ~]# docker stop 9a9e5785999d #停止容器ID
9a9e5785999d
[root@centos-7 ~]# 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
[root@centos-7 ~]# docker start 9a9e5785999d #启动容器ID
9a9e5785999d
3.2.10 使用exec命令进入正在运行的docker容器
[root@centos-7 ~]# 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
[root@centos-7 ~]# docker exec -it 9a9e5785999d bash # 通过exec命令进入正在运行的容器
root@9a9e5785999d:/# 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命令对容器IP过滤(推荐使用)
[root@centos-7 ~]# docker inspect -f "{{.NetworkSettings.IPAddress}}" 9a9e5785999d
172.17.0.3
[root@centos-7 ~]# docker inspect -f "{{.NetworkSettings.Gateway}}" 9a9e5785999d
172.17.0.1
使用nsenter命令,需要安装yum install util-linux -y
[root@centos-7 ~]# docker inspect -f "{{.State.Pid}}" 9a9e5785999d #需要先查询PID号
8000
[root@centos-7 ~]# nsenter -t 8000 -m -u -i -n -p # 根据查询的PID号进入到容器中
root@9a9e5785999d:/# 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
执行脚本
[root@centos-7 ~]# 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
[root@centos-7 ~]# bash docker_in.sh 14fa729e9d46 #根据容器ID号进入到容器中
root@14fa729e9d46:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
3.2.11 查看容器内部的hosts文件
[root@centos-7 ~]# bash docker_in.sh ecb05e2a7543
[root@ecb05e2a7543 /]# 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
[root@ecb05e2a7543 /]# 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 停止和开启所有的容器
[root@centos-7 ~]# docker stop `docker ps -a -q` #停止所有容器
ecb05e2a7543
d75fe26c9cf5
14fa729e9d46
[root@centos-7 ~]# docker start `docker ps -a -q` #开启所有容器
ecb05e2a7543
d75fe26c9cf5
14fa729e9d46
3.2.13 批量强制停止docker所有容器
[root@centos-7 ~]# docker kill `docker ps -a -q `
ecb05e2a7543
d75fe26c9cf5
14fa729e9d46
3.2.14 批量删除已经退出状态的容器
[root@centos-7 ~]# docker rm -fv `docker ps -aq -f status=exited`
ecb05e2a7543
d75fe26c9cf5
14fa729e9d46
[root@centos-7 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3.2.15 指定容器的DNS
[root@centos-7 ~]# docker run -it --dns 223.6.6.6 centos bash #指定容器的阿里云的dns地址
[root@d404a9217e8c /]# cat /etc/resolv.conf #查看dns的IP地址
nameserver 223.6.6.6
[root@d404a9217e8c /]# 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