【微服务全家桶】-实用篇-2-Docker


1 初识Docker

1.1 什么是Docker

在这里插入图片描述

在这里插入图片描述

Docker下如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?

  • Docke下允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像

  • Docker应用运行在容器中,使用沙箱机制,相互隔离

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

Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行

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

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

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

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

1.2 Docker与虚拟机

在这里插入图片描述

在这里插入图片描述

Docker和虚拟机的差异:

  • docker是一个系统进程;虚拟机是在操作系统中的操作系统

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

1.3 镜像和容器

在这里插入图片描述

镜像和容器都是只读的,如果要进行写操作,拷贝一份data,在各自容器中进行读写,避免相互之间进行污染

1.3.1 docker和dockerhub

在这里插入图片描述

1.3.2 docker架构

在这里插入图片描述

2 Docker基本操作

启动

systemctl start docker

2.1 镜像相关命令

镜像名称一般分两部分组成:[repository]:[tag]。

在没有指定tag时,默认是latest,代表最新版本的镜像

在这里插入图片描述

在这里插入图片描述

2.1.1 案例1-拉取最新的nginx

进入DockerHub,https://hub.docker.com

搜索nginx,选取官方镜像,docker pull nginx

在这里插入图片描述

下载完后,使用 docker images查看当前所有镜像

2.1.2 案例2-将镜像导出并加载回来

将镜像导出 docker save [OPTIONS] IMAGE [IMAGE...] docker save -o nginx.tar nginx:latest

删除本地镜像 docker rmi nginx:latest

加载镜像 docker load [OPTIONS] docker load -i nginx.tar

使用 docker images查看镜像已经加载回来

如果想用那个命令不知道怎么用,后面加个 --help使用就行

2.2 容器相关命令

在这里插入图片描述

2.2.1 案例1-创建运行一个Nginx

docker run --name containerName -p 80:80 -d nginx 端口要去dockerhub查

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

  • –name:给容器起一个名字,比如叫做mn

  • -p:将宿主机端口与容器端口映射,冒号左侧是宿主机端口(随意),右侧是容器端口(由镜像决定,一般固定)

  • -d:后台运行容器

  • nginx:镜像名称,例如nginx,未指明tag则为latest

使用 docker ps查看容器运行情况

在这里插入图片描述

主机访问192.168.204.129:80 ,成功访问Nginx

在这里插入图片描述

查看容器日志

docker logs [OPTIONS] CONTAINER

持续跟踪日志 docker logs -f conNginx

2.2.2 案例2-修改内容

进入容器 docker exec -it conNginx bash

  • docker exec:进入容器内部,执行一个命令

  • -t:给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互

  • mn:要进入的容器的名称

  • bash:进入容器后执行的命令,bash是一个linux终端交互命令,cd,ls等等都属于bash命令

在这里插入图片描述

Nginx目录只能在dockerhub里寻找

在这里插入图片描述

进入nginx的静态文件地址,尝试用vim修改,发现vi命令不可用,因为容器里只是最小依赖,自然没有vim

在这里插入图片描述

不能使用vim,则使用命令行完成

sed -i -e 's#Welcome to nginx#传智教育欢迎您#g' -e 's#<head>#<head><meta charset="utf-8">#g' index.html

重新用浏览器打开192.168.204.129:80

在这里插入图片描述

exit 退出容器

docker stop conNginx停止容器

docker ps默认只能查看运行中的容器,docker ps -a展示所有容器

docker start conNginx启动容器

docker rm conNginx删除容器,不能删除正在运行的容器。docker rm -f conNginx删除容器,强制删除,哪怕容器正在运行

2.2.3 案例3-运行redis容器并持久化

docker run --name conRedis -p 6379:6379 -d redis redis-server --appendonly yes

在这里插入图片描述

使用Redis Desktop Manager连接虚拟机查看端口6379

进入redis管理发现并没有数据

在这里插入图片描述

进入容器docker exe -it conRedis bash也可以直接docker exe -it conRedis redis-cli直接进入redis客户端

连接redis redis-cli

查看数据 keys *

存入数据 set num 666

在这里插入图片描述

打开redis manager

在这里插入图片描述

发现num已经写入redis中

在这里插入图片描述

get num获取redis中num的值,第一个exit退出redis,第二个exit退出redis容器

2.3 数据卷相关命令

在这里插入图片描述

在这里插入图片描述

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

docker volume [COMMAND]

docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作。

在这里插入图片描述

在这里插入图片描述

2.3.1 案例1-创建宿主机并查看数据卷在宿主机的位置

(1)创建数据卷

(2)查看所有数据

(3)查看数据卷详细信息卷

docker volume create html 创建html数据卷

docker volume ls 查看数据卷

docker volume inspect html 查看数据卷html的具体位置

2.3.2 案例2-挂载数据卷

在这里插入图片描述
在这里插入图片描述

docker run --name conNginx -v html:/usr/share/nginx/html -p 80:80 -d nginx -v 数据卷:镜像数据卷地址

docker inspect html 查找数据卷位置

在这里插入图片描述

实现高级编辑器打开,实现编辑

这里挂载的是已经创建好的数据卷,如果没有创建好数据卷怎么办

docker rm -f conNginx强制删除容器

docker volume prune删除未使用的数据卷

如果最开始没有数据卷,那么docker会自动的创建数据卷

2.3.3 案例3-创建一个mysql容器,并且将目录挂载到容器中

在这里插入图片描述

把mysql.tar通过finalshell上传到/tmp中

把mysql.tar的镜像加载到docker中

docker load -i mysql.tar

查看镜像是否导入

docker images

在这里插入图片描述

创建多级目录

mkdir -p mysql/data
mkdir -p mysql/conf

向mysql的conf目录上传mysql配置文件 hmy.cnf

在dockerHub上查看

为mysql创建一个容器并且为root设置密码

docker run \
 --name conMysql \
 -e MYSQL_ROOT_PASSWORD=123sjbsjb \
 -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

创建成功后

用navicat查看

在这里插入图片描述

2.4 Dockerfile自定义镜像

2.4.1 镜像结构

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

在这里插入图片描述

2.4.2 Dockerfile

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

在这里插入图片描述

案例

在这里插入图片描述

在/tmp下创建docker-demo

mkdir docker-demo

在这里插入图片描述

上传这三个到docker-demo中

自定义镜像

docker build -t javaweb:1.0 .
  • -t 代表tag 前面名字后面tag
  • . 代表dockerfile文件的所在目录,当前目录就是.

运行好后查看images

在这里插入图片描述

尝试运行

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

成功运行

页面访问

在这里插入图片描述

访问成功

2.4.3 jdk8简化安装

在这里插入图片描述

修改dockfile

源dockfile

# 指定基础镜像
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

修改后

# 指定基础镜像
FROM java:8-alpine
# # 配置环境变量,JDK的安装目录
# ENV JAVA_DIR=/usr/local

# # 拷贝jdk和java项目的包
# 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

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

# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

覆盖dockerfile后重新构建

docker build -t javaweb:2.0 .

在这里插入图片描述

2.5 DockerCompose

2.5.1 认识DockerCompose

Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!

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

在这里插入图片描述

参照文档centos7安装docker完成DockerCompose的安装

2.5.2 利用DockerCompose部署微服务

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: 123sjbsjb
    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"

修改java项目中的地址,不能再用localhost了

user-service中

application.yml url: jdbc:mysql://mysql:3306/cloud_user

boostrap.yml server-addr: nacos:8848 # Nacos地址

order-service中

application.yml url: jdbc:mysql://mysql:3306/cloud_order?useSSL=false

server-addr: nacos:8848

gateway中

application.yml server-addr: nacos:8848

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

在每个微服务中,通过pom.xml中

<build>
        <finalName>app</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

打包之前clean一下,clean后package

将响应服务的jar包放入对应文件夹中

在这里插入图片描述

将cloud-demo上传虚拟机

利用 docker-compose up -d部署

通过 docker-compose logs -f查看日志

nacos启动太慢,可以使用 docker-compose restart gateway userservice orderservice重启服务

在这里插入图片描述

查询成功

2.6 Docker镜像仓库

镜像仓库(Docker Registry)有公共的和私有的两种形式:

  • 公共仓库:例如Docker官方的Docker Hub,国内也有一些云服务商提供类似于Docker Hub的公开服务,比如网易云镜像服务、DaoCloud镜像服务、阿里云镜像服务等。

  • 除了使用公开仓库外,用户还可以在本地搭建私有Docker Registry。企业自己的镜像最好是采用私有Docker Registry来实现。

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

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

在tmp目录下创建registry-ui目录,后创建docker-compose.yml,粘贴内容

touch docker-compose.yml
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

cd 进registry-ui目录,构建docker-compose项目

docker-compose up -d

构建完成后访问浏览器:http://192.168.204.129:8080/

在这里插入图片描述

2.6.1 在私有镜像仓库中推送或拉取镜像

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

① 重新tag本地镜像,名称前缀为私有仓库的地址:192.168.204.129:8080/

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

在这里插入图片描述

② 推送镜像

docker push 192.168.204.129:8080/nginx:1.0 

在这里插入图片描述
推送成功

③ 拉取镜像

docker pull 192.168.204.129:8080/nginx:1.0 
  • 19
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AAA码农宝哥.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值