容器介绍
容器其实是一种沙盒技术。沙盒就是能够像一个集装箱一样,把你的应用"装"起来的技术。这样,应用与应用之间,就因为有了边界而不至于相互干扰;而被装进集装箱的应用,也可以被方便地搬来搬去。
问题:容器的本质到底是什么?
容器的本质是进程。容器镜像就是这个系统里的".exe"安装包.
.iso----->(wind/linux) docker 下载镜像images —run–> docker容器----->tomcat —打包–>images------run ----容器。
Docker介绍:
Docker是Docker.Inc公司开源的一个基于轻量级虚拟化技术的容器引擎项目,整个项目基于Go语言开发,并遵从Apache 2.0协议。通过分层镜像标准化和内核虚拟化技术,Docker使得应用开发者和运维工程师可以以统一的方式跨平台发布应用,并且以几乎没有额外开销的情况下提供资源隔离的应用运行环境。
Docker 是一个开源工具,它可以让创建和管理 Linux 容器变得简单。**容器就像是轻量级的虚拟机,并且可以以秒级的速度来启动或停止**。
官网:docker.com
docker.io ---docker官方库也叫docker-hub
没有容器的时候:
1.rd开发产品(需要配置开发环境)lamp
2.测试(需要配置测试环境)
3.op上线(需要线上环境)
开发 测试 运维
有容器之后:
-
rd开发产品(需要在docker容器里配置开发环境)
-
把容器打包成镜像交给运维,运维上线
Docker跟原有的工具区别:
传统的部署模式是:安装(包管理工具或者源码包编译)->配置->运行; Docker的部署模式是:复制->运行。
Docker对服务器端开发/部署带来的变化:
方便快速部署 对于部署来说可以极大的减少部署的时间成本和人力成本 Docker支持将应用打包进一个可以移植的容器中,重新定义了应用开发,测试,部署上线的过程,核心理念 是 Build once, Run anywhere 1)标准化应用发布,docker容器包含了运行环境和可执行程序,可以跨平台和主机使用; 2)节约时间,快速部署和启动,VM启动一般是分钟级,docker容器启动是秒级; 3)方便构建基于微服务架构的系统,通过服务编排,更好的松耦合; 4)节约成本,以前一个虚拟机至少需要几个G的磁盘空间,docker容器可以减少到MB级;
Docker 优势:
1、交付物标准化
Docker的标准化交付物称为"镜像",它包含了应用程序及其所依赖的运行环境,大大简化了应用交付的模式。
2、应用隔离
Docker可以隔离不同应用程序之间的相互影响,但是比虚拟机开销更小。总之,容器技术部署速度快,开发、测试更敏捷;提高系统利用率,降低资源成本.
3、一次构建,多次交付
类似于集装箱的"一次装箱,多次运输",Docker镜像可以做到"一次构建,多次交付"。
Docker的度量:
Docker是利用容器来实现的一种轻量级的虚拟技术,从而在保证隔离性的同时达到节省资源的目的。Docker的
可移植性可以让它一次建立,到处运行。Docker的度量可以从以下四个方面进行:
1)隔离性
通过内核的命名空间来实现的,将容器的进程、网络、消息、文件系统和主机名进行隔离。
2)可度量性
Docker主要通过cgroups控制组来控制资源的度量和分配。
3)移植性
Docker利用AUFS来实现对容器的快速更新。
AUFS是一种支持将不同目录挂载到同一个虚拟文件系统下的文件系统,支持对每个目录的读写权限管理。AUFS具有层
的概念,每一次修改都是在已有的只写层进行增量修改,修改的内容将形成新的文件层,不影响原有的层。
4)安全性
安全性可以分为容器内部之间的安全性;容器与托管主机之间的安全性。
容器内部之间的安全性主要是通过命名空间和cgroups来保证的。
容器与托管主机之间的安全性主要是通过内核能力机制的控制,可以防止Docker非法入侵托管主机。
Docker容器使用AUFS作为文件系统,有如下优势:
1)节省存储空间
多个容器可以共享同一个基础镜像存储。
2)快速部署
3)升级方便
升级一个基础镜像即可影响到所有基于它的容器。需要注意已经在运行的docker容器不受影响
容器和 VM 的主要区别:
表面区别:
容器占用体积小,虚拟机占用体积大
隔离性:容器提供了基于进程的隔离,而虚拟机提供了资源的完全隔离。
启动速度:虚拟机可能需要一分钟来启动,而容器只需要一秒钟或更短。
容器使用宿主操作系统的内核,而虚拟机使用独立的内核。Docker 的局限性之一是,它只能用在64位的操作系统上。
本质区别:
容器是被隔离的进程
docker安装
CentOS 7 中 Docker 的安装:
Docker 软件包已经包括在默认的 CentOS-Extras 软件源(联网使用centos7u2自带网络Yum源)里。因此想要安装 docker,只需要运行下面的 yum 命令:
# yum install -y epel*
# yum install docker
启动 Docker 服务:
# service docker start
# chkconfig docker on
CentOS 7
# systemctl start docker.service
# systemctl enable docker.service
确定docker服务在运行:
结果会显示服务端和客户端的版本,如果只显示客户端版本说明服务没有启动
# docker version
Client:
Version: 1.10.3
API version: 1.22
...
docker版本与官方安装方式
moby、docker-ce与docker-ee
最早时docker是一个开源项目,主要由docker公司维护。
2017年3月1日起,docker公司将原先的docker项目改名为moby,并创建了docker-ce和docker-ee。
三者关系:
moby是继承了原先的docker的项目,是社区维护的的开源项目,谁都可以在moby的基础打造自己的容器产品
docker-ce是docker公司维护的开源项目,是一个基于moby项目的免费的容器产品
docker-ee是docker公司维护的闭源产品,是docker公司的商业产品
moby project由社区维护,docker-ce project是docker公司维护,docker-ee是闭源的docker公司维护。
CentOS–官方安装
如果是centos,上面的安装命令会在系统上添加yum源:/etc/yum.repos.d/docker-ce.repo
# wget https://download.docker.com/linux/centos/docker-ce.repo
# mv docker-ce.repo /etc/yum.repos.d
# yum install -y docker-ce
或者直接下载rpm安装:
# wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm
# yum localinstall docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm
国内源安装新版docker
使用aliyun docker yum源安装新版docker
删除已安装的Docker
[root@yixuan ~]# yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
配置阿里云Docker Yum源
# yum install -y yum-utils device-mapper-persistent-data lvm2 git
# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装指定版本
查看Docker版本:
# yum list docker-ce --showduplicates
安装较旧版本(比如Docker 17.03.2) :
需要指定完整的rpm包的包名,并且加上–setopt=obsoletes=0 参数:
# yum install -y --setopt=obsoletes=0 \
docker-ce-17.03.2.ce-1.el7.centos.x86_64 \
docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch
安装Docker新版本(比如Docker 18.03.0):加上rpm包名的版本号部分或不加都可以:
# yum install docker-ce-18.03.0.ce -y
或者
[root@yixuan ~]# yum install -y docker-ce
启动Docker服务:
#systemctl enable docker
#systemctl start docker
查看docker版本状态:
[root@yixuan ~]# docker -v
Docker version 19.03.2, build 6a30dfc
[root@yixuan ~]# docker version
Client: Docker Engine - Community
Version: 19.03.2
API version: 1.40
Go version: go1.12.8
Git commit: 6a30dfc
Built: Thu Aug 29 05:28:55 2019
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.2
API version: 1.40 (minimum version 1.12)
Go version: go1.12.8
Git commit: 6a30dfc
Built: Thu Aug 29 05:27:34 2019
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.6
GitCommit: 894b81a4b802e4eb2a91d1ce216b8817763c29fb
runc:
Version: 1.0.0-rc8
GitCommit: 425e105d5a03fabd737a126ad93d62a9eeede87f
docker-init:
Version: 0.18.0
GitCommit: fec3683
查看docker运行状态:
# docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
...
=======================================================
报错1:
docker info的时候报如下错误
bridge-nf-call-iptables is disabled
解决1:
追加如下配置,然后重启系统
# vim /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
问题2:
虚拟机ping百度也能ping通,但是需要等好几秒才出结果,关键是下载镜像一直报错如下
# docker pull daocloud.io/library/nginx
Using default tag: latest
Error response from daemon: Get https://daocloud.io/v2/: dial tcp: lookup daocloud.io on 192.168.1.2:53: read udp 192.168.1.189:41335->192.168.1.2:53: i/o timeout
解决2:
我的虚拟机用的网关和dns都是虚拟机自己的.1或者.2,把DNS改成8.8.8.8问题就解决了,ping百度也秒出结果
# vim /etc/resolv.conf
nameserver 8.8.8.8
简单测试
运行一个容器
[root@192 ~]# docker run -it daocloud.io/library/ubuntu /bin/bash #运行容器
Unable to find image 'daocloud.io/library/ubuntu:latest' locally
latest: Pulling from library/ubuntu
5c939e3a4d10: Pull complete
c63719cdbe7a: Pull complete
19a861ea6baf: Pull complete
651c9d2d6c4f: Pull complete
Digest: sha256:bc025862c3e8ec4a8754ea4756e33da6c41cba38330d7e324abd25c8e0b93300
Status: Downloaded newer image for daocloud.io/library/ubuntu:latest
如果自动进入下面的容器环境,说明ubuntu镜像运行成功,Docker的安装也没有问题:可以操作容器了
root@db8e84e2ea96:/#
国内镜像源
去查看如何使用aliyun的docker镜像库
去查看如何使用网易蜂巢的docker镜像库
daocloud.io
**Docker 加速器 **
使用 Docker 的时候,需要经常从官方获取镜像,但是由于显而易见的网络原因,拉取镜像的过程非常耗时,严重影响使用 Docker 的体验。因此 DaoCloud 推出了加速器工具解决这个难题,通过智能路由和缓存机制,极大提升了国内网络访问 Docker Hub 的速度。
Docker 加速器对 Docker 的版本有要求吗?
需要 Docker 1.8 或更高版本才能使用。
Docker 加速器支持什么系统?
Linux, MacOS 以及 Windows 平台。
Docker 加速器是否收费?
提供永久免费的加速器服务,请放心使用。
国内比较好的镜像源:网易蜂巢、aliyun和daocloud
daocloud.io–官网
=以下为亲测======
使用国内镜像:
进入网站:https://daocloud.io/
注册帐号:soso666
进入镜像市场
随便选择一个,选择mysql
上面有详细的使用命令。但是每个镜像的命令不一样,在选择一个:
[root@yixuan ~]# docker pull daocloud.io/library/nginx #下载镜像
Using default tag: latest
latest: Pulling from library/nginx
0a4690c5d889: Pull complete
9719afee3eb7: Pull complete
44446b456159: Pull complete
Digest: sha256:f83b2ffd963ac911f9e638184c8d580cc1f3139d5c8c33c87c3fb90aebdebf76
Status: Downloaded newer image for daocloud.io/library/nginx:latest
daocloud.io/library/nginx:latest
现在我们使用web界面:
等一会,不要手动终止:
[root@yixuan ~]# curl -sSL https://get.daocloud.io/daomonit/install.sh | sh -s 8e6d8ce76e4ec4668f31859dae6297439ac49243
* Installing Daomonit...
* Downloading Daomonit from https://get.daocloud.io/daomonit/daomonit.x86_64.rpm
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 279 100 279 0 0 1091 0 --:--:-- --:--:-- --:--:-- 1094
100 337 100 337 0 0 950 0 --:--:-- --:--:-- --:--:-- 950
100 3349k 100 3349k 0 0 2060k 0 0:00:01 0:00:01 --:--:-- 2207k
准备中... ################################# [100%]
正在升级/安装...
1:daomonit-0.1.70-1 ################################# [100%]
Created symlink from /etc/systemd/system/multi-user.target.wants/daomonit.service to /usr/lib/systemd/system/daomonit.service.
* Configuring Daomonit...
[10/04/19 23:05:51] [DEBG] Writing configuration file /etc/daocloud/daomonit.yml
[10/04/19 23:05:51] [INFO] You have successfully saved your config file.
* Start Daomonit...
Starting daomonit (via systemctl): [ OK ]
You can view daomonit log at /var/log/daomonit.log
And You can Start or Stop daomonit with: service daomonit start/stop/restart/status
*********************************************************************
*********************************************************************
***
*** Installed and Started Daomonit 0.1.70
***
*** NOTICE:
*** You can pull image very Fast by dao, For Example:
*** dao pull ubuntu
***
*********************************************************************
*********************************************************************
[root@yixuan ~]#
完成之后:
点击查看主机
启动我们的容器
[root@yixuan ~]# docker images #查看镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
daocloud.io/library/nginx latest 98ebf73aba75 2 months ago 109MB
daocloud.io/daocloud/daocloud-toolset latest bbdc71e950ea 2 years ago 147MB
[root@yixuan ~]# docker run -it daocloud.io/library/nginx /bin/bash #运行容器
root@37b8b8cdd75f:/#
将容器启动之后刷新一下刚才的界面点击容器就会显示出来
点击查看详情…
配置阿里云的仓库
使用阿里的的仓库下载镜像:
[root@192 ~]# docker pull registry.cn-hangzhou.aliyuncs.com/xynginx/nginx
Using default tag: latest
latest: Pulling from xynginx/nginx
7dc0dca2b151: Pull complete
c4757245bbef: Pull complete
0a46433073b6: Pull complete
Digest: sha256:c0eaf80075734ba7b095162a1a9b2991a48987174f2f3424882714ba7b3c4033
Status: Downloaded newer image for registry.cn-hangzhou.aliyuncs.com/xynginx/nginx:latest
registry.cn-hangzhou.aliyuncs.com/xynginx/nginx:latest
[root@192 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.cn-hangzhou.aliyuncs.com/xynginx/nginx latest 3966d32f8bd8
347MB
配置阿里加速器:
如果这个目录/etc/docker/不存在就创建
[root@192 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://br003st4.mirror.aliyuncs.com"]
}
[root@192 ~]# systemctl daemon-reload
[root@192 ~]# systemctl restart docker
docker基本概念
Docker系统
Docker系统有两个程序:docker服务端和docker客户端
docker服务端:是一个服务进程,管理着所有的容器。也叫docker engine
docker客户端:扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。
大部分情况下,docker服务端和客户端运行在一台机器上
Docker三大核心组件:
Docker 镜像 - Docker images
Docker 仓库 - Docker registeries
Docker 容器 - Docker containers
容器的三大组成要素:
名称空间 namespace 容器隔离(pid,net,mnt,user,)
资源限制 cgroups 资源(内存,cpu)
文件系统 overlay2(UnionFS)
docker 仓库:
**用来保存镜像,可以理解为代码控制中的代码仓库。**同样的,Docker 仓库也有公有和私有的概念。
公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建。
仓库(registry) -->Repository-->镜像(按版本区分)
docker.io/centos:7
registry/repository:tag
repository:存储库
docker 国内仓库
ali
网易蜂巢
daocloud
=========================
docker公有仓库
docker.io -------docker官方库也叫docker-hub
类似于github一样,面向全球的一个docker镜像的公共仓库。如果在国内使用速度太慢。
===============================
docker私有仓库
个人或者公司部署的非公开库
Docker 镜像
Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成。Docker 使用 UnionFS 来将这些层联合到单独的镜像中。正因为有了这些层的存在,Docker 是如此的轻量。当你改变了一个 Docker 镜像,比如升级到某个程序到新的版本,一个新的层会被创建。因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新的层被添加或升级了。
在 Docker 的术语里,一个只读层被称为镜像,一个镜像是永久不会变的。由于 Docker 使用一个统一文件系统,由于镜像不可写,所以镜像是无状态的。
镜像由三部分组成:
镜像名称:仓库名称+镜像分类+tag名称(镜像版本)
1.存储对象:images
2.格式:库名/分类:tag
3.tag:表示镜像版本
镜像的大体分类方式:这不是规定
1.以操作系统名字
centos的docker镜像:
centos5
centos6
centos7
-----------------
2.以应用的名字
nginx的docker镜像
tomcat的docker镜像
mysql的docker镜像
镜像名字:
完整镜像名称示例:
docker.io/library/nginx:v1
docker.io/library/nginx:latest
daocloud.io/library/nginx
镜像ID:
所有镜像都是通过一个 64 位十六进制字符串来标识的。 为简化使用,前 12 个字符可以组成一个短ID,可以在命令行中使用。短ID还是有一定的碰撞机率,所以服务器总是返回长ID。
镜像ID:64位的id号,一般我们看到的是12位的我们称之为短ID,只要我们每个ID号不冲突就可以了
镜像本身:是由一层一层的镜像合在一起的,最底层的镜像我们称为基础镜像,在这个基础镜像的基础上还可以在做镜像,在做的镜像称为子镜像,对于子镜像来讲在谁的基础之上做的就是父镜像。
基础镜像:一个没有任何父镜像的镜像,谓之基础镜像。
centos7 镜像
centos7+nginx 镜像
Docker 容器
Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分。
docker镜像命名解析
Docker镜像命名解析
镜像是Docker最核心的技术之一,也是应用发布的标准格式。无论你是用docker pull image,或者是在
Dockerfile里面写FROM image,从Docker官方Registry下载镜像应该是Docker操作里面最频繁的动作之一
了。那么docker镜像是如何命名的,这也是Docker里面比较容易令人混淆的一块概念:Registry,Repository, Tag and Image。
那么Registry又是什么呢?Registry存储镜像数据,并且提供拉取和上传镜像的功能。Registry中镜像是通过
Repository来组织的,而每个Repository又包含了若干个Image。
下面是在本地机器运行docker images的输出结果:
常说的"ubuntu"镜像其实不是一个镜像名称,而是代表了一个名为ubuntu的Repository,同时在这个Repository下面有一系列打了tag的Image,Image的标记是一个GUID,为了方便也可以通过Repository:tag来引用。
Image[:tag]
当一个镜像的名称不足以分辨这个镜像所代表的含义时,你可以通过tag将版本信息添加到run命令中,以执行特
定版本的镜像。
例如:docker run ubuntu:14.04
docker镜像和容器的区别
一、Docker镜像
要理解Docker镜像和docker容器之间的区别,确实不容易。。
一个Docker镜像可以构建于另一个Docker镜像之上,这种层叠关系可以是多层的。第1层的镜像层我们称之为基础镜像(Base Image),其他层的镜像(除了最顶层)我们称之为父层镜像(Parent Image)。这些镜像继承了他们的父层镜像的所有属性和设置。
Docker镜像通过镜像ID进行识别。镜像ID是一个64字符的十六进制的字符串。但是当我们运行镜像时,通常我们不会使用镜像ID来引用镜像,而是使用镜像名来引用。
要列出本地所有有效的镜像,可以使用命令
# docker images
镜像可以发布为不同的版本,这种机制我们称之为标签(Tag)。
可以使用pull命令加上指定的标签:
# docker pull ubuntu:14.04
# docker pull ubuntu:12.04
二、Docker容器
Docker容器可以使用命令创建:
# docker run -it imagename /bin/bash
它会在所有的镜像层之上增加一个可写层。这个可写层有运行在CPU上的进程,而且有两个不同的状态:运行态
(Running)和退出态 (Exited)。这就是Docker容器。当我们使用docker run启动容器,Docker容器就进
入运行态,当我们停止Docker容器时,它就进入退出态。
当我们有一个正在运行的Docker容器时,从运行态到停止态,我们对它所做的一切变更都会永久地写到容器的文
件系统中。要切记,对容器的变更是写入到容器的文件系统的,而不是写入到Docker镜像中的。
我们可以用同一个镜像启动多个Docker容器,这些容器启动后都是活动的,彼此还是相互隔离的。我们对其中一
个容器所做的变更只会局限于那个容器本身。如果对容器的底层镜像进行修改,那么当前正在运行的容器是不受影响的,不会发生自动更新现象。
名字空间–namespace
namespace 空间隔离
cgroup 资源限制
名字空间是 Linux 内核一个强大的特性。每个容器都有自己单独的名字空间,运行在其中的应用都像是在独立的操作系统中运行一样。名字空间保证了容器之间彼此互不影响。
- pid 名字空间
不同用户的进程就是通过 pid 名字空间隔离开的,且不同名字空间中可以有相同 pid。所有的 LXC 进程在 Docker中的父进程为Docker进程,每个 LXC 进程具有不同的名字空间。同时由于允许嵌套,因此可以很方便的实现嵌套的 Docker 容器。
-
net 名字空间
有 了 pid 名字空间, 每个名字空间中的 pid 能够相互隔离,但是网络端口还是共享 host 的端口。网络隔离是通过 net 名字空间实现的, 每个 net 名字空间有独立的 网络设备, IP 地址, 路由表, /proc/net 目录。这样每个容器的网络就能隔离开来。
-
ipc 名字空间
容器中进程交互还是采用了 Linux 常见的进程间交互方法(interprocess communication - IPC), 包括信号量、消息队列和共享内存、socket、管道等。
linux系统里面ipc通信有几种方式
管道(pipe):管道可用于具有亲缘关系的进程间的通信,是一种半双工的方式,数据只能单向流动,允许一个进程和另一个与它有公共祖先的进程之间进行通信。
命名管道(named pipe):命名管道克服了管道没有名字的限制,同时除了具有管道的功能外(也是半双工),它还允许无亲缘关系进程间的通信。命令管道在文件系统中有对应的文件名。命令管道通过命令mkfifo或系统调用mkfifo来创建。
信号(signal):信号是比较复杂的通信方式,用于通知接收进程有某种事件发生了,除了进程间通信外,进程还可以发送信号给进程本身。
消息队列:消息队列是消息的链接表,包括Posix消息队列和system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程可以读走队列中的消息。消息队列克服了信号承载信息少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
共享内存:使得多个进程可以访问同一块内存空间,是最快的IPC形式。是针对其他通信机制运行效率低而设计的。往往与其他通信机制,如信号量结合使用,来达到进程间的同步及互斥。
内存映射:内存映射允许任何多个进程间通信每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它。
信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
套接字(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。
socket:网络进程间的通信
管道:本地进程间的通信:echo hello | grep e
信号: kill -9 PID 这种我们叫信号量级,也是本地进程间的通信
共享内存:每个操作系统里面共享内存多大,是物理内存的一半
- mnt名字空间
mnt 名字空间允许不同名字空间的进程看到的文件结构不同,这样每个名字空间 中的进程所看到的文件目录就被隔离开了。
- uts 名字空间
UTS(“UNIX Time-sharing System”) 名字空间允许每个容器拥有独立的 hostname 和 domain name, 使其在网络上可以被视作一个独立的节点而非主机上的一个进程。
- user 名字空间
每个容器可以有不同的用户和组 id, 也就是说可以在容器内用容器内部的用户执行程序而非主机上的用户。
镜像管理
搜索镜像:
这种方法只能用于官方镜像库
搜索基于 centos 操作系统的镜像
[root@yixuan ~]# docker search centos
按星级搜索镜像:
查找 star 数至少为 100 的镜像,默认不加 s 选项找出所有相关 centos 镜像:
[root@yixuan ~]## docker search centos -s 100
或者
[root@yixuan ~]## docker search ubuntu -f stars=100
拉取镜像:
# docker pull centos
注:没有加registry,默认是从docker.io下载的
[root@yixuan ~]# docker pull daocloud.io/library/tomcat:7
[root@yixuan ~]# docker pull daocloud.io/library/centos:6
查看本地镜像:
[root@yixuan ~]# docker image list
或者
[root@yixuan ~]# docker images
查看镜像详情:
[root@yixuan ~]# docker image inspect 镜像id
删除镜像:
删除一个或多个,多个之间用空格隔开,可以使用镜像名称或id
[root@yixuan ~]# docker rmi daocloud.io/library/mysql
或者
[root@yixuan ~]# docker rmi 81debc
参数解释:
rm Remove one or more containers ---移除一个或多个容器
rmi Remove one or more images ---删除一个或多个镜像
强制删除:–force
如果镜像正在被使用中可以使用--force强制删除
# docker rmi docker.io/ubuntu:latest --force
-f, --force Force removal of the image
注意: 容器运行中不能删除,将容器停止后,删除容器在删除镜像。
只查看所有镜像的id:
[root@yixuan ~]# docker images -q
98ebf73aba75
81debc95563d
d0957ffdf8a2
-q, --quiet
删除所有镜像:
[root@yixuan ~]# docker rmi $(docker images -q)
查看镜像制作的过程:
相当于dockfile
[root@yixuan ~]# docker history daocloud.io/library/nginx 使用镜像名或者镜像ID都可以
容器管理
创建新容器但不启动:
# docker create -it daocloud.io/library/centos:5 /bin/bash
创建并运行一个新Docker 容器:同一个镜像可以启动多个容器,每次执行run子命令都会运行一个全新的容器
# docker run -it --restart=always centos /bin/bash #最常用
-i :标准输入输出
-t:分配一个终端或控制台
--restart=always:容器随docker engine自启动,因为在重启docker的时候默认容器都会被关闭
也适用于create选项
-d 后台运行容器,并返回容器ID;
如果执行成功,说明CentOS 容器已经被启动,并且应该已经得到了 bash 提示符。
--rm:默认情况下,每个容器在退出时,它的文件系统也会保存下来.另一方面,也可以保存容器所产生的数据。但是当你仅仅需要短暂的运行一个容器,并且这些数据不需要保存,你可能就希望Docker能在容器结束时自动清理其所产生的数据。这个时候就需要--rm参数了。
注意:--rm 和 -d不能共用
容器名称
为容器分配一个名字,如果没有指定,docker会自动分配一个随机名称是 docker run子命令的参数
--name= Assign a name to the container
# docker run -it --name 名字 daocloud.io/centos:6 #名字自定义
如果你在执行docker run时没有指定–name,那么自动生成一个随机字符串UUID。这个UUID标识是由Docker deamon生成的。但是对于一个容器来说有个name会非常方便,当你需要连接其它容器时或者类似需要区分其它容器时,使用容器名称可以简化操作。无论容器运行在前台或者后台,这个名字都是有效的。
若要断开与容器的连接,并且关闭容器:容器内部执行如下命令
root@37b8b8cdd75f:/# exit
如果只想断开和容器的连接而不关闭容器:
快捷键:ctrl+p+q
查看容器:
1.只查看运行状态的容器:
#docker ps
2.-a 查看所有容器
#docker ps -a
3.只查看所有容器id:
# docker ps -a -q
查看容器详细信息:
inspect :用于查看容器的配置信息,包含容器名、环境变量、运行命令、主机配置、网络配置和数据卷配置等。
目标:查找某一个运行中容器的id,然后使用docker inspect命令查看容器的信息。
提示:可以使用容器id的前面部分,不需要完整的id。
[root@yixuan ~]# docker inspect bbdc71e #机器上运行的一个容器ID或者名称
[
{
"Id": "d95a220a498e352cbfbc098c949fc528dbf5a5c911710b108ea3a9b4aa3a4761",
"Created": "2017-07-08T03:59:16.18225183Z",
"Path": "bash",
"Args": [],
"State": {
"Status": "exited",
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 0,
容器信息很多,这里只粘贴了一部分
启动容器:
# docker start name #容器ID也可以
这里的名字是状态里面NAMES列列出的名字,这种方式同样会让容器运行在后台
关闭容器:
# docker stop name
# docker kill name --强制终止容器
杀死所有running状态的容器
# docker kill $(docker ps -q)
stop和kill的区别:
docker stop命令给容器中的进程发送SIGTERM信号,默认行为是会导致容器退出,当然,容器内程序可以捕获该信号并自行处理,例如可以选择忽略。而docker kill则是给容器的进程发送SIGKILL信号,该信号将会使容器必然退出。
删除容器:
# docker rm 容器id或名称
要删除一个运行中的容器,添加 -f 参数 --慎用。先stop在删除
根据格式删除所有容器:
# docker rm $(docker ps -qf status=exited)
-f:过滤
pause :暂停容器中所有的进程
unpause:恢复容器内暂停的进程,与pause对应
[root@yixuan ~]# docker pause c7
[root@yixuan ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3c0e0f43807d 98ebf73aba "/bin/bash" 7 minutes ago Up 7 minutes (Paused) 80/tcp c7
[root@yixuan ~]# docker unpause c7 #恢复
重启容器:
#docker restart name
让容器运行在后台:
# docker run -dit 镜像ID /bin/bash
-d后台运行必须要加-it
如果在docker run后面追加-d=true或者-d,那么容器将会运行在后台模式。此时所有I/O数据只能通过网络资源或者共享卷组来进行交互。因为容器不再监听你执行docker run的这个终端命令行窗口。但你可以通过执行
docker attach来重新附着到该容器的回话中。
[root@yixuan ~]# docker attach 容器ID/容器名字
注:
容器运行在后台模式下,是不能使用–rm选项的(老版本是这样,新版本已经可以同时生效)
rename —修改容器名称
[root@yixuan ~]# docker rename mytest testmy
[root@yixuan ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
774c02898fb1 daocloud.io/library/nginx "/bin/bash -c 'while…" 5 minutes ago Up About a minute 80/tcp testmy
stats
Display a live stream of container(s) resource usage statistics—显示容器资源使用统计信息的实时流
[root@yixuan ~]# docker stats
--当有容器在运行的时候动态显示容器的资源消耗情况,包括:CPU、内存、网络I/O
连接容器:前提是容器在运行状态中
方法1.attach
# docker attach 容器id #前提是容器创建时必须指定了交互shell
方法2.exec
通过exec命令可以创建两种任务:后台型任务和交互型任务
1.交互型任务:
[root@yixuan ~]# docker exec -it 容器id /bin/bash
root@68656158eb8e:/# ls
2.后台型任务:不进入容器里面执行命令
[root@yixuan ~]# docker exec 容器id touch /testfile
监控容器的运行:
可以使用logs、top、wait这些子命令
logs:使用logs命令查看守护式容器
可以通过使用docker logs命令来查看容器的运行日志,其中–tail选项可以指定查看最后几条日志,使用-f选项可以跟踪日志的输出,直到手动停止。
[root@yixuan ~]# docker pull daocloud.io/library/nginx
[root@yixuan ~]# docker images
[root@yixuan ~]# docker run -it --name nginx1 98ebf73 /bin/bash
root@8459191dbe7c:/# /usr/sbin/nginx #启动nginx
ctrl+p+q --- 退出
[root@yixuan ~]# docker inspect nginx1 #找到ip地址
[root@yixuan ~]# curl -I http://172.17.0.3 #宿主机访问容器可以访问成功
HTTP/1.1 200 OK
Server: nginx/1.17.1
Date: Mon, 09 Mar 2020 14:49:40 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 25 Jun 2019 12:19:45 GMT
Connection: keep-alive
ETag: "5d121161-264"
Accept-Ranges: bytes
[root@yixuan ~]# curl -I http://172.17.0.3 #继续测试访问
在开启一个终端:
[root@yixuan ~]# docker logs -f nginx1
root@8459191dbe7c:/# /usr/sbin/nginx
root@8459191dbe7c:/# 172.17.0.1 - - [09/Mar/2020:14:49:33 +0000] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.29.0" "-"
172.17.0.1 - - [09/Mar/2020:14:49:40 +0000] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.29.0" "-"
# docker logs --tail -2 App_Conainer
top:显示一个运行的容器里面的进程信息
[root@yixuan ~]# docker top nginx #容器ID也可以
wait :–捕捉容器停止时的退出码
执行此命令后,该命令会"hang"在当前终端,直到容器停止,此时,会打印出容器的退出码
在第一个终端执行停止容器命令
[root@yixuan ~]# docker stop nginx1
===============================
[root@yixuan ~]# docker wait 01d8aa #第二个终端操作
0
docker run 之后容器退出的状态码:
0,表示正常退出
非0,表示异常退出(退出状态码采用chroot标准)
125,Docker守护进程本身的错误
126,容器启动后,要执行的默认命令无法调用
127,容器启动后,要执行的默认命令不存在
宿主机和容器之间相互COPY文件
cp的用法如下:
Usage:
docker cp [OPTIONS] CONTAINER:PATH LOCALPATH --从容器拷贝到本机
docker cp [OPTIONS] LOCALPATH CONTAINER:PATH --从本机拷贝到容器
如:容器nginx中/usr/local/bin/存在test.sh文件,可如下方式copy到宿主机
[root@yixuan ~]# docker exec -it nginx /bin/bash
root@2a9a18b4a485:/# cd /usr/local/bin/
root@2a9a18b4a485:/usr/local/bin# touch test.sh
ctrl+p+q 退出
[root@yixuan ~]# docker cp mytest:/usr/local/bin/test.sh /root/
修改完毕后,将该文件重新copy回容器
[root@yixuan ~]# ls
anaconda-ks.cfg test.sh
[root@yixuan ~]# echo "123" >> test.sh
[root@yixuan ~]# docker cp /root/test.sh mytest:/usr/local/bin/
docker容器镜像制作
一、容器文件系统打包
将容器的文件系统打包成tar文件,也就是把正在运行的容器直接导出为tar包的镜像文件
export
Export a container’s filesystem as a tar archive
有两种方式:
第一种:
[root@yixuan ~]# docker ps #运行一个容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
96e2b7265d93 daocloud.io/library/centos:6 "/bin/bash" About an hour ago Up About an hour c6
[root@yixuan ~]# docker exec -it c6 /bin/bash
[root@96e2b7265d93 /]# vi a.txt #编辑一个文件
123
[root@96e2b7265d93 /]# yum install -y vim wget #安装一个软件
[root@yixuan ~]# docker export -o centos6-1.tar 96e2b726
-o, --output
[root@yixuan ~]# ls #保存到当前目录下
anaconda-ks.cfg centos6-1.tar
第二种:
[root@yixuan ~]# docker export 容器名称 > 镜像.ta
导入镜像归档文件到其他宿主机:
import
[root@yixuan ~]# docker import centos6-1.tar centos6-1:v1
sha256:b8414448c913259a28d623643a7b67a6c13da9b3259e70ee5febb16c2b0b1095
[root@yixuan ~]# docker images
[root@yixuan ~]# docker run -it --name c6.1 centos6-1:v1 /bin/bash
[root@4a29d58d3bd2 /]# ls
a.txt bin dev etc home lib lib64 lost+found media mnt opt proc root sbin selinux srv sys tmp usr var
[root@4a29d58d3bd2 /]# cat a.txt
123123
二、通过容器创建本地镜像
背景:容器运行起来后,又在里面做了一些操作,并且要把操作结果保存到镜像里
方案:使用 docker commit 指令,把一个正在运行的容器,直接提交为一个镜像。
commit 是提交的意思,类似告诉svn服务器我要生成一个新的版本。
例子:
在容器内部新建了一个文件
[root@yixuan ~]# docker run -it --name c7 daocloud.io/library/centos /bin/bash
[root@yixuan ~]# docker exec -it c7 /bin/bash
[root@2e8f79cb5922 /]# touch test.txt
# 将这个新建的文件提交到镜像中保存
[root@yixuan ~]# docker commit 2e8f79cb5922 soso/test:v2
sha256:2214bad66e9b1c2079dc89a2e14e997604237cd49a6dc6c29d84e915fbbeb5bd
[root@yixuan ~]# docker images
也可以这样例子:
# docker commit -m "my images version1" -a "soso" 108a85b1ed99 daocloud.io/ubuntu:v2
sha256:ffa8a185ee526a9b0d8772740231448a25855031f25c61c1b63077220469b057
-m 添加注释
-a 作者
108a85b1ed99 容器环境id
daocloud.io/ubuntu:v2 镜像名称:hub的名称/镜像名称:tag
-p,–pause=true 提交时暂停容器运行
镜像迁移
保存一台宿主机上的镜像为tar文件,然后可以导入到其他的宿主机上:
save
将镜像打包,与下面的load命令相对应
[root@yixuan ~]# docker save -o nginx.tar daocloud.io/library/nginx
load
与上面的save命令相对应,将上面sava命令打包的镜像通过load命令导入,(实验环境中原来机器上面有镜像可以先删除掉。)
[root@yixuan ~]# docker load < nginx.tar
[root@yixuan ~]# docker images
把容器导出成tar包 export import
把容器做成镜像 commit -a "" -m ""
把镜像保存为tar包 save load
像。
commit 是提交的意思,类似告诉svn服务器我要生成一个新的版本。
例子:
在容器内部新建了一个文件
[root@yixuan ~]# docker run -it --name c7 daocloud.io/library/centos /bin/bash
[root@yixuan ~]# docker exec -it c7 /bin/bash
[root@2e8f79cb5922 /]# touch test.txt
# 将这个新建的文件提交到镜像中保存
[root@yixuan ~]# docker commit 2e8f79cb5922 soso/test:v2
sha256:2214bad66e9b1c2079dc89a2e14e997604237cd49a6dc6c29d84e915fbbeb5bd
[root@yixuan ~]# docker images
也可以这样例子:
# docker commit -m "my images version1" -a "soso" 108a85b1ed99 daocloud.io/ubuntu:v2
sha256:ffa8a185ee526a9b0d8772740231448a25855031f25c61c1b63077220469b057
-m 添加注释
-a 作者
108a85b1ed99 容器环境id
daocloud.io/ubuntu:v2 镜像名称:hub的名称/镜像名称:tag
-p,–pause=true 提交时暂停容器运行
镜像迁移
保存一台宿主机上的镜像为tar文件,然后可以导入到其他的宿主机上:
save
将镜像打包,与下面的load命令相对应
[root@yixuan ~]# docker save -o nginx.tar daocloud.io/library/nginx
load
与上面的save命令相对应,将上面sava命令打包的镜像通过load命令导入,(实验环境中原来机器上面有镜像可以先删除掉。)
[root@yixuan ~]# docker load < nginx.tar
[root@yixuan ~]# docker images
把容器导出成tar包 export import
把容器做成镜像 commit -a "" -m ""
把镜像保存为tar包 save load