Docker 简介

Docker 简介 Docker 有一个守护程序,一直监听在套接字之上。 使用镜像的流程 从远程 registry 下载镜像,下载到本地后存储到 image 仓库中。然后通过后台的 libcontainer 引擎将镜像加载到容器中。 Docker 付费版和社区版 Docker-ee 是付费版,Docker-ce 是社区版,并且是免费版。 Docker 组成 Docker daemon 运行的守护进程 Docker client 客户端的运行 Docker registries 镜像仓库,最著名的有 Docker 官方的镜像仓库,但是本地用户也可以创建一个本地的镜像仓库。 镜像和容器的关系 镜像是静态的,容器是动态的,并且有生命周期。要想运行容器 Docker 的资源对象 images 镜像,支持增删改查 containers 容器,支持增删改查 networks 网络,单独支持增删改查 volumes 卷,增删改查 plugins 插件,增删改查 Docker 的安装 找到阿里云源或者是清华大学源,都会有 docker 的 yum 源 daemon.json 文件配置 https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file 官方网址 { "authorization-plugins": [], "data-root": "", "dns": [], "dns-opts": [], "dns-search": [], "exec-opts": [], "exec-root": "", "experimental": false, "features": {}, "storage-driver": "", "storage-opts": [], "labels": [], "live-restore": true, "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file":"5", "labels": "somelabel", "env": "os,customer" }, "mtu": 0, "pidfile": "", "cluster-store": "", "cluster-store-opts": {}, "cluster-advertise": "", "max-concurrent-downloads": 3, "max-concurrent-uploads": 5, "default-shm-size": "64M", "shutdown-timeout": 15, "debug": true, "hosts": [], "log-level": "", "tls": true, "tlsverify": true, "tlscacert": "", "tlscert": "", "tlskey": "", "swarm-default-advertise-addr": "", "api-cors-header": "", "selinux-enabled": false, "userns-remap": "", "group": "", "cgroup-parent": "", "default-ulimits": { "nofile": { "Name": "nofile", "Hard": 64000, "Soft": 64000 } }, "init": false, "init-path": "/usr/libexec/docker-init", "ipv6": false, "iptables": false, "ip-forward": false, "ip-masq": false, "userland-proxy": false, "userland-proxy-path": "/usr/libexec/docker-proxy", "ip": "0.0.0.0", "bridge": "", "bip": "", "fixed-cidr": "", "fixed-cidr-v6": "", "default-gateway": "", "default-gateway-v6": "", "icc": false, "raw-logs": false, "allow-nondistributable-artifacts": [], "registry-mirrors": [], "seccomp-profile": "", "insecure-registries": [], "no-new-privileges": false, "default-runtime": "runc", "oom-score-adjust": -500, "node-generic-resources": ["NVIDIA-GPU=UUID1", "NVIDIA-GPU=UUID2"], "runtimes": { "cc-runtime": { "path": "/usr/bin/cc-runtime" }, "custom": { "path": "/usr/local/bin/my-runc-replacement", "runtimeArgs": [ "--debug" ] } }, "default-address-pools":[ {"base":"172.80.0.0/16","size":24}, {"base":"172.90.0.0/16","size":24} ] } 指定 docker 版本下载 查看所有版本 [root@centos7_10 ~]# yum list docker-ce.x86_64 --showduplicates 指定下载 apt-get -y install docker-ce=5:18.09.9~3-0~ubuntu-bionic docker-ce-cli=5:18.09.9~3-0~ubuntu-bionic Docker 的进程 dockerd:服务器程序,被 client 直接访问,其父进程为宿主机的 systemd 守护进程 docker-proxy:每个进程 docker-proxy 实现对应一个需要网络通信的容器,管理宿主机和容器的之间端口映射,其父进程 dockerd,如果容器不需要网络则无需启动 containerd:被 dockerd 进程调用以实现与 runc 交互 containerd-shim:真正运行容器的载体,每个容器对应一个 container-shim 进程,其父进程为 containerd Docker 安装源配置 进入网站,下载 repo 源,然后将 repo 源中的源连接替换到repo 源中https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/ ...

November 10, 2020

Docker容器及管理

容器简介 容器就是镜像的运行时示例。正如从虚拟机模板启动 VM 一样,用户也同样可以从单个镜像上启动一个或多个容器。就像使用一个 OS 镜像在 VMware 装多个系统一样。 虚拟机与容器 虚拟机和容器最大的区别是容器更快更加便捷轻量 虚拟机是在操作系统上新建的一个操作系统,不与操作系统共享内核,有自己的操作系统和内核 容器是在操作系统上新建的容器,与操作系统共享内核 启动容器方法 docker container run 命令启动容器,该命令可以携带许多参数。 基础格式 docker container run <image> <app> 中,指定了启动所需的镜像以及要运行的应用。 docker container run -it ubuntu /bin/bash 启动某个 Ubuntu Linux 容器,运行 /bin/bash 作为应用进行启动 -it 参数可以将当前终端连接到容器的 shell 终端之上 容器随着启动运行应用程序的退出而终止。linux 容器会在 /bin/bash 退出后终止。简单的验证方法 docker container run -it [image] sleep 10 这条命令可以验证容器是根据运行在自己身上的应用来决定自己是否正在运行的。 docker container stop 停止容器正在运行的应用 docker container rm 删除容器正在运行的应用 容器和虚拟机 虚拟机与容器都是寄居在物理机上运行的。 虚拟机 虚拟机是将物理机的物理资源通过 Hypervisor 划分成多个 VM 小块并封装,在这个封装的 VM 环境中,安装自己单独的 OS 系统,并且可以在系统上安装相应的应用。一旦 Hypervisor 启动,那么就会占用所有的主机资源。虚拟机是将硬件的物理资源划分,在物理资源上直接创建的虚拟机系统,且整个架构可以装载自定义的操作系统 ...

October 25, 2020

Docker应用容器化

Docker 应用容器化简介 将应用整合到容器并且运行起来的这个过程,成为“容器化”(Containerizing),有时也叫做“docker 化” 容器是为应用而生的,具体来说,容器能够简化应用的构建、部署和运行过程。 容器是为应用而生的,具体来说容器能够简化应用的构建、部署和运行过程。 完整的应用容器化过程 编写应用代码 创建一个 dockerfile,其中包含当前应用的描述、依赖以及该如何运行这个应用 对该 Dockerfile 执行 docker image buuild 命令 等待 Docker 将应用程序构建到 Docker 镜像中 一旦完成了应用容器化(就是将一个应用打包成为一个 Docker 镜像),就能以镜像的形式交付并以容器的方式运行了。 1.获取应用代码 应用代码可以从网盘获取(https://pan.baidu.com/s/150UgIJPvuQUf0yO3KBLegg 提取码:pkx4) 安装解压工具 yum install unzip zip 解压后目录树 [root@centos7 wenjian1]# tree psweb-master/ psweb-master/ ├── app.js ├── circle.yml ├── Dockerfile ├── package.json ├── README.md ├── test │ ├── mocha.opts │ └── test.js └── views └── home.pug 该目录下包含了全部的应用源码,以及包含界面的单元测试的子目录。应用代码准备完成后开始准备 dockerfile 文件。 2. 分析 Dockerfile 如何区分指令是否会新建镜像层 基本原则,如果指令的作用是向镜像中添加新的文件或程序,那么这条指令就会新建镜像层,如果只是告诉 Docker 如何完成构建或者如何运行应用程序,那么就只会增加镜像的元数据。(查看 docker image history 指令中 SIZE字段不为零的指令都会新建镜像层) ...

October 25, 2020

Docker镜像及管理

Docker 镜像概念 可以把镜像理解为 VM 模板,VM 模板就像停止运行的 VM,而 Docker 就像停止运行的容器。就像一个静态的 OS 镜像。 首先需要从镜像仓库拉取镜像,然后使用**镜像可以启动多个容器。**镜像在内部看来有很多层级,但是在外部看来就是一个整体。在镜像中像是集成了一个小 OS,其中镜像中包含了许多必须依赖的内容。 在该前提下,镜像可以理解为一个构建时(build-time)结构,而容器可以理解为一个运行时(run-time)结构 镜像和容器 上图反映了镜像与容器之间的关系,如果镜像没有使用 docker container run 命令运行在容器中时,那么将可以随时删除。但是使用 docker container run 命令运行镜像到容器后,那么两个就会像绑定到一起一样。这时删除镜像将会有错误。 因为镜像正在容器中运行,所以时删除不了的,就类似于你的 OS 镜像在 VMware workstation 中挂载运行时,是无法删除挂载后的镜像的。 镜像的大小 镜像一般都比较小,一般的镜像会包含多个 shell 环境或者是一个 shell 环境,有些镜像为了节省空间只会创建一个 shell,并不会创建多个 shell。 并且镜像中是不包含内核的,会与宿主机共享内核来使用并运行该容器。 例如 ubuntu 的镜像,在官方网站上要近 10G,但是在 docker 镜像中,只需要 110M 就可以下载 Ubuntu 并可以使用该 Ubuntu 的环境。 Hyper-V 容器是个特例,他会运行在轻量级的 VM 上,同时利用 VM 内部的操作系统内核。 拉取镜像 Docker 主机安装之后,本地没有镜像。 通常情况下,镜像会从 Docker Hub 的仓库中拉取。docker image pull alpine:latest 命令会从 docker hub 的 alpine 仓库中拉取标签为 latest 的镜像。默认镜像会存储在 /var/lib/docker/ ...

October 24, 2020

Docker引擎

Docker 引擎简介 用来运行和管理容器的核心软件,通常人们会将其指为 docker 或 docker 平台。 基于开放容器计划(OCI)相关标准的要求,docker 引擎操用了模块化的设置原则,其组件是可替换的。 从多个角度来看,Docker 引擎就像汽车引擎——二者都是模块化的,并且由许多可交换的部件组成。 汽车引擎由许多专用的部件协同工作,从而使汽车可以行驶,例如进气管、节气门、气缸、火花塞、排气管等。 Docker 引擎由许多专用的工具协同工作,从而可以创建和运行容器,例如 API、执行驱动、运行时、shim 进程等。 Docker 引擎由如下主要的组件构成:Docker 客户端(Docker Client)、Docker 守护进程(Docker daemon)、containerd 以及 runc。它们共同负责容器的创建和运行。 Docker 首次发布时,Docker 引擎由两个核心组件构成:LXC 和 Docker daemon Docker daemon 是单一的二进制文件,包括诸如 Docker 客户端、Docker API、容器运行时、镜像构建等 LXC 提供了对注入命名空间(Namespace)和控制组(CGroup)等基础工具的操作能力,他们是基于内核的容器虚拟化技术 老版 docker 构成 摆脱 LXC 对 LXC 的依赖始终都是个问题。 首先,LXC 是基于 Linux 的。这对于一个立志于跨平台的项目来说是个问题。 其次,如此核心的组件依赖于外部工具,这会给项目带来巨大风险,甚至影响其发展。 因此,Docker 公司开发了名为 Libcontainer 的自研工具,用于替代LXC。 Libcontainer 的目标是成为与平台无关的工具,可基于不同内核为 Docker 上层提供必要的容器交互功能。 在 Docker 0.9 版本中,Libcontainer 取代 LXC 成为默认的执行驱动。 摒弃大而全的 Docker daemon docker daemon 是什么? docker daemon 是 docker 的守护进程 docker client 命令行与 docker daemon 通信,完成 docker 的相关操作。 ...

October 20, 2020

Docker存储驱动

Docker 存储驱动介绍 每个 Docker 容器都有一个本地存储空间,用于保存层叠的镜像层(image layer)以及挂载的容器文件系统。 默认情况下,容器所有的读写操作都发生在其镜像层或挂载的文件系统中,所以存储是每个容器的性能和稳定性不可或缺的一个环节。 以往,本地存储是通过存储驱动(Storage Driver)进行管理的,有时候也被称为 Graph Driver 或者 GraphDriver。 虽然存储驱动在上层抽象设计中都采用了栈式镜像层存储和写时复制(Copy-on-write)的设计思想,但是 Docker 在 linux 底层支持几种不同的存储驱动的具体实现,每一种实现方式都采用不同方法实现了镜像层和写时复制。 虽然底层实现的差异不影响用户与 Docker 之间的交互,但是对 Docker 的性能和稳定性至关重要。 Docker 在 linux 上的存储驱动 AUFS Overlay2 Device Mapper Btrfs —- 新版的文件系统,功能强大,支持 raid,以及使用量限制等 ZFS Docker 在 windows 的存储驱动 filter 存储驱动配置 修改存储驱动 可以通过修改 /etc/docker/daemon.json 文件来修改存储驱动 [root@centos7 docker]# cat daemon.json {"storage-driver":"overlay2"}, 找不到 daemon.json 文件的解决方法 官方说法,新创建一个即可 To configure the Docker daemon using a JSON file, create a file at /etc/docker/daemon.json on Linux systems, or C:\ProgramData\docker\config\daemon.json on Windows. On MacOS go to the whale in the taskbar > Preferences > Daemon > Advanced. 如果修改了正在运行 docker 主机的存储引擎类型,则现有的镜像和容器在重启后将不可用,这时因为每种存储驱动在主机上存储镜像层的位置是不同的(通常在 /var/lib/docker/ /… 目录下) ...

October 1, 2020

Docker简介安装

Docker 公司 公司位于旧金山,由法裔美籍开发者和企业家 Solumon Hykes 创立。 docker 公司刚开始是是一个提供产品即服务的提供商。底层上使用了 docker 技术,后来因为业务不景气,所以就将 docker 开源开来,公司火了,但是 docker 之父已经不在原来的公司工作了。 Docker 运行时与编排引擎 多数技术人员在说 docker 时,实际上就是指的 docker 引擎。 Docker 是用于运行和编排基础设施工具。有 vmware 管理经验的读者可以将其类比为 ESXi ESXi 是运行虚拟机的核心管理程序,而 docker 引擎是运行容器的核心容器运行时。 其他的产品或者是第三方的产品都是基于 docker 引擎进行开发和集成的。 存储引擎可以从 docker 网站下载,也可以基于 github 上的源码进行构建。无论是开源还是商业版都会有 linux 和 windows 版本。 docker 引擎主要有两个版本,一个是企业版(EE),一个是社区版(CE) EE 企业版会提供 12 个月的支持,而社区版每个版本只会支持 4 个月的支持。 版本号介绍 从 2017 年第一季度开始,Docker 版本号遵循 YY.MM-xx 格式,类似于 Ubuntu 等项目。例如,2018 年 6 月第一次发布的社区版本为 18.06.0-ce。 Docker 开源项目 Moby docker 的开源项目已经改名为 Moby,也就是与 CE 已经分离,这是 Moby 的最新 logo。 ...

October 1, 2020

运维人员对Docker的学习目标

掌握 Docker 的镜像下载,运行新的容器、登录新容器、再容器内运行命令,以及销毁容器。 当安装 Docker 的时候,会涉及两个主要组件:Docker 客户端和 Docker daemon。 daemon 实现了 Docker 引擎的 API 使用 Linux 默认安装时,客户端与 daemon 之间的通信是通过本地 IPC/UNIX Socket 完成的(/var/run/docker.sock);在 Windows 上是通过名为 npipe:////./pipe/docker_engine 的管道(pipe)完成的。 docker version 命令的使用 可以使用 docker version 命令来检测客户端和服务端是否已经正常运行并且可以相互通信 [root@centos7 ~]# docker version Client: Docker Engine - Community ---客户端响应 Version: 19.03.13 API version: 1.40 Go version: go1.13.15 Git commit: 4484c46d9d Built: Wed Sep 16 17:03:45 2020 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community ----服务端响应 Engine: Version: 19.03.13 API version: 1.40 (minimum version 1.12) Go version: go1.13.15 Git commit: 4484c46d9d Built: Wed Sep 16 17:02:21 2020 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.3.7 GitCommit: 8fba4e9a7d01810a393d5d25a3621dc101981175 runc: Version: 1.0.0-rc10 GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd docker-init: Version: 0.18.0 GitCommit: fec3683 成功获取来自客户端和服务端的响应。 ...

October 1, 2020