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

Posted struggle-1216

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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、启动速度更快:可以在数秒内完成启动。

  技术图片

使用虚拟机是为了更好的实现服务运行环境隔离,每个虚拟机都有独立的内核,虚拟化可以实现不同操作 系统 的虚拟机 ,但是 通常一个虚拟机只运行一个服务, 很明显资源利用率比较低且造成不必要的性能损耗,

我们创建虚拟机的目的是为了运行应用程序,比如 nginxphp、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/

 技术图片

[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/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 加速

[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 基础命令操作

3.1 镜像管理

3.1.1 搜索官方仓库镜像

[root@centos-7 yum.repos.d]# docker  search nginx  #不带版本号默认 latest

 技术图片

3.1.2 下载镜像

(1)下载需要的镜像

[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@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

查看哪些容器退出的状态

[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 192.168.7.100:8080:80 nginx  # 指定本地的IP地址8080端口映射到80端口上
[root@centos-7 ~]# docker run -it -p 192.168.7.100:8080: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命令进入到运行的容器中(推荐使用)

[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

  

  

  

 

  

  

  

  

  

  

  

  

  

  

  

  

 

  

 

  

  

 

 

  

  

  

  

 

  

以上是关于Docker之一----基础介绍和命令详解的主要内容,如果未能解决你的问题,请参考以下文章

Docker:Dockerfile 命令详解

Docker image 详解

Docker常用指令和镜像操作详解一文速学+实例代码

Linux基础命令(之一)详解

Docker 基础 : 镜像

MongoDB基础入门之一:基础入门和复制集