java微服务02-docker

一.大致认识

是一个快速构建,运行,管理应用的工具。

就以安装mysql举例:

发现安装命令多,安装包多,步骤复杂。

而这就是传统安装的问题。

而使用docker进行安装呢?

一句命令行就可以解决。

这就是学习docker的意义。

二.快速入门(以下都在linus系统中执行)

linus安装参考:课程说明 - 飞书云文档

安装docker:步骤都在云文档中,只显示结果:

2.发现报错:

如何解决:

可以通过 vi 命令编辑 /etc/yum.repos.d/CentOS-Base.repo 文件,将其中的 mirrorlist 行用 # 号注释掉,并将 baseurl 行取消注释,并修改为其他可靠的镜像地址。

vi /etc/yum.repos.d/CentOS-Base.repo

然后进入编辑模式

输入 vi /etc/yum.repos.d/CentOS-Base.repo 后,默认处于 命令模式。

按 i 键(或 Insert 键)进入 编辑模式,此时可以修改文件内容。

修改内容:

如将下图四个 baseurl 地址按顺序修改为阿里云的镜像地址:

baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/

baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/

baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/

baseurl=http://mirrors.aliyun.com/centos/$releasever/centosplus/$basearch/

  1. 保存文件

完成编辑后:

退出编辑模式:按 Esc 键(确保回到命令模式)。

保存并退出:

输入 :wq(注意前面的冒号 :),然后按 Enter。

bash

:wq

原有:

CentOS-Base.repo

The mirror system uses the connecting IP address of the client and the

update status of each mirror to pick mirrors that are updated to and

geographically close to the client. You should use this for CentOS updates

unless you are manually picking other mirrors.

If the mirrorlist= does not work for you, as a fall back you can try the

remarked out baseurl= line instead.

base

name=CentOS-$releasever - Base

#mirrorlist=http://mirrorlist.centos.org/?release=$releasever\&arch=$basearch\&repo=os\&infra=$infra

#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates

updates

name=CentOS-$releasever - Updates

mirrorlist=http://mirrorlist.centos.org/?release=$releasever\&arch=$basearch\&repo=updates\&infra=$infra

#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful

extras

name=CentOS-$releasever - Extras

mirrorlist=http://mirrorlist.centos.org/?release=$releasever\&arch=$basearch\&repo=extras\&infra=$infra

#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that extend functionality of existing packages

centosplus

name=CentOS-$releasever - Plus

mirrorlist=http://mirrorlist.centos.org/?release=$releasever\&arch=$basearch\&repo=centosplus\&infra=$infra

#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/

gpgcheck=1

enabled=0

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

修改后:

由于某个地方我写错了,需要清除使用代码:

/etc/yum.repos.d/CentOS-Base.repo

然后:

cat > /etc/yum.repos.d/CentOS-Base.repo << 'EOF' [base] name=CentOS-releasever - Base - mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos/releasever/os/basearch/ http://mirrors.aliyuncs.com/centos/releasever/os/basearch/ http://mirrors.cloud.aliyuncs.com/centos/releasever/os/basearch/ gpgcheck=1 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 \[updates\] name=CentOS-releasever - Updates - mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/ http://mirrors.aliyuncs.com/centos/$releasever/updates/$basearch/ http://mirrors.cloud.aliyuncs.com/centos/$releasever/updates/$basearch/ gpgcheck=1 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 [extras] name=CentOS-releasever - Extras - mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos/releasever/extras/basearch/ http://mirrors.aliyuncs.com/centos/releasever/extras/basearch/ http://mirrors.cloud.aliyuncs.com/centos/releasever/extras/basearch/ gpgcheck=1 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 \[centosplus\] name=CentOS-releasever - Plus - mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos/$releasever/centosplus/$basearch/ http://mirrors.aliyuncs.com/centos/$releasever/centosplus/$basearch/ http://mirrors.cloud.aliyuncs.com/centos/$releasever/centosplus/$basearch/ gpgcheck=1 enabled=0 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 EOF

完成:

docker安装成功:

1.部署mysql

命令:

docker run -d \ --name mysql \ -p 3306:3306 \ -e TZ=Asia/Shanghai \ -e MYSQL_ROOT_PASSWORD=123 \ mysql

安装成功:

镜像和容器

镜像仓库:Docker Hub 容器镜像库 |应用容器化

存储管理镜像的平台

2.命令解读

比如mysql那一条命令,看似很多行,其实只有一行,使用"\"隔开了。

解读:

  • docker run -d :创建并运行一个容器,-d则是让容器以后台进程运行

  • --name`` mysql : 给容器起个名字叫mysql,你可以叫别的

  • -p ``3306:3306 : 设置端口映射。

    • 容器是隔离环境 ,外界不可访问。但是可以 宿主机 端口 映射容器内到端口,当访问宿主机指定端口时,就是在访问容器内的端口了。

    • 容器内端口往往是由容器内的进程决定,例如MySQL进程默认端口是3306,因此容器内端口一定是3306;而宿主机端口则可以任意指定,一般与容器内保持一致。

    • 格式: -p 宿主机端口:容器内端口,示例中就是将宿主机的3306映射到容器内的3306端口

  • -``e`` TZ=Asia/Shanghai : 配置容器内进程运行时的一些参数

    • 格式:-e KEY=VALUE,KEY和VALUE都由容器内进程决定

    • 案例中,TZ``=Asia/Shanghai是设置时区;MYSQL_ROOT_PASSWORD=123是设置MySQL默认密码

  • mysql : 设置镜像名称,Docker会根据这个名字搜索并下载镜像

    • 格式:REPOSITORY:TAG,例如mysql:8.0,其中REPOSITORY可以理解为镜像名,TAG是版本号

    • 在未指定TAG的情况下,默认是最新版本,也就是mysql:latest

    • 需要指定版本的话则在:后加上版本

镜像的名称不是随意的,而是要到DockerRegistry中寻找,镜像运行时的配置也不是随意的,要参考镜像的帮助文档,这些在DockerHub网站或者软件的官方网站中都能找到。

如果我们要安装其它软件,也可以到DockerRegistry中寻找对应的镜像名称和版本,阅读相关配置即可。

三.Docker基础

1.常见命令

官方文档:docs.docker.com

较为常见的命令:

命令 说明 文档地址
docker pull 拉取镜像 docker pull
docker push 推送镜像到DockerRegistry docker push
docker images 查看本地镜像 docker images
docker rmi 删除本地镜像 docker rmi
docker run 创建并运行容器(不能重复创建) docker run
docker stop 停止指定容器 docker stop
docker start 启动指定容器 docker start
docker restart 重新启动容器 docker restart
docker rm 删除指定容器 docs.docker.com
docker ps 查看容器 docker ps
docker logs 查看容器运行日志 docker logs
docker exec 进入容器 docker exec
docker save 保存镜像到本地压缩文件 docker save
docker load 加载本地压缩文件到镜像 docker load
docker inspect 查看容器详细信息 docker inspect

案例:

判断拉取是否成功:

如何本地保存:

--help的作用是告诉save后面如何填写。

具体写法:

删除:

加载本地的tar包:

创建并运行nginx容器:

查看:

也可以简化写法:docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"

结尾加上 -a展示所有容器:

查看日志:

docker logs -f nginx。即加上一个-f就是不停查看日志

进如容器操作:

-it是可交互的终端

bash是命令行

# 第1步,去DockerHub查看nginx镜像仓库及相关信息

# 第2步,拉取Nginx镜像 docker pull nginx

# 第3步,查看镜像 docker images #

结果如下: REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 605 c77e624dd 16 months ago 141 MB mysql latest 3218 b38490ce 17 months ago 516 MB

# 第4步,创建并允许Nginx容器 docker run -d --name nginx -p 80:80 nginx

# 第5步,查看运行中容器 docker ps # 也可以加格式化方式访问,格式会更加清爽 docker ps --format "table {``{.ID}}\t{``{.Image}}\t{``{.Ports}}\t{``{.Status}}\t{``{.Names}}"

# 第6步,访问网页,地址:http://虚拟机地址

# 第7步,停止容器 docker stop nginx

# 第8步,查看所有容器 docker ps -a --format "table {``{.ID}}\t{``{.Image}}\t{``{.Ports}}\t{``{.Status}}\t{``{.Names}}"

# 第9步,再次启动nginx容器 docker start nginx

# 第10步,再次查看容器 docker ps --format "table {``{.ID}}\t{``{.Image}}\t{``{.Ports}}\t{``{.Status}}\t{``{.Names}}"

# 第11步,查看容器详细信息 docker inspect nginx

# 第12步,进入容器,查看容器内目录 docker exec -it nginx bash

# 或者,可以进入MySQL docker exec -it mysql mysql -uroot -p

# 第13步,删除容器 docker rm nginx # 发现无法删除,因为容器运行中,强制删除容器 docker rm -f nginx

往往查看docker中的进程状态时,往往会用到docker ps。但是这个命令查看的内容非常的多,混乱。往往使用另一个进行格式化:--format

同时会用table的语法。

但是这样的句式往往会比较长,这时可以使用命令别名:

如何设置命令别名:

打开后:

2.数据卷

案例:

在容器内会发现vi指令没有,因为docker镜像确实准备了应用运行所需要的系统函数库系统环境,但是只包含当前镜像所对应的应用运行必备的系统函数。

而vi操作并不属于其中。

所以如何做到案例的需求,使用数据卷:

命令行:

命令 说明 文档地址
docker volume create 创建数据卷 docker volume create
docker volume ls 查看所有数据卷 docs.docker.com
docker volume rm 删除指定数据卷 docs.docker.com
docker volume inspect 查看某个数据卷的详情 docs.docker.com
docker volume prune 清除数据卷 docker volume prune

不用记,输入 docker volume --help就能知道

挂载容器目录:

查看是否成功:

查看详情:

挂载的宿主机的位置:

容器目录:

cd进宿主机:

可以看到nginx页面:

接下来如何修改,不需要指令,点击如图:直接修改功能,找到文件:

mysql容器的数据挂载:

查看是否有数据卷挂载:

查看mysql发现有数据卷挂载:

明明没有创建却有,这是叫匿名卷,即容器运行时自动创建的卷。

这个是mysql自动存储的目录

匿名卷并不好,因为删除容器后原来的数据卷仍然在,而更新容器后又会创建一个新的数据卷,这就造成数据丢失。

最好自己进行挂载,并且介绍一个新的挂载方式。

使用volumes并不好用,因为目录很深,直接目录直接挂载:

3.自定义镜像

镜像结构:

分层好处有一点,加快下载。比如下载redis,有一层mysql下载完了redis就不用下载:

如何告诉docker我们的镜像结构:

由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能。我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可。

而这种记录镜像结构的文件就称为Dockerfile,其对应的语法可以参考官方文档:

https://docs.docker.com/engine/reference/builder/

其中的语法比较多,比较常用的有:

指令 说明 示例
FROM 指定基础镜像 FROM centos:6
ENV 设置环境变量,可在后面指令使用 ENV key value
COPY 拷贝本地文件到镜像的指定目录 COPY ./xx.jar /tmp/app.jar
RUN 执行Linux的shell命令,一般是安装过程的命令 RUN yum install gcc
EXPOSE 指定容器运行时监听的端口,是给镜像使用者看的 EXPOSE 8080
ENTRYPOINT 镜像中应用的启动命令,容器运行时调用 ENTRYPOINT java -jar xx.jar

以后我们会有很多很多java项目需要打包为镜像,他们都需要Linux系统环境、JDK环境这两层,只有上面的3层不同(因为jar包不同)。如果每次制作java镜像都重复制作前两层镜像,是不是很麻烦。

所以,就有人提供了基础的系统加JDK环境,我们在此基础上制作java镜像,就可以省去JDK的配置了:

当我们写好了Dockerfile,如何构建镜像:

如图:

4.容器网络

正常来说,容器都是独立的空间,全都有自己的网络和ip,但是ip非常接近。都在一个网段,既可以相互访问。

假设服务重启,ip可能会被其他容器占用,这个ip数会不断递增变化。这就是问题。

所以ip地址连接的方式有问题,需要使用自定义网络。以上是默认网桥。

创建就有的网桥:

创建自定义网络,就会形成一个新的网桥,网段就不一样,然后容器加入网桥就可以相互连接:

官方文档:

https://docs.docker.com/engine/reference/commandline/network/

常见命令有:

命令 说明 文档地址
docker network create 创建一个网络 docker network create
docker network ls 查看所有网络 docs.docker.com
docker network rm 删除指定网络 docs.docker.com
docker network prune 清除未使用的网络 docs.docker.com
docker network connect 使指定容器连接加入某网络 docs.docker.com
docker network disconnect 使指定容器连接离开某网络 docker network disconnect
docker network inspect 查看网络详细信息 docker network inspect

同时也会多一个网桥。

使容器加入这个网络:

查看结果:

但是我的为空,因为没有启动mysql。

启动:docker inspect mysql。

当然,在容器创建时也可以直接加入:

如果这样做则不会有默认网桥。

四.项目部署

1.部署前端

如何挂载conf类型文件:

复制代码

docker run -d \

--name nginx \

-p 18080:18080 \

-p 18081:18081 \

-v /root/nginx/html:/usr/share/nginx/html \

-v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \

--network hmall \

nginx

成功:

2.部署Java

common-serve中的yam文件:

意义为读取配置中的其他配置变量,取决于:

打包:

注意将jdk改为11:

成功L

启动成功:

访问成功:

3.DockerCompose

官方文档:旧版版本 |Docker 文档

docker-compose文件中可以定义多个相互关联的应用容器,每一个应用容器被称为一个服务(service)。由于service就是在定义某个应用的运行时参数,因此与docker run参数非常相似。

举例来说,用docker run部署MySQL的命令如下:

docker run -d \

--name mysql \

-p 3306:3306 \

-e TZ=Asia/Shanghai \

-e MYSQL_ROOT_PASSWORD=123 \

-v ./mysql/data:/var/lib/mysql \

-v ./mysql/conf:/etc/mysql/conf.d \

-v ./mysql/init:/docker-entrypoint-initdb.d \

--network hmall

mysql

如果用docker-compose.yml文件来定义,就是这样:

复制代码

version: "3.8"

services:

mysql:

image: mysql

container_name: mysql

ports: - "3306:3306"

environment:

TZ: Asia/Shanghai

MYSQL_ROOT_PASSWORD: 123

volumes:

- "./mysql/conf:/etc/mysql/conf.d"

- "./mysql/data:/var/lib/mysql"

networks:

- new

networks:

new:

name: hmall

对比如下:

docker run 参数 docker compose 指令 说明
--name container_name 容器名称
-p ports 端口映射
-e environment 环境变量
-v volumes 数据卷配置
--network networks 网络

基本语法如下:

docker compose [OPTIONS] [COMMAND]

其中,OPTIONS和COMMAND都是可选参数,比较常见的有:

类型 参数或指令 说明
Options -f 指定compose文件的路径和名称
Options -p 指定project名称。project就是当前compose文件中设置的多个service的集合,是逻辑概念
Commands up 创建并启动所有service容器
Commands down 停止并移除所有容器、网络
Commands ps 列出所有启动的容器
Commands logs 查看指定容器的日志
Commands stop 停止容器
Commands start 启动容器
Commands restart 重启容器
Commands top 查看运行的进程
Commands exec 在指定的运行中容器中执行命令
相关推荐
寻寻觅觅☆8 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
l1t8 小时前
在wsl的python 3.14.3容器中使用databend包
开发语言·数据库·python·databend
青云计划9 小时前
知光项目知文发布模块
java·后端·spring·mybatis
赶路人儿9 小时前
Jsoniter(java版本)使用介绍
java·开发语言
ceclar1239 小时前
C++使用format
开发语言·c++·算法
探路者继续奋斗9 小时前
IDD意图驱动开发之意图规格说明书
java·规格说明书·开发规范·意图驱动开发·idd
码说AI10 小时前
python快速绘制走势图对比曲线
开发语言·python
Gofarlic_OMS10 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
星空下的月光影子10 小时前
易语言开发从入门到精通:补充篇·网络爬虫与自动化采集分析系统深度实战·HTTP/HTTPS请求·HTML/JSON解析·反爬策略·电商价格监控·新闻资讯采集
开发语言
老约家的可汗10 小时前
初识C++
开发语言·c++