posts - 26,comments - 0,views - 20642

Docker

1、Docker是什么

分布式微服务现在已成为主流技术,但是服务拆分后服务数量庞大,依赖冲突、环境部署会很麻烦,Docker可以解决这一系列问题

 

如何解决依赖冲突问题

  • 将应用的Libs(函数库)、Deps(依赖)、配置与应用一起打包,每个容器就像一个小的系统

  • 采用容器化技术,将每个服务放到隔离容器,避免互相干扰

如何解决不同系统环境的问题

应用执行步骤:用户应用-->系统应用(操作系统函数库)-->linux内核-->计算机硬件

  • Docker将用户程序与所需要调用的系统函数库一起打包

  • Docker运行到不同操作系统时,直接基于打包的函数库,借助于操作系统的Linux内核来运行

Docker优势

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

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

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

Docker和虚拟机的区别

  • docker是一个系统进程仅封装了系统的函数库并没有模拟一个完整的操作系统;虚拟机是在操作系统中的操作系统,模拟了一个完整的操作系统

  • docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般

2、Docker架构

2.1容器和镜像概念

镜像(Image)

Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。

容器(Container)

镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见。

一切应用最终都是代码组成,都是硬盘中的一个个的字节形成的文件。只有运行时,才会加载到内存,形成进程。而镜像,就是把一个应用在硬盘上的文件、及其运行环境、部分系统函数库文件一起打包形成的文件包。这个文件包是只读的。容器呢,就是将这些文件中编写的程序、函数加载到内存中允许,形成进程,只不过要隔离起来。因此一个镜像可以启动多次,形成多个容器进程。

2.2镜像仓库

存储镜像的地方

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

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

公司一般会搭建自己的镜像仓库

2.3架构模型

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

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

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

 

3、安装Docker

基于centos7安装流程(其他系统参照官网安装指南

3.1 卸载(可选)

如果之前安装过旧版本的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
复制代码

3.2 安装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.repo
    
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
​
yum makecache fast

然后输入命令:

yum install -y docker-ce

 

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

3.3 启动docker

Docker应用需要用到各种端口,学习阶段建议大家直接关闭防火墙!企业应用阶段为了安全性需要我们按需开放端口

# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld

通过命令启动docker:

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

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

docker -v

3.4 配置镜像加速

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://wfdhhn4l.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

 

4、Docker镜像操作

Docker镜像名称一般包含两部分:名称:版本 如果没有指定版本默认为latest(最新镜像)

docker pull 拉取一个镜像 具体需要去dockerhub查看
docker images 查看镜像
docker save -o [保存的目标文件名称] [镜像名称] 导出保存镜像
docker rmi 删除镜像
docker load -i 加载镜像文件

5、Docker容器操作

创建并运行一个容器

docker run --name 名称 -p 主机端口:容器端口 -d 镜像名称 
    -p 端口
    -name 名称
    -d 后台运行

 

暂停容器

docker pause 实例名称

恢复运行

docker unpause 实例名称

停止容器

docker stop 实例名称

启动容器

docker start 实例名称

删除一个容器

docker rm 实例名称

查看所有容器

docker ps -a

查看运行中容器

docker ps

进入容器(后面会采用挂在数据卷的形式可以使用高级编辑器编辑容器内容)

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

查看容器日志

docker logs

持续查看容器日志

docker logs -f

6、数据卷(容器数据管理)

解决问题:

  • 容器数据不便于修改

  • 容器数据不可以复用

  • 容器升级维护困难

6.1 数据卷定义

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

 

完成数据卷挂在后,容器内数据通过数据卷可以与本地目录进行双向绑定,对容器的一切操作都会作用在数据卷对应的宿主机目录了。

6.2 操作命令

  • 创建一个数据卷

    docker volume create

  • 显示一个或多个数据卷的信息

    docker volume inspect

  • 列出所有的数据卷

    docker volume ls

  • 删除未使用的数据卷

    docker volume prune

  • 删除一个或多个指定的数据卷

    docker volume rm

  • 挂载数据卷

    docker run --name 名称 -p 主机端口:容器端口 -v 数据卷名称:容器内目录 -d 镜像名称

可以通过多个 -v 挂载多个数据卷

也可以直接挂载本地目录 -v 本地目录:容器内目录

数据卷挂载与目录挂载区别

  • 数据卷挂载耦合度低,由docker来管理目录,但是目录较深,不好找

  • 目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看

7、Dockerfile自定义镜像

7.1 镜像结构

 

7.2 Dockerfile语法

构建自定义的镜像时,并不需要一个个文件去拷贝,打包。

我们只需要告诉Docker,我们的镜像的组成,需要哪些BaseImage、需要拷贝什么文件、需要安装什么依赖、启动脚本是什么,将来Docker会帮助我们构建镜像。

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

 

更新详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder

  • 基于Ubuntu构建Java项目

    • 新建一个文件夹

    • 拷贝jdk,jar包到改文件夹下

    • 在文件夹新建文件DockerFile

    • 修改文件内容如下

      复制代码
      # 指定基础镜像
      FROM ubuntu:16.04
      # 配置环境变量,JDK的安装目录
      ENV JAVA_DIR=/usr/local
      ​
      # 拷贝jdk和java项目的包
      COPY ./jdk8.tar.gz $JAVA_DIR/
      COPY ./docker-demo.jar /tmp/app.jar
      ​
      # 安装JDK
      RUN cd $JAVA_DIR \
       && tar -xf ./jdk8.tar.gz \
       && mv ./jdk1.8.0_144 ./java8
      ​
      # 配置环境变量
      ENV JAVA_HOME=$JAVA_DIR/java8
      ENV PATH=$PATH:$JAVA_HOME/bin
      ​
      # 暴露端口
      EXPOSE 8090
      # 入口,java项目的启动命令
      ENTRYPOINT java -jar /tmp/app.jar
      复制代码
    • 执行构建命令

      docker build -t javaweb:1.0 .

      . 表示当前目录

  • 基于java8构建Java项目

    基本上与上面一致,dockerfile文件内容改为无需拷贝jdk 只需要拷贝我们的jar包

    FROM java:8-alpine
    COPY ./app.jar /tmp/app.jar
    EXPOSE 8090
    ENTRYPOINT java -jar /tmp/app.jar

     

8、Docker-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"
复制代码

上面的Compose文件就描述一个项目,其中包含两个容器:

  • mysql:一个基于mysql:5.7.25镜像构建的容器,并且挂载了两个目录

  • web:一个基于docker build临时构建的镜像容器,映射端口时8090

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

8.1 安装Docker-Compose

下载

Linux下需要通过命令下载:

# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

如果下载速度较慢,或者下载失败

可以在网上下载docker-compose文件:上传到/usr/local/bin/目录也可以。

修改文件权限

# 修改权限
chmod +x /usr/local/bin/docker-compose

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 "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts

8.2 集群部署

  • 修改自己的cloud-demo项目,将数据库、nacos地址都命名为docker-compose中的服务名然后将各个服务打包为jar包

  • 每个服务创建一个文件夹,用来存放jar包,以及DockerFile

  • 新建一个docker-compose.yml文件 格式例子如下

    version: "3.2"

    services:
    nacos:
      image: nacos/nacos-server
      environment:
        MODE: standalone
      ports:
        - "8848:8848"
    mysql:
      image: mysql:5.7.25
      environment:
        MYSQL_ROOT_PASSWORD: 123
      volumes:
        - "$PWD/mysql/data:/var/lib/mysql"
        - "$PWD/mysql/conf:/etc/mysql/conf.d/"
    userservice:
      build: ./user-service
    orderservice:
      build: ./order-service
    gateway:
      build: ./gateway
      ports:
        - "10010:10010"

    可以看到,其中包含5个service服务:

    • nacos:作为注册中心和配置中心

      • image: nacos/nacos-server: 基于nacos/nacos-server镜像构建

      • environment:环境变量

        • MODE: standalone:单点模式启动

      • ports:端口映射,这里暴露了8848端口

    • mysql:数据库

      • image: mysql:5.7.25:镜像版本是mysql:5.7.25

      • environment:环境变量

        • MYSQL_ROOT_PASSWORD: 123:设置数据库root账户的密码为123

      • volumes:数据卷挂载,这里挂载了mysql的data、conf目录,其中有我提前准备好的数据

    • userserviceorderservicegateway:都是基于Dockerfile临时构建的

部署

docker-compose up -d

9、Docker镜像仓库

9.1 简化版镜像仓库

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 目录,这是私有镜像库存放数据的目录。

9.2 带有图形化界面版本

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

version: '3.0'
services:
registry:
  image: registry
  volumes:
    - ./registry-data:/var/lib/registry
ui:
  image: joxit/docker-registry-ui:static
  ports:
    - 8080:80
  environment:
    - REGISTRY_TITLE=简易代码私有仓库
    - REGISTRY_URL=http://registry:5000
  depends_on:
    - registry

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

9.3 配置Docker信任地址

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

# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["http://自己的ip:上面配的端口"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker

9.4 镜像仓库的使用

推送镜像到私有镜像服务必须先tag,步骤如下:

① 重新tag本地镜像,名称前缀为私有仓库的地址:ip:上面配的端口

docker tag nginx:latest ip:上面配的端口/nginx:1.0 

② 推送镜像

docker push ip:上面配的端口/nginx:1.0 

③ 拉取镜像

docker pull ip:上面配的端口/nginx:1.0 

 

posted on   简易代码  阅读(85)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示