云原生

简介: Docker是一个基于Go语言的开源容器化平台,实现“一次镜像,处处运行”。它通过容器技术将应用及其依赖打包,实现高效、轻量的部署与隔离,相比传统虚拟机启动更快、资源占用更少。

01-Docker概述

Docker简介
Docker是基于Go语言实现的云开源项目。

Docker的主要目标是:Build, Ship and Run Any App, Anywhere,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP及其运行环境能做到一次镜像,处处运行。

传统虚拟机和容器

传统虚拟机(virtual machine):
传统虚拟机技术基于安装在主操作系统上的虚拟机管理系统(如VirtualBox、VMware等),创建虚拟机(虚拟出各种硬件),在虚拟机上安装从操作系统,在从操作系统中安装部署各种应用。
缺点:资源占用多、冗余步骤多、启动慢

Linux容器(Linux Container,简称LXC):
Linux容器是与系统其他部分分隔开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。

Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一的运行。

ISOLATE SYSTEMS

ISOLATE APPLICATIONS

APP #1

APP #3

APP #2

BINS/LIBS

BINS/LIBS

BINS/LIBS

GUEST OS

GUEST OS

GUEST OS

APP #2

APP #1

APP #3

BINS / LIBS

BINS / LIBS

BINS/LIBS

DOCKER DAEMON

HYPERVISOR

HOST OPERATING SYSTEM

HOST OPERATING SYSTEM

INFRASTRUCTURE

INFRASTRUCTURE

VIRTUALMACHINES

DOCKER CONTAINERS



对比:

特性

容器

虚拟机

启动

秒级

分钟级

大小

一般为Mb

一般为Gb

速度

接近原生

比较慢

系统支持数量

单机支持上千个容器

一般几十个


Docker运行速度快的原因

Docker有比虚拟机更少的抽象层:
由于Docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在CPU、内存利用率上docker有明显优势。

Docker利用的是宿主机的内核,而不需要加载操作系统OS内核:
当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统内核。进而避免引寻、加载操作系统内核返回等比较耗时耗资源的过程。当新建一个虚拟机时,虚拟机软件需要加载OS,返回新建过程是分钟级别的。而Docker由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个docker容器只需要几秒钟。

Docker容器的本质就是一个进程。
Docker软件
Docker并非一个通用的容器工具,它依赖于已经存在并运行的Linux内核环境。(在Windows上安装Docker时需要依赖WLS,也即Windows下的Linux子系统)。

Docker实质上是在已经运行的Linux下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的Linux主机。

Docker的基本组成部分:
镜像(image)
容器(container)
仓库(repository)

Docker镜像

Docker镜像就是一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建多个容器。

Docker容器

Docker利用容器独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。

Docker仓库

Docker仓库是集中存放镜像文件的场所。
仓库分为公开仓库和私有仓库两种。
最大的公开仓库是Docker官方的Docker Hub:https://hub.docker.com/
Docker架构
Docker是一个 C/S(Client-Server) 结构的系统,后端是一个松耦合架构,众多模块各司其职。

Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从容器接收命令并管理运行在主机上的容器。

DOCKER.HOST

REGISTRY

OCKER BUILD

DOCKER DAEMON

DOCKER PULL

LIMAGES

DOCKER RUN



Docker运行的基本流程为:
1用户是使用Docker Client 与 Docker Daemon 建立通信,并发送请求给后者
2Docker Daemon 作为 Docker 架构的主体部分,首先提供 Docker Server 的功能使其可以接收 Docker Client 的请求
3Docker Engine 执行 Docker 内部的一系列工作,每一项工作都是以一个 Job 的形式存在
4Job 的运行过程中,当需要容器镜像时,则从 Docker Registry 中下载镜像,并通过镜像管理驱动 Graph Driver 将下载镜像以 Graph 的形式存储
5当需要为 Docker 创建网络环境时,通过网络管理驱动 Network driver 创建并配置 Docker 容器网络环境
6当需要限制 Docker 容器运行资源或执行用户指令等操作时,则通过 Exec driver 来完成
7Libcontainer 是一项独立的容器管理包,Network driver 以及 Exec driver 都是通过 Libcontainer 来实现具体对容器进行的操作

DOCKER CLIENT

HTTP SERVER

DOCKER SERVER

DOCKER

DAEMON

ROUTER

HANDLER

ENGINE

DOCKER

JOB

JOB

JOB

REGISTRY

JOB

JOB

DRIVER

GRAPH

EXECDRIVER

NETWORKDRIVER

GRAPHDRIVER

DRIVER

DRIVER

DRIVER

REPOSITORY

GRAPHDB

IMAGES)

NETWORK

BRIDGE

INTERFACE

NATIVE

AUFS

IP

PORT

NETLINK

DEVICES

NAMESPACES

CGROUPS

APPMARMOR

1IBCONTAINER

DOCKER CONTAINER

ROOTFS (LAYERED)


若有收获,就点个赞吧

02-Docker安装

CentOS安装Docker

参考官网:https://docs.docker.com/engine/install/centos/

卸载旧版本

如果之前安装过Docker,需要先卸载旧版本:


旧版本的Docker引擎包可能叫做:docker、docker-engine。

新版本的Docker引擎包叫做:docker-ce

配置yum资源库

安装yum-config-manager:


配置docker的资源库地址:

官方地址:(比较慢,不推荐)


阿里云镜像地址:


阿里云官网提供了很多资源镜像,镜像地址:https://mirrors.aliyun.com,进入之后可以选择自己需要的资源进行配置

创建缓存(可选):


安装Docker引擎

安装最新版本的Docker引擎、Docker客户端:


此时,默认安装的docker引擎、客户端都是最新版本。

如果要安装指定版本:


启动docker引擎

如果没有启动Docker引擎,那么执行 docker version查看版本号时,只能看到 Client: Docker Engine(Docker引擎客户端)的版本号。

启动Docker引擎:


卸载Docker

卸载Docker步骤:

1 关闭服务

2 使用yum删除docker引擎

3 删除镜像、容器、卷、自定义配置等文件


运行HelloWorld测试

运行HelloWorld:

Ubuntu安装Docker
卸载旧版本
卸载旧版本Docker(如果已经安装):
安装依赖
安装必要的依赖:
添加docker软件源
官网源:(不推荐,可能会连不上报错)

阿里云源(推荐):

安装docker
更新软件源并安装Docker:

启动并测试Docker
离线安装
下载安装
从docker官网(或者国内镜像站)下载对应linux版本的安装包,例如docker-27.0.3.tgz
将安装包上传到服务器,解压:
解压出来的文件的所有者可能不是root,修改为root用户:
将解压的文件移动到/usr/bin下:
启动测试:

配置成系统服务
将docker添加到systemd:
编辑文件/usr/lib/systemd/system/docker.service。
文件内容参考:github的docker-ce官方文档
为docker.service添加执行权限:

配置docker
创建docker组:
编辑daemon.json配置文件:
文件:/etc/docker/daemon.json

1

2

3

4

5

6

7

8

9

10

11

12

{

   // 还可以在这个文件中配置加速器、镜像仓库地址等

"insecure-registries": [

       // 配置不验证https证书、允许http连接

"192.168.xxx.xxx:8088"

],

"data-root":"/data/docker",

"log-driver":"json-file",

"log-opts":{

"max-size":"200m","max-file":"3"

}

}

重载配置:

1

systemctl daemon-reload


启动docker并设置开机自启
启动docker:

1

systemctl start docker

设置开机自启:

Shell

运行代码复制代码

1

systemctl enable docker

检验:

1

docker version


配置命令自动补全
从docker的github官方仓库获取命令补全的文件:docker
将该文件放到/usr/share/bash-completion/completions,启用该文件:

1

source /usr/share/bash-completion/completions/docker

若有收获,就点个赞吧

docker下载加速


方式1:使用 网易数帆、阿里云等容器镜像仓库进行下载。


例如,下载网易数帆镜像中的mysql。(网易数帆的地址为 hub.c.163.com,网易数帆对dockerhub官方的镜像命名空间为 library)。


docker pull hub.c.163.com/library/mysql:latest


方式2:配置阿里云加速。


登录阿里云,进入 工作台 -> 容器镜像服务 -> 镜像工具 -> 镜像加速器


里面提供了一个加速器地址:https://xxxxx.mirror.aliyuncs.com,将该地址配置到docker中:


cd /etc/docker
# 初次进来时没有/etc/docker/daemon.json文件,直接创建该文件即可
vi /etc/docker/daemon.json


daemon.json中写入以下内容:(即加速器地址)


{
  "registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]  
}


然后刷新配置、重启docker即可:


# centos6 的命令
sudo chkconfig daemon-reload
sudo service docker restart
# centos7 的命令
sudo systemctl daemon-reload
sudo systemctl restart docker


使用方式2可以直接下载官方的镜像,且镜像tag为官方tag,不需要加上云服务商的地址。


例如:


docker pull mysql:latest

Docker配置代理

如果使用了科学上网,可以为docker配置代理。

/etc/docker/daemon.json文件中加入以下内容:

{
  "proxies": {
    "http-proxy": "http://127.0.0.1:7890",  // 代理地址
    "https-proxy": "http://127.0.0.1:7890",
    "no-proxy": "localhost"
  }
}

启动类命令


启动docker:


systemctl start docker


停止Docker:


systemctl stop docker


重启Docker:


systemctl restart docker


查看状态:


systemctl status docker


设置开机自启:


systemctl enable docker


帮助类命令


查看Docker版本:


docker version


查看Docker概要信息:


docker info


查看Docker总体帮助文档:


docker --help


查看docker具体命令帮助文档:


docker 具体命令 --help


镜像命令


列出本地主机上的镜像


docker images


参数:


  • -a:列出所有镜像(含历史镜像)
  • -q:只显示镜像ID
  • -f:过滤


在远程仓库中搜索镜像


(默认取docker hub中搜索)


docker search 镜像名称


参数:


  • -f:过滤
  • --limit 数量:只展示前几项


下载镜像


docker pull 镜像名称[:tag]


不加 tag 时,默认下载最新的镜像(即tag为latest)。


查看占据的空间


查看镜像/容器/数据卷所占的空间:


docker system df


删除镜像


docker rmi 镜像名称/ID


可以使用空格分隔,删除多个镜像:


docker rmi 镜像1 镜像2 镜像3


删除全部镜像:


docker rmi -f $(docker images -qa)


虚悬镜像


仓库名、标签都是<none>的镜像,俗称虚悬镜像(dangling image)。


命令自动补全


docker支持命令自动补全功能,当输入镜像名前几位时,可以按tab键自动补全镜像名称、tag等。


# 如果镜像中有ubuntu,查看输入ub按下tab是否可以补全
docker run ub


如果按下tab时没有自动补全,可以按以下步骤操作:


  1. 检查是否安装了bash-completion(命令补全增强包)
# 检查有 /usr/share/bash-completion/bash_completion 这个文件
ls /usr/share/bash-completion/bash_completion


  1. 如果有/usr/share/bash-completion目录,但是没有/usr/share/bash-completion/bash_completion文件(centos6为/etc/bash_completion文件),则需要安装bash-completion
yum -y install bash-completion


  1. 检查是否安装了docker的自动补全
# 检查/usr/share/bash-completion/completions文件夹下是否有docker开头的自动补全
# docker安装完后会在该文件夹下生成自动补全文件docker
# 如果安装了docker-compose,则该文件夹下还会有 docker-compose文件
ll /usr/share/bash-completion/completions/docker*


  1. 如果已经安装了docker自动补全,使用source命令使其生效
source /usr/share/bash-completion/completions/docker


  1. 再次使用tab查看是否可以自动补全
# 如果镜像中有ubuntu,查看输入ub按下tab是否可以补全
docker run ub


  1. 如果有报错,且报错中提示_get_comp_words_by_ref: command not found。说明bash-completion的配置文件没有生效,需要source一下
# 对于centos7,bash-completion安装的是2.x版本,配置文件为/usr/share/bash-completion/bash_completion
source /usr/share/bash-completion/bash_completion
# 如果是centos6,自动安装的bash-completion最新版为1.x版本,配置文件为/etc/bash_completion
# bash /etc/bash_completion


  1. 再次使用tab查看是否可以自动补全
# 如果镜像中有ubuntu,查看输入ub按下tab是否可以补全
docker run ub


Docker后台启动一个纯Linux镜像

Docker启动镜像后,如果镜像中的程序不是一直运行的,那么在程序运行完成后容器就会自动退出。而单纯的Linux镜像中是没有一直运行的程序的,如果需要后台启动一个不停止的Linux镜像,可以手动指定一个不停止的程序,例如采用以下方式:

# 使用tail -f 不停的打印一个日志,例如打印日志黑洞/dev/null
docker run -d --name kylin hxsoong/kylin:v10-sp1  tail -f /dev/null


yum只下载依赖不进行安装

有些时候,内网需要安装某个RPM包,而内网服务器不连接互联网,无法直接下载缺失的依赖。可以在Docker中启动一个相同版本的Linux,然后下载相关依赖:

# yum只下载依赖不进行安装:(尝试安装aaaa.rpm,将需要的rpm依赖下载到aaaa_packages文件夹中)
yum install --downloadonly --downloaddir=aaaa_packages aaaa.rpm

新建启动容器


docker run [OPTIONS] IMAGE [COMMAND] [ARG...]


常用的参数:


  • --name:为容器指定一个名称
  • -d:后台运行容器并返回容器ID,也即启动守护式容器
  • -i:以交互模式(interactive)运行容器,通常与-t同时使用
  • -t:为容器重新分配一个伪输入终端(tty),通常与-i同时使用。也即启动交互式容器(前台有伪终端,等待交互)
  • -e:为容器添加环境变量
  • -P:随机端口映射。将容器内暴露的所有端口映射到宿主机随机端口
  • -p:指定端口映射


-p指定端口映射的几种不同形式:


  • -p hostPort:containerPort:端口映射,例如-p 8080:80
  • -p ip:hostPort:containerPort:配置监听地址,例如 -p 10.0.0.1:8080:80
  • -p ip::containerPort:随机分配端口,例如 -p 10.0.0.1::80
  • -p hostPort1:containerPort1 -p hostPort2:containerPort2:指定多个端口映射,例如-p 8080:80 -p 8888:3306


启动交互式容器


以交互方式启动ubuntu镜像


# -i 交互模式
# -t 分配一个伪输入终端tty
# ubuntu 镜像名称
# /bin/bash(或者bash) shell交互的接口
docker run -it ubuntu /bin/bash


退出交互模式:


方式1:


# 在交互shell中exit即可退回宿主机
exit;


方式2:使用快捷键ctrl + P + Q


方式1 退出后,容器会停止;


方式2 退出后容器依然正在运行。


启动守护式容器


大部分情况下,我们系统docker容器服务时在后台运行的,可以通过-d指定容器的后台运行模式:


docker run -d 容器名


注意事项:


如果使用docker run -d ubuntu尝试启动守护式的ubuntu,会发现容器启动后就自动退出了。


因为Docker容器如果在后台运行,就必须要有一个前台进程。容器运行的命令如果不是那些一直挂起的命令(例如toptail),就会自动退出。


列出正在运行的容器


列出所有正在运行的容器:


docker ps [OPTIONS]


常用参数:


  • -a:列出当前所有正在运行的容器+历史上运行过的容器
  • -l:显示最近创建的容器
  • -n:显示最近n个创建的容器
  • -q:静默模式,只显示容器编号


容器其他启停操作


启动已经停止的容器


docker start 容器ID或容器名


重启容器


docker restart 容器ID或容器名


停止容器


docker stop 容器ID或容器名


强制停止容器


docker kill 容器ID或容器名


删除容器


删除已经停止的容器:


docker rm 容器ID或容器名


删除容器是 docker rm,删除镜像是 docker rmi,注意区分。


强制删除正在运行的容器:


docker rm -f 容器ID或容器名


一次删除多个容器实例:


docker rm -f ${docker ps -a -q}
# 或者
docker ps -a -q | xargs docker rm


查看容器日志


docker logs 容器ID或容器名


查看容器内运行的进程


docker top 容器ID或容器名


查看容器内部细节


docker inspect 容器ID或容器名


进入正在运行的容器


进入正在运行的容器,并以命令行交互:


docker exec -it 容器ID bashShell


重新进入:


docker attach 容器ID


docker execdocker attach 区别:


  • attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出会导致容器的停止
  • exec是在容器中打开新的终端,并且可以启动新的进程,用exit退出不会导致容器的停止


如果有多个终端,都对同一个容器执行了 docker attach,就会出现类似投屏显示的效果。一个终端中输入输出的内容,在其他终端上也会同步的显示。


容器和宿主机文件拷贝


容器内文件拷贝到宿主机:


docker cp 容器ID:容器内路径 目的主机路径


宿主机文件拷贝到容器中:


docker cp 主机路径 容器ID:容器内路径


导入和导出容器


export:导出容器的内容流作为一个tar归档文件(对应import命令);


import:从tar包中的内容创建一个新的文件系统再导入为镜像(对应export命令);


示例:


# 导出
# docker export 容器ID > tar文件名
docker export abc > aaa.tar
# 导入
# cat tar文件 | docker import - 自定义镜像用户/自定义镜像名:自定义镜像版本号
cat aaa.tar | docker import - test/mytest:1.0.1


将容器生成新镜像


docker commit提交容器副本使之成为一个新的镜像。


docker 启动一个镜像容器后, 可以在里面执行一些命令操作,然后使用docker commit将新的这个容器快照生成一个镜像。


docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[tag]


Docker挂载主机目录,可能会出现报错:cannot open directory .: Perission denied


解决方案:在命令中加入参数 --privileged=true


CentOS7安全模块比之前系统版本加强,不安全的会先禁止,目录挂载的情况被默认为不安全的行为,在SELinux里面挂载目录被禁止掉了。如果要开启,一般使用 --privileged=true,扩大容器的权限解决挂载没有权限的问题。也即使用该参数,容器内的root才拥有真正的root权限,否则容器内的root只是外部的一个普通用户权限。


容器数据卷


卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过UnionFS,提供一些用于持续存储或共享数据。


特性:卷设计的目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。


特点:


  • 数据卷可以在容器之间共享或重用数据
  • 卷中的更改可以直接实施生效
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止


运行一个带有容器卷存储功能的容器实例:


docker run -it --privileged=true -v 宿主机绝对路径目录:容器内目录[rw | ro] 镜像名


可以使用docker inspect查看容器绑定的数据卷。


权限:


  • rw:读写
  • ro:只读。如果宿主机写入内容,可以同步给容器内,容器内可以读取。


容器卷的继承:


# 启动一个容器
docker run -it --privileged=true /tmp/test:/tmp/docker --name u1 ubuntu /bin/bash
# 使用 --volumes-from 继承 u1的容器卷映射配置
docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu


所有命令示意图


目录
相关文章
|
2月前
|
Java 关系型数据库 MySQL
基于springboot的二手物品交易系统
本研究聚焦二手交易平台的网络化转型,探讨其在社会经济快速发展背景下的必要性与意义。结合SpringBoot、Java、MySQL等技术,分析系统设计与实现路径,旨在提升平台管理效率、降低成本,推动二手交易向规范化、信息化发展,助力现代化服务体系建设。
|
2月前
|
缓存 Ubuntu Linux
Docker安装
本文介绍CentOS系统下安装、配置及卸载Docker的完整步骤,涵盖卸载旧版本、配置阿里云镜像源、安装Docker引擎、启动服务、运行HelloWorld测试,并提供离线安装与系统服务配置方法,同时包含daemon.json参数设置、日志管理、命令补全等高级配置,助力快速部署Docker环境。
155 0
|
安全 网络协议 Linux
安卓Termux搭建web服务器【公网远程手机Android服务器】
安卓Termux搭建web服务器【公网远程手机Android服务器】
|
2月前
|
安全 Ubuntu 数据安全/隐私保护
怎么解决无法拉取Docker镜像?不如我们自己建一个加速站(
本教程介绍如何通过GitHub Actions与阿里云容器镜像服务,构建私有Docker镜像加速通道,解决国内无法拉取微软官方Jekyll开发镜像的问题。适用于个人救急使用,无需依赖公共加速器,安全高效。
257 9
怎么解决无法拉取Docker镜像?不如我们自己建一个加速站(
|
2月前
|
JavaScript Java 关系型数据库
基于springboot的小区维修管理系统
针对城市园林社区维修管理效率低、信息不透明等问题,本研究基于Java技术,结合MySQL、Spring Boot、Vue等框架,设计并实现了一套B/S架构的智能化维修管理系统,提升物业管理水平与业主满意度。
|
2月前
|
人工智能 运维 监控
开源项目分享 : Gitee热榜项目 2025-12-13 日榜
本文整理Gitee当日热门开源项目,涵盖AI智能体、低代码开发、数字人、容器化部署等前沿技术。聚焦智能化、降本增效与垂直场景应用,展现AI工程化、全栈融合与技术普惠趋势,助力开发者把握开源脉搏。
324 15
|
2月前
|
Java 关系型数据库 MySQL
基于springboot的健身房预约与学习管理系统
本系统基于Java与Spring Boot框架,结合MySQL数据库与B/S架构,构建高效、智能的健身房管理平台。实现会员管理、课程预约、财务统计等功能,提升运营效率与用户体验,推动健身行业信息化升级。
|
2月前
|
运维 安全 Linux
宝塔 Linux 面板 Docker 容器化部署指南
BAOTA(宝塔Linux面板)是一款提升运维效率的服务器管理软件,支持一键部署LAMP/LNMP环境、集群管理、服务器监控、网站搭建、FTP配置、数据库管理、JAVA环境等100多项服务器管理功能。其设计理念是功能全面、操作简便、稳定性高且安全性强,已获得全球百万用户的认可与安装。
288 2
|
2月前
|
Linux Go 虚拟化
docker
Docker是基于Go语言的开源容器技术,实现“一次镜像,处处运行”。它通过容器化隔离应用,对比传统虚拟机更轻量、启动更快。核心组件包括镜像、容器和仓库,利用宿主机内核高效运行,广泛应用于开发、部署与运维全流程。
|
2月前
|
关系型数据库 MySQL Shell
Docker下载加速
本文介绍Docker下载加速的两种方法:一是使用网易数帆、阿里云等镜像仓库,如`docker pull hub.c.163.com/library/mysql`;二是配置阿里云镜像加速器,通过修改`/etc/docker/daemon.json`添加加速地址,实现快速拉取官方镜像。此外,若使用代理上网,还可配置HTTP/HTTPS代理,提升镜像下载效率。