Docker安装和使用

  • iptables -vnL 安装完成后他会自动生成一些规则
  • 尽量不要删除不然docker不能运行,当然重启后也能自动生成

    目录

    Docker 介绍

    Docker 的组成 

    Namespace 

    Control groups   限制资源使用

    Docker 的优势

    Docker 的缺点 

    容器的相关技术

     容器 runtime

    bocker安装  加速

    删除docker 等

    常用命令

    bocker脚本安装  

    bocker脚本二进制安装

    Docker 存储引擎

    alpine 介绍  用于做实验的的镜像,优点:体积小

    Debian(ubuntu)系统建议安装的基础包

    在别的地方下载镜像

     镜像下载保存的路径

    镜像导出

    镜像导入


Docker 介绍

统一基础设施环境-docker环境

  • 硬件的组成配置
  • 操作系统的版本
  • 运行时环境的异构

统一程序打包(装箱)方式-docker镜像java 程序

  • go 程序
  • python 程序
  • nodejs 程序

统一程序部署(运行)方式-docker容器

  • java-jar...→ docker run...
  • go 二进制程序 → docker run...
  • python manage.py runserver... → docker run...
  • npm run dev ... → docker run..

Docker 的组成 

  • docker 官网: http://www.docker.com
  • 帮助文档链接: https://docs.docker.com/
  • docker 镜像: https://hub.docker.com/docker
  • 中文网站: http://www.docker.org.cn/

  • Docker 主机(Host): 一个物理机或虚拟机,用于运行Docker服务进程和容器,也称为宿主机,node节点
  • Docker 服务端(Server): Docker守护进程,运行docker容器
  • Docker 客户端(Client): 客户端使用 docker 命令或其他工具调用docker API
  • Docker 镜像(Images): 镜像可以理解为创建实例使用的模板,本质上就是一些程序文件的集合
  • Docker 仓库(Registry): 保存镜像的仓库,官方仓库: https://hub.docker.com/,可以搭建私有仓库harbor
  • Docker 容器(Container): 容器是从镜像生成对外提供服务的一个或一组服务,其本质就是将镜像中的程序启动后生成的进程

Namespace 

namespace是Linux系统的底层概念,在内核层实现,即有一些不同类型的命名空间被部署在内核,各个docker容器运行在同一个docker主进程并且共用同一个宿主机系统内核,各docker容器运行在宿主机的用户空间,每个容器都要有类似于虚拟机一样的相互隔离的运行空间,但是容器技术是在一个进程内实现运行指定服务的运行环境,并且还可以保护宿主机内核不受其他进程的干扰和影响,如文件系统空间、网络空间、进程空间等,目前主要通过以下技术实现容器运行空间的相互隔离:

隔离类型 功能 系统调用参数 内核
版本
MNT Namespace(mount) 提供磁盘挂载点和文件系统的隔离能力 CLONE_NEWNS 2.4.19
IPC Namespace(Inter-
Process Communication)
提供进程间通信的隔离能力,包括信号量,消息队列和共享内存 CLONE_NEWIPC 2.6.19
UTS Namespace(UNIX
Timesharing System)
提供内核,主机名和域名隔离
能力
CLONE_NEWUTS 2.6.19
PID Namespace(Process
Identification)
提供进程隔离能力 CLONE_NEWPID 2.6.24
Net Namespace(network) 提供网络隔离能力,包括网络设备,网络栈,端口等 CLONE_NEWNET 2.6.29
User Namespace(user) 提供用户隔离能力,包括用户和组 CLONE_NEWUSER 3.8

Control groups   限制资源使用

groups 最主要的作用,就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等等。此外,还能够对进程进行优先级设置,资源的计量以及资源的控制(比如:将进程挂起和恢复等操作)。
Cgroups在内核层默认已经开启,从CentOS 和 Ubuntu 不同版本对比,显然内核较新的支持的功能更多。

Centos 8.1 cgroups:

[root@centos8 ~]#cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)
[root@centos8 ~]#grep CGROUP /boot/config-4.18.0-147.el8.x86_64
CONFIG_CGROUPS=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_CGROUP_WRITEBACK=y
CONFIG_CGROUP_SCHED=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_RDMA=y
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_BPF=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_SOCK_CGROUP_DATA=y
# CONFIG_BLK_CGROUP_IOLATENCY is not set
CONFIG_NETFILTER_XT_MATCH_CGROUP=m
CONFIG_NET_CLS_CGROUP=y
CONFIG_CGROUP_NET_PRIO=y
CONFIG_CGROUP_NET_CLASSID=y
[root@centos8 ~]#

Docker 的优势

  • 快速部署: 短时间内可以部署成百上千个应用,更快速交付到线上
  • 高效虚拟化: 不需要额外hypervisor支持,基于linux内核实现应用虚拟化,相比虚拟机大幅提高性能和效率
  • 节省开支: 提高服务器利用率,降低IT支出
  • 简化配置: 将运行环境打包保存至容器,使用时直接启动即可
  • 环境统一: 将开发,测试,生产的应用运行环境进行标准化和统一,减少环境不一样带来的各种问题
  • 快速迁移和扩展: 可实现跨平台运行在物理机、虚拟机、公有云等环境,良好的兼容性可以方便将应用从A宿主机迁移到B宿主机,甚至是A平台迁移到B平台
  • 更好的实现面向服务的架构,推荐一个容器只运行一个应用,实现分布的应用模型,可以方便的进行横向扩展,符合开发中高内聚,低耦合的要求,减少不同服务之间的相互影响

Docker 的缺点 

  • 多个容器共用宿主机的内核,各应用之间的隔离不如虚拟机彻底
  • 由于和宿主机之间的进程也是隔离的,需要进入容器查看和调试容器内进程等资源,变得比较困难和繁琐
  • 如果容器内进程需要查看和调试,需要在每个容器内都需要安装相应的工具,这也造成存储空间的重复浪费

容器的相关技术

容器技术除了的docker之外,还有coreOS的rkt,还有阿里的Pouch,为了保证容器生态的标准性和健康可持续发展,包括Linux 基金会、Docker、微软、红帽谷歌和IBM等公司在2015年6月共同成立了一个叫Open Container Initiative(OCI)的组织,其目的就是制定开放的标准的容器规范,目前OCI一共发布了两个规范,分别是runtime spec和 image format spec,有了这两个规范,不同的容器公司开发的容器只要兼容这两个规范,就可以保证容器的可移植性和相互可操作性。

 容器 runtime

runtime是真正运行容器的地方,因此为了运行不同的容器runtime需要和操作系统内核紧密合作相互在支持,以便为容器提供相应的运行环境

runtime 类型

  • Lxc: linux上早期的runtime,在 2013 年 Docker 刚发布的时候,就是采用lxc作为runtime, Docker把 LXC 复杂的容器创建与使用方式简化为 Docker 自己的一套命令体系。随着Docker的发展,原有的LXC不能满足Docker的需求,比如跨平台功能
  • Libcontainer: 随着 Docker 的不断发展,重新定义容器的实现标准,将底层实现都抽象化到Libcontainer 的接口。这就意味着,底层容器的实现方式变成了一种可变的方案,无论是使用namespace、cgroups 技术抑或是使用 systemd 等其他方案,只要实现了 Libcontainer 定义的一组接口,Docker 都可以运行。这也为 Docker 实现全面的跨平台带来了可能。
  • runc: 早期libcontainer是Docker公司控制的一个开源项目,OCI的成立后,Docker把libcontainer项目移交给了OCI组织,runC就是在libcontainer的基础上进化而来,目前Docker默认的runtime,runc遵守OCI规范
  • rkt: 是CoreOS开发的容器runtime,也符合OCI规范,所以使用rktruntime也可以运行Docker容器

对于容器运行时主要有两个级别:Low Level(使用接近内核层) 和 High Level(使用接近用户层)目前,市面上常用的容器引擎有很多,主要有下图的那几种。 

Docker安装和使用_第1张图片

 注释:docker安装之后都会自动安装runc    contaninerd 。K8s可以不经过下面的头两个,直接到Cintainerd

 dockershim, containerd 和cri-o都是遵循CRI的容器运行时,我们称他们为高层级运行时(High-levelRuntime)
其他的容器运营厂商最底层的runc仍然是Docker在维护的。
Google,CoreOS,RedHat都推出自已的运行时:lmctfy,rkt,cri-o,但到目前Docker仍然是最主流的容器引擎技术。
Docker 的运行机制

bocker安装  加速

阿里云 docker-ce镜像_docker-ce下载地址_docker-ce安装教程-阿里巴巴开源镜像站 (aliyun.com)

 官方 在乌班图|上安装 Docker 引擎泊坞窗文档

把下面阿里云加速复制到代码里 执行完之后就重启一下 作用就是以后拉镜像的时候更快

也可以之完之后在页面直接复制进去然后重启一下

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

删除docker 等

[root@ubuntu ~]#apt purge docker-ce
[root@ubuntu ~]#rm -rf /var/lib/docker   #删除docker相关文件
[root@rocky8 ~]#docker rm -f `docker ps -qa`  #删除所有东西(容器)
docker rmi hello-world:latest  #后面本版本删除标签 后面跟IP才是删除容器
docker rmi `docker images -q`    #删除所有容器
[root@ubuntu2004 ~]#find / -name "*docker*" -exec rm -rf {} \;  #二进制安装用这个,需要重启下

常用命令

  • docker info   #用于显示 docker 的系统级信息,比如内核,镜像数,容器数等
  • docker pull nginx   #从镜像仓库中拉取或者更新指定镜像
  • docker run alpine:latest #latest下载最新版并运行,生产最好不要用 最好把latest换成版本号
  • docker image history nginx   #用于查看镜像分层历史的详细信息 (时间历史做了什么)
  • docker images    #列出本地镜像
  • docker search nginx    #在官方网站搜索你想要的内容,你也可以自己上传上面去
  • docker tag   #在复制一个,可以更该版本号名字 ,IP才是判断镜像的方法 列· 
[root@ubuntu2004 ~]#docker images   查看
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
alpine       latest    c059bfaa849c   10 months ago   5.59MB

[root@ubuntu2004 ~]#docker tag  alpine:latest qwe:9.0  把你版本号和命令复制下来,在后面写你想要的
[root@ubuntu2004 ~]#docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
alpine       latest    c059bfaa849c   10 months ago   5.59MB
qwe          9.0       c059bfaa849c   10 months ago   5.59MB
  • docker images  --no-trunc    #查看镜像的完整ip
  • docker inspect alpine:latest   #查看镜像详细信息 

  • docker save alpine:latest -o dara-9.0.tar     #导出来改名 需要自己gzip压缩 可以一次多个

  •   dockerdocker load -i dara-9.0.tar dara-9.0.tar  #在另一个导入到docker 这个能自己解压

  • docker save `docker images |awk 'NR>1{print $1":"$2}' |tr '\n' ' '` -o all.tar  #利用循环全部倒入解压导出后会和之前一摸一样,下,下面别的方法

  • #方法1: 使用image ID导出镜像,在导入后的镜像没有REPOSITORY和TAG,显示
    docker save `docker images -qa` -o all.tar
    #方法2:将所有镜像导入到一个文件中,此方法导入后可以看REPOSITORY和TAG
    docker save `docker images | awk 'NR!=1{print $1":"$2}'` -o all.tar
    #方法3:将所有镜像导入到一个文件中,此方法导入后可以看REPOSITORY和TAG
    docker image save `docker image ls --format "{{.Repository}}:{{.Tag}}"` -o all.tar

bocker脚本安装  

# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce

# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
#   docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
#   docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]

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

bocker脚本二进制安装

二进制安装没有办法看systemctl status containerd.service,这个还是照样看的systemctl status docker.service 

#!/bin/bash
# 
#********************************************************************
#Author:            wangxiaochun
#QQ:                29308620
#Date:              2022-10-15
#FileName:          install_docker_offline.sh
#URL:               http://www.wangxiaochun.com
#Description:       The test script
#Copyright (C):     2022 All rights reserved
#********************************************************************
 DOCKER_VERSION=20.10.19
#URL=https://mirrors.aliyun.com
URL=https://download.docker.com

prepare () {
    if [ ! -e docker-${DOCKER_VERSION}.tgz ];then
        #wget ${URL}/docker-ce/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz
        wget ${URL}/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz
    fi
    [ $? -ne 0  ] && { echo "文件下载失败"; exit; }
}

install_docker () {
    tar xf docker-${DOCKER_VERSION}.tgz -C /usr/local/
    cp /usr/local/docker/* /usr/bin/
    cat > /lib/systemd/system/docker.service <<-EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H unix://var/run/docker.sock
ExecReload=/bin/kill -s HUP \$MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target
EOF
    systemctl daemon-reload
}

start_docker (){
    systemctl enable --now docker
    docker info
}

config_docker () {
    mkdir -p /etc/docker
    tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://si7y70hh.mirror.aliyuncs.com"]
     }
EOF
    systemctl restart docker
}

prepare
install_docker
config_docker
start_docker

Docker 存储引擎

Docker官方推荐首选存储引擎为overlay2,其次为devicemapper,但是devicemapper存在使用空间方面的一些限制,虽然可以通过后期配置解决,但是官方依然推荐使用overlay2

该文件系统可以联合挂在, 挂在几个都能看到

alpine 介绍  用于做实验的的镜像,优点:体积小

目前 Docker 官方已开始推荐使用 Alpine 替代之前的 Ubuntu 做为基础镜像环境。这样会带来多个好处。包括镜像下载速度加快,镜像安全性提高,主机之间的切换更方便,占用更少磁盘空间等。
下表是官方镜像的大小比较:

REPOSITORY     TAG        IMAGE ID         VIRTUAL SIZE
busybox        latest     beae173ccac6     1.24MB
alpine         latest     4e38e38c8ce0     4.799 MB
debian         latest     4d6ce913b130     84.98 MB
ubuntu         latest     b39b81afc8ca     188.3 MB
centos         latest     8efe422e6104     210 MB

Alpine 官网: https://www.alpinelinux.org/
Alpine 官方仓库: https://github.com/alpinelinux
Alpine 官方镜像: https://hub.docker.com/_/alpine/
Alpine 官方镜像仓库: https://github.com/gliderlabs/docker-alpine
Alpine 阿里云的镜像仓库: https://mirrors.aliyun.com/alpine/

范例: alpine管理软件

#修改源替换成阿里源,将里面 dl-cdn.alpinelinux.org 的 改成 mirrors.aliyun.com
vi /etc/apk/repositories
http://mirrors.aliyun.com/alpine/v3.8/main/
http://mirrors.aliyun.com/alpine/v3.8/community/
#更新源
apk update
#安装软件
apk add vim
#删除软件
apk del openssh openntp vim

Debian(ubuntu)系统建议安装的基础包

在很多软件官方提供的镜像都使用的是Debian(ubuntu)的系统,比如:nginx,tomcat,mysql,httpd 等,但镜像内缺少很多常用的调试工具.当需要进入容器内进行调试管理时,可以安装以下常用工具包

# apt update #安装软件前需要先更新索引
# apt install procps #提供top,ps,free等命令
# apt install psmisc #提供pstree,killall等命令
# apt install iputils-ping #提供ping命令
# apt install net-tools #提供netstat网络工具等
# apt install iproute2 #提供ip,ss网络工具等

在别的地方下载镜像

列:阿里云   最好选择公网地址 剩余的哪俩你也用不了,不信自己试试

Docker安装和使用_第2张图片

 Docker安装和使用_第3张图片

 镜像下载保存的路径

/var/lib/docker/overlay2/镜像ID ,那一堆乱码里面就像是Linux的内核文件目录,就是没有内核

ls /var/lib/docker/overlay2/
13f475fba0e7e601c7dc731f5db51f1f2ddfc4ca8d0713c3886f61ae7e18abda  6136dd7db88e8dd5bdc05c182156ab86fff19747e2

[root@ubuntu2004 ~]#ls /var/lib/docker/overlay2/l   #里面放的软连接 
DNMYY6XUSHJET537RJX3FN6D6Z  JIFGWT65FQHWEOE5H6UMCATXTS  O2KAOJBPZYWR2DNDTIYOJMT72R

[root@ubuntu2004 ~]#ls /var/lib/docker/overlay2/l -l
总用量 36
lrwxrwxrwx 1 root root 72 10月 15 20:11 DNMYY6XUSHJET537RJX3FN6D6Z -> ../6136dd7db88e8dd5bdc05c182156ab86fff19747e212e45c8a2917c425bc80a7/diff
lrwxrwxrwx 1 root root 72 10月 15 20:11 DZLAZW4OJ6RFX23Q4QSBFUBCHW -> ../1808e58cb947dfd3745cd5dad60c9a23cee3bbc7e522e83e5f7345d82709da3e/diff

镜像导出

  • docker save alpine:latest -o dara-9.0.tar     #导出来改名 需要自己gzip压缩 可以一次多个

  •   dockerdocker load -i dara-9.0.tar dara-9.0.tar  #在另一个导入到docker 这个能自己解压

  • docker save `docker images |awk 'NR>1{print $1":"$2}' |tr '\n' ' '` -o all.tar  #利用循环全部倒入解压导出后会和之前一摸一样,下,下面别的方法

  • #方法1: 使用image ID导出镜像,在导入后的镜像没有REPOSITORY和TAG,显示
    docker save `docker images -qa` -o all.tar
    #方法2:将所有镜像导入到一个文件中,此方法导入后可以看REPOSITORY和TAG
    docker save `docker images | awk 'NR!=1{print $1":"$2}'` -o all.tar
    #方法3:将所有镜像导入到一个文件中,此方法导入后可以看REPOSITORY和TAG
    docker image save `docker image ls --format "{{.Repository}}:{{.Tag}}"` -o all.tar

镜像导入

利用docker load命令可以将镜像导出的打包或压缩文件再导入

范例: 导出所有镜像至不同的文件中

[root@centos8 ~]#docker images | awk 'NR!=1{print $1,$2}' | while read repo tag;do docker save $repo:$tag -o /opt/$repo-$tag.tar ;done

[root@centos8 ~]#ls /opt/*.tar/opt/alpine-3.13.5.tar /opt/busybox-latest.tar /opt/centos-centos8.3.2011.tar/opt/centos-latest.tar /opt/ubuntu-latest.tar

[root@ubuntu2004 ~]#for i in `docker image ls --format "{{.Repository}}:{{.Tag}}"`;do docker save $i -o `echo $i|cut -d: -f1`.tar ;done

你可能感兴趣的:(docker,docker,容器,运维)