Docker基础入门实战

第1章          docker简介

1.1  what is Docker

Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源,源代码部署在GitHub上。

Docker是通过内核虚拟技术来提供容器的资源隔离与安全保障,由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,从而提高资源的利用率。

Docker的目标是实现轻量级的操作系统虚拟化解决方案。

1.2  Docker的工作模式

Docker对于操作者来说是C/S架构,但是Docker后端是一个非常耦合的架构,模块各司其职,并有机组合,支撑Docker的运行。

用户通过使用Docker ClientDocker Daemon建立通信,并发送请求给后者。

CLI(命令行)交互模型

image.png

RemoteAPI交互模式

image.png

1.3  Docker可以干些什么

q  8种应用场景

image.png

q  Simplifying Configuration

 简化配置:统一配置、通过镜像快速启动

q  Code Pipeline Management

 代码流水线管理:

 开发环境->测试环境->预生产环境->灰度发布->正式发布,docker在这里可以快速实现迁移

q  Developer Productivity

 提高开发效率:对开发人员来说,有了镜像,直接启动容器即可

q  App Isolation

 隔离应用:相对于虚拟机的完全隔离会占用资源,docker会比较节约资源

q  Server Consolidation

 服务器整合:同一台服务器可以跑多个docker容器,提高服务器的利用率

q  Debugging Capablities

 调试能力:Docker提供了很多的工具,提供了很多的功能,这些可以帮助调试bug

q  Multi-tenancy

 多租户:一个租户多个用户,类似于阿里云的一个projiect下多个用户

q  Rapid Deplovment

 快速部署:不需要启动操作系统,实现秒级部署

1.4 Docker8大开发模式

q  The Shared Base Container(s):共享基础容器

q  The Shared Volume Dev Container:共享卷开发容器

q  The Dev Tools Container:开发工具容器

q  The Test In A Different Environment containers:不同环境下测试容器

q  The Build Container:构建容器

q  The Installation Container:安装容器

q  The Default-Service-In-A-Box Containes:盒子中默认服务器容器

q  The Infrastructure/Glue Containers:基础设施/粘合剂容器

1.1  Docker9个基本事实

q  容器不同于虚拟机

q  容器不如虚拟机来的成熟

q  容器可以在几分之一秒内启动

q  容器已在大规模环境证明了自身的价值(比如在谷歌搜索中)

q  IT人员称容器为轻量级

q  容器引发安全方面的问题

q  Docker已成为容器的代名词,但他不是唯一的提供者

q  容器可以节省IT人力,加快更新

q  容器仍面临一些没有解决的问题

1.2  Why use Docker

q  更快速的交付和部署

q  更高效的虚拟化

q  更轻松的迁移和扩展

q  更简单的管理

1.1  DockerOpenStack的对比

类别

Docker

OpenStack

部署难度

极其简单

组件多,部署复杂

启动速度

秒级

分钟级

执行性能

和物理系统几乎一致

Vm会占用一些资源

镜像体积

镜像是MB级别

虚拟机镜像是GB级别

管理效率

管理简单

组件相互依赖,管理复杂

隔离性

隔离性高

彻底隔离

可管理性能

单进程、不建议启动ssh

完整的系统隔离

网络连接

比较弱

借助Neutron可以灵活组件各种网络结构

特别提示:有些场景是不适合用docker的,像前段的web服务,若使用docker则当docker挂掉时,里面不会像数据库那样有数据写入,这时就需要在重新启动启动一个docker

1.1  Docker3大核心概念

1.1.1        镜像(image

 Docker镜像就是一个只读的模板,例如一个镜像可以包含一个完整的操作系统环境,里面仅安装了Apache或用户需要的其他应用程序

 镜像可以用来创建容器,Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,并且用户甚至可以直接从其他人哪里下载一个已经做好的镜像来直接使用

1.1.2        容器(container

 Docker利用容器来运行应用,容器是从镜像创建的运行实例,他可以启动、停止、开始、删除,每个容器都是相互隔离的,保证平台的安全

 可以把容器看成一个简易版的linux系统和运行在其中的应用程序

 镜像是只读的,容器在启动的时候会创建一层可写层作为最上层

1.1.3        仓库(repository

 仓库就是集中存放镜像的地方,有时候会把仓库和仓库注册器混成一块,并不严格区分,仓库注册器上往往存放着多个仓库,每个仓库又包含了多个镜像,每个镜像又有不同的tag

 仓库分为公开仓库和私有仓库两种,最大的公开仓库是Docker Hub,提供了数量庞大的镜像供用户下载,国内的公开仓库包括Docker Pool等,可以提供大陆用户更稳定、更快的访问

第2章          Docker入门实战

2.1 系统环境

[root@docker ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@docker ~]# uname -r
3.10.0-693.11.6.el7.x86_64

2.2 安装及启动

[root@docker ~]# yum install -y docker   ==》安装
[root@docker ~]# systemctl  start docker   ==》启动
[root@docker ~]# systemctl  status docket  ==》查看状态信息
[root@docker ~]# systemctl enable docker  ==》加入开机自启动
[root@docker ~]# docker --version  ==》简略版本信息
Docker version 1.13.1, build dded712/1.13.1 
[root@docker ~]# docker version    ==》详细版本信息
Client:   ==》客户端信息
 Version:         1.13.1
 API version:     1.26
 Package version: docker-1.13.1-68.gitdded712.el7.centos.x86_64
 Go version:      go1.9.4
 Git commit:      dded712/1.13.1
 Built:           Tue Jul 17 18:34:48 2018
 OS/Arch:         linux/amd64
 
Server:  ==》服务端信息
 Version:         1.13.1
 API version:     1.26 (minimum version 1.12)
 Package version: docker-1.13.1-68.gitdded712.el7.centos.x86_64
 Go version:      go1.9.4
 Git commit:      dded712/1.13.1
 Built:           Tue Jul 17 18:34:48 2018
 OS/Arch:         linux/amd64
 Experimental:    false

2.3 docker镜像管理

2.3.1 search镜像

[root@docker ~]# docker search centos:6

2.3.2 push镜像

[root@docker ~]# docker pull centos:6

2.3.3 查看镜像

[root@docker ~]# docker images

2.3.4 导入/导出镜像


[root@docker ~]# docker save centos:6 >/opt/centos.tar.gz  ==》导出镜像
[root@docker ~]# docker load  </opt/centos.tar.gz  ==》导入镜像


2.3.5 删除镜像

[root@docker ~]# docker rmi $ IMAGE ID/$TAG

2.3.6 利用镜像创建容器

[root@docker ~]# docker run -it centos:6 /bin/bash

2.4 容器管理

2.4.1 新建容器


[root@docker ~]# docker run centos:6 /bin/echo "hehe" =》与在本地执行/bin/echo "hehe"一样
[root@docker ~]# docker run --name mydocker -it centos:6 /bin/bash =》启动一个bash终端,允许用户进行交互
--name:给容器定义名称
-i:让容器的标准输入保持打开
-t:Docker分配一个伪终端并绑定到容器的标准输入上


2.4.2 启动/停止容器


[root@docker ~]# docker start $NAMES/$CONTAINER ID
[root@docker ~]# docker stop $NAMES/$CONTAINER ID
[root@docker ~]# docker ps  ==》列出已经启动的容器
[root@docker ~]# docker ps –a  ==》列出所有容器,包括未启动的


2.4.3 删除容器


[root@docker ~]# docker rm $CONTAINER ID  ==》删除已经停止的容器
[root@docker ~]# docker rm -f  $CONTAINER ID  ==》删除正在运行的容器


2.4.4 进入容器

2.4.4.1 attach命令进入


[root@docker ~]# docker attach $CONTAINER ID
注意:该命令是系统自带的,并且启用attach命令有时候并不是特别的方便,当多个窗口同时attach到一个容器的时候,多有的窗口都会同步显示,当某个窗口因某个命令堵塞时,其他窗口也就无法再执行命令了,在退出容器时,该容器会自动停止


2.4.4.2 nsenter命令进入


[root@docker ~]# yum install -y util-linux  ==》安装nsenter
[root@docker ~]# docker inspect --format "{{.State.Pid}}" test ==》找到容器进程ID
[root@docker ~]# nsenter -t 19245 -u -i -m –p   ==》进入容器
-t, --target <pid>     target process to get namespaces from
指定容器的进程ID
-m, --mount[=<file>]   enter mount namespace
进入到mount namespace空间中
-u, --uts[=<file>]     enter UTS namespace (hostname etc)
进入到UTS namespace空间中
-i, --ipc[=<file>]     enter System V IPC namespace
进入到System V IPC namespace空间中
-n, --net[=<file>]     enter network namespace
进入到network namespace空间中
-p, --pid[=<file>]     enter pid namespace
进入到pid namespace空间


2.4.4.3 编写脚本快速进入容器

[root@docker scripts]# vim docker_in.sh
#/bin/bash
 
PID=$(docker inspect -f "{{.State.Pid}}" $1)
nsenter -t $PID -m -u -i -n -p