目录

  • 一、初识Docker
    • 什么是Docker
    • Docker和虚拟机的区别
    • 镜像和容器
    • Docker和DockerHub
  • 二、Docker架构
  • 三、安装Docker
  • 四、Docker的基本操作
    • 镜像操作
    • 容器操作
    • 容器相关命令
    • 数据卷(容器数据管理)
  • 五、Dockerfile自定义镜像
    • 什么是Dockerfile
    • 镜像结构
  • 六、Docker-Compose
    • 初始DockerCompose
    • 部署微服务集群
  • 七、Docker镜像服务
    • 搭建私有镜像仓库
    • 向镜像仓库中推送或拉取镜像

一、初识Docker

大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题

依赖关系复杂,容易出现兼容性问题
开发、测试、生产环境有差异

Docker如何解决依赖的兼容问题?
● 将应用的Libs(函数库)、Deps(依赖)、配置与应用一起打包,形成可移植镜像
● 将每个应用放到一个隔离容器去运行,使用沙箱机制,相互隔离,避免互相干扰

不同环境的操作系统不同,Docker如何解决?
● Docker将用户程序与所需要调用的系统(比如Ubuntu)函数库一起打包,Docker镜像中包含完整运行环境,当运行到不同操作系统时,直接基于打包的库函数,借助于操作系统的Linux内核来运行

什么是Docker

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

① 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统

② 运行时利用沙箱机制形成隔离容器,各个应用互不干扰

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

Docker和虚拟机的区别

docker 是一个系统进程应用执行时直接调用操作系统内核;虚拟机是在操作系统中的操作系统【docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般】

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

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

镜像和容器


镜像(Image): Docker将应用程序及其所需要的依赖、函数库、环境、配置等文件打包在一起,称为镜像。【只读不可写】

容器(Container): 镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。【一个镜像可以运行多个容器】

Docker和DockerHub

DockerHub: DockerHub是一个Docker镜像的托管平台。这样的平台称为Docker Registry。

● 国内也有类似于DockerHub的公开服务,比如 网易云镜像服务、阿里云镜像库等。

二、Docker架构

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

● 服务端(Server): Docker守护进程,负责处理Docker指定,管理镜像、容器等
● 客户端(client): 通过命令或RestAPI向Docker服务器发送指令。可以在本地或远程向服务端发送指令。

三、安装Docker

企业部署一般采用Linux操作系统,而其中CentOS发行版占比较多,因此我们在CentOS下安装Docker

科普
Linux和Windows目录结构对比
Linux系统中的目录
● / 是所有目录的顶点
● 目录结构像一颗倒挂的树

Linux目录介绍

在VMware中启动Linux服务器【端口号为:192.168.197.128】

使用SSH连接工具(finalshell)连接Linux服务器

如果之前安装过旧版本的Docker,可以使用下面命令卸载

yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-engine \docker-ce

安装Docker前首先需要我们虚拟机联网,安装yum工具:

yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken

然后更新本地镜像源:

# 设置docker镜像源
yum-config-manager \--add-repo \https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.reposed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repoyum makecache fast


然后输入命令:

yum install -y docker-ce


docker-ce为社区免费版本。稍等片刻,docker即可安装成功。

启动docker
Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!

启动docker前,一定要关闭防火墙后!!
启动docker前,一定要关闭防火墙后!!
启动docker前,一定要关闭防火墙后!!

# 如何关闭(2种)
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld

通过命令启动docker:

systemctl start docker  # 启动docker服务systemctl stop docker  # 停止docker服务systemctl restart docker  # 重启docker服务

启动成功!!!

输入命令,可以查看docker版本:

docker -v

配置镜像加速

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

参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://6w3xx357.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

四、Docker的基本操作

镜像操作

镜像相关命令
● 镜像名称一般分两部分组成:[repository]:[tag]。
● 在没有指定tag时,默认是latest,代表最新版本的镜像

镜像操作命令

【可通过帮助文档查看相关命令】

#查看帮助文档
docker --help
#查看某一具体命令的作用(例如查看images命令作用)
docker  images  --help

案例一:从DockerHub拉取一个nginx镜像并查看
1、去镜像仓库搜索nginx镜像,比如DockerHub

2、拉取nginx镜像

3、查看本地镜像,是否拉取成功?

案例二:利用docker save将nginx镜像导出磁盘,然后再通过load加载回来
1、利用docker xx --help命令查看docker save(将镜像变为压缩包)和dacker load的语法

2、使用docker tag 创建新镜像mynginx1.0

3、使用docker save导出镜像到磁盘

案例三:去DockerHub搜索并拉取一个Redis镜像
1、去DockerHub搜索Redis镜像

2、查看Redis镜像的名称和版本

3、利用docker pull命令拉取镜像

4、利用docker save命令将redis:latest打包为一个redis.tar包

5、利用docker rmi删除本地的redis:latest

6、利用docker load重新加载redis.tar文件

容器操作

容器相关命令


案例一:创建运行一个Nginx容器
1、 去docker hub查看Nginx的容器命令

docker run --name some-nginx -p 8080:80 -d some-content-nginx

命令解读
● docker run:创建并运行一个容器
● --name:给容器起一个名字,比如mn
● -p:将宿主机端口与容器端口映射,冒号左侧使宿主机端口,右侧是容器端口
● -d:后台运行容器
● nginx:镜像名称,例如nginx

访问成功!!!

案例二:进入Nginx容器,修改HTML文件内容,添加"GY欢迎你!!!"
1、进入容器。进入刚刚创建的nginx容器的命令为:

docker  exec  -it  mn  bash

命令解读
● docker exec:进入容器内部,执行一个命令
● --it:给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
● mn:要进入的容器的名称
● bash:进入容器后执行的命令,bash是一个Linux终端交互命令

2、进入nginx的HTML所在目录/usr/share/nginx/html

cd /usr/share/nginx/html

3、修改index.html的内容

sed -i 's#Welcome to nginx#GY欢迎你#g' index.html
sed -i 's#<head>#<head><meta charset="utf-8">#g' index.html

重新通过浏览器访问,已修改成功!!!

常见命令

查看容器状态:●  docker  ps (默认查看运行中的容器)●  添加-a参数查看所有状态的容器
删除容器:●  docker  rm●  不能删除运行中的容器,除非添加-f参数(强制删除)      【eg: docker rm -f  mn】
进入容器:    ●  命令是docker  exec -it[容器名][要执行的命令]●  exec命令可以进入容器修改文件,但是在容器内修改文件是不推荐的

数据卷(容器数据管理)

数据卷
数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。

容器与数据耦合的问题

  1. 不便于修改:当我们要修改Nginx的html内容时,需要进入容器内部进行修改,很不方便
  2. 数据不可复用:在容器内的修改对外是不可见的。所有修改对新创建的容器是不可复用的
  3. 升级维护困难:数据在容器内,如果要升级容器必然删除旧容器,所有数据都跟着删除了

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

docker volume [COMMAND]

docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:
◆ create————创建一个volume
◆ inspect————显示一个或多个volume
◆ ls————列出所有的volume
◆ prune————删除未使用的volume
◆ rm————删除一个或多个指定的volume

挂载数据卷
在创建容器时,可以通过-v参数来挂载一个数据卷到某个容器目录,如果容器运行时volume不存在,会被自动创建出来

举例说明
docker run \                 docker run:就是创建并运行容器
--name mn \                  --name mn:容器的名字为mn
-v html:/root/html \         -v html:/root/html:把html数据卷挂载到容器内的 /root/html这个目录中
-p 8080:80                   -p 8080:80:把宿主机的8080多口映射到容器内的80端口
nginx \                      nginx:镜像名称

案例一:创建一个nginx容器,修改容器内的html目录内的index.html内容(利用数据卷挂载实现)
需求说明:
进入nginx容器内部(nginx的html目录所在位置/usr/share/nginx/html),我们需要把这个目录挂载到html这个数据卷上,方便操作其中的内容。【提示:运行容器时使用-V参数挂载数据卷】

创建容器并挂载数据卷到容器内的HTML目录

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

进入html数据卷所在位置,并修改HTML内容并保存

cd /var/lib/docker/volumes/html/_data

打开html文件修改成功!!!

访问页面成功!!!

案例二:创建并运行一个MySQL容器,将宿主机目录直接挂载到容器
提示:目录挂载与数据卷挂载的语法时类似的:

●  -v [宿主机]:[容器目录]●   -v [宿主机文件]:[容器内文件]

实现思路

1.  将mysql.tar文件上传到虚拟机,通过load命令加载镜像
2.  创建目录/tmp/mysql/data
3.   创建目录/tem/mysql/conf,将hmy.cnf文件上传到/tmp/mysql/conf
4.  去DockerHub查阅,创建并运行MYSQL容器,要求:①  挂载/tmp/mysql/data到mysql容器内数据存储目录②  挂载/tmp/mysql/conf/hmy.cnf到mysql容器的配置文件③ 设置MySQL密码


资源下载链接:
mysql镜像:https://pan.baidu.com/s/1f2-oeulj2AKvHs-w2BVWtg
提取码:GY66
hmy.cnf:https://pan.baidu.com/s/1gUbE0F9mTs2fRTzJ0gcchw
提取码:GY66

docker run --name mysql -e MYSQL_ROOT_PASSWORD=123 -p 3306:3306 -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf -v /tmp/mysql/data:/var/lib/mysql -d mysql:5.7.25

挂载成功!!!

mysql测试连接成功!!!

数据卷挂载与目录直接挂载对比:①  数据卷挂载耦合度低,由docker来管路目录,但是目录较深,不好找②  目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看

五、Dockerfile自定义镜像

什么是Dockerfile

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

详细语法说明,可参考官方文档:https://docs.docker.com/engine/reference/builder

镜像结构

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

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

● BaseImage层:  包含基本的系统函数库、环境变量、文件系统
●  Entrypoint:   入口,是镜像中应用启动的命令
●  其他:  在BaseImage基础上添加依赖、安装程序、完成整个应用的安装和配置

案例一:基于Ubuntu镜像构建一个新镜像,运行一个java项目

资源下载链接:
docker-demo.jar:https://pan.baidu.com/s/1sM9aJ6AniDWZWjmQSxFSjA
提取码:GY66
jdk8.tar.gz:https://pan.baidu.com/s/1sYS9CN8WTeHhzaGCzSFMcQ
提取码:GY66
Dockerfile:https://pan.baidu.com/s/1uV1gnbwRQm-x6yxCziGX_A
提取码:GY66

1、新建一个空文件夹docker-demo

①  cd /tmp/
②  mkdir docker-demo

2、拷贝docker-demo.jar文件到docker-demo目录
3、拷贝jdk8.tar.gz文件到docker-demo目录
4、拷贝Dockerfile到docker-demo目录

5、进入docker-demo

6、运行命令(构建镜像):docker build -t javaweb:1.0 .(-t [镜像名称:版本] 最后一个点代表Dockerfile所在的目录)

成功构建镜像并运行!!!

访问成功!!!(项目已成功构建镜像并部署到docker容器)

上诉构建镜像过程较繁琐,若我们需要构建大量微服务,每个微服务在做构建时都需要执行完整的流程【分层】。因此我们可将前n层不变的提前构建为一个镜像(eg:jdk的安装、配置环境变量等…)

案例二:基于java:8-alpine镜像(体积很小的jdk的一个镜像),将一个java项目构建为镜像

  1. 新建一个空的目录,然后在目录中新建一 个文件,命名为Dockerfile

  2. 拷贝课前docker-demo.jar到这个目录中

  3. 编写Dockerfile文件 :
    a)基于java:8-alpine作为基础镜像
    b)将app.jar拷 贝到镜像中
    c)暴露端口
    d)编写入口ENTRYPOINT

  4. 使用docker build命令构建镜像

5.使用docker run创建容器并运行

docker run --name web -p 8090:8090 -d javaweb:2.0

小结

Dockerfile的本质是一个文件,通过指令描述镜像的构建过程
Dockerfile的第一行必须是FROM,从一个基础镜像来构建
基础镜像可以是基于操作系统,如Ubuntu。也可以是其他人制作好的镜像,例如:java:8-alpine

六、Docker-Compose

初始DockerCompose

什么是DockerCompose
● Docker Compose可以基于Compose文件帮我们快速部署分布式应用,而无需手动一个个创建和运行容器!
● Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。

DockerCompose的详细语法参考官网:https://docs.docker.com/compose/compose-file/

安装DockerCompose

资源链接
docker-compose文件:https://pan.baidu.com/s/1R6AZsHi3iNFNKL-VkJ7M9A
提取码:GY66

Linux下需要通过命令下载:

  1. 安装
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

如果下载速度较慢,或者下载失败,可以使用资源链接提供的docker-compose文件,
上传到/usr/local/bin/目录也可以。

  1. 修改文件权限(+x:执行权)
 chmod +x /usr/local/bin/docker-compose
  1. Base自动补全命令:
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

如果这里出现错误,需要修改自己的hosts文件 :

echo "192.232.68.133 raw.githubusercontent.com" >> /etc/hosts

部署微服务集群

案例:将之前案例cloud-demo微服务集群利用DockerCompose部署

资源链接
cloud-demo文件夹:https://pan.baidu.com/s/11EPXtWRn1EslTNLBlJBKmw
提取码:GY66

1、打开cloud-demo文件夹,里面已经编写好docker-compose文件

2、修改自己的cloud-demo项目,将数据库、nacos地址都命名为docker-compose中的服务名

3、使用maven打包工具,将项目中的每个微服务都打包为app.jar

4、将打包好的app.jar拷贝到cloud-demo中的每一个对应的子目录中

5、将cloud-demo上传至虚拟机,利用docker-compose up -d 来部署【up:创建并执行容器】

七、Docker镜像服务

常见镜像仓库服务

镜像仓库(Docker Registry)有公共的和私有的两种形式:
● 公共仓库:例如Docker官方的Docker Hub,国内也有一些云服务商提供类似于 Docker Hub 的公开服务,比如 网易云镜像服务、DaoCloud镜像服务、阿里云镜像服务等。
● 除了公开镜像外,用户还可以在本地搭建私有Docker Registry。企业自己的镜像最好采用私有的Docker Registry来实现。

搭建私有镜像仓库

搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。

官网地址:https://hub.docker.com/_/registry

① 简化版镜像仓库

Docker官方的Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,但是没有图形化界面。

搭建方式比较简单,命令如下:

docker run -d \--restart=always \--name registry    \-p 5000:5000 \-v registry-data:/var/lib/registry \registry

命令中挂载了一个数据卷registry-data到容器内的/var/lib/registry 目录,这是私有镜像库存放数据的目录。

访问http://YourIp:5000/v2/_catalog 可以查看当前私有镜像服务中包含的镜像

② 带有图形化界面版本

使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:

version: '3.0'
services:registry:image: registryvolumes:- ./registry-data:/var/lib/registryui:image: joxit/docker-registry-ui:staticports:- 8080:80environment:- REGISTRY_TITLE=星辰大海      # 标题- REGISTRY_URL=http://registry:5000depends_on:- registry

配置Docker信任地址

我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:

1、打开要修改的文件

vi /etc/docker/daemon.json

2、 添加内容:

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

3、 重加载

systemctl daemon-reload

4、重启docker

systemctl   restart  docker

执行DockerCompose

1、新建文件夹

mkdir  registry-ui

2、新建docker-compose文件

touch docker-compose.yml

3、将命令保存至docker-compose.yml文件中

version: '3.0'
services:registry:image: registryvolumes:- ./registry-data:/var/lib/registryui:image: joxit/docker-registry-ui:staticports:- 8080:80environment:- REGISTRY_TITLE=星辰大海- REGISTRY_URL=http://registry:5000depends_on:- registry

向镜像仓库中推送或拉取镜像

推送镜像到私有镜像服务必须先tag,步骤如下:
① 重新tag本地镜像,名称前缀为私有镜像仓库的地址:192.168.197.140:8080/

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

② 推送镜像

docker push  192.168.197.140:8080/nginx:1.0

③ 拉取镜像

  docker pull  192.168.197.140/nginx:1.0

Docker(从入门到部署微服务集群)相关推荐

  1. Docker-Compose一些常见的报错解决方法【部署微服务集群】

    部署微服务集群 ① 上传编写好了docker-compose文件 ② 启动nacos微服务 docker run --env MODE=standalone --name nacos -d -p 88 ...

  2. DockerCompose-部署微服务集群

    部署微服务集群 需求:将之前学习的cloud-demo微服务集群利用DockerCompose部署 实现思路: ① 查看提供的cloud-demo文件夹,里面已经编写好了docker-compose文 ...

  3. docker入门与部署微服务--学习笔记

    最近公司进一步去windows,走向 linux+云化. 原来的一大坨windows虚拟机服务器都要转向linux, 既然走向linux的话,那么docker肯定是要涉足的. 故学习了docker入门 ...

  4. 使用 Docker Stack 部署多服务集群

    使用 Docker Stack 部署多服务集群 前言 单机模式下,我们可以使用 Docker Compose 来编排多个服务,而在 上一篇文章 中介绍的 Docker Swarm 只能实现对单个服务的 ...

  5. Eclipse启动SpringCloud微服务集群的方法

    1.说明 下面这篇文章介绍了Eureka Server集群的启动方法, SpringCloud创建Eureka模块集群 是通过jar包启动时指定配置文件的方式实现的. 现在只有Eureka Serve ...

  6. SkeyeVSS综合安防监控Onvif、RTSP、GB28181视频云无插件直播点播解决方案之子系统微服务集群解决方案

    SkeyeVSS综合安防监控Onvif.RTSP.GB28181视频云无插件直播点播解决方案之子系统微服务集群 我们通过SkeyeVSS系列文章<SkeyeVSS集群部署说明文档>可以了解 ...

  7. spring boot 微服务集群 + 注册中心

    spring boot 微服务框架下载地址: https://start.spring.io/ 注册中心 Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进 ...

  8. (转) 分布式-微服务-集群的区别

    1.分布式 将一个大的系统划分为多个业务模块,业务模块分别部署到不同的机器上,各个业务模块之间通过接口进行数据交互.区别分布式的方式是根据不同机器不同业务. 上面:service A.B.C.D 分别 ...

  9. 【微服务】如何实现微服务集群的高可靠?

    实现微服务高可靠11连问 前言 概述 优势 难点 1. 微服务架构中有哪些技术手段必须在设计阶段就需要规划进去? 2. 缓存是每个互联网应用系统必备的组件,在微服务框架下如何用好缓存来提高系统的QPS ...

  10. SpringCloud微服务(04):Turbine组件,实现微服务集群监控

    一.聚合监控简介 1.Dashboard组件 微服务架构中为了保证程序的可用性,防止程序出错导致网络阻塞,出现了断路器模型.断路器的状况反应程序的可用性和健壮性,它是一个重要指标.HystrixDas ...

最新文章

  1. ACMNO.11 一个数如果恰好等于它的因子之和,这个数就称为“完数“。 例如,6的因子为1、2、3,而6=1+2+3,因此6是“完数“。 编程序找出N之内的所有完数,并按下面格式输出其因子
  2. 初学图论-Bellman-Ford单源最短路径算法
  3. Eclipse中CVS版本管理
  4. FP、FN、TP、TN、精确率(Precision)、召回率(Recall)、准确率(Accuracy)评价指标详述
  5. .NET Core New csproj 如何发布可执行文件
  6. TensorFlow:字词的向量表示
  7. rowStyle设置Bootstrap Table行样式
  8. Caffe学习:Data
  9. 【BZOJ1966】[AHOI2005]病毒检测(动态规划)
  10. 老版迅雷5.8无限制经典版
  11. 拨号上网和宽带上网的区别分析
  12. java 代码实现加锁_java内置锁实现锁住代码块方案(同一个对象或锁住整个类.class)...
  13. 【verbs】ibv_reg_mr()
  14. bomb和mysql_Bigger Bomb
  15. 什么是ASP.NET
  16. 周志华《机器学习》第三章线性模型笔记+习题
  17. Java转化音频格式 m4a-wav
  18. 怎么将微博图片中的水印去掉
  19. 深圳家庭数据存储 家庭数据备份 数蚁科技
  20. fgsea进行GSEA富集分析

热门文章

  1. 中国互联网+政务建设产业运行状况分析及前景战略研究报告2022-2028年版
  2. SWOT模板与方法论
  3. xmind电脑安卓v2021.20.8免费全平台永久思维导图直装版
  4. 蓝芯保护卡_蓝芯防毒卡无忧版
  5. MySQL高级学习(一) (吾爱破解)
  6. 一个毕业设计手机病毒软件查杀
  7. dex2jar .\classes.dex - .\classes-dex2jar.jar com.googlecode.d2j.DexException: not support version
  8. Python 结合bat批处理文件 实现密码保管箱
  9. 数据权限设计思路_权限设计数据权限
  10. Oracle StorageTek磁带库产品线或将终结