Docker

Docker是一种轻量级容器技术,解决了项目部署中的依赖和环境一致性问题。它将应用及其环境打包成镜像,实现跨平台运行。与虚拟机相比,Docker更轻便、启动快。文章还介绍了Docker的基本操作,如镜像和容器的管理,以及Dockerfile和DockerCompose用于自动化部署。此外,还讲解了如何搭建和使用私有镜像仓库。
摘要由CSDN通过智能技术生成

一、初识 Docker

1. 什么是 Docker

(1) 项目部署存在的问题:

大型项目组件较多,运行环境也较为复杂,

部署时会碰到一些问题:

① 依赖关系复杂,容易出现兼容性问题

② 开发、测试、生产环境有差异

 1) Docker 解决依赖的兼容问题:

① 将应用的 Libs (函数库)、Deps (依赖)、

    配置与应用一起打包

② 将每个应用放到一个隔离容器去运行,

     避免互相干扰

 2) Docker 解决不同环境操作系统不同的

      问题:

操作系统可分为三层,系统应用内核

还有计算机硬件

其中内核与硬件交互,提供操作硬件的

指令,系统应用封装内核指令为函数

便于程序员调用,用户程序基于系统函

数库实现功能

Ubuntu 和 CentOS 都是基于 Linux 内核,

只是系统应用不同,提供的函数库有差异

解决方式:

① Docker 将用户程序与所需要调用的系

    统 (比如Ubuntu) 函数库一起打包

② Docker 运行到不同操作系统时,直接

    基于打包的库函数,借助于操作系统的

    Linux 内核来运行

(2) Docker 解决大型项目

解决大型项目依赖关系复杂,不同组件依赖

的兼容性问题:

① Docker 允许开发中将应用、依赖、函

    数库、配置一起打包,形成可移植镜像

② Docker 应用运行在容器中,使用沙箱

    机制,相互隔离

解决开发、测试、生产环境有差异的问题:

Docker 镜像中包含完整运行环境,包括

系统函数库,仅依赖系统的 Linux 内核,

因此可以在任意 Linux 操作系统上运行  

(3) 总结

Docker 是一个快速交付应用、运行应用的

技术:

① 可以将程序及其依赖、运行环境一起

    打包为一个镜像,可以迁移到任意

    Linux操作系统

② 运行时利用沙箱机制形成隔离容器,

    各个应用互不干扰

③ 启动、移除都可以通过一行命令完成,

    方便快捷

2. Docker 和虚拟机的区别

虚拟机 (virtual machine) 是在操作系统

模拟硬件设备,然后运行另一个操作

系统,比如在 Windows 系统里面运行

Ubuntu 系统,这样就可以运行任意的

Ubuntu 应用了

① docker 是一个系统进程

   虚拟机是在操作系统中的操作系统

② docker 体积、启动速度、性能

   虚拟机体积大、启动速度慢、性能一般 

特性Docker虚拟机
性能接近原生性能较差
硬盘占用一般为 MB一般为 GB
启动秒级分钟级

3. Docker架构

(1) 镜像和容器

镜像 (Image):Docker 将应用程序及其

所需的依赖、函数库、环境、配置等文

件打包在一起,称为镜像

容器 (Container):镜像中的应用程序运

行后形成的进程就是容器,只是 Docker

会给容器做隔离,对外不可见

  

(2) Docker 和 DockerHub

DockerHub:DockerHub 是一个 Docker

镜像的托管平台,这样的平台称为 Docker

Registry

国内也有类似于 DockerHub 的公开服务,

比如 网易云镜像服务、阿里云镜像库等

(3) Docker 架构

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

服务端(server):Docker 守护进程,负责处

           理 Docker 指令,管理镜像、容器等

客户端(client):通过命令 RestAPI

           Docker 服务端发送指令,可以在

           地或远程向服务端发送指令

4. 安装 Docker

二、Docker 的基本操作

1. 镜像操作

镜像名称一般分两部分组成:

[repository]:[tag]

例如:mysql:5.7

在没有指定 tag 时,默认是 latest,代表

最新版本的镜像

docker images:查看镜像

docker rmi:删除镜像

docker pull:从服务器拉取镜像

docker push:推送镜像到服务器

docker save:保存镜像为压缩包

docker load:加载压缩包为镜像

docker build:构建镜像

 (2) 案例:从 DockerHub 中拉取一个 nginx

      镜像并查看

输入命令拉取:docker pull ngnix 

 

通过命令:docker images 查看拉取到的镜像 

 

2. 容器操作

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

docker logs:查看容器运行日志

docker exec:进入容器执行命令

docker rm:删除指定容器

 (2) 案例:创建运行一个 Nginx 容器

去 docker hub 查看 Nginx 的容器运行命令

docker run --name containerName -p 80:80 -d nginx

命令解读:

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

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

-p :宿主机端口容器端口映射

-d:后台运行容器

nginx:镜像名称,例如nginx

3.数据卷 (容器数据管理)

(1) 容器与数据耦合的问题:

① 不便于修改

   当我们要修改 Nginx 的 html 内容时,

   需要进入容器内部修改,很不方便

② 数据不可复用

   在容器内的修改对外是不可见的,所

   有修改对新创建的容器是不可复用的

③ 升级维护困难

    数据在容器内,如果要升级容器必然

    删除旧容器,所有数据都跟着删除了

数据卷(volume)是一个虚拟目录,指向

宿主机文件系统中的某个目录

(2) 数据卷的作用:

将容器与数据分离,解耦合,方便操作

容器内数据,保证数据安全

(3) 数据卷操作:

docker volume create:创建数据卷

docker volume ls:查看所有数据

docker volume inspect:查看数据卷详

                                       细信息卷

docker volume rm:删除一个或多个数

                                据卷

docker volume prune:删除未使用数据

                                     卷

(4) 挂载数据卷

我们在创建容器时,可以通过 -v 参数

来挂载一个数据卷到某个容器目录

  1) docker run 的命令中通过 -v 参数挂载

      文件或目录到容器中: 

-v volume名称 : 容器内目录

-v 宿主机文件 : 容器内文件

-v 宿主机目录 : 容器内目录

  2) 数据卷挂载与目录直接挂载的区别

① 数据卷挂载耦合度,由 docker 来

    管理目录,但是目录较深,不好找

② 目录挂载耦合度,需要我们自己管

    理目录,不过目录容易寻找查看 

三、Dockerfile 自定义镜像

很多时候需要自己构建镜像,构建镜像需

要写 Dockerfile

1. 镜像结构

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

① 底层是系统函数库(例如 Ubuntu),这一

    层也叫做基础镜像(BaseImage),相当于

    地基

② 在地基上添加安装包,添加安装包、配

    置、依赖等,每次形成新的一层

③ 最后需要提供一个入口(Entrypoint),也

    就是程序启动的脚本和参数

2. Dockerfile 语法

Dockerfile 是一个文本文件没有后缀

其中包含一些指令(Instruction),每一个

指令就是一层

常用指令:

① Dockerfile 的第一行必须是 FROM

    从一个基础镜像来构建

② 基础镜像可以是基本操作系统,如

    Ubuntu,也可以是其他人制作好的

    镜像,例如:java:8-alpine

③ 写好 Dockerfile 后使用 docker build

    命令构建镜像

四、Docker-Compose

1. 初识 Docker Compose

① Docker Compose 可以基于 Compose

   文件帮我们快速的部署分布式应用,而

   无需手动一个个创建和运行容器!

② Compose 文件是一个文本文件,通过

   指令定义集群中的每个容器如何运行

version: "3.8"

services:
  mysql:
    image: mysql:5.7.25
    environment:
     MYSQL_ROOT_PASSWORD: 123 
    volumes:
     - "/tmp/mysql/data:/var/lib/mysql"
     -  "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"
  web:
    build: .
    ports:
     - "8090:8090"

2. 安装步骤

# 下载docker-compose
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 添加执行权限
chmod +x /usr/local/bin/docker-compose
# 下载自动补全
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

3. 基本命令

# 后台启动当前项目 也可以指定服务
docker-compose up -d
# 查看项目容器
docker-compose ps
# 停止容器运行 可以指定服务
docker-compose stop
# 停止并删除容器 可以加参数来删除镜像、数据卷等
docker-compose down
# 持续查看日志
docker-compose logs -f
# 构建或重新构建镜像 可以指定服务
docker-compose build

五、Docker 镜像仓库

镜像仓库(Docker Registry)有公共的和

私有的两种形式,企业自己的镜像最好

是采用私有 Docker Registry 来实现

1. 搭建私有镜像仓库

① 准备好 docker-compose.yml

version: '3.0'
services:
  registry:
    image: registry
    volumes:
      - ./registry-data:/var/lib/registry
  ui:
    image: joxit/docker-registry-ui:static
    ports:
      - 5000:80
    environment:
      - REGISTRY_TITLE=docker私服
      - REGISTRY_URL=http://registry:5000
    depends_on:
      - registry

② 设置信任地址

私服采用的是 http 协议,默认不被 Docker

信任,所以需要做一个配置:

# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["http://yourip:port"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker

③ 启动 

docker-compose up -d

④ 访问 ip + 端口登录

2. 向镜像仓库推送镜像

① 上传镜像

重新 tag 本地镜像,名称前缀为私有仓库

的地址:192.168.150.101:8080/

docker tag nginx:latest 192.168.150.101:8080/nginx:1.0

② 推送镜像 

docker push 192.168.150.101:8080/nginx:1.0

③ 从镜像仓库拉取镜像

docker pull 192.168.150.101:8080/nginx:1.0 

总结:

① 推送本地镜像到仓库前都必须重命名

    (docker tag)镜像,以镜像仓库地址为

    前缀

② 镜像仓库推送前需要把仓库地址配置

     到 docker 服务的 daemon.json 文件

     中,被 docker 信任

③ 推送使用 docker push 命令

④ 拉取使用 docker pull 命令

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值