Docker

目录

一、定义

二、意义

三、Docker的使用场景

四、Docker 引擎(Docker Engine)

五、Docker的架构( Docker architecture )

六、名称空间(Namespaces )

七、docker run

八、控制组

九、部署docker

1.安装依赖包

2.设置阿里云镜像源

3.安装docker-ce社区版

4.环境配置

5.设置镜像加速

6.网络优化

7.docker镜像操作

十、容器操作


一、定义

        Docker是一个用于开发,交付和运行应用程序的开放平台。Docker能够将应用程序与基础架构分开,从而可以快速交付软件。
        是一个开源的应用容器引擎,让开发者可以打包大门的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或者Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
        沙箱(Sandbox):在计算机安全领域,沙箱是一种程序的隔离运行机制。Docker在2013年一炮而红, 直到现在,已经成为容器技术的代名词。
        Docker从一开始就以提供标准化的运行时环境为目标,真正做到“build once, run anywhere" 可以将同一个构建版本用于开发、测试、预发布、生产等任何环境,并且做到了与底层操作系统的解耦。在此基础上还进一步发展出了 Caas (容器即服务)技术。

        2013年,发布了docker,把容器化技术做成了标准化平台。

Dcoker是基于容器技术的轻量级虚拟化解决方案
        docker是容器引擎,把linux的cgroup、 namespaces 等容器底层技术进行完美的封装、并抽象为用户提供创建和管理容器的便捷界面(命令行C1i、api等) C/S。

二、意义

docker引擎统一了基础设施环境-docker容器环境(引擎)
docker引擎统一了程序打包(装箱)方式-docker 镜像
docker引擎统一了程序部署(运行)方式-docker容器
镜像→封装的某一个时刻的服务/应用状态
容器→应用跑起来的状态(正常提供服务的状态-运行时)

三、Docker的使用场景

K8S image镜像+ container容器的方式
war jar→github gitlab 私有仓库(代码仓库)→jenkins (测试)
(应用程序封装/构建镜像)→运维下载,使用容器技术进行运行/发布

         打包应用程序简单部署,可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解
耦),例如:服务器从腾讯云迁移到阿里云,持续集成和持续交付(CI/CD) :开发到测试发布
         部署微服务,提供PAAS产品(平台即服务) {OpenStack 的云主机类似于阿里云的ECS,属于IAAS、Docker (K8S) 属于PAAS}。

docker 三要素
镜像→模板
容器→基于镜像,运行状态/运行时状态
仓库→存放镜像模板

四、Docker 引擎(Docker Engine)

Docker Engine是具有以下主要组件的客户端-服务器应用程序:
服务器是一种 长期运行的程序,称为守护程序进程( dockerd 命令)。
REST  API,它指定程序可以用来与守护程序进行通信并指示其操作的接口。
命令行界面(CLI) 客户端(docker 命令)

五、Docker的架构( Docker architecture )

        Docker使用客户端-服务器架构。Docker 客户端与Docker守护进程进行对话,该守护进程完成了构建,运行和分发Docker容器的繁重工作。
       Docker区别于传统的虚拟化,不需要虚拟硬件资源,直接使用容器引擎,所以速度快。

Docker Client:客户端,提供一个与用户交互,展示的平台+管理、控制docker服务端(功能)的工具docker。
       Docker客户端(docker) 是许多Docker用户与Docker交互的主要方式。当您使用诸如之类的命令时dockerrun,客户端会将这些命令发送到dockerd,以执行这些命令。该docker命令使用Docker API。Docker客户端可以与多个守护程序通信。

Docker daemon:守护进程
         Docker守护程序(dockerd)侦听DockerAPI请求并管理Docker对象,例如图像,容器,网络和卷。守护程序还可以与其他守护程序通信以管理Docker服务。
Docker images:镜像
Docker container:容器
Docker registry:镜像仓库(共有的, 私有的harbor)
公有的镜像仓库:dockerhub/github/公有云的镜像仓库存储镜像的地方,默认在公共的Docker Hub上查找,可以使用个人仓库。

docker 三大组件
镜像:一组资源集合,包含了应用程序软件包、应用程序相关的依赖包、运行应用程序所需要的基础环境(泛指操作系统环境),可以理解为容器的模板
容器:基于镜像的一种运行时状态
仓库:存放image镜像,仓库大类

1)公共仓库→docker hub

2)私有仓库registry harbor

3)docker hub : lnmp lnmp

docker镜像
docker hub公共仓库
docker-harbor上传 下载方便、安全
github404→延迟
gitlab
svn
gitee
码云代码仓库
vm256
物理硬件256
centos依赖包、应用程序

docker与虚拟机区别(资源利用率/损耗)

实现应用A和应用B隔离
判断应用和应用的隔离
操作系统维度
       应用A与应用B隔离,在操作系统中,是通过namespaces(名称空间、命名空间)实现的,只要实现以下6个空间隔离才能认为两个应用实现了完全/完整隔离。

不同点containerVM
启动速度秒级分钟级
运行性能接近原生(直接在内核中运行)50%左右损失
磁盘占用MBGB
数量成百上千一般几十台
隔离性进程级别系统级别(更彻底)
操作系统主要支持Linux几乎所有
封装程度只打包项目代码和依赖关系,共享宿主机内核完整的操作系统,与宿主机隔离

六、名称空间(Namespaces )

       Docker使用一种称 为namespaces提供容器的隔离工作区的技术。运行容器时,Docker 会为该容器创建一组 名称空间。
       这些名称空间提供了一层隔离。容器的每个方面都在单独的名称空间中运行,并且其访问仅限于该名称空间。
Docker Engine在Linux.上使用以下名称空间:
该pid命名空间:进程隔离(PID: 进程ID)。
该net命名空间:管理网络接口(NET: 网络)
该ipc命名空间:管理访问IPC资源(IPC: 进程问通信)
该mnt命名空间:管理文件系统挂载点(MNT: mount) 。
该uts命名空间,隔离内核和版本标识符,(UTS.Unix时间共享系统)
Host主机名。

容器完美的实现了6个名称空间隔离( namespace资源隔离-用容器化技术封装)

mount文件系统, 挂载点→一个文件系统内,不能重复挂载一个指定目录,例如: /mnt
user操作进程的用户和用户组
pid进程编号
uts主机名和主机域
ipc信号量、消息队列,共享内存(理解,不同的应用调用内存资源的时候应该使用不同的内存空间)
net网络设备、网络协议栈、端口等

cgroup和namespaces 两者构成了docker底层原理

cgroupslinux内核态中资源管理的模块
cgroups管理一些系统资源

uname - r
该pid命名空间:进程隔离(PID: 进程ID)。
该net命名空间:管理网络接口(NET: 网络)
该ipc命名空间:管理访问IPC资源(IPC: 进程间通信)。
该mnt命名空间:管理文件系统挂载点(MNT: mount )
该uts命名空间:隔离内核和版本标识符。(UTS: Unix时间共享系统)。
docker引擎对内核版本是有要求的( 至少是3.8+)
docker需要cgroups的资源管理功能

最晚的一个名称空间,3.8

七、docker run

背景: ( 理解环境、了 解namespace )
以linux而言,linux操作系统会有一个主进程pid=1派生出其他进程来控制不同服务。
例如: pid=2→python pid=3→java pid4→php,三个服务可能会相互影响。
       使用者期望将这三个不同的服务,跑在不同的运行时环境中实现相互不影响,同时不会增加服务器成本→将这三种服务分别封装起来→虚拟化技术,实现了一个操作系统模拟多个操作系统/不同的运行时环境。
        随着技术发展→虚拟化技术开销较大(例如:只要运行一个py脚本,想要使用虚拟化方式实现,还需要安装一 个操作系统,并不方便/合理)→容器技术。
        虚拟化层的抽象层(用户层)剥离,使用docker engine来替代(来宾操作系统去除),只要通过引擎就可以直接连接到宿主机操作系统中,极大减小了开销。

八、控制组

Linux 上的Docker引擎还依赖于另一种称为控制组(cgroups)的技术。cgroup将 应用程序限制为一组特定 的资源。控制组允许Docker Engine将可用的硬件资源共享给容器,并有选择地实施限制和约束。可以限制特定容器可用的内存。
4个CPU
1、3              2、4
container1    container2
nginx
工作进程
212 01 10 001 010 100 0001

九、部署docker

1.安装依赖包

yum install -y yum-utils device-mapper-pe rsistent-data lvm2

 

2.设置阿里云镜像源

cd /etc/yum. repos.d/
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/dockerce.repo

 

3.安装docker-ce社区版

yum install -y docker-ce

 

4.环境配置

systemctl stop firewalld
systemctl disable fi rewalld
setenforce 0
vim /etc/ selinux/ config
SELINUX=disabled

systemctl start docker
systemctl enable docker

5.设置镜像加速

tee /etc/docker/daemon. json <<- 'EOF'
{
"registry-mirrors":["https://jgqwsp8f.mirror.aliyuncs.com"]
}
EOF

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://a18ou5no.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

镜像加速注册地址https://a18ou5no.mirror.aliyuncs.com

 

 

6.网络优化

vim /etc/sysctl.conf

net.ipv4.ip_forward=1

sysctl -p

systemctl restart network
systemctl restart docker

docker-server端配置文件daemon.json
{
"graph":"/data/docker",
数据目录默认: /var/lib/docker/containers (image)

"storage-driver":"overlay2",
存储引擎LXC →overlay→overlay2 (存储驱动/引擎) 

"insecure-registries":["registry.access.redhat.com","quary.io"]
私有仓库

"registry-mirrors":["https://q"]
镜像加速

"bip": "172.7.5.1/24",
docker网络(172.17.0.1 docker 0)

"exec-opts": ["native .cgroupdr iver-systemd"] 
启动时候的额外参数(驱动,k8s使用)

"live-restore":true 
'docker容器引擎挂掉的时候,使用docker跑起来的容器还能运行(分离)

以上是建议的配置项

docker 的网络建议和宿主机的IP"对照”
比如宿主机10.2.5.6 容器的地址就可以修改为172.5.6.1,这样方便在故障发生时,更容易定位故障节点位置

systemctl daemon-reload
systemctl restart docker

7.docker镜像操作

docker run hello-world
run:
①pull    dockerhub    仓库中项目/库/镜像
②start hello-world- image

1)docker client 客户端连接到了服务端(服务端是以一个守护进程的形式跑在操作系统里面的) restful api,典型的C/S架构。
2)由docker服务端的守护进程从dockerhub.上下载了镜像(PS:服务端会先检查本地系统是否有这个镜像)。
3)服务端创建了一个新的容器,然后从拉去的这个镜像启动了一个容器,容器执行了脚本/可执行程序让我们可以查看/使用(client )
4)docker服务端把这些信息流(传递)返回到客户端并展示出来,( 展示在终端上)
docker client可以是多种形式,比如"docker"命令工具所在的终端

查询docker版本

docker version && docker info

  

搜索镜像

docker search nginx
docker search centos:7

自己制作镜像,然后上传到docker hub上
优化
有效减少镜像大小(dockerfile 优化)
Linux发行版: alpine centos redhat Debian ( apt包管理,centos 是rpm)

下载镜像(默认是从dockerhub)

docker pull镜像名称,
docker pull nginx 

 查看镜像列表

docker images  查看当前docker下的下载镜像信息

获取镜像信息

docker inspect 镜像ID

开机启动运行的第一个指令程序,以守护进程方式启动

启动级别

添加镜像标签(上传(镜像到仓库)、(从仓库)下载(镜像) )

docker tag nginx:latest nginx: lnmp

删除

docker rmi 镜像名称
docker rmi镜像标签
docker rmi  `docker images -q`

删除硬链接源文件还在。删除所有硬链接,所有文件都没有

镜像导出

docker save -o  文件名  镜像名
docker save -o nginx_docker nginx: latest

 镜像导入

docker load < nginx
使用场景,有的生产环境,企业不直接使用docker私有仓库,而是存放在一个ftp服务器中,按需上传下载。

 应用场景

ftp winscp ssh登陆VPN (360 connect VPN )

十、容器操作

查询容器

docker ps -a

创建容器(基于镜像)

docker create -it nginx: latest /bin/bash (command)

-i让容器的标准输入保持打开
-t分配一个伪终端
-d后台守护进程的方式运行

启动容器

docker start 容器id

启动容器(一次性执行)

docker run centos:7 /usr/bin/bash -c ls /

停止容器

docker stop 容器ID

持续后台运行

docker run -d centos:7 /bin/bash -c "while true;do echo hello; done"

进入容器
①使用run

docker run -it nginx: latest /bin/bash

②exec(容器必须为开启状态)

docker exec -it 容器ID /bin/bash

exec 和shell是两种运行模式
docker run -it会创建前台进程,但是会在输入exit后终止进程。
docker attach会通过连接stdin,连接到容器内输入输出流,会在输入exit后终止容器进程.
docker exec -it会连接到容器,可以像SSH一样进入容器内部,进行操作,可以通过exit退出容器,不影响容器运行。

watch -n 1 docker ps -a

 

systemctl status docker

systemctl start docker

systemctl enable docker

systemctl restart docker

容器导出

docker export 容器ID >文件名

docker export 容器ID > nginx_a

容器导入(生成镜像)

docker import导出的文件名(容器)指定 镜像名称
docker.import nginx_a nginx: latest
cat 文件名(容器) | docker import - nginx:latest

批量删除容器&&批量删除镜像

删除容器

docker rm 容器ID

强制删除容器(正在运行的)

docker rm -f 容器ID

批量删除容器(正则匹配)

docker ps -a | awk ' {print "docker rm "$1}' | bash 
docker rm `docker ps - aq`

删除非up状态的rm-f:强制删除所有

docker rm `docker ps -q`

批量删除"exit"状态(指定状态)的容器

for i in `docker ps -a 1 grep -i exit | awk ' (print $1}'`; do docker rm -f $i; done

created

容器打包为镜像

docker run -it --name Nginx.01 nginx:latest /bin/bash
docker commit  nginx-vlbeta

 当日志占满之后如何处理

docker run -d centos:7 /bin/bash -c "while true;do echo hello; done"

清除日志

!/bin/bash
logs-$ (find /var/lib/ docker/containers/ -name *-json.log*)
for log in $logs
do
cat /dev/null > $log
done

设置docker日志文件数量及每个日志大小

vim /etc/docker/daemon.json

{
"registry-mirrors": ["http://f613ce8fm.daocloud,io"],
"log-driver":"json-file",
"log-opts": {"max-size":"500m", "max- file" :"3"}
}

#!/bin/bash
for i in `seq 10000000`
do
echo $i
sleep 1
done

自定义一个容器

docker run -it --name nginx \
-v /data_ nginx/:/usr/local/nginx/conf \
-v / log_nginx:/usr/local/nginx/logs \
log-driver-json-file \
log-opts max-size-500m \
log-opts max-file=3 \
-p 81:80 \
-p 8443:443 \
--network \
--ip 172.18.0.10 \
nginx:latest
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值