Docker的介绍及应用

1.什么是Docker

我们在部署大型项目的时候,肯定会遇到这种问题,大学项目组件较多,运行环境复杂,部署时会碰到一些问题:例如node、redis、mysql等这些应用都有自己的依赖和函数库。这种复杂的依赖关系很容易出现兼容问题。开发、测试、生产环境如果有差异还会遇到其他问题。为了解决依赖兼容和运行环境不一致的问题,Docker就诞生了。

Docker是如何解决依赖的兼容问题的?

依赖混乱的解决:

将应用的函数库依赖 、配置与应用一起打包,形成可移植镜像

Docker应用运行在容器中,使用沙箱机制,相互隔离

跨系统的解决:

首先我们需要先了解这些:对于不同的Linux系统,只是上层的应用不同,内核都是Linux,内核是用来操作计算机硬件的。上层应用操作是将内核的命令集合封装起开作为一个函数,多个函数形成一个函数库,通过函数来操作计算机硬件,因为不同的Linux系统(例如:ubuntu、centOS),他们的函数名字不同,自然会产生跨系统报错问题

Docker的解决方案就是将用户程序与所需要调用的系统(比如ubuntu)函数库一起打包,因此可以在任意Linux系统上运行。

简化来说:**Docker是一个快速交付应用、运行应用的技术。**可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统。运行时利用沙箱机制形成隔离容器,各个应用互不干扰。启动、移除都可以通过一行命令完成,方便快捷。

2.Docker与虚拟机

虚拟机是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在Windows系统里面运行Ubuntu系统,这样就可以任意运行Ubuntu应用了。 Hypervisor的作用是用来模拟硬件的信息。

Docker与虚拟机的区别

Docker的硬盘占用较小(一般为Mb)、启动较快。是一个系统进程。

虚拟机的硬盘占用较大(一般为Gb)、启动较慢。是在操作系统中的操作系统。

3.Docker的架构

Docker是一个CS架构的程序,由两部分组成:

服务器(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等

客户端(client):通过命令或者RestAPI向Docker服务端发送指令,可以在本地或者远程服务器端发送指令。

客户端可以通过docker build命令构建镜像,命令到达DockerServer后会被docker daemon 守护进程接收和处理,根据client提供的数据构建一个镜像。

通过docker pull命令可以拉取镜像,命令到达DockerServer后会通过docker daemon守护进程去Registry里面拉取指定镜像。

通过docker run 命令创建容器,命令到达DockerServer后会通过docker daemon守护进程去创建容器。

4.安装Docker

1.卸载旧的版本

sudo yum remove docker \

docker-client \

docker-client-latest \

docker-common \

docker-latest \

docker-latest-logrotate \

docker-logrotate \

docker-engine

这说明之前没有安装过docker。

2.安装yum-utils工具

sudo yum install -y yum-utils

3.设置镜像仓库

sudo yum-config-manager \

--add-repo \

http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4.更新yum

yum makecache fast

5.安装docker社区版

sudo yum install docker-ce docker-ce-cli containerd.io

6.启动docker

#关闭防火墙

systemctl stop firewalld

#禁止开机启动防火墙

systemctl disable firewalld

#启动docker

sudo systemctl start docker

#查看docker状态

sudo systemctl start docker

6.配置镜像

由于docker官方镜像仓库网速较差,我们需要设置国内镜像:

#设置中科大镜像

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'

{

"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]

}

EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

5.Docker基本操作

镜像操作

镜像名称一般分为两部分组成:[repository]:[tag] tag指的是版本,如果没有写版本就是最新版本。

对于镜像的操作无非就是crud:

docker build :构建镜像

docker pull :拉取镜像

docker image:查看镜像

docker rmi :删除镜像

docker push :推送镜像到服务端

docker save :保存镜像为一个压缩包(可以通过U盘copy)

docker save -o nginx.tar nginx:latest

nginx.tar为保存的压缩包的名字,后面跟的是镜像的名字和tag

docker load :可以加载压缩包为镜像

容器操作

docker run :创建容器并运行

命令解读:

docker run:创建并运行一个容器

--name:给容器起一个唯一的名字

-p:将宿主机端口与容器端口映射,冒号左侧是主机端口,右侧是容器端口

因为容器具有隔离性,客户不能直接访问,所以需要映射到宿主的端口,这样的话客户就可以访问。

-d:后台运行容器

docker pause:将运行的容器暂停

docker unpause:将暂停的容器启动

docker stop:将运行的容器停止

docker start:将停止的容器启动

暂停是将进程挂起,内存保留

停止是将进程杀死,内存删除

docker ps 查看所有运行的容器及状态

-a :参数可以查看所有容器,容器如果stop的话docker ps查看不了,加个-a参数就行

docker logs 查看容器运行日志

docker exec :进入容器执行命令

docker exec -it name bash

docker rm :删除指定容器

-f:docker rm 不能移除正在运行的命令,但是通过-f参数可以删除

数据卷(容器数据管理)

因为docker所有文件和数据都和容器耦合在一起:

不便于修改:

当我们要修改Nginx的html内容时,要进入容器内部修改,很放不方便

数据不可复用:

在容器内的修改对外是不可见的,所有修改对新创建的容器都是不可复用的,而且如果修改过多,时间久了你也不知道修改了什么。

升级维护困难:

数据在容器内,如果要升级容器,必然要删除旧的容器,所有的数据也跟着删除了

为了解决上面三个问题,就有了我们的数据卷, 数据卷是一个虚拟目录,指向宿主机文件系统中的某个目录。Docker主机会管理很多个数据卷,每一个数据卷都会对于,宿主机/var/lib/docker/volumes/的真实的文件目录

拿nginx举例,nginx的静态资源都会放在/usr/share/nginx/html,配置文件会放在/etc/nginx/confg。我们可以让容器内部的这两个文件与数据卷关联。如果修改任何一方,另一方也会同步更新。 数据卷的这种关联特性,可以解决前两个问题,如果需要升级,只需要挂载之前的数据卷就可以了。第三个问题也迎刃而解。

操作数据卷

数据卷操作基本语法如下:

docker volume [COMMAND]

docker volume 命令是数据卷操作,根据命令后跟随的command来确定下一步操作:

create:创建一个volume

inspect:显示一个或多个volume的信息

ls:列出所有的volume

prune:删除未使用的volume

rm:删除一个或多个指定的volume

挂载数据卷

我们在创建容器时,可以通过-v参数来挂载一个数据卷到某个容器目录

docker run --name nginx -p 80:80 -v html:/usr/share/nginx/html -d nginx

通过这个命令我们可以看到nginx的默认页面已经关联到我们宿主机具体的文件夹里面了。如果挂载的数据卷如htlm不存在,会自动创建!

6.Dockerfile自定义镜像

镜像结构

镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。

镜像是一个分层结构,每一层称为一个Layer:

BaseImage层:包含基本系统函数库、环境变量、文件系统

Entrypoint:入口,镜像中应用启动的命令

其他:在BaseImage基础上添加依赖、安装程序,完成整个应用的安装和配置

Dockerfile语法

什么是Dockerfile

Dockerfile就是一个文本文件,其中包含一个个的指令,用指令来说明要执行什么操作来构建,每一个指令都会形成一层Layer

Dockerfile的常见命令

7.DockerCompose

什么是DockerCompose

Docker Compose可以基于Compose文件帮我们快速部署分布式应用,而无需手动一个个创建和运行容器,DockerCompose的作用是帮我们快速部署分布式应用,无需一个一个微服务去构建镜像和部署

Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。语法格式如下:

其实就是将docker run 命令的参数转换成指令

安装DockerCompose

直接在release中下载对应的linux发行版【docker-compose-linux-x86_64】

https://github.com/[docker](https://so.csdn.net/so/search?q=docker&spm=1001.2101.3001.7020 "docker")/compose/releases/tag/v2.18.1

下载完后将软件上传至 Linux的【/usr/local/bin】目录下然后重命名:

sudo mv docker-compose-linux-x86_64 docker-compose

授予权限:

sudo chmod +x /usr/local/bin/docker-compose

然后就完事了

卸载

rm /usr/local/bin/docker-compose

docker-compose --version #如果不出现版本信息,则表示卸载成功

常用命令:

前台启动, 启动项目中的所有服务。

docker-compose up

后台启动, 启动所有服务并在后台运行。

docker-compose up -d

停止所有服务。

docker-compose stop

restart

docker-compose restart重启服务容器。

docker-compose restart # 重启工程中所有服务的容器

docker-compose restart nginx # 重启工程中指定服务的容器

start

docker-compose start启动服务容器。

docker-compose start # 启动工程中所有服务的容器

docker-compose start nginx # 启动工程中指定服务的容器

stop

docker-compose stop停止服务容器。

docker-compose stop # 停止工程中所有服务的容器

docker-compose stop nginx # 停止工程中指定服务的容器

删除服务容器(容器)

docker-compose down

# 输出日志,不同的服务输出使用不同的颜色来区分

docker-compose logs

# 跟踪日志输出

docker-compose logs -f

8.Docker镜像仓库

镜像仓库有公有和私有两种形式:

公共仓库:例如Docker Hub,网易云镜像服务、DaoCloud镜像服务、阿里云镜像服务等。

除了使用公开仓库外,用户还可以本地搭建私有Docker Registry。企业自己的镜像最好采用私有Registry来实现。从而达到保护商业机密的目的

私有镜像仓库的搭建

配置Docker信任地址

vi /etc/docker/daemon.json

添加属性 insecure-registries(192.168.137.1这是我自己电脑的ipv4地址)如果有多个属性记得加","

"insecure-registries":["http://192.168.137.1:8080"]

重加载

systemctl daemon-reload

重启docker

然后导入我们写的compose文件:

📎docker-compose.yml

然后运行

docker-compose up -d

输入http://192.168.10.8:8080/查看,启动成功

这样我们的私有镜像仓库就搭建完毕了

在私有镜像仓库里拉取或推送镜像

打包:

docker tag nginx:latest 192.168.10.8:8080/my-nginx:1.0

上传:

拉取:

相关推荐
运维小文19 分钟前
K8S资源限制之LimitRange
云原生·容器·kubernetes·k8s资源限制
登云时刻20 分钟前
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(二)
redis·容器·kubernetes
Mr_Xuhhh24 分钟前
重生之我在学环境变量
linux·运维·服务器·前端·chrome·算法
朝九晚五ฺ8 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
Kkooe9 小时前
GitLab|数据迁移
运维·服务器·git
wuxingge9 小时前
k8s1.30.0高可用集群部署
云原生·容器·kubernetes
久醉不在酒9 小时前
MySQL数据库运维及集群搭建
运维·数据库·mysql
志凌海纳SmartX10 小时前
趋势洞察|AI 能否带动裸金属 K8s 强势崛起?
云原生·容器·kubernetes
锅总10 小时前
nacos与k8s service健康检查详解
云原生·容器·kubernetes
BUG弄潮儿11 小时前
k8s 集群安装
云原生·容器·kubernetes