logo头像

分享技术,品味人生

微服务-docker

Day03- 配置中心、Feign声明http框架、GW网关

本章小结:

  1. Docker 基本知识了解、实践
  2. Docker 三大块实践【镜像、容器、数据卷】
  3. Dockerfile实践
  4. Docker-compose 批量安装编排基本实战
  5. Docker Registry 镜像仓库实战

[TOC]


No.01-Docker知识整理

1、Docker是什么

image-20211015084547671

2、Docker与虚拟机的差别

image-20211015084557609

3、K8S是什么,与Docker的区别

4、Docker都有什么

image-20211015084606581

image-20211015084624930

No.02-Docker命令实践

0、Docker安装

  • 常识

    • Docker 分为 CE 和 EE 两大版本。
    • CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。
    • Docker CE 分为 stable testnightly 三个更新频道。
    • Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10, CentOS 7 满足最低内核的要求。
  • 卸载(可选)

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

更新XFS文件系统管理工具:

yum update xfsprogs -y

然后更新本地镜像源:

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

安装ce报错,网上搜了下,执行这个脚本,安装contain-selinux

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

然后输入命令:

yum install -y docker-ce

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

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

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

通过命令启动docker:

systemctl enable docker
systemctl start docker

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

docker --version

如图:

  • 配置镜像

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

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

systemctl daemon-reload
systemctl restart docker
  • docker命令

docker服务的命令:

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

1、镜像命令

image-20211015092008059

  • 从官方hub拉取一个nginx镜像并查看

image-20211015090150992

命令实践,==pull/push暂缓==

# 不写tag,默认拉取latest
docker pull nginx

# 查看本地镜像清单
docker images

# 导出镜像为tar
docker save -o nginx.tar nginx:latest

# 删除镜像
docker rmi nginx

# 导入镜像
docker load -i nginx.tar

# 查看latest实际版本
docker image inspect nginx:latest | grep -i version

# tag标记或备份?
docker tag nginx:latest nginx:lin

image-20211015091552816

docker pull redis
docker inspect redis|grep -i version
docker save -o redis.tar redis:latest
docker rmi redis:latest
docker images
docker load -i redis.tar

2、容器命令

image-20211015092019673


# 运行一个容器,并设置名称、端口【宿主机:容器端口】、后端运行、镜像:版本号
docker run --name mn -p 80:80 -d nginx:latest

# 查看运行或暂挂的容器
docker ps

# 查看容器日志
docker logs mn

# 进入容器bash,根据官方hub文档提示的目录用sed命令修改文件,并web查看效果
docker exec -it mn bash
cd /usr/share/nginx/html/
sed -i 's#Welcome to nginx#lin baba welcome#g' index.html

# 暂停容器
docker pause mn
# 恢复容器
docker unpause mn

# 停止并删除容器
docker stop mn
docker ps -a
docker rm mn

image-20211015094824982

docker run --name mr -p 6379:6379 -d redis:latest
docker ps
docker logs mr

# 进入容器,进入redis设置num为666,重启容器后数据依旧在
docker exec -it mr bash
[root@docker ~]# docker exec -it mr bash
root@4e21007e8dbf:/data# redis-cli 
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set num 666
OK
127.0.0.1:6379> keys *
1) "num"
127.0.0.1:6379> get num
"666"

docker stop mr
docker start mr


# 直接进入cli,退出也少了一层!!!
docker exec -it mr redis-cli
127.0.0.1:6379> keys *
1) "num"
127.0.0.1:6379> get num
"666"

桌面工具访问也很OK的

image-20211015100554840

3、数据卷挂载

# 创建数据卷、检阅、prune无使用删除方式
docker volume create html
docker volume inspect html
docker inspect html
docker volume prune

# 再次创建数据卷,运行nginx容器并关联
docker volume create html
docker inspect html
docker run --name mn -v html:/usr/share/nginx/html -p 80:80 -d nginx 
docker ps
curl localhost

# 使用finalShell调用外部编辑器vscode实时编辑同步,查看web效果,很OK!
docker inspect html
ls -l /var/lib/docker/volumes/html/_data

# 测试容器被删除后,数据卷内文件保存, 因此也证明了卷内的文件是从只读的容器拷贝过来的!而非简单链接使用
docker rm -f mn
ls -l /var/lib/docker/volumes/html/_data
docker ps
docker run --name mn -v html:/usr/share/nginx/html -p 80:80 -d nginx
docker ps

# 删除容器、删除卷、重新运行容器并标识数据卷,自动创建数据卷!
docker rm -f mn
docker ps -a
docker volume ls
docker volume prune
docker run --name mn -v html:/usr/share/nginx/html -p 80:80 -d nginx

image-20211015114029297

4、文件目录挂载

image-20211015122113521

  • hmy.cnf

    [mysqld]
    skip-name-resolve
    character_set_server=utf8
    datadir=/var/lib/mysql
    server-id=1000
    
# 创建mysql配置文件夹、数据目录,拷贝hmy.cnf 到conf目录
cd /tmp
mkdir -p mysql/conf
mkdir -p mysql/data

# 尝试用培训班的mysql.tar,5.7.25版本,发现官方目前主流是5.7.35,维护时间很新,下载也快,就直接run同步下载了

docker load -i mysql.tar
docker images 
docker rmi mysql:5.7.25
docker images 
docker pull mysql:5.7.25
docker rmi mysql:5.7.25
rm -f mysql.tar

# 运行mysql(首次同步下载),指定名称、端口、root密码、数据库扩展配置、数据库目录, 参数配置可以从dockerHub上查到
docker run \
    --name mysql \
    -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=123456 \
    -v /tmp/mysql/conf/hmy.conf:/etc/mysql/conf.d/hmy.cnf \
    -v /tmp/mysql/data:/var/lib/mysql \
    -d mysql:5.7.35

image-20211015124244858

image-20211015124301325

5、玩转DockerFile

image-20211015124544384

image-20211015124550567

image-20211015124554877

实战:

  • 拷贝三个文件到/tmp/docker-demo

    image-20211015124849202

  • Dockerfile 文件展示

    ```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
&& ln -s./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




- 打包镜像, 启动容器

```shell
[root@docker docker-demo]# docker build -t javaweb:1.0 .

docker run --name javaweb -p 8090:8090 -d javaweb:1.0
  • web访问

    image-20211015125511268

  • 更新轻量级主流base

    ```dockerfile

指定基础镜像

FROM java:8-alpine

拷贝java项目的包

COPY ./docker-demo.jar /tmp/app.jar

暴露端口

EXPOSE 8090

入口,java项目的启动命令

ENTRYPOINT java -jar /tmp/app.jar




- 再次编译运行

docker build -t javaweb:2.0 .

docker rm -f javaweb
docker run –name javaweb -p 8090:8090 -d javaweb:2.0






## No.03-DockerCompose

相比dockerfile,用compose批量化管理、运行docker再编排也比较简单,k8s呢???



### 1、compose安装

- 下载

Linux下需要通过命令下载:

```sh
# 安装
curl -L https://github.com/docker/compose/releases/download/1.29.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

2、compose文件准备

image-20211015141021725

  • 根目录/docker-compose.yml, 文件名固定,是compose的主要运行文件, 首行版本号很关键,下方配置参考官方文档

    version: "3.2"
    
    services:
      nacos:
        image: nacos/nacos-server
        environment:
          MODE: standalone
        ports:
          - "8848:8848"
      mysql:
        image: mysql:5.7.35
        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"
    
  • service/Dockerfile

    FROM java:8-alpine
    COPY ./app.jar /tmp/app.jar
    ENTRYPOINT java -jar /tmp/app.jar
    
  • mysql/conf/hmy.cnf

    [mysqld]
    skip-name-resolve
    character_set_server=utf8
    datadir=/var/lib/mysql
    server-id=1000
    
  • mysql/data/* 是提前准备的所有数据库文件,略

  • service/app.jar 是下方准备的jar,略过

3、jar工程准备

原来整体工程有5个对外端口:nacos、mysql、gateway、orderservice、userservice

容器化调整为:nacos、gateway

所以要修改工程代码,将url都替换成compose的服务名称,这样在容器中就可以互相访问了

  • 修改范围有
    • application.yml或bootstrap.yml中的nacos地址、端口,mysql的地址端口,被调用服务名称如order中的userservice
  • mvn clean package
  • 拷贝jar到三个文件夹中,gateway、userservice、orderservice

4、上传编译运行

  • 打包cloud-demo成zip,上传到/tmp

  • 编译运行

    ```sh

安装unzip、解压demo程序

cd /tmp
rz
yum install -y unzip
unzip cloud-demo.zip
cd cloud-demo

编译,自动下载nacos

docker-compose up -d

查看日志报错,因为nacos启动比较慢,服务故障,需重启服务

docker-compose logs userservice
docker images
docker ps

尝试按compose停止服务,确实批量停止了

docker-compose stop
docker ps -a

尝试批量卸载,仅删除容器,镜像还是在的!但数据没有被删除,很Nice!

docker-compose down

修正数据库引擎从5.2.25 到5.2.35主流版本

vim docker-compose.yml
docker images
docker rmi mysql:5.7.25
docker-compose up -d
docker-compose restart gateway userservice orderservice
docker-compose logs userservice


- web访问

![image-20211015142602609](http://image.iyyxx.com/i/2022/08/11/62f45997c42bb.png)

![image-20211015142610853](http://image.iyyxx.com/i/2022/08/11/62f45997be4a0.png)



> 这里用的app.jar是程序包提供的,==后续需用jenkins自动化实现!==
>
> ==compose版本如何管理?==



## No.04-DockerRegistry

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

### 1、仓库安装

- 简化版镜像仓库(不推荐)

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

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

```sh
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 可以查看当前私有镜像服务中包含的镜像

  • 带有图形化界面版本

    • 创建环境

      cd /tmp
      mkdir registry-ui
      cd registry-ui
      touch docker-compose.yaml
      vim docker-compose.yaml
      
    • 使用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
      
    • 配置Docker信任地址,添加一行

      [root@docker registry-ui]# cat /etc/docker/daemon.json
      
      {
        "registry-mirrors": ["https://6yga1re5.mirror.aliyuncs.com"],
        "insecure-registries":["192.168.20.165:8080"]
      }
      
      systemctl daemon-reload
      systemctl restart docker
      

2、镜像上传、本地删除、镜像拉取

  • 编译运行并进行pull、push测试

    cd /tmp/registry-ui
    docker-compose start
    
    docker tag nginx:latest 192.168.20.165:8080/nginx:1.0
    docker images
    
    docker push 192.168.20.165:8080/nginx:1.0
    docker rmi 192.168.20.165:8080/nginx:1.0
    docker images
    docker pull 192.168.20.165:8080/nginx:1.0
    

image-20211015150934223

  • Registry UI 升级(验证compose,已上传的镜像都在,因为registry没有升级,只是换了ui, 卸载registry,但数据目录没变!)

    ```sh

删除旧容器

docker-compose down

修改版本为joxit/docker-registry-ui:1.5-static 来源 web提醒,上图!

vim docker-compose.yaml
docker-compose up -d
docker images
docker ps

[root@docker registry-ui]# ll registry-data/docker/registry/v2/repositories/nginx/
total 0
drwxr-xr-x 3 root root 20 Oct 15 15:05 _layers
drwxr-xr-x 4 root root 35 Oct 15 15:05 _manifests
drwxr-xr-x 2 root root 6 Oct 15 15:05 _uploads

```

评论系统未开启,无法评论!