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

上传:

拉取:

相关推荐
绵绵细雨中的乡音7 分钟前
Linux进程学习【基本认知】
linux·运维·学习
matrixlzp17 分钟前
K8S Service 原理、案例
云原生·容器·kubernetes
GnixAij1 小时前
Docker SSH端口转发
docker·ssh
珹洺1 小时前
Linux操作系统从入门到实战(三)Linux基础指令(上)
linux·运维·服务器
剁椒排骨1 小时前
win11什么都不动之后一段时间黑屏桌面无法显示,但鼠标仍可移动,得要熄屏之后才能进入的四种解决方法
运维·windows·经验分享·计算机外设·win11·win10
angushine1 小时前
让Docker端口映射受Firewall管理而非iptables
运维·docker·容器
归寻太乙2 小时前
Linux环境变量
linux·运维·服务器
m0Java门徒2 小时前
面向对象编程核心:封装、继承、多态与 static 关键字深度解析
java·运维·开发语言·intellij-idea·idea
Sapphire~2 小时前
Linux-06 ubuntu 系统截图软件使用简单记录
linux·运维·ubuntu
高级IT技术专家secops9982 小时前
在统信UOS/麒麟Kylin OS操作系统中配置APT和GIT代理
运维·服务器·git·系统安全·kylin