docker基础理论及安装部署(镜像与容器的基本操作注解)(代码片段)

TaKe___Easy TaKe___Easy     2023-03-18     355

关键词:

Docker

一、前言理论概述

1.1 背景

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

1.2 Docker是什么

  • Docker 是一个用于开发,交付和运行应用程序的开发平台。能够将应用程序与基础架构分开,从而可以快速交付软件
  • Docker 是一个开源的应用容器引擎,让开发者可以通过打包方式封装应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或者Windows机器上,也可以实现虚拟化
  • 容器是完全使用沙箱机制(隔离机制),相互之间不会有任何接口
    • 沙箱(Sandbox):在计算机完全领域,沙箱是一种程序的隔离运行机制
  • Docker 从一开始就以提供标准化的运行时环境为目标,真正做到了“build once,run anywhere”,可以将同一个构建版本用于开发、测试、预发布、生产等任何环境,并且做到了与底层操作系统的解耦(不吃操作系统)。在此基础上还进一步发展出了CaaS(容器即服务)技术
  • Docker 其实就是基于容器技术的轻量级虚拟化解决方案
  • Docker 是容器引擎,把linux的cgroup(资源管理技术)、namespaces等容器底层技术进行完美的封装、并抽象为用户提供创建和管理容器的便捷界面(命令行Cli、api等)

1.4 Docker的优势及意义

  • 优势
    • Docker 把容器化技术做成了标准化平台(docker 统一、指定了容器化技术的标准化平台)
    • Docker 实现了一次构建,多次、多处使用
  • 意义
    • Docker 统一了基础设施环境——docker 环境
    • Docker 统一了程序打包(装箱)方式——docker 镜像
    • Docker 统一了程序部署(运行)方式——docker 容器

1.5 隔离是如何实现的

  • Docker使用一种称为namespaces提供容器的隔离工作区的技术。运行容器时,Docker会为该容器创建一组名称空间,这些名称空间提供了一层隔离。容器的每个方面都在单独的名称空间中运行,并且其访问仅限于该名称空间
  • 在操作系统中,是通过namespaces(名称空间、命名空间)实现的,但是只有实现下面6个空间隔离,才能认为两个应用实现了完全/完整隔离
名称空间说明
mount文件系统,挂载点
user操作进程的用户和用户组
pid进程编号
uts主机名和主机域
ipc信号量、消息队列,共享内存(不同的应用调用的时候应该使用不同的内存空间)
net网络设备、网络协议栈、端口等

二、Docker 的使用场景

  • 1.打包应用程序简单部署(前端打成war包或者jar包丢给私有仓库(代码仓库),再通过jenkins工具进行应用程序封装或者构建镜像,最后给运维使用容器技术进行下载并运行(发布))
  • 2.可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦)
  • 3.持续集成和持续交付
  • 4.部署微服务
  • 5.提供PaaS产品(平台即服务)
    • Openstack的云主机类似于阿里云的ECS,属于IaaS
    • Docker(K8S)属于PaaS

三、Docker 引擎(Docker Engine)

  • Docker Engine是主要具有C/S(客户端/服务端)的应用程序
  • Server端:服务器是一种长期运行的程序,称为守护程序进程(dockerd命令)
  • Client端 :REST API(指定程序可以用来与守护程序进行通信并指示其操作的借口),并提供命令行界面(CLI)和客户端(docker命令)

四、Docker 架构(Docker architecture)

  • Docker 使用C/S(客户端/服务端)架构
  • Docker客户端与Docker守护进程进行对话,该守护进程完成了构建、运行和分发Docker容器的繁重工作
  • Docker Client(客户端):是提供一个与用户交互、展示的平台+管理、控制docker服务端(功能)的工具
  • Docker客户端是许多Docker用户与Docker交互的主要方式。当使用诸如docker run之类的命令时,客户端会将这些命令发送到dockerd,以执行这些命令。该docker命令使用Docker API。docker客户端可以与多个守护程序通信
  • Docker守护程序(dockerd)侦听Docker API请求并管理Docker对象(例如:图像、容器、网络和卷)。守护程序还可以与其他守护程序通信以管理Docker服务

五、Docker核心概念

  • 镜像
    • 一组资源集合,包含了应用程序软件包、应用程序相关的依赖包、运行应用程序所需要的基础环境(泛指操作系统环境)
  • 容器
    • 基于镜像的一种运行时状态
  • 仓库
    • 存放image镜像
    • 仓库两大类:1.公共仓库(docker hub)2.私有仓库(registry&harbor)

六、容器和虚拟机区别

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

七、控制组(Control groups)

  • Linuxx上的Docker 引擎还依赖于另一种称为控制组(cgroups)的技术。cgroup将应用程序限制为一组特定的资源。控制组允许Docker Engine将可用的硬件资源共享给容器,并有选择地实施限制和约束(例如:限制特定容器可用的内存)

八、安装部署

8.1 关闭防火墙安装依赖包以及设置阿里云镜像源

[root@localhost ~]# hostnamectl set-hostname docker
[root@localhost ~]# su
[root@docker ~]# systemctl stop firewalld.service 
[root@docker ~]# systemctl disable firewalld.service 
[root@docker ~]# setenforce 0
[root@docker ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@docker ~]# cd /etc/yum.repos.d/
[root@docker yum.repos.d]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

8.2 安装docker-ce 社区版并设置镜像加速

[root@docker ~]# uname -r        【因为最后一个命名空间发布于3.8版本,所以要求内核版本在3.8以上】
3.10.0-693.el7.x86_64
[root@docker yum.repos.d]# yum install -y docker-ce
[root@docker ~]# systemctl start docker
[root@docker ~]# systemctl enable docker
[root@docker ~]# tee /etc/docker/daemon.json <<-'EOF'
> 
>   "registry-mirrors": ["https://73qpe1qe.mirror.aliyuncs.com"]
> 
> EOF

  "registry-mirrors": ["https://73qpe1qe.mirror.aliyuncs.com"]

8.3 简单网络优化

[root@docker ~]# vim /etc/sysctl.conf

  1 # sysctl settings are defined through files in
  2 # /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
  3 #
  4 # Vendors settings live in /usr/lib/sysctl.d/.
  5 # To override a whole file, create a new file with the same in
  6 # /etc/sysctl.d/ and put new settings there. To override
  7 # only specific settings, add a file with a lexically later
  8 # name in /etc/sysctl.d/ and put new settings there.
  9 #
 10 # For more information, see sysctl.conf(5) and sysctl.d(5).
 11 net.ipv4.ip_forward=1                                          【开启转发功能】
 
[root@docker ~]# sysctl -p                                         【加载内核】
net.ipv4.ip_forward = 1
[root@docker ~]# systemctl restart network
[root@docker ~]# systemctl restart docker 
[root@docker ~]# cat /etc/docker/daemon.json  【该文件为刚才添加镜像加速时创建,也是对server端的控制】

  "registry-mirrors": ["https://73qpe1qe.mirror.aliyuncs.com"]



【以下是建议的配置项】

  "graph": "/data/docker",					                        【数据目录】
  "storage-driver": "overlay2",				                        【存储引擎】
  "insecure-registries": ["registry.access.redhat.com","quary.io"] 	【私有仓库】
  "registry-mirrors": ["https://73qpe1qe.mirror.aliyuncs.com"]  	【镜像加速】
  "bip": "172.7.5.1/24",					                        【docker网络】
【建议和宿主机的IP“对照”比如宿主机10.2.5.6容器的地址就可以修改为172.5.6.1这样方便在故障发生时,更容易定位故障节点位置】

  "exec-opts": ["native.cgroupdriver=systemd"],  			        【启动时候的额外参数(驱动)】
  "live-restore": true	    
【当docker容器引擎挂掉的时候,做一个分离让使用docker跑起来的容器还能运行(默认关闭)】

8.4 docker 镜像操作

[root@docker ~]# docker run hello-world                【下载并运行镜像,hello-world后面不加版本信息默认下载最新版本】
Unable to find image 'hello-world:latest' locally      【在本地找不到最新版本的hello-world镜像】
latest: Pulling from library/hello-world               【最新版本从library项目下载hello-world镜像】
b8dfde127a29: Pull complete                            【镜像名称b8dfde127a29下载完成】
Digest: sha256:5122f6204b6a3596e048758cabba3c46b1c937a46b5be6225b835d091b90e46c 【细节、摘要】
Status: Downloaded newer image for hello-world:latest  【状态:下载了最新的镜像】

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
【docker client客户端连接到了服务端(服务端是以一个守护进程的形式跑在操作系统里面的),这也是典型的C/S架构】


 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
【由docker 服务端的守护进程从docker hub 上下载了镜像】


 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
【服务端创建了一个新的容器,然后从拉去的这个镜像启动了一个容器,容器执行了脚本/可执行程序让我们可以查看/使用】


 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.
【docker 服务端把这些信息流(传递)返回到客户端并展示出来,(展示在终端上)】
To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/




[root@docker ~]# docker images      【查看镜像】
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    d1165f221234   3 months ago   13.3kB
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                      PORTS     NAMES
5bdc6666f3da   hello-world   "/hello"   12 minutes ago   Exited (0) 12 minutes ago             compassionate_vaughan
【Exited (0):因为刚才执行的脚本是一次性的任务,并不是持续运行的任务。所以执行完脚本后直接退出,状态为0。如果为非0值则为异常退出】




【查询docker 版本的方式1[root@docker ~]# docker version
Client: Docker Engine - Community
 Version:           20.10.7
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        f0df350
 Built:             Wed Jun  2 11:58:10 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.7
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       b0f5bc3
  Built:            Wed Jun  2 11:56:35 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.6
  GitCommit:        d71fcd7d8303cbf684402823e425e9dd2e99285d
 runc:
  Version:          1.0.0-rc95
  GitCommit:        b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0



【查询docker 版本的方式2[root@docker ~]# docker info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)
  scan: Docker Scan (Docker Inc., v0.8.0)

Server:
 Containers: 1
  Running: 0
  Paused: 0
  Stopped: 1
 Images: 1
 Server Version: 20.10.7
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:                                                【插件】
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive                                         【图形结构】
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: d71fcd7d8303cbf684402823e425e9dd2e99285d
 runc version: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7
 init version: de40ad0                                   【版本】
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 3.10.0-693.el7.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 2
 Total Memory: 1.938GiB
 Name: docker
 ID: 5I5W:SVVR:KWOF:6F6Y:ETNM:K66Y:TVLI:TA3J:UVOM:56XS:MHBT:EYBM
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  https://73qpe1qe.mirror.aliyuncs.com
 Live Restore Enabled: false

WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled







【搜索镜像】
[root@docker ~]# docker search lnmp
NAME                    DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
2233466866/lnmp         https://hub.docker.com/r/2233466866/lnmp        106                  
winstonpro/lnmp         based on ubuntu 14.04                           27                   
twang2218/lnmp-nginx    这是 LNMP 示例中的 nginx 镜像                           23                   [OK]
fbraz3/lnmp             An easy-to-use LNMP/LEMP image, with Ubuntu19                   
duckll/lnmp             webservice                                      16                   [OK]
dzer/lnmp               lnmp环境                                          12                   
thinksvip/lnmp          LNMP docker production environment              8                    [OK]
maxwhale/lnmp-docker    LNMP Docker                                     4                    [OK]
twang2218/lnmp-php      这是 LNMP Docker 容器互联示例的 php 镜像                   3                    [OK]
idiswy/lnmp             Ubuntu 16.04 + nginx 1.8.x + php7 + MySQL 5.3                    
evagle/lnmp             ubuntu14.04 + nginx + mysql + php + redis       3                    
inteye/lnmp             LNMP1.2 (Linux, Nginx, Mysql, PHP). For deta…   1                    
c21xdx/lnmp13_cen6      php5.4                                          1                    [OK]
yahuiwong/lnmp          linux nginx mysql php                           1                    [OK]
turtlell/lnmp           first lnmp demo                                 1                    
zhaojianhui/lnmp        LNMP环境                                          1                    
lyx554073858/lnmp       docker hub link git hub                         1                    [OK]
canj/lnmp               lnmp环境(centos7+nginx+mariadb+php)               1                    
pby231/lnmp             lnmp集成环境                                        0                    
huangguoji/lnmp         lnmp.org的包                                      0                    
dahaitech/lnmp-douyou   douyou test lnmp                                0                    [OK]
twang2218/lnmp-mysql    This is the MySQL image of the LNMP docker c…   0                    [OK]
zshtom/lnmp             lnmp in centos 7                                0                    
wildcloud/lnmpbase      a basic lnmp for php app                        0                    
pby231/lnmp1                                                            0        








【指定版本搜索镜像】
[root@docker ~]#  docker search centos:7
NAME                                                DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
benwang6/tedu-jdk                                   oracle jdk 8u281 centos:7 JAVA_HOME=/usr/jdk…   4                    
vikingco/python                                     Python Stack Docker Base Image: Based on cen…   1                    
mjstealey/mariadb-galera                            MariaDB Galera cluster in Docker - based fro…   1                    [OK]
legerete/nginx-php71                                LA[->]P - Centos:7 + Nginx + PHP 7.1            1                    [OK]
sndnvaps/docker-golang                              build latest golang in centos:7                 1                    [OK]
peltikalle/basepython                               Base image with Centos:7 and Python 3.5.2       1                    [OK]
bbania/centos                                       Build image based on centos:7                   0                    
alvintz/centos                                      centos:7.2.1511                                 0                    [OK]
grossws/nginx                                       nginx (mainline) on grossws/centos:7            0                    [OK]
europeanspallationsource/oracle-jdk-maven-jenkins   ICS oracle-jdk + maven + jenkins users image…   0                    
sjoeboo/rbenv                                       Simple base container from CentOS:7 w/ rbenv…   0                    [OK]
pbieberstein/acic-findr                             CentOS:7 with dependencies to run 'Findr' (h…   0                    [OK]
acktsw/java                                         oracle jdk 8u171 , centos:7,  timeZone:+8, e…   0                    [OK]
geomatikk/centos                                    FROM centos:7 with maven 3.6.1 and openjdk-10                    
macedigital/nodejs                                  La

docker基本部署及基本控制命令(理论篇)(代码片段)

Docker基本部署及基本控制命令Docker概述?Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机... 查看详情

docker架构镜像及容器的安装和基本操作(代码片段)

Docker概念Docker是在Linux容器里运行应用的开源工具,是一种轻量级的虚拟机。Docker的宗旨:Build,ShipandRunAnyAPP,Anywhere,即通过对应用组件的分装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次分装,到处运行”... 查看详情

docker基本管理(容器及镜像操作)(代码片段)

Docker基本管理(容器及镜像操作)一、Docker概述设计宗旨优点容器在内核中支持2种重要技术二、Docker与虚拟机的区别三、Docker的核心概念镜像容器仓库总结四、安装Docker五、Docker镜像操作1.搜索镜像2.获取镜像3.镜像加速... 查看详情

docker基本管理(容器及镜像操作)(代码片段)

Docker基本管理(容器及镜像操作)一、Docker概述设计宗旨优点容器在内核中支持2种重要技术二、Docker与虚拟机的区别三、Docker的核心概念镜像容器仓库总结四、安装Docker五、Docker镜像操作1.搜索镜像2.获取镜像3.镜像加速... 查看详情

docker的部署与相关命令(代码片段)

Docker的部署与相关命令一、部署20版docker1、关闭防火墙及安全机制2、设置阿里云镜像源3、安装Docker-CE4、配置阿里云的镜像加速5、优化网络二、docker基础命令1、docker简单命令2、容器的操作3、私有仓库的操作4、Docker数据卷和数... 查看详情

docker基础命令详解——镜像及容器操作(代码片段)

Docker基础命令详解——镜像及容器操作前言?上篇文章介绍了有关Docker的基础与Linux下docker的安装,本文主要讲解安装docker后的基础使用方法以及命令的介绍,主要是docker镜像操作及容器操作命令。?当然,docker的相关命令非常多... 查看详情

docker&kubernetes❀docker容器技术笔记链接梳理

Docker的在线安装、离线安装、配置镜像加速器、配置文件参数详解Docker镜像与容器相关操作基础命令详解Dockerimage镜像原理解析与分层理论说明DockerDatavolume数据卷的使用与原理说明DockerFile保留关键字基本使用方法与相关解释Docke... 查看详情

docker-基础知识与安装命令

docker概念docker是一个平台,为了让开发人员和系统管理人员进行研发、部署、运行容器程序的。灵活性:那怕最复杂的应用程序也可以容器化轻量级:容器是利用和分享宿主机的内核可互换:可以动态部署更新和升级可移植:你... 查看详情

干货docker的安装镜像及容器容器(代码片段)

1、Docker概述Docker是在Linux容器中运行应用的开源工具,是一种轻量级的虚拟机。器容器技术可以在一台主机上轻松地为任何应用创建一个轻量级的、可移植的、自给自足的容器。通过这种容器打包应用程序,意味着简化了重新部... 查看详情

docker的安装镜像操作容器操作及资源控制(代码片段)

Docker概述Docker是在linux容器里运行应用的开源工具,是一种轻量级的虚拟机。Docker包含三大核心概念,分别是:镜像、容器和仓库。Docker的容器技术可以在一台主机上轻松的为任何应用创建一个轻量级的、可移植的、自给自足的... 查看详情

docker及常用软件的安装部署(代码片段)

Docker内容简介1.安装与运行2.常用命令3.镜像相关命令4.创建与启动容器5.部署应用内容简介本篇文章介绍Docker安装部署和在Docker安装一些常用软件。首先介绍一下什么是Docker摘自百度百科:Docker是一个开源的应用容器引擎࿰... 查看详情

linux企业运维——docker安装部署与镜像构建

Linux企业运维——Docker(一)安装部署与镜像构建文章目录Linux企业运维——Docker(一)安装部署与镜像构建1、Docker简介2、Docker安装及简单使用3、Docker镜像的构建3.1、构建方法一3.2、构建方法二1、Docker简介Docker... 查看详情

docker架构镜像及容器的基本操作(代码片段)

Docker架构、镜像及容器的基本操作前言引导Docker是在Linux容器里运行应用的开源工具,是一种轻量级的虚拟机,诞生于2013年。Docker的设计宗旨:Build、ShipandRunAny、Anywhere,即通过对应用组件的封装、发布、部署、运行等生命周期的... 查看详情

mac系统下安装docker及基本使用

参考技术A1、dockerrun是一个最基本的命令,它指定运行哪个docker镜像,并生成一个容器在系统中,即同时生成一个镜像一个容器2、dockersearchhttpd搜索合适的镜像3、dockerpullhttpd拖取镜像4、dockerimages查看镜像指令(该指令列出系统... 查看详情

docker容器部署详细操作

目录一、Centos安装部署docker1.centos安装docker1.1.卸载旧版本docker(可选)1.2.安装docker1.2.1设置docker镜像源1.2.2:安装docker1.2.3:启动docker2:安装dockerCompose3.docker 部署Java项目3.1、将jar包上传到centos上3.2、编写Dockerfile文件3.3.Dockerf... 查看详情

docker的安装及基本命令

docket的安装及基本命令下载各个版本Docker地址:https://download.docker.com/linux/static/stable/x86_64/docker概述docker是在liunx容器里运行应用的开源工具,是一种轻量级的“虚拟机”。docker的logo设计为蓝色鲸鱼,鲸鱼可以看作为宿主机,而... 查看详情

docker容器简介及命令(代码片段)

文章目录dockerdocker简述docker基本组成安装dockerdocker命令docker服务相关命令docker镜像相关命令docker容器相关命令docker容器的数据卷docker应用部署部署mysql部署tomcat:部署nginx部署redis部署私有仓库:dockerdocker简述Docker是一个... 查看详情

docker的部署与相关命令(代码片段)

Docker的部署与相关命令一、部署20版docker1、关闭防火墙及安全机制2、设置阿里云镜像源3、安装Docker-CE4、配置阿里云的镜像加速5、优化网络二、docker基础命令1、docker简单命令2、容器的操作3、私有仓库的操作4、Docker数据卷和数... 查看详情