Docker之一----基础介绍和命令详解

一、前言

统称来说,容器是一种工具, 指的 是可以装下其它物品的工具, 以方便人类归纳 放置 物品 、存储和异地运输 具体 来说 比如人类使用的 衣柜 、行李箱、背包等可以成为容器,但今天我们所说的容器是一种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

时间: 2024-10-11 05:42:21

Docker之一----基础介绍和命令详解的相关文章

hbase shell基础和常用命令详解

HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服务. 1. 简介 HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一个结构化数据的分布式存储系统>.HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase

hbase shell基础和常用命令详解(转)

HBase shell的基本用法 hbase提供了一个shell的终端给用户交互.使用命令hbase shell进入命令界面.通过执行 help可以看到命令的帮助信息. 以网上的一个学生成绩表的例子来演示hbase的用法. name grad course math art Tom 5 97 87 Jim 4 89 80 这里grad对于表来说是一个只有它自己的列族,course对于表来说是一个有两个列的列族,这个列族由两个列组成math和art,当然我们可以根据我们的需要在course中建立更

Docker虚拟化技术系列之-命令详解

虚拟化原理:虚拟化解决方案的底部是要进行虚拟化的物理机器.这台机器可能直接支持虚拟化,也可能不会直接支持虚拟化:那么就需要系统管理程序 层的支持.系统管理程序(Virtual machine monitor),或称为 VMM,可以看作是平台硬件和操作系统的抽象化.在某些情况中,这个系统管理程序就是一个操作系统:此时,它就称为主机操作系统. 随着docker不断的学习,我们要想进一步去维护docker,就需要掌握docker日常使用的命令,如下为docker常用命令: 一.容器基础命令 docke

Linux入门基础之grep命令详解及正则表达式

grep命令是linux下经常使用的命令之一,能根据用户指定的模式(pattern)对文本进行过滤,显示出匹配到的行.其命令格式为: grep [OPTIONS] PATTERN [FILE] 例如:我们要查找网卡0中配置的IP地址(该文件路径: /etc/sysconfig/network-scripts/ifcfg-eth0)---grep 'IPADDR' /etc/sysconfig/network-scripts/ifcfg-eth0 (注:alias grep='grep --col

linux下mysql数据库基础及客户端命令详解

1.mysql数据库存储引擎: SHOW ENGINES;   #查看mysql支持的存储引擎 常见有如下两个存储引擎: MyISAM:每表三个文件: .frm: 表结构 .MYD:表数据 .MYI:表索引 InnoDB:默认所有表共享一个表空间文件: 建议:每表一个独立的表空间文件:默认此功能没有打开 .frm: 表结构 .ibd: 表空间,包含表数据和表索引 .opt: 字符集和字符排序规则 打开InnoDB每表创建独立的表空间文件功能办法: vim /etc/my.cnf   #新增如下一

history基础知识及命令详解

一.概述 history命令是Linux的一个内嵌的shell命令,history命令的使用有时会大大缩短我们输入命令的时间,达到节省命令快捷操作的要求.学会history命令之后,我们可以隐藏一些含有敏感信息的命令输入,做到使系统更加安全的目的.我们还可以定时的去清理我们不想要其它用户看到的一些私密的命令. 二.命令行历史 保存你输入的命令历史.可以用它来重复执行命令: 登录shell时,会读取命令历史文件中记录下的命令,历史文件路径~/.bash_history: 登录进shell后新执行的

文件管理基础知识及命令详解

一.文件系统概述 1.文件和目录被组织成一个单根倒置树结构: 2.文件系统从根目录下开始,用"/"表示: 3.名称是大小写敏感: 4.以.开头的文件为隐藏文件: 5.路径分隔的/: 6.文件有两位数据: 6.1:元数据(文件名.大小属性等):metadata: 数据:data: 二.文件名命名规则 1.包括路径在内文件名称最长4095个字节,用/分隔的路径不能超过255个字节: 2.文件名除了/以外的任意字符,但不建议使用特殊字符,有些字符需要引号来引用它们: 3.标准Linux文件系

linux基础篇-usermod命令 详解

参考资料:usermod manpage usermod - 修改用户帐户信息 modify a user account usermod [options] username 选项(options) -a|--append      ##把用户追加到某些组中,仅与-G选项一起使用 -c|--comment     ##修改/etc/passwd文件第五段comment -d|--home        ##修改用户的家目录通常和-m选项一起使用 -e|--expiredate  ##指定用户帐

Docker基础命令详解——镜像及容器操作

Docker基础命令详解--镜像及容器操作 前言 ? 上篇文章介绍了有关Docker的基础与Linux下docker的安装,本文主要讲解安装docker后的基础使用方法以及命令的介绍,主要是docker镜像操作及容器操作命令. ? 当然,docker的相关命令非常多,可以使用docker help命令查看对应目录以及相关提示命令. Docker镜像操作命令 [[email protected] ~]# which docker /usr/bin/docker 1.镜像搜索:docker sear