Docker

一、docker简述

1.docker是什么?

Docker 是⼀个开源的应⽤容器引擎,可以实现虚拟化,完全采⽤“沙盒”机制,容器之间不会存在任何接⼝。
Docker 通过 Linux Container(容器)技术将任意类型的应⽤进⾏包装,变成⼀种轻量级、标准化、可移植、⾃管理的组件。在包装应⽤的同时,可连带该应⽤的依赖和环境⼀并进⾏打包,所以可以将这种“包”移植到任意环境去运⾏,省去兼容性的问题。

2.docker和虚拟机的区别

Docker和虚拟机在以下⼋个⽅⾯存在差异:
1)启动速度:Docker 启动速度⾮常快,属于秒级别,⽽虚拟机通常需要⼏分钟去启动。
2)资源消耗:Docker 需要的资源更少,它直接运⾏在宿主机的内核上,以⼀系列进程的结合形式存在。⽽虚拟机则需要消耗更多的资源,因为它在操作系统级别进⾏虚拟化。
3)轻量级:Docker 更轻量,它的架构可以共⽤⼀个内核与共享应⽤程序库,所占内存极⼩。⽽虚拟机则相对较重,需要消耗更多的内存。
4)隔离性:虚拟机可以实现系统级别的隔离,⽽ Docker 则属于进程之间的隔离,隔离性相对较弱。
5)安全性:Docker 的安全性也更弱。
6)可管理性:Docker 的集中化管理⼯具还不算成熟。
7)兼容性:开发⼈员不需要关系具体是哪个 Linux 操作系统,基本市⾯上主流系统都可使⽤ Docker。
8)数据持久性:Docker ⽆法存储数据,当容器重启后,数据会消失;⽽虚拟机可以存储各种数据,包括⽇志、数据库等。

3.docker解决的问题

1)系统环境不一致问题

使用docker容器时:将简易的操作系统、编写好的代码、部署完成的应⽤服务配置等打包放到容器内,再转到鲸⻥上,由鲸⻥送到服务器,此时,⽆论是什么运⾏环境,docker 容器都可以运⾏。

2)应用隔离问题

Linux 是⼀个⽀持多⽤户的操作系统,正因如此,可能会造成⽤户使⽤时,互相之间占⽤资源过多,以致于服务器资源空间不⾜,⽽docker 具有隔离性,可以在启动时就限定好硬件的使⽤率,当某个容器到达或超过限定的阈值时,就会被 kill,此时需要运维⼈员对其进⾏调试。

3)服务器扩展问题

⽇常的业务量⼤多很平均,但在业务量繁多时期,⽐如“双⼗⼀”,“春运购票”等场景,就需要对服务器进⾏横向扩展才能将负载均衡下来,⽽如果⼤规模地扩展服务器,待服务器满载时期过去,回到⽇常对各种应⽤服务进⾏部署、调试等,⼯作量也⼗分庞⼤,所以,此时使⽤ Docker 将会真正意义上实现快速部署,且耗费资源较少,尤
其不会出现兼容性的问题

4.docker优缺点

1)优点

1. 体积⼩:减⼩系统的开销值,⼀台主机可以运⾏上千个容器。
2. 启动迅捷:更快速的交付和部署,docker容器 ,⽐传统虚拟机要快很多,docker核⼼解决的问题就是利⽤容器实现VM类似的功能。
3. 操作⽅便:通过配置 dockerfile 便⽀持灵活的⾃动化创建和部署。
4. 更轻松的扩展:可以实现更简单的、更可靠的迁移,避免了兼容性等问题。
5. 更强的可扩展性和可移植性。

2)缺点

1. 安全问题:如果没有正确配置,⼀个容器中的恶意代码可能会响到主机上的其他容器以及主机本身的安全。
2. 存储问题:当使⽤⼤量容器时,存储和管理容器映像可以变得⾮常困难。这可能需要使⽤分布式存储或其他解决⽅案来管理⼤量容器的存储。
3. 性能问题:在某些情况下,容器和虚拟机相⽐会导致性能损失。这些性能问题越来越少,但是仍然需要考虑。
4. ⽹络问题:Docker 可能会在⽹络配置上存在⼀些问题,这可能需要更多的时间来诊断和解决。
5. 复杂性:Docker 是⼀个⾮常灵活的系统,但这同时也让它更加复杂。⻓时间使⽤ Docker 会产⽣⼤量的脚本和配置⽂件,这些可能变得难以维护。
6. 资源消耗:使⽤ Docker 必须占⽤⼀些资源,包括 CPU、内存、磁盘等等。如果运⾏容器的主机资源不⾜,可能会导致性能问题。
7. 学习曲线:Docker 是⼀个相对新的技术,相⽐传统环境需要⼀定的学习曲线。需要了解Docker 基本概念、命令和配置⽂件等。
8. 需要花费时间配置和管理:使⽤ Docker 需要花时间配置和管理容器集群和应⽤程序。需要配置每个容器,管理 Jenkins、Kubernetes 等运⾏ Docker 容器的⼯具。
9. 映像构建复杂:构建Docker映像需要按照特定格式编写Dockerfile 脚本,需要遵循⼀定的规范和流程,这可能需要更多的时间和精⼒。

5.docker架构

1. ⽤ docker pull 命令从 hub.docker.com 官⽹上下载 images (镜像)。
2. 可以⽤ docker save 命令将镜像保存到本地 tar ⽂件,也可以⽤docker load 命令将本地tar ⽂件导⼊镜像。
3. 可以⽤ docker build 构建 Dockerfile 镜像。
4. 可以⽤ docker run 和 docker create 将镜像运⾏成 container(容器),容器内可以安装所需要的 APP。
5. 可以⽤ docker commit/export 将容器做成镜像反复的使⽤。
6. 可以将⾃⼰制作的镜像发布到 hub.docker.com ⽹站,需要注册账号。

6.docker 核⼼概念

1. 镜像(images):⼀个⾯向 docker 容器引擎的只读模板,也是容器的基础,类似于 iso 镜像⽂件。
2. 容器(container):基于镜像所创建的虚拟实例,相当于⼀个简易的 Linux 环境,可启停,且多个容器之间互相隔离。
3. 仓库(Repository):集中存放 docker 镜像的位置,可使⽤docker pull 或 push 命令下载或上传到私有或公有仓库。
4. 仓库注册服务器(registry):存放仓库的地⽅,如果没有私有仓库,则使⽤公共仓库 docker hub。

7.Docker 特性

⽂件系统隔离:每个进程容器运⾏在⼀个完全独⽴的根⽂件系统⾥。
资源隔离:实现不同的容器的资源配额和调度,cgroup。
⽹络隔离:每个进程容器运⾏在⾃⼰的⽹络空间,拥有虚拟接⼝和 IP 地址。
⽇志记录:Docker将收集到和记录的每个进程容器的标准流(stdout/stderr/stdin),⽤于实时检索或者批量检索。
变更管理:容器⽂件系统的变更可以提交到新的镜像中,并可重复使⽤以创建更多的容器。
交互式shell:Docker可以分配⼀个虚拟终端并且关联到任何容器的标准输出上,例如运⾏⼀个⼀次性交互shell。

二、安装docker

1.安装Docker

[root@localhost ~]# cat << EOF | tee /etc/modules-load.d/k8s.conf
> overlay
> br_netfilter
> EOF
overlay
br_netfilter
[root@localhost ~]# modprobe overlay                        //加载overlay内核模块
[root@localhost ~]# modprobe br_netfilter                          //加载br_netfilter内核模块

[root@localhost ~]#  cat << EOF | tee /etc/sysctl.d/k8s.conf
> net.bridge.bridge-nf-call-iptables = 1
> net.bridge.bridge-nf-call-ip6tables = 1
> net.ipv4.ip_forward = 1
> EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1

[root@localhost ~]# sysctl --system                  //加载
[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo                      //添加阿里云yum源
[root@localhost ~]# yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y                               //安装docker

overlay:是⼀种⽂件系统层叠技术,常⽤于容器化平台(⽐如Docker)中。它允许将多个⽂件系统叠加在⼀起,从⽽创建⼀个统⼀可⻅的⽂件系统。通过加载 overlay 模块,可以在 Linux 系统中使⽤ overlay ⽂件系统,并且它将提供⼀些额外的功能,⽐如联合挂载、⽂件层叠等。

br_netfilter:Linux 内核中的⼀个模块,它提供了桥接设备(bridge device) 和⽹络过滤器(netfilter) 之间的集成。它允许在桥接设备上使⽤⽹络过滤器功能,如防⽕墙规则、⽹络地址转换(NAT) 等。通过加载 br_netfilter 模块,你可以在 Linux 系统中的桥接设备上应⽤⽹络过滤规则对⽹络流量进⾏管理和控制。

device-mapper-persistent-data:⼀个Linux内核模块,它为Device Mapper设备提供持久存储功能。DMPD提供了⼀个⽤于存储映射关系的数据库,使得Device Mapper可以持久化存储映射数据,以便在系统重新启动后仍然可以恢复之前的映射关系。

lvm2:Linux系统下的逻辑卷管理⼯具,LVM 的升级版,它是对磁盘分区进⾏管理的⼀种机制,建⽴在硬盘和分区之上的⼀个逻辑层,⽤来提⾼磁盘管理的灵活性。


2.设置阿⾥云镜像加速器

阿⾥云官⽹:https://www.aliyun.com/

[root@localhost ~]# systemctl start docker            //启动服务

[root@localhost ~]# docker images                //查看现有镜像
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

[root@localhost ~]# docker search 镜像名         //搜索镜像

[root@localhost ~]# docker pull centos      //下载centos镜像,默认下载最新版本,这里看到下载不下来,那就设置docker镜像站
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Retrying in 1 second 
error pulling image configuration: download failed after attempts=6: dial tcp 108.160.169.175:443: connect: connection refused

[root@localhost ~]# vim /etc/docker/daemon.json                              //配置docker镜像站
{
    "registry-mirrors": [
        "https://do.nark.eu.org",
        "https://dc.j8.work",
        "https://docker.m.daocloud.io",
        "https://dockerproxy.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://docker.nju.edu.cn"
    ]
}
[root@localhost ~]# systemctl restart docker                   //重启
[root@localhost ~]# docker search centos                       //搜索centos镜像
[root@localhost ~]# docker pull centos                              //下载
[root@localhost ~]# docker images                             //现在已经能查到centos镜像了
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
centos       latest    5d0da3dc9764   2 years ago   231MB

三、Docker 基本操作

1.镜像操作

docker login(logout)    :登录(登出) docker hub 账户,也可以指定某个私有仓库登录,⽐如“docker login 私有仓库地址 -u 登录⽤户”
docker search 镜像名    :查找镜像,可根据名称、星级、是否官⽅发布等条件查找(starts、official 等)
docker pull 镜像名        :下载某个镜像,不加标签默认下载最新版本的镜像
docker images         :查看现有镜像
docker inspect 镜像名    :查看镜像详细信息
docker tag 旧镜像:标签 新镜像:标签    :可更改镜像的标签名,也可镜像名连同标签⼀起修改成新镜像
docker rmi 镜像名或镜像 id    :删除某个镜像
docker save -o 保存位置 镜像名    :保存导出某个镜像到某⼀位置
docker load < 保存后⽣成的镜像⽂件    :导⼊本地保存的镜像⽂件
docker push 镜像名    :上传镜像,在上传之前需要将镜像使⽤ tag 命令改名,改名为“仓库名/镜像”这种格式,才可以上传
docker info             :查看 docker 信息
cat 镜像⽂件 | docker import -镜像名:标签    :导⼊本地镜像⽂件并设置名称
docker system prune --all --force --volumes    :删除所有未使⽤的⽂件,在 /var/lib/docker/下
docker volume prune    :删除所有未使⽤的卷,/var/lib/docker/volumes
docker system df         :列出所有未使⽤的 docker ⽂件
docker image prune -a    :删除所有未使⽤的镜像

2.容器操作

docker create -it 镜像 运⾏的程序        :创建容器-i:让容器的输⼊保持打开-t:为容器分配伪终端运⾏的程序:需要容器运⾏的某个命令,如果想要容器持续运⾏,给/bin/bash
docker ps                         :查看所有容器,包括已退出的容器
docker ps -a                        :查看正在运⾏的容器
docker start/stop/restart 容器名或 ID    :启动/停⽌/重启某个容器
docker run [-itd] 容器名 运⾏的程序 [-c 命令 ]    :创建并启动容器等于 docker pull 命令+docker create 命令+docker start 命令
docker attach 容器名/ID             :进⼊容器内部,可使⽤ exit 或 CTRL+D 退出,也可以使⽤ CTRL+p+q
docker exec [-itd] 容器名/ID /bin/bash:分配⼀个 bash 环境再进⼊容器
docker export 容器名/ID > 保存位置    :导出容器到某个位置
docker import 本地容器⽂件 新镜像名    :导⼊某个容器⽂件到 docker 镜像并给新镜像命名
docker commit 容器名/ID 新镜像名    :将某个容器保存⾄镜像
docker rm -f 容器名/ID                :删除容器,-f:强制删除
docker logs 容器名/ID                :查看容器标准输出的内容
docker run 的逻辑原理:执⾏此命令后,docker 后台会检测此容器需要的镜像是否存在,如果本地不存在则去公共仓库下载。下载完毕后,根据镜像创建⼀个容器,分配⼀个⽂件系统给容器,在只读的镜像层外边挂载⼀层可读写层,从宿主机配置的⽹桥接⼝中桥接⼀个虚拟机接⼝到容器中,分配⼀个地址池中的ip地址给容器执⾏⽤户所执⾏的命令,执⾏完成后将容器终⽌运⾏。如果想让容器执⾏完命令后继续运⾏,选项加 -d,此容器会在执⾏完命令后在后台运⾏。

3.实例操作

[root@localhost ~]# docker run -i -t --name=c0 centos:latest /bin/bash             //命名并运行容器
[root@207ca7680ecc ~]# rm -rf /etc/yum.repos.d/*
[root@207ca7680ecc ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo               //下载centos8阿里云yum源
[root@207ca7680ecc ~]# yum clean all && yum makecache
[root@207ca7680ecc ~]# yum -y install httpd                                   //安装httpd
[root@207ca7680ecc ~]# httpd -k start                                             //启动httpd
[root@207ca7680ecc ~]# vim /usr/share/httpd/noindex/index.html               //修改页面
i am tdr
[root@207ca7680ecc ~]# curl localhost                                                   //访问
i am tdr
打开另一台本机终端(终端2)
[root@localhost ~]# ps -aux | grep docker                                   //查看进程
root       4822  0.0  6.4 1636504 60440 ?       Ssl  12:00   0:09 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root       5144  0.0  1.7 1453432 16600 pts/1   Sl+  14:18   0:00 docker run -i -t --name=c0 centos:latest /bin/bash
root       5662  0.0  0.1 112720   964 pts/2    S+   15:03   0:00 grep --color=auto docker
回到刚才的终端退出(终端1)
[root@207ca7680ecc ~]# exit
exit
[root@localhost ~]# 
再回去查看(终端2)
[root@localhost ~]# ps -aux | grep docker
root       4822  0.0  6.5 1636504 60700 ?       Ssl  12:00   0:09 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root       5688  0.0  0.1 112720   968 pts/2    S+   15:06   0:00 grep --color=auto docker
再回到原来的终端登陆(终端1)
[root@localhost ~]# docker start c0                          //启动c0容器
c0
[root@localhost ~]# docker attach c0                       //进入c0容器
[root@207ca7680ecc /]# 
[root@207ca7680ecc /]# httpd -k start
[root@207ca7680ecc /]# curl localhost
i am tdr
[root@207ca7680ecc /]# exit                   //退出
exit
可以使用ctrl+p+q来退出但不结束进程

四、远程连接

1.检查状态

[root@localhost ~]# ls -lh /var/run/docker.sock                    //查看sock套接字,
srw-rw----.  1 root   docker    0 8月  22 11:22 docker.sock
[root@localhost ~]# netstat -lnput|grep 2375                 //要允许远程连接,需要有一个服务,使用端口来体现

2.设置允许远程管理

1)停用docker服务

[root@localhost ~]# systemctl stop docker

2)修改daemon.json文件

[root@localhost ~]# vim /etc/docker/daemon.json 
{
    "registry-mirrors": [
        "https://do.nark.eu.org",
        "https://dc.j8.work",
        "https://docker.m.daocloud.io",
        "https://dockerproxy.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://docker.nju.edu.cn"
    ],

        "hosts": [
                "tcp://0.0.0.0:2375",
                "unix:///var/run/docker.sock"
        ]
}

3)修改docker配置文件

[root@localhost ~]# vim /usr/lib/systemd/system/docker.service 

4)加载daemon.json文件

[root@localhost ~]# systemctl daemon-reload

5)启动服务

[root@localhost ~]# systemctl start docker

6)检查端口以及套接字文件

[root@localhost ~]# netstat -lnput|grep 2375
tcp6       0      0 :::2375                 :::*                    LISTEN      6450/dockerd  
[root@localhost ~]# ls -lh /var/run/docker.sock 
srw-rw----. 1 root docker 0 8月  22 16:10 /var/run/docker.sock


3.使用远程连接管理docker

[root@localhost ~]# docker -H192.168.1.76 images                           //远程连接
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
centos       latest    5d0da3dc9764   2 years ago   231MB

  • 26
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值