从虚拟机到容器
1.环境配置的难题
软件开发最大的麻烦事之一,就是环境配置。用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来?
用户必须保证两件事:操作系统的设置,各种库和组件的安装。只有它们都正确,软件才能运行。举例来说,安装一个 Python 应用,计算机必须有 Python 引擎,还必须有各种依赖,可能还要配置环境变量。
如果某些老旧的模块与当前环境不兼容,那就麻烦了。开发者常常会说:"它在我的机器可以跑了"(It works on my machine),言下之意就是,其他机器很可能跑不了。
环境配置如此麻烦,换一台机器,就要重来一次,旷日费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。
2.虚拟机
虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。
虽然用户可以通过虚拟机还原软件的原始环境。但是,这个方案有几个缺点。
- 资源占用多,虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运行。
- 冗余步骤多,虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。
- 启动慢,操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。
3.Linux 容器
由于虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。
Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。
由于容器是进程级别的,相比虚拟机有很多优势。
- 启动快,容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。
- 资源占用少,容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。
- 体积小,容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。
总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。
4.Docker
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
5.Window Wsl
Wsl安装:https://learn.microsoft.com/zh-cn/windows/wsl/install-manual
列出Wsl正在运行的组件:wsl -l -v --all
Docker实现原理简述
1.进程隔离—Namespace
Linux Namespace(Linux 命名空间)是 Linux 内核(Kernel)提供的功能,它可以隔离一系列的系统资源,如 PID(进程 ID,Process ID)、User ID、Network、文件系统等。
Linux Namespace是在当前运行的系统环境中创建(隔离)另一个进程的运行环境出来,并在此运行环境中将一些必要的系统全局资源进行【虚拟化】。进程可以运行在指定的namespace中,因此,namespace中的每个进程都认为自己拥有所有这些虚拟化的全局资源。
2.资源限制—Linux Cgroups
Docker 容器本质依旧是一个进程,多个 Docker 容器运行时,如果其中一个 Docker 进程占用大量 CPU 和内存就会导致其他 Docker 进程响应缓慢,为了避免这种情况,可以通过 Linux Cgroups 技术对资源进行限制。
Linux Cgroups(Linux Contorl Groups,简称 Cgroups)可以对一组进程及这些进程的子进程进行资源限制、控制和统计的能力,其中包括 CPU、内存、存储、网络、设备访问权限等,通过 Cgroups 可以很轻松的限制某个进程的资源占用并且统计该进程的实时使用情况。
Cgroups 由 3 个组件构成,分别是 cgroup(控制组)、subsystem(子系统)以及 hierarchy(层级树),3 者相互协同作用。
- cgroup 是对进程分组管理的一种机制,一个 cgroup 通常包含一组(多个)进程,Cgroups 中的资源控制都以 cgroup 为单位实现。
- subsystem 是一组(多个)资源控制的模块,每个 subsystem 会管理到某个 cgroup 上,对该 cgroup 中的进程做出相应的限制和控制。
- hierarchy 会将一组(多个)cgroup 构建成一个树状结构,Cgropus 可以利用该结构实现继承等功能
3.分层结构—Union File System
Docker 镜像是一种分层结构,每一层构建在其他层之上,从而实现增量增加内容的功能。
Union File System(简称,UnionFS),它是为 Linux 系统设计的将其他文件系统联合到一个联合挂载点的文件系统服务。UnionFS 使用 branch(分支)将不同文件系统的文件和目录透明地叠加覆盖,形成一个单一一致的文件系统,此外 UnionFS 使用写时复制(Copy on Write,简称,CoW)技术来提高合并后文件系统的资源利用。
Docker 架构
1.基本概念
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。
2.概念组成
- Docker 镜像(Images)是用于创建 Docker 容器的模板,比如 Ubuntu 系统。
- Docker 容器(Container)是独立运行的一个或一组应用,是镜像运行时的实体。
- Docker 客户端(Client)通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。
- Docker 主机(Host)是一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
- Docker Registry用来保存镜像,可以理解为代码控制中的代码仓库。
- Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
- Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。
Docker入门
官方文档
Docker Engine:https://docs.docker.com/engine/,Docker核心
Docker Desktop:https://docs.docker.com/desktop/,可视化操作。
Docker Composer:https://docs.docker.com/compose/,编排容器。
拓展
Window Linux子系统:https://docs.microsoft.com/zh-cn/windows/dev-environment/
1.Docker安装
官方文档上有详细的说明,这里以centos7.6作为操作实例。(https://docs.docker.com/engine/install/centos/)
官方建议如果安装过旧版本,先卸载后安装。旧版docker-engine现在被称为docker-ce.
# 这个可以理解为字符串换行连接符
$ sudo yum remove docker docker-client docker-client-latest docker-common
docker-latest docker-latest-logrotate docker-logrotate docker-engine
然后配置yum仓库源,命令行开始:
# 安装yum-utils,一般都有装
$ yum install -y yum-utils
# 配置仓库源
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
开始安装最新版本的 Docker Engine、containerd 和 Docker Compose
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
此命令会安装 Docker,但不会启动 Docker。它还会创建一个 docker组,但是默认情况下它不会将任何用户添加到该组中。
安装完成,查看docker版本信息,命令如下:
$ docker version
# 或者
$ docker info
启动docker ,命令如下:
# service 命令的用法
$ sudo service docker start
# systemctl 命令的用法
$ sudo systemctl start docker
# 测试安装是否正常
$ docker run hello-world
提示
docker --help 、docker command --help,查看命令的功能说明
镜像image
Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码,运行时(一个程序在运行或者在被执行的依赖)、库,环境变量和配置文件。其实也可以理解为一个文件目录
image 是二进制文件。实际开发中,一个 image 文件往往通过继承另一个 image 文件,加上一些个性化设置而生成。举例来说,你可以在 Ubuntu 的 image 基础上,往里面加入 Apache 服务器,形成你的 image。
image 文件是通用的,一台机器的 image 文件拷贝到另一台机器,照样可以使用。一般来说,为了节省时间,我们应该尽量使用别人制作好的 image 文件,而不是自己制作。即使要定制,也应该基于别人的 image 文件进行加工,而不是从零开始制作。
为了方便共享,image 文件制作完成后,可以上传到网上的仓库。Docker 的官方仓库 Docker Hub 是最重要、最常用的 image 仓库。此外,出售自己制作的 image 文件也是可以的。
相关参考
https://blog.csdn.net/sinat_33087001/article/details/123029844
镜像仓库
1.修改镜像仓库源
添加镜像仓库之后下载镜像时会先从镜像仓库进行下载;
以centos为例,编辑/etc/docker/daemon.json文件;
{
"registry-mirrors": ["https://alzgoonw.mirror.aliyuncs.com"]
}
然后重启docker:
# 重载配置
$ systemctl daemon-reload
# 重启docker
$ systemctl restart docker
# 查看docker信息
$ docker info
Window Docker Desktop:
- 打开Docker Desktop应用程序。
- 点击屏幕右上角的齿轮图标,打开设置菜单。
- 在左侧导航栏中选择"Docker Engine"选项。
- 在编辑器中找到或创建一个JSON配置文件。如果已经存在,请确保它是可编辑状态。
- 在JSON配置文件中,添加或修改registry-mirrors键的值。将其设置为你想要使用的镜像源地址。如果你想同时使用多个镜像源,可以在该键的值中提供一个逗号分隔的列表。
- 例如,假设你要使用阿里云的镜像源,你可以将registry-mirrors设置为:"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
- 保存并关闭配置文件。
- 重新启动Docker Desktop,以使配置更改生效。
2.登录仓库 docker login
登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub(https://hub.docker.com/)
# 登录,不指定地址,默认为官方仓库
$ docker login -u 用户名 -p 密码
3.退出登录 docker logout
# 退出指定仓库的登录
$ docker logout [OPTIONS] [SERVER]
4.搜索镜像 docker search
我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个 openresty的镜像来作为我们的 web 服务。我们可以通过 docker search 命令搜索 openresty来寻找适合我们的镜像。
[root@VM-0-11-centos ~]# docker search Openresty
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
openresty/openresty OpenResty Official Docker Images - a dynamic… 370 [OK]
ficusio/openresty Minimalist OpenResty image 22 [OK]
3scale/openresty Latest Openresty with redis and some handy p… 16 [OK]
- NAME: 镜像仓库源的名称
- DESCRIPTION: 镜像的描述
- OFFICIAL: 是否 docker 官方发布
- stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
- AUTOMATED: 自动构建。
5.拉取镜像 docker pull
# 拉取指定的镜像(name为上方镜像仓库源名称)
# -a :拉取所有 tagged 镜像
# name可以是一个在仓库存在的镜像名,也可以是代表镜像的一个远程地址
$ docker pull [OPTIONS] NAME[:TAG|@DIGEST]
6.上传仓库 docker push
用于将本地的镜像上传到镜像仓库,要先登陆到镜像仓库。
# docker push [OPTIONS] NAME[:TAG]
# 上传本地镜像myapache:v1到镜像仓库中。
$ docker push myapache:v1
# OPTIONS --disable-content-trust :忽略镜像的校验,默认开启
向指定远程仓库推送镜像
# 在本地登录到远程仓库:
$ docker login --username=[用户名] -p=[密码] 远程ip:端口
# 给本地镜像打标签, [远程ip:端口/自定义路径/*]:[版本号] 就是:[标签名:版本号]
$ docker tag [镜像id:标签] [远程ip:端口/自定义路径/*]:[版本号]
# 推送
$ docker push [远程ip:端口/自定义路径/*]:[版本号]
实际操作:
$ docker tag hello-world daocloud.io/zter/hello-world:v1
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 9 weeks ago 1.84 kB
hello-world v1 fce289e99eb9 9 weeks ago 1.84 kB
hello-world v2 fce289e99eb9 9 weeks ago 1.84 kB
daocloud.io/zter/hello-world v1 fce289e99eb9 9 weeks ago 1.84 kB
$ docker push daocloud.io/zter/hello-world:v1
The push refers to a repository [daocloud.io/zter/hello-world]
af0b15c8625b: Pushed
v1: digest: sha256:39bbd4a41b5d3b164632d3b4a295c0db31139992a8fe985f949dac7ccff7aa54 size: 524
本地镜像管理
1.查看镜像列表 docker images
docker images [OPTIONS] [REPOSITORY[:TAG]]
OPTIONS说明:
- -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
- --digests :显示镜像的摘要信息;
- -f :显示满足条件的镜像;
- --format :指定返回值的模板文件;
- --no-trunc :显示完整的镜像信息;
- -q :只显示镜像ID。
[root@VM-0-11-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 9 months ago 13.3kB
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
2.删除镜像 docker rmi
# 删除指定镜像
$ docker rmi name
3.创建历史 docker history
$ docker history [OPTIONS] IMAGE
OPTIONS说明:
- -H :以可读的格式打印镜像大小和日期,默认为true;
- --no-trunc :显示完整的提交记录;
- -q :仅列出提交记录ID。
# 查看本地镜像nice/ubuntu:v3的创建历史。
$ docker history nice/ubuntu:v3
4.镜像归档 dcoker save
$ docker save [OPTIONS] IMAGE [IMAGE...]
OPTIONS 说明:
- -o :输出到的文件。
# 将镜像 runoob/ubuntu:v3 生成 my_ubuntu_v3.tar 文档
$ docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3
经过测试,导出镜像可以,导出容器不行
导出时通过参数-o指定的值必须是一个文件名,不能是目录名。
5.镜像导入 dcoker load
导入使用 docker save 命令导出的镜像。
$ docker load [OPTIONS]
OPTIONS 说明:
- --input , -i : 指定导入的文件,代替 STDIN。
- --quiet , -q : 精简输出信息。
6.镜像标签 docker tag
标记本地镜像,将其归入某一仓库。
$ docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
$ docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
容器生命周期
1.创建容器 docker create
# 创建一个容器,类似 docker run -d 命令
$ docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
docker create 创建的容器并未实际启动,还需要执行 docker start 命令或 docker run 命令以启动容器。docker create 命令常用于在启动容器之前进行必要的设置。 参数类似run。
2.容器运行 docker run
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
- -d, --detach=false 指定容器运行于前台还是后台,默认为 false。
- -i, --interactive=false 打开 STDIN,用于控制台交互。
- -t, --tty=false 分配 tty 设备,该可以支持终端登录,默认为 false。
- -u, --user="" 指定容器的用户。
- -a, --attach=[] 登录容器(必须是以 docker run -d 启动的容器)。
- -w, --workdir="" 指定容器的工作目录。
- -c, --cpu-shares=0 设置容器 CPU 权重,在 CPU 共享场景使用。
- -e, --env=[] 指定环境变量,容器中可以使用该环境变量。
- -m, --memory="" 指定容器的内存上限。
- -P, --publish-all=false 指定容器暴露的端口。
- -p, --publish=[] 指定容器暴露的端口。
- -h, --hostname="" 指定容器的主机名。
- -v, --volume=[] 给容器挂载存储卷,挂载到容器的某个目录。(-v 主机目录:容器目录)
- - -volumes-from=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录。
- - -cap-add=[] 添加权限。
- - -cap-drop=[] 删除权限。
- - -cidfile="" 运行容器后,在指定文件中写入容器 PID 值,一种典型的监控系统用法。
- - -cpuset="" 设置容器可以使用哪些 CPU,此参数可以用来容器独占 CPU。
- - -device=[] 添加主机设备给容器,相当于设备直通。
- - -dns=[] 指定容器的 dns 服务器。
- - -dns-search=[] 指定容器的 dns 搜索域名,写入到容器的 /etc/resolv.conf 文件。
- - -entrypoint="" 覆盖 image 的入口点。
- - -env-file=[] 指定环境变量文件,文件格式为每行一个环境变量。
- - -expose=[] 指定容器暴露的端口,即修改镜像的暴露端口。
- - -link=[] 指定容器间的关联,使用其他容器的 IP、env 等信息。
- - -lxc-conf=[] 指定容器的配置文件,只有在指定 --exec-driver=lxc 时使用。
- - -name="" 指定容器名字,后续可以通过名字进行容器管理,links 特性需要使用名字。
- - -network=“bridge” 器网络设置,
bridge
使用 docker daemon 指定的网桥;host
容器使用主机的网络;container:NAME_or_ID
使用其他容器的网路,共享 IP 和 PORT 等网络资源;none
容器使用自己的网络(类似- -network=bridge),但是不进行配置。 - - -privileged=false 指定容器是否为特权容器,特权容器拥有所有的 capabilities。
- -restart=“no” 指定容器停止后的重启策略: no:容器退出时不重启,on-failure:容器故障退出(返回值非零)时重启, always:容器退出时总是重启。 - - -rm=false 指定容器停止后自动删除容器(不支持以 docker run -d 启动的容器)。
- - -sig-proxy=true 设置由代理接受并处理信号,但是 SIGCHLD、SIGSTOP 和 SIGKILL 不能被代理。
示例:
docker run -idt -v /:/home/lnmp --network host centos:centos7 /bin/bash
COMMAND、ARG...
代表容器运行之后,要执行的命令行命令和参数
# 运行容器,并进入bash
$ docker run -it nginx:latest /bin/bash
3.启动容器docker start
$ docker start [OPTIONS] CONTAINER [CONTAINER...]
Options:
- -a, --attach ,连接容器的标准输出、标准错误
- --detach-keys,覆盖分离容器的键的顺序
- -i, --interactive,连接容器的标准输入
4.停止容器 docker stop
$ docker stop [OPTIONS] CONTAINER [CONTAINER...]
Options:
- -t, --time ,在停止之前等待的秒数,默认为10s;
5.重启容器docker restart
$ docker restart contanier
6.强制停止 docker kill
$ docker kill container
7.删除容器 docker rm
docker rm [OPTIONS] CONTAINER [CONTAINER...]
Option参数:
- -f 通过 SIGKILL 信号强制删除一个运行中的容器。
- -l 移除容器间的网络连接,而非容器本身。
- -v:-v 删除与容器关联的卷。
8.暂停、恢复 docker pause/unpause
暂停、恢复容器内的进程的运行。
$ docker pause CONTAINER [CONTAINER...]
$ docker unpause CONTAINER [CONTAINER...]
9.执行命令 docker exec
docker exec 用于在一个运行中的容器内执行command。
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
OPTIONS说明:
- --detach, -d 后台运行模式,在后台执行命令相关命令。
- --detach-keys 覆盖容器后台运行的一些参数信息。
- --env, -e 设置环境变量。
- --interactive, -i 展示容器输入信息 STDIN。
- --privileged 为命令提供一些扩展权限。
- --tty, -t 命令行交互模式。
- --user, -u 设置用户名。
# 在指定容器打开一个bash环境的交互式终端
$ docker exec -i -t mynginx /bin/bash
容器运维
1.列出容器 docker ps
$ docker ps [OPTIONS]
OPTIONS说明:
- 无参 默认显示正在运行的容器。
- -a 显示所有的容器,包括未运行的。
- -f 根据条件过滤显示的内容。
- - -format 指定返回值的模板文件。
- -l 显示最近创建的容器。
- -n 列出最近创建的n个容器。
- - -no-trunc 不截断输出。
- -q 静默模式,只显示容器编号。
- -s 显示总的文件大小。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- CONTAINER ID: 容器 ID。
- IMAGE: 使用的镜像。
- COMMAND: 启动容器时运行的命令。
- CREATED: 容器的创建时间。
- STATUS: 容器状态。状态有7种:created(已创建)、restarting(重启中)、running(运行中)、removing(迁移中)、paused(暂停)、exited(停止)、dead(死亡)
- PORTS: 容器的端口信息和使用的连接类型(tcpudp)。
- NAMES: 自动分配的容器名称。
2.查看容器内正在运行的进程信息
容器运行时不一定有/bin/bash终端来交互执行top命令,而且容器还不一定有top命令,可以使用docker top来实现查看container中正在运行的进程
$ docker top CONTAINER [ps OPTIONS]
3.连接容器 docker attach
关联容器的标准输入、标准输出、错误输出到容器到本机
$ docker attach [OPTIONS] CONTAINER
options 说明
- --detach-keys 覆盖用于分离容器的键序列
- --no-stdin 不要附加标准输入
- --sig-proxy 所有接收到的信号代理到进程
4.阻塞容器 docker wait
阻塞容器运行,直到容器停止运行,同时输出退出的状态码,通过状态码判断容器的退出状态。
$ docker wait CONTAINER [CONTAINER...]
5.端口映射 docker port
docker port 命令可以用于列出指定的 Docker容器 的端口映射,或者将容器里的端口映射到宿主机。该命令后面的 CONTAINER 可以是容器Id,或者是容器名。
$ docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]]
$ docker port mysql
$ docker port mysql 3306/tcp
6.元数据 docker inspect
$ docker inspect [OPTIONS] NAME|ID [NAME|ID...]
OPTIONS说明:
- -f 指定返回值的模板文件。
- -s 显示总的文件大小。
- - -type 为指定类型返回JSON。
7.容器重命名 docker rename
$ docker rename CONTAINER NEW_NAME
8.统计 docker stats
docker stats 命令可以用于动态显示 Docker容器 的资源消耗情况,包括:CPU、内存、网络I/O。docker stats命令也可以指定已停止的容器,但是不会返回任何信息。
docker stats [options] [container...]
OPTIONS参数:
- - -all, -a 查看所有容器信息(默认显示运行中的)。
- - -format Go模板展示镜像信息。
- - -no-stream 不展示容器的一些动态信息。
9.更新配置docker update
docker update [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS说明:
- - -cpu-shares 更新 cpu-shares。
- - -kernel-memory 更新内核内存限制。
- - -memory 更新内存限制。
- - -restart 更新重启策略。
10.容器导出 docker export
将 Docker容器 里的文件系统作为一个 tar 归档文件导出。docker export 命令后面的 CONTAINER 可以是容器Id,或者是容器名。
$ docker export [OPTIONS] CONTAINER
OPTIONS说明:
- -o 将输入内容写到文件。
11.导入镜像 docker import
用于导入export导出的镜像归档文件。
$ docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
$ docker images nicen/ubuntu:v4
区别、侧重点
参考
https://blog.csdn.net/JineD/article/details/118761569
1.docker save和docker export的区别
- docker save保存的是镜像(image)
- docker export保存的是容器(container)
2.docker load和docker import的区别
- docker load用来载入镜像包;
- docker import用来载入容器包,但两者都会恢复为镜像;
- docker load不能对载入的镜像重命名;
- docker import可以为镜像指定新名称。;
3.打包镜像和打包容器的区别
从文件的角度来说,打包容器仅仅会打包容器的当前状态(类似服务器快照),会丢弃所有的历史记录和元数据信息。而打包镜像则是导出完整的历史记录和元信息。
Docker日志
1.实时事件 docker events
从服务器获取实时事件
docker events [OPTIONS]
OPTIONS说明:
- -f :根据条件过滤事件;
- --since :从指定的时间戳后显示所有事件;
- --until :流水时间显示到指定的时间为止;
2.历史版本 dcoker history
打印出指定的 Docker镜像 的历史版本信息。
docker history [OPTIONS] IMAGE
OPTIONS说明:
- docker history -H, --human 以可读的格式打印镜像大小和日期,默认为 true。
- docker history --no-trunc 显示完整的提交记录。
- docker history -q, --quiet 仅列出提交记录 ID。
3.输出日志 docker log
获取容器运行时输出的日志信息
docker logs [OPTIONS] CONTAINER
- docker logs --details 显示 log 信息的额外的详细信息。docker logs -f, --follow 跟踪日志输出。docker logs --since 显示某个开始时间的所有日志。docker logs --tail 仅列出最新 N 条容器日志。
- docker logs -t, --timestamps 显示时间戳。
Docker rootfs命令
1.docker commit
docker commit 命令用于根据 Docker容器 的更改创建一个新的 Docker镜像。该命令后面的 CONTAINER 可以是容器Id,或者是容器名。
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
OPTIONS说明:
- -a, --author string 作者。
- -c, --change list 应用 dockerfile 指令来创建图像。
- -m, --message string 提交信息。
- -p, --pause 提交期间暂停容器(默认为true)。
2.docker cp
# 从容器复制到宿主机
$ docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
# 从宿主机复制到容器
$ docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
OPTIONS说明:
- -a, --archive 归档模式(复制所有UID / GID信息)
- -L, --follow-link 总是跟在源地址符号链接
命令说明
- docker cp 命令类似于 Linux 中的 cp -a 命令,递归复制目录下的所有子目录和文件。
- docker cp 命令中的 - 表示通过标准输入/输出设备以流的方式读取或写入 tar 文件。
- 本地文件系统中的路径可以是绝对路径,也可以是相对路径,相对于当前命令执行的路径。
- 容器中的路径都是相对容器的 / 根路径。
- docker cp 命令操作的容器可以是在运行状态,也可以是停止状态。
- docker cp 命令不能复制 /proc、 /sys、 /dev、 tmpfs 和容器中 mount 的路径下的文件。
3.docker diff
docker diff 命令用于比较一个 Docker容器 不同版本提交的文件差异。该命令后面的 CONTAINER 可以是容器Id,或者是容器名。
docker diff命令会列出 3 种容器内文件状态变化(A - Add, D - Delete, C - Change )的列表清单。
$ docker diff CONTAINER
制作镜像
1.docker build
docker build 命令可以用来使用 Dockerfile 创建镜像。
$ docker build [OPTIONS] PATH | URL | -
相关文档:https://www.runoob.com/docker/docker-build-command.html、https://www.runoob.com/docker/docker-dockerfile.html
2.docker Dockerfile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
相关说明:https://www.runoob.com/docker/docker-dockerfile.html
3.docker composer
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
相关说明:https://www.runoob.com/docker/docker-compose.html
Docker容器网络
原文
https://blog.csdn.net/qq_42418169/article/details/119102917
1.介绍
容器网络实质上也是由Docker为应用程序所创造的虚拟环境的一部分,它能让应用从宿主机操作系统的网络环境中独立出来,形成容器自有的网络设备、IP协议栈、端口套接字、IP路由表、防火墙等等与网络相关的模块。
Docker
Docker网络中有三个核心概念:沙盒(Sandbox)、网络(Network)、端点(Endpoint)。
- 沙盒,提供了容器的虚拟网络栈,也即端口套接字、IP路由表、防火墙等内容。隔离容器网络与宿主机网络,形成了完全独立的容器网络环境。
- 网络,可以理解为Docker内部的虚拟子网,网络内的参与者相互可见并能够进行通讯。Docker的虚拟网络和宿主机网络是存在隔离关系的,其目的主要是形成容器间的安全通讯环境。
- 端点,位于容器或网络隔离墙之上的洞,主要目的是形成一个可以控制的突破封闭的网络环境的出入口。当容器的端点与网络的端点形成配对后,就如同在这两者之间搭建了桥梁,便能够进行数据传输了。
这三者形成Docker网络核心模型,也就是容器网络模型(Container Network Model)。
2.Docker的网络实现
容器网络模型为容器引擎提供了一套标准的网络对接范式,Docker中,实现这套范式的是Docker所封装的libnetwork模块。
Docker官方提供了五种Docker网络驱动,分别是:Bridge Driver、Host Driver、Overlay Driver、MacLan Driver、None Driver。Bridge和 Overlay在开发中使用频率较高。
- host(主机模式) 相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址
- bridge(桥梁模式) 相当于Vmware中的Nat模式,容器使用独立network Namespace,并连接到docker0虚拟网卡(默认模式)。
- overlay(覆盖模式) Overlay网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文之上的新的数据格式。
- container(容器模式) 在理解了host模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
- none(无网络模式) 该模式将容器放置在它自己的网络栈中,但是并不进行任何配置。实际上,该模式关闭了容器的网络功能,在以下两种情况下是有用的:容器并不需要网络(例如只需要写磁盘卷的批处理任务)。
3.默认网络(docker 0)
当你安装Docker时,它会自动创建三个网络。你可以使用docker network ls命令列出这些网络:
C:UsersAdmin>docker network ls
NETWORK ID NAME DRIVER SCOPE
ff3025b2bb75 bridge bridge local
4db4c96b8fad host host local
075e1e639650 none null local
Docker内置这三个网络,运行容器时,你可以在run运行容器时使用--network
标志来指定容器应连接到哪个网络。
不指定network时,默认将容器连接到bridge网络。
4.host网络模式
相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。
Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。
一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
5.bridge网络模式
相当于Vmware中的Nat模式,容器使用独立network Namespace,并连接到docker0虚拟网卡(默认模式)。通过docker0网桥以及Iptables nat表配置与宿主机通信;bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。
Docker 默认的 bridge 网络是不支持通过 Docker DNS 服务进行域名解析的,自定义桥接网络是可以的。
5.1Bridge模式的拓扑
当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。
虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配IP了,Docker会从RFC1918所定义的私有IP网段中,选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从这个子网中选择一个未占用的IP使用。
如一般Docker会使用172.17.0.0/16这个网段,并将172.17.0.1/16分配给docker0网桥(在主机上使用ifconfig命令是可以看到docker0的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)。单机环境下的网络拓扑如下,主机地址为10.10.0.186/24。
Dokcer
Docker完成以上网络配置的过程大致是这样的:
- 在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。
- Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在主机中,以veth65f9这样类似的名字命名,并将这个网络设备加入到docker0网桥中
- 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。
6.docker overlay模式
Overlay网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文之上的新的数据格式。这样不但能够充分利用成熟的IP路由协议进程数据分发;而且在Overlay技术中采用扩展的隔离标识位数,能够突破VLAN的4000数量限制支持高达16M的用户,并在必要时可将广播流量转化为组播流量,避免广播数据泛滥。
因此,Overlay网络实际上是目前最主流的容器跨节点数据传输和路由方案。
要想使用Docker原生Overlay网络,需要满足下列任意条件
- Docker 运行在Swarm
- 使用键值存储的Docker主机集群
Docker Network
docker network inspect # 根据网络的ID展示网络的详细信息
docker network ls # 展示所有的网络,以列表形式
docker network create # 创建一个自定义网络
docker network connect # 连接一个容器到指定网络上
docker network disconnect # 让一个容器从指定网络上断开
docker network prune # 删除所有未使用的网络
docker network rm # 根据网络的ID,删除一个或多个网络
Docker Machine
Docker Machine 是 Docker 官方提供的一个工具,它可以帮助我们在远程的机器上安装 Docker,或者在虚拟机 host 上直接安装虚拟机并在虚拟机中安装 Docker。我们还可以通过 docker-machine 命令来管理这些虚拟机和 Docker。