Docker(黑马spring cloud笔记)详解

 更新时间:2023年01月18日 14:32:42   作者:yangsf_  
这篇文章主要介绍了Docker(黑马spring cloud笔记)详解,本文章内容详细,具有很好的参考价值,希望对大家有所帮助,需要的朋友可以参考下<BR>

介绍和安装

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

几个概念:

  • 镜像(image):Docker将应用程序及其所需要的依赖、函数库等打包在一起,即为镜像。
  • 容器:镜像中的应用程序运行后形成的进程。
  • Docker Registry:镜像托管平台,如DockerHub,网易云镜像服务,阿里云镜像服务。

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

安装存储驱动等:

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

设置docker仓库:

# 设置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

安装社区版docker:

yum install -y docker-ce

启动

# 关闭防火墙
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
# 启动docker服务
systemctl start docker
# 停止docker服务
systemctl stop docker  
# 重启docker服务
systemctl restart docker  
# 查看docker版本
docker -v

镜像加速

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

Docker基本操作

镜像操作

一些简单的操作:

# 查看镜像
docker images
# 删除镜像
docker rmi 
# 拉取镜像
docker pull
# 推送镜像到Docker Registry
docker push
# 保存镜像为tar包
docker save
# 加载tar包为镜像
docker load
…………

命令有很多,不必记忆,勤用

--help

例如:

docker images --help

容器操作

一些简单的容器操作:

# 创建容器
docker run
# 进入容器
docker exec
# 查看容器日志(添加-f可以持续查看)
docker logs 
# 查看容器
docker ps
# 删除容器
docker rm
…………

数据卷操作

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

docker volume [COMMAND]

create 创建数据卷inspect 显示一个或多个数据卷的信息ls 列出所有数据卷prune 删除未使用数据卷rm 删除一个或多个数据卷

后文练习123帮助理解。

Dockerfile

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

镜像结构

首先介绍镜像结构,镜像是应用程序及其所需要的系统函数库、环境、配置、依赖一层一层构建出来的,以mysql为例:

底层是系统函数库(例如Ubuntu),这一层也叫做基础镜像(BaseImage),相当于地基。

然后在地基上添加安装包,配置环境变量、配置、依赖等等。

最后需要提供一个入口(Entrypoint),也就是程序启动的脚本和参数。

Dockerfile

Dockerfile是一个文本文件,名为Dockerfile,没有后缀,其中包含一些指令,每一个指令就是一层。

常用指令:

写好Dockerfile后使用

docker build

命令构建镜像

详见练习4

Docker-Compose

若是部署微服务集群,一个个docker去构建会很繁琐,所以需要DOcker-Compose。

DockerCompose基于Compose文件快速部署分布式应用,无需手动一个个的创建和运行。

Compose文件也是一个文本文件,通过指令定义集群中的每个容器如何运行。

安装

# 下载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

基本命令

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

和docker操作差不多

Docker 私 服搭建

搭建一个docker 私 服。

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

存放镜像的目录得准备好。

还得给docker设置信任地址。

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

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

然后就可以

docker-compose up -d

启动

访问ip+端口,成功:

上传一个镜像试试:

# 标记镜像,归入私 服,有格式要求,名称前缀为私 服地址
docker tag nginx:latest xxx:xxx/nginx:1.0
# 推送
docker push xxx:xxx/nginx:1.0
# 拉取
docker pull xxx:xxx/nginx:1.0

练习

练习1:save和load

打包镜像:

docker save -o mynginx.tar nginx:latest

加载镜像:

docker load -i mynginx.tar

练习2:docker部署nginx

# 拉取
docker pull nginx
# 启动
docker run --name mynginx -p 8080:80 -d nginx
# -p 后面的端口 左边是宿主机 右边是容器 
# -d 后台运行

此时访问宿主机的8080端口即可访问到nginx服务。

问题:修改主页

方式一:进入容器修改/usr/share/nginx/html/index.html文件(这个路径dockerhub的nginx镜像官方文档中可以找到)

# 进入容器
docker exec -it mynginx bash
# -it 给当前进入的容器创建一个标准输入输出的终端,允许我们与容器交互
# bash 进入容器执行的命令

# 因为没有vi等文本编辑器,所以使用替换命令
sed -i 's#Welcome to nginx#替换#g' index.html
sed -i 's#<head>#</head><meta charset="utf-8">#g' index.html

这种方式明显是有很大局限性的!容器和数据耦合度非常高,操作繁琐不说,数据也不可复用,维护也非常困难。

方式二:将数据卷挂载到/usr/share/nginx/html目录。

# 强行删除容器
docker rm -f mynginx
# 准备一个目录
mkdir -p /tmp/nginx/html
# 启动
docker run --name mynginx -v /tmp/nginx/html:/usr/share/nginx/html -p 8080:80 -d nginx
# -p 后面的端口 左边是宿主机 右边是容器 
# -d 后台运行
# -v 数据卷挂载 左边是宿主机目录 右边是容器

这样 就可以把数据和容器解耦了。

练习3:部署MySQL

# 拉取镜像(先去dockerhub看看镜像名和版本)
docker pull mysql:5.7.25
# 准备存放数据和配置的数据卷
mkdir -p /tmp/mysql/data
mkdir -p /tmp/mysql/conf

准备mysql配置文件后缀是.conf例如my.conf,内容如下:

[mysqld]
skip-name-resolve
character_set_server=utf8
datadir=/var/lib/mysql
server-id=1000
# 启动mysql
docker run \
--name mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 \
-v /tmp/mysql/conf:/etc/mysql/conf.d \
-v /tmp/mysql/data:/var/lib/mysql \
-d \
mysql:5.7.25
# -e 后面表示这个容器的环境变量 这里我们将环境变量MYSQL_ROOT_PASSWORD赋值为123456
# -p 端口 左宿主 右容器
# -v 数据卷挂载
# -d 后台运行

这里面的一些数据是需要取看官方文档的,例如环境变量、配置文件目录等。

练习4:基于Ubuntu构建一个新镜像,运行一个java项目

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 .
# -t 表示后面是 name:tag
#. 表示Dockerfile所在的目录 . 表示当前目录

# 启动容器
docker run --name web -p 8090:8090 -d javaweb:1.0

问题 层数太多,每次都要安装jdk

这样做有缺陷,有很多层都用来做安装jdk了:

# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local
# 拷贝jdk
COPY ./jdk8.tar.gz $JAVA_DIR/
# 安装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

所以改进后:

# 指定基础镜像
FROM java:8-alpine
# 拷贝项目
COPY ./docker-demo.jar /tmp/app.jar
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

练习5:部署微服务集群

部署之前的cloud-demo。

修改cloud-demo中的配置,nacos和mysql的地址改为docker-compose中的服务名,例如:

spring:
  datasource:
    url: jdbc:mysql://mysql:3306/cloud_order?useSSL=false
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
  application:
    name: orderservice
  cloud:
    nacos:
      server-addr: nacos:8848

打包,然后写对应的Dockerfile,例如:

打包有个小坑 如果之前feign-api这个公共模块是创建的spring项目而不是maven项目,那么会order-service打包失败,换一个打包插件就好:

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
    </plugin>
</plugins>

然后install一下这个模块就行。

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

完成后:

编写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"

启动docker-compose

docker-compose up -d
# 后台运
docker-compose logs -f
# 持续查看日志

问题:微服务注册失败

原因:nacos启动慢,微服务启动时nacos还没有启动完成。

解决:重启指定微服务,下次部署时先部署好nacos,使用depends_on也不行不知道啥问题。

docker-compose restart gateway userservice orderservice
# 重启指定服务
docker-compose logs -f
# 持续查看日志

到此这篇关于Docker(黑马spring cloud笔记)详解的文章就介绍到这了,更多相关Docker内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • docker 命令报异常permission denied的解决方案

    docker 命令报异常permission denied的解决方案

    这篇文章主要介绍了docker 命令报异常permission denied的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • docker容器运行后退出(怎么才能一直运行)

    docker容器运行后退出(怎么才能一直运行)

    这篇文章主要介绍了docker容器运行后退出(怎么才能一直运行),本文详细的介绍了解决方法,非常具有实用价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • Docker容器的网络管理和网络隔离的实现

    Docker容器的网络管理和网络隔离的实现

    这篇文章主要介绍了Docker容器的网络管理和网络隔离的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • 如何在docker中运行springboot项目过程图解

    如何在docker中运行springboot项目过程图解

    这篇文章主要介绍了如何在docker中运行springboot项目过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • CentOS 6.5 制作可以ssh登录的Docker镜像

    CentOS 6.5 制作可以ssh登录的Docker镜像

    这篇文章主要介绍了CentOS 6.5 制作可以ssh登录的Docker镜像,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • docker compose部署cassandra集群的操作代码

    docker compose部署cassandra集群的操作代码

    这篇文章主要介绍了docker compose部署cassandra集群的操作代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-03-03
  • Harbor搭建Docker私有仓库的实现方法

    Harbor搭建Docker私有仓库的实现方法

    Harbor是一个由CNCF托管的开源的Docker镜像仓库管理工具,我们可以通过它快速的建立起自己的私有仓库,本文就详细的介绍了Harbor搭建Docker私有仓库的实现方法,感兴趣的可以了解一下
    2021-06-06
  • docker修改默认ip的实现步骤

    docker修改默认ip的实现步骤

    在 Docker 中,默认的网络是 bridge 网络,它通常使用 172.17.0.0/16 这个网段,那么如何修改,本文就来详细的介绍下docker修改默认ip的实现步骤,感兴趣的可以了解一下
    2024-02-02
  • docker网络双向连接详解

    docker网络双向连接详解

    在本篇文章里小编给大家分享的是一篇关于docker网络双向连接知识点详解内容,有兴趣朋友们可以参考学习下。
    2020-01-01
  • Docker部署Django+Mysql+Redis+Gunicorn+Nginx的实现

    Docker部署Django+Mysql+Redis+Gunicorn+Nginx的实现

    这篇文章主要介绍了Docker 部署 Django+Mysql+Redis+Gunicorn+Nginx,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11

最新评论