docker

 建议更换yum源

 

【Docker】
主要内容
Docker 简介
Docker 安装与启动
镜像加速器配置
Docker 镜像操作
Docker 容器操作
DockerFile
推送镜像到阿里云及本地仓库
Docker 容器生命周期
Docker 数据管理
 
 
学习目标
 
知识点
要求
 
Docker 简介
了解
Docker 安装与启动
掌握
镜像加速器配置
掌握
Docker 镜像操作
掌握
Docker 容器操作
掌握
DockerFile
掌握
推送镜像到阿里云及本地仓库
掌握
Docker 容器生命周期
掌握
Docker 数据管理
掌握
 

Docker

 

一、 Docker 简介

 
1 什么是 Docker
 
Docker 是基于 Go 语言实现的开源容器项目。利用操作系统本身已有的机制和特性,
可以实现远超传统虚拟机的轻量级虚拟化。它是内核级的虚拟化。期望达到使项目运行环
境“一次封装,到处运行的目的”。
利用 docker 创建的运行环境叫做 docker 容器,容器是通过 docker 镜像创建的,docker
镜像文件可以放在私有仓库中也可以放在共有仓库中。
官网地址:https://www.docker.com
 

 

 

    虚拟机:面向硬件的,分钟级别

 

 

 

3 Docker 特点

3.1 效率高

用户只需要几分钟,就可以把自己的程序“Docker 化”。Docker 依赖于“写时复制”
(copy-on-write)模型,使修改应用程序也非常迅速,可以说达到“随心所致,代码即改”
的境界。
随后,就可以创建容器来运行应用程序了。大多数 Docker 容器只需要不到 1 秒中即
可启动。由于去除了管理程序的开销,Docker 容器拥有很高的性能,同时同一台宿主机中
也可以运行更多的容器,使用户尽可能的充分利用系统资源。

3.2 职责明确

使用 Docker,开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如
何管理容器。Docker 设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署
的生产环境一致性。从而降低那种“开发时一切正常,肯定是运维的问题(测试环境都是
正常的,上线后出了问题就归结为肯定是运维的问题)”

3.3 结构完整

Docker 的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用
程序具备可移植性,易于构建,并易于协作。(通俗一点说,Docker 就像一个盒子,里面
可以装很多物件,如果需要这些物件的可以直接将该大盒子拿走,而不需要从该盒子中一件件的取。)

3.4 契合微服务架构

Docker 还鼓励面向服务的体系结构和微服务架构。Docker 推荐单个容器只运行一个
应用程序或进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或
者服务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试应
用程序都变得非常简单,同时也提高了程序的内省性。(当然,可以在一个容器中运行多
个应用程序)

4 Docker 架构

 

 

 

4.1 Docker daemon(Docker 守护进程)

Docker daemon 是一个运行在宿主机(DOCKER_HOST)的后台进程。我们可通过
Docker 客户端与之通信。
 

4.2 Client(Docker 客户端)

 
Docker 客户端是 Docker 的用户界面,它可以接受用户命令和配置标识,并与 Docker
daemon 通信。图中,docker build 等都是 Docker 的相关命令。4.3 Images(Docker 镜像)
Docker 镜像是一个只读模板,它包含创建 Docker 容器的说明。它和系统安装光盘
有点像——我们使用系统安装光盘安装系统,同理,我们使用 Docker 镜像运行 Docker
镜像中的程序。
 

4.4 Container(容器)

 
容器是镜像的可运行实例。镜像和容器的关系有点类似于面向对象中,类和对象的关
系。我们可通过 Docker API 或者 CLI 命令来启停、移动、删除容器。
 

4.5 Registry(仓库)

 
Docker Registry 是一个集中存储与分发镜像的服务。我们构建完 Docker 镜像后,
就可在当前宿主机上运行。但如果想要在其他机器上运行这个镜像,我们就需要手动拷贝。
此时,我们可借助 Docker Registry 来避免镜像的手动拷贝。
一个 Docker Registry 可包含多个 Docker 仓库;每个仓库可包含多个镜像标签;每
个标签对应一个 Docker 镜像。这跟 Maven 的仓库有点类似,如果把 Docker Registry
比作 Maven 仓库的话,那么 Docker 仓库就可理解为某 jar 包的路径,而镜像标签则可
理解为 jar 包的版本号。

二、 Docker 安装与启动

以下安装步骤基于 CentOS8,并确保该虚拟机可以连接外网。

1 安装

 

1.1 下载 docker-ce repo

 
为本地 yum 提供远程 repo 信息。
curl   https://download.docker.com/linux/centos/docker-ce.repo  -o   /etc/yum.repos.d/docker-ce.repo
 
 
 

1.2 安装依赖

yum install -y  https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm 
 
 
 
 

1.3 安装 docker-ce

 
yum install -y docker-ce
 

2 启动

 

2.1 启动命令

 
systemctl start docker
service docker start
 

2.2 关闭命令

 
systemctl stop docker
service docker stop
 

2.3 查看 Docker 状态

 
docker info

 

 

结果如下:

三、 镜像加速器配置

 
默认情况下 Docker 从 Docker Hub 上下载镜像资源,但速度很慢,可以通过配置国内
的镜像加速器来解决。
本课程以阿里云镜像加速器为例讲解

1 访问阿里云

https://www.aliyun.com/

2 进入控制台

 

 

3 搜索镜像加速器

 

 

4 选择对应的 OS 并配置

 

 

#创建文件
mkdir -p /etc/docker
#编辑daemon.json
vim /etc/docker/daemon.json
# 编辑内容
{
 "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
}
# 重启容器
systemctl restart docker

 

 

5 验证镜像加速器配置

通过 docker info 命令验证镜像加速器配置,结果如下:

 

 

四、 Docker 镜像操作

 

1 什么是 Docker 镜像

Docker 镜像是由文件系统叠加而成(是一种文件的存储形式)。最底端是一个文件引
导系统,即 bootfs,这很像典型的 Linux/Unix 的引导文件系统。Docker 用户几乎永远不会和引导系统有什么交互。实际上,当一个容器启动后,它将会被移动到内存中,而引导文
件系统则会被卸载,以留出更多的内存供磁盘镜像使用。Docker 容器启动是需要一些文件
的,而这些文件就可以称为 Docker 镜像。

 

 

2 列出镜像

列出 docker 下的所有镜像,命令: docker images 或者 docker image ls

 

 

结果解释:
REPOSITORY:镜像所在的仓库名称
TAG:镜像标签
IMAGE ID:镜像 ID
CREATED:镜像的创建日期(不是获取该镜像的日期)
SIZE:镜像大小
 

3 搜索镜像

 
可使用命令搜索需要的镜像,命令: docker search 镜像名称

 

 

结果解释:
NAME:仓库名称
DESCRIPTION:镜像描述
STARS:用户评价,反应一个镜像的受欢迎程度
OFFICIAL:是否官方
AUTOMATED:自动构建,表示该镜像由 Docker Hub 自动构建流程创建的
 

4 拉取镜像

 
拉取镜像相当于从远程 Registry 中下载镜像到本地,命令: docker pull 镜像名称

 

 

5 删除镜像

 
删除本地镜像使用命令:
docker rmi $IMAGE_ID
docker rmi $REPOSITORY:$TAG

 

 

 

五、 Docker 容器操作

 
可以把容器看成简易版的 Linux 环境(包括 root 用户权限,进程空间,用户空间和网
络空间等)和运行在其中的应用程序。
 

1 新建容器

 
docker create [options] 镜像名字或者 ID [COMMAND] [ARG...]
docker create -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root mysql
docker create -p 3306:3306 --name mysql_new -e MYSQL_ROOT_PASSWORD=root \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
mysql

1.1 options 常见参数说明

 
--name:给容器起一个新名字。为容器指定一个名称
-i:以交互模式运行容器,通常与-t 连用
-t:为容器重新分配一个伪终端,通常与-i 连用
-P:随机端口映射
-p:指定端口映射,hostPost:containerPort
-e:配置信息
-d:后台执行
-v:主机和容器的目录映射关系,":"前为主机目录,之后为容器目录
 

2 新建并启动容器

 
docker run [options] 镜像名字或者 ID [COMMAND] [ARG...]
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql
docker run -p 3306:3306 --name mysql_new -e MYSQL_ROOT_PASSWORD=root \
-v /usr/local/docker/mysql/conf:/etc/mysql \-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-d mysql
 

3 列出启动容器

 
列出正在运行的容器: docker container ls
查看 docker 容器进程信息: docker ps [options]
docker ps
 docker ps -a 查看所有的容器,包括已停止的

3.1 options 参数说明

 
-l:显示最近创建的容器
-n 数字:显示最近 n 个创建的容器
-a:列出所有的运行过的容器
-q:列出容器 id
 

4 与运行中的容器交互

 
docker exec [options] 容器 ID [command]
docker exec -it mysql /bin/bash
 
docker exec -it id /bin/bash

 

 
4.1 options 参数说明
-i:以交互模式运行容器,通常与-t 连用
-t:为容器重新分配一个伪终端,通常与-i 连用
 

5 停止容器

 
docker stop 容器 ID
docker stop mysql
 

6 启动容器

docker start 容器 ID
docker start mysql
 

7 强制停止容器

不推荐使用,容易造成容器服务不正常关闭,影响后续使用。
docker kill 容器 ID 或名称
docker kill mysql
 

8 暂停容器

 
docker pause 容器 ID 或名称
docker pause mysql
 

9 恢复容器

docker unpause 容器 ID 或名称
docker unpause mysql
 

10 删除容器

要删除的容器,必须是关闭状态的。
docker rm 容器 ID 或名称
docker rm mysql
 

11 查看容器日志

docker logs -f -t --tail 行数 容器 ID
docker logs -f -t --tail 5 mysql
-f 参数代表长期监控日志数据
-t 额外增加时间戳
--tail 行数 显示末尾多少行日志
 

12 查看容器中运行的进程

 
docker top 容器 ID 或名称
docker top mysql
 

13 查看容器内部详情

docker inspect 容器 ID 或名称
docker inspect mysql
 

14 复制容器数据到宿主机

docker cp 容器 ID 或名称:容器内路径 宿主机路径
复制 MySQL 配置到宿主机: docker cp mysql:/etc/mysql ~/tmp/conf
 
从主机复制到容器 docker cp host_path containerID:container_path 
从容器复制到主机 docker cp containerID:container_path host_path

 

六、 Docker File 管理

 
Docker File 是用来构建 Docker 镜像的构建文件,是由一系列命令和参数构成的脚本。
案例构建一个 java 工程镜像。
 

1 使用本地命令构建镜像

 

1.1 下载 JDK 镜像

 
一般使用 openjdk 镜像。
docker search openjdk
docker pull openjdk
 

1.2 创建构建文件

 
要构建到镜像中的 jar 文件需要和 buildFile 处于同一个目录。
vi ~/docker/buildFile
FROM openjdk:latest
VOLUME /var/mydatas
ADD cloudeureka-1.0-SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]EXPOSE 8761
 

1.2.1 语法解释

 
#指定基础镜像,这个需要根据自己配置的仓库上的版本写
FROM openjdk:latest
#持久化目录
VOLUME /var/mydatas
#指定源包,前者是你的 jar 包
ADD cloudeureka-1.0-SNAPSHOT.jar app.jar
#指定容器启动时执行的命令
ENTRYPOINT ["java","-jar","/app.jar"]
#对外端口
EXPOSE 8761
 

1.3 构建镜像

 
docker build -f 构建文件 -t 镜像名称:TAG 相对目录
docker build -f /root/docker/buildFile -t eureka:1.0 .
 

1.4 启动

 
docker run --name eureka -p 8761:8761 -d eureka:1.0
 

2 使用 IDEA 构建镜像

 

2.1 修改 Docker 服务配置

 
vi /usr/lib/systemd/system/docker.service
 
在 ExecStart 变量末尾,增加下述配置:
-H unix:///var/run/docker.sock -H 0.0.0.0:2375
-H unix:///var/run/docker.sock : 开启一个对外主机服务,使用 docker.sock 文件管理。
-H 0.0.0.0:2375 : 允许什么客户端 IP 访问当前服务,当前服务对外暴露的端口号是什
么。端口可自定义。结果如下:
 

 

 

2.2 重启 docker 服务

 
systemctl daemon-reload
systemctl restart docker
 

2.3 IDEA 项目 POM 依赖

 
新增 plugin 插件配置:
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<configuration>
<imageName>projects/eureka:1.0</imageName> <!--指定镜像名称 仓库/镜像名:标-->
<baseImage>openjdk:latest</baseImage> <!--指定基础镜像-->
<dockerHost>http://192.168.89.128:2375</dockerHost> <!-- 指定服务器仓库地址
-->
<entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint> <!-- 容器
启动执行的命令 -->
<exposes>
<expose>8761</expose><!-- 发布端口 -->
</esposes>
<resources>
<resource>
<targetPath>/</targetPath> <!-- 指定要复制的目录路径,这里是当前目录 -->
<directory>${project.build.directory}</directory> <!-- 指定要复制的根目录,
这里是 target 目录 -->
<include>${project.build.finalName}.jar</include> <!-- 指定需要拷贝的文件,
这里指最后生成的 jar 包 -->
</resource>
</resources>
</configuration>
</plugin>

 

2.4 新增 IDEA 启动配置

 

 

 

最终结果如下:

 

 

七、 阿里云镜像仓库

在阿里云容器镜像服务中,创建镜像仓库。并依据镜像仓库信息完成镜像的 push 和
pull。

1 push 镜像

docker login --username=jincg_ear registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/jincg_ear/jincg_repo:[镜像版 本
号]
docker push registry.cn-hangzhou.aliyuncs.com/jincg_ear/jincg_repo:[镜像版本号]
具体命令如下:
docker login --username=jincg_ear registry.cn-hangzhou.aliyuncs.com
docker
tag
df689c674c72
registry.cn-hangzhou.aliyuncs.com/jincg_ear/jincg_repo:eureka_1.0
docker push registry.cn-hangzhou.aliyuncs.com/jincg_ear/jincg_repo:eureka_1.0

2 pull 镜像

docker pull registry.cn-hangzhou.aliyuncs.com/jincg_ear/jincg_repo:[镜像版本号]
具体命令如下:
docker pull registry.cn-hangzhou.aliyuncs.com/jincg_ear/jincg_repo:eureka_1.0
 

八、 本地镜像仓库

1 搭建本地仓库

1.1 下载本地仓库镜像

docker pull registry
 

1.2 修改 Docker Service 配置

vi /usr/lib/systemd/system/docker.service
修改内容如下:找到 Service 节点,在 ExecStart 属性末尾增加新参数,值为:
--insecure-registry ip:5000

1.3 修改 Docker Daemon 配置

vi /etc/docker/daemon.json
新增配置内容:
{
"insecure-registries":["192.168.89.128:5000"]
}
具体如下:

1.4 重启 Docker 服务

systemctl daemon-reload
systemctl restart docker

1.5 启动容器

docker run -p 5000:5000 -v /opt/registry:/var/lib/registry --name registry -d registry

1.6 容器启动状态

docker ps -l
 
查看所有容器:
docker container ls -a

 

1.7 浏览器查看本地仓库

http://ip:5000/v22 push 镜像
docker tag [ImageId] ip:5000/[镜像名称]:[镜像版本号]
docker push ip:5000/[镜像名称]:[镜像版本号]
具体命令如下:
docker tag df689c674c72 192.168.89.128:5000/eureka:1.0
docker push 192.168.89.128:5000/eureka:1.0
查看 push 结果
http://ip:5000/v2/_catalog

3 pull 镜像

docker pull ip:5000/[镜像名称]:[镜像版本号]
具体命令如下:
docker pull 192.168.89.128:5000/eureka:1.0
 

九、 Docker 容器的生命周期

 

1 状态介绍

1.1 圆形

代表容器的五种状态:
created:初建状态
running:运行状态
stopped:停止状态
paused: 暂停状态
deleted: 删除状态

1.2 长方形

代表容器在执行某种命令后进入的过度状态:
docker create : 创建容器后,不立即启动运行,容器进入初建状态;
docker run : 创建容器,并立即启动运行,进入运行状态;
docker start : 容器转为运行状态;
docker stop : 容器将转入停止状态;
docker kill : 容器在故障(死机)时,执行 kill(断电),容器转入停止状态,这种操
作容易丢失数据,除非必要,否则不建议使用;
docker restart : 重启容器,容器转入运行状态;
docker pause : 容器进入暂停状态;
docker unpause : 取消暂停状态,容器进入运行状态;
docker rm : 删除容器,容器转入删除状态(如果没有保存相应的数据库,则状态不可
见)。

1.3 菱形

 
需要根据实际情况选择的操作
 

1.3.1 killed by out-of-memory(因内存不足被终止)

宿主机内存被耗尽,也被称为 OOM:非计划终止
这时需要杀死最吃内存的容器
然后进行选择操作
 

1.3.2 container process exited(异常终止)

 
1.3.3 出现容器被终止后,将进入 Should restart?选择操作:
yes 需要重启,容器执行 start 命令,转为运行状态。
no 不需要重启,容器转为停止状态。
 

十、 Docker 的数据管理

1 数据卷管理

数据卷的作用是将宿主机的某个磁盘目录映射到容器的某个目录,从而实现宿主机和
容器之间的数据共享。
docker run|create --name [容器名称] -v [宿主机目录]:[容器目录] [镜像名称]
参考新建容器章节或新增并启动容器章节

2 数据卷容器管理

数据卷容器的作用是实现多个容器之间的数据共享。其实,数据卷容器也是一个容器,
但是与其他 Docker 容器不一样的是,数据卷容器是专门用来提供数据卷给其他容器进行
挂载操作。
 

2.1 创建数据卷容器

创建容器,并在容器中创建目录/datas。
docker create --name my_datas -v /datas eureka:1.0

2.2 创建容器并使用数据卷容器

命令格式:
docker run --volumes-from [数据卷容器名或 ID] [options] [镜像名或 ID]
具体如下:
docker run --volumes-from my_datas -tid --name eureka1 -p 8761:8761 eureka:1.0
docker run --volumes-from my_datas -tid --name eureka2 -p 8762:8761 eureka:1.0

2.3 测试

 

2.3.1 访问 eureka1 容器并在共享目录中写入数据

 
docker exec -it eureka1 bash
> ls /
> mkdir /datas/test
> touch /datas/test/readme
> echo this text from eureka1 >> /datas/test/readme
> exit
 

2.3.2 访问 eureka2 容器并读取共享目录中的数据

docker exec -it eureka2 bash
> ls /datas/test
> cat /datas/test/readme
 

3 数据备份

 
将某容器中的数据目录备份。此过程需要一个备份容器作为中间过程辅助完成。
 

3.1 创建宿主机备份目录

mkdir /backup/
 

3.2 通过容器备份数据

 
命令格式:
docker run --rm --volumes-from [数据卷容器 ID 或名称] -v [宿主机目录]:[容器目录] [镜
像名称] [备份命令]
其中--rm 是自动删除容器参数,代表此容器执行完备份命令后,自动删除。
具体如下:
docker run --rm --volumes-from my_datas -v /backup/:/backup/ mysql tar -cf
/backup/data.tar.gz /data
备份成功后,查看宿主机中/backup 目录备份结果。
 

4 数据还原

 
将备份的数据文件还原到某容器,这个过程也需要一个容器辅助完成。
 

4.1 删除容器中的数据文件

 
用于模拟无数据的容器。
docker exec -it my_datas bash
> rm -rf /datas
 

4.2 通过容器还原备份数据

 
命令格式:
docker run --rm -itd --volumes-from [数据要恢复到的容器] -v [宿主机备份目录]:[容器
备份目录] [镜像名称] [解压命令]
具体如下:
docker run --rm -itd --volumes-from my_datas -v /backup/:/backup/ mysql tar -xf
/backup/data.tar.gz -C /4.3 查看还原结果
docker exec -it my_datas bash
> ls /data/test
> cat /datas/test/readme
 
 

 

 docker Compose -容器编排

什么是docker compose

定义: Compose 项目是docker官方的开源项目,负责实现对docker容器集群的快速编排。

快速编排:站在项目角度将一组相关联容器整合在一起,对这组容器进行按照指定顺序启动。

 

 

 

4.2.安装DockerCompose

 

 

 

Compose 安装

Linux 上我们可以从 Github 上下载它的二进制包来使用,最新发行的版本地址:https://github.com/docker/compose/releases

运行以下命令以下载 Docker Compose 的当前稳定版本:

$ sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

要安装其他版本的 Compose,请替换 v2.2.2。

Docker Compose 存放在 GitHub,不太稳定。

你可以也通过执行下面的命令,高速安装 Docker Compose。

curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

将可执行权限应用于二进制文件:

$ sudo chmod +x /usr/local/bin/docker-compose

创建软链:

$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

测试是否安装成功:

$ docker-compose version
cker-compose version 1.24.1, build 4667896b

注意: 对于 alpine,需要以下依赖包: py-pip,python-dev,libffi-dev,openssl-dev,gcc,libc-dev,和 make。

 

4.3.部署微服务集群

需求:将之前学习的cloud-demo微服务集群利用DockerCompose部署

 

实现思路

① 查看课前资料提供的cloud-demo文件夹,里面已经编写好了docker-compose文件

② 修改自己的cloud-demo项目,将数据库、nacos地址都命名为docker-compose中的服务名

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

④ 将打包好的app.jar拷贝到cloud-demo中的每一个对应的子目录中

⑤ 将cloud-demo上传至虚拟机,利用 docker-compose up -d 来部署

 

4.3.1.compose文件

查看资料提供的cloud-demo文件夹,里面已经编写好了docker-compose文件,而且每个微服务都准备了一个独立的目录:

 

 

内容如下:

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临时构建的

 

查看mysql目录,可以看到其中已经准备好了cloud_order、cloud_user表:

 

 

查看微服务目录,可以看到都包含Dockerfile文件:

 

 

内容如下:

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

 

 

4.3.2.修改微服务配置

因为微服务将来要部署为docker容器,而容器之间互联不是通过IP地址,而是通过容器名。这里我们将order-service、user-service、gateway服务的mysql、nacos地址都修改为基于容器名的访问。

如下所示:

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

 

4.3.3.打包

接下来需要将我们的每个微服务都打包。因为之前查看到Dockerfile中的jar包名称都是app.jar,因此我们的每个微服务都需要用这个名称。

可以通过修改pom.xml中的打包名称来实现,每个微服务都需要修改:

<build>
 <!-- 服务打包的最终名称 -->
 <finalName>app</finalName>
 <plugins>
   <plugin>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-maven-plugin</artifactId>
   </plugin>
 </plugins>
</build>

打包后:

 

 

4.3.4.拷贝jar包到部署目录

编译打包好的app.jar文件,需要放到Dockerfile的同级目录中。注意:每个微服务的app.jar放到与服务名称对应的目录,别搞错了。

user-service:

 

 

order-service:

 

 

gateway:

 

 

4.3.5.部署

最后,我们需要将文件整个cloud-demo文件夹上传到虚拟机中,理由DockerCompose部署。

上传到任意目录:

 

 

部署:

进入cloud-demo目录,然后运行下面的命令:

docker-compose up -d
 

 docker network详解

 

其他项目调用这个项目就在后面指定一下add-host

--add-host  solr.dtmaster.cn:172.18.0.50

 

 

 

1、docker network --help

#帮助命令后显示下面信息
[root@localhost /]# docker network --help

Usage:    docker network COMMAND

Manage networks

Options:
      --help   Print usage

Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks

Run 'docker network COMMAND --help' for more information on a command.
  • connect 将某个容器连接到一个docker网络
  • create 创建一个docker局域网络
  • disconnect 将某个容器退出某个局域网络
  • inspect 显示某个局域网络信息
  • ls 显示所有docker局域网络
  • prune 删除所有未引用的docker局域网络
  • rm 删除docker网络

2、创建自定义docker局域网络

docker network create mynet 

然后pull两个镜像使用新创建的网络

3、pull镜像和运行镜像

#pull之前先设置docker镜像加速,国外pull速度很慢,参考:
https://blog.csdn.net/wangyue23com/article/details/110194399

 
docker pull redis
docker pull nginx
#运行redis容器
docker run -itd --name redis  --network mynet --network-alias redis -p 6379:6379 redis
#运行nginx容器
docker run -d --name nginx -p 80:80 --network mynet --network-alias nginx --privileged=true   -v /home/wwwroot:/home/wwwroot -v /home/wwwlogs:/home/wwwlogs  nginx

运行容器时候加入命令 --network mynet --network-alias redis,
代表当然容器要加入到mynet局域网络中

4、docker 查询网络信息

#查看mynet的详细信息,发现redis和nginx已在Containers容器内,属于当前mynet网络
[root@localhost /]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "8453b7b1d246f1ad54e27033928bbb8e7842ca96b4315fad720688af206b69c6",
        "Created": "2020-12-13T22:50:55.566207522-08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Containers": {
            "87ff63bb819a823578bed89a67527009d9fee31a92de9d50e5d635b97cc18664": {
                "Name": "redis",
                "EndpointID": "19a04279300025dc936d206a287b1e31d04b339298b445694452a5f4326f7051",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            },
            "c75ff4ac770fd04a1c6daa05a82533555038e3b0f8e15c3b1ee29e26c14a0131": {
                "Name": "nginx",
                "EndpointID": "4ccc014edcfd7be443c75491cc32aa0745561cfd45903e204e8d3e7afa94a4fe",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]
View Code

5、验证ping命令是否容器之间网络交互

 
#进入redis命令行,使用ping nginx命令验证能够连接成功**使用ping命令之前,需要给docker安装ping,自行百度**
docker exec -it redis bash
root@822f249e7d90:/# ping nginx
PING nginx (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: icmp_seq=0 ttl=64 time=0.071 ms
64 bytes from 172.18.0.3: icmp_seq=1 ttl=64 time=0.100 ms

同样也可以不指定网络,直接启动容器,然后使用docker network connect接入网络。

#将容器删掉重新创建
docker stop nginx
docker rm -f nginx
docker stop redis
docker rm -f redis

6、使用docker network connect

#运行nginx和docker容器
docker run -itd --name redis -p 6379:6379 redis
docker run -d --name nginx -p 80:80 --privileged=true -v /home/wwwroot:/home/wwwroot -v /home/wwwlogs:/home/wwwlogs nginx

使用docker network connect命令连接网络

#加入nginx到mynet网络
[root@localhost /]# docker network connect mynet nginx
#加入redis到mynet网络
[root@localhost /]# docker network connect mynet redis
#查看mynet网络包含的容器,会发现两个容器都加入当前网络了,后面使用ping命令是能够ping通容器名称的。
[root@localhost /]# docker network inspect mynet

7、docker network disconnect

#将nginx移除mynet局域网络
docker network disconnect mynet nginx

使用docker network 很方便的维护和管理docker网络,方便容器之间ip和端口交互。

 

docker -p

-p指令有哪些用法?
大家用的最多的可能就是-p 80:80事实上,还有其他用法:

-p 8080:80

将容器的TCP80端口映射到宿主机的8080端口

-p 192.168.1.100:8080:80

将容器的TCP80端口映射到IP地址为192.168.1.100宿主机的8080端口

-p 8080:80/udp

将容器的UPD80端口映射到宿主机的8080端口

-p 8080:80/tcp -p 8080:80/udp

同时映射TCP和UDP端口 作者:小可ThinkPHP学堂 https://www.bilibili.com/read/cv17601617 出处:bilibili

 
 
docker常用命令及进入tomcat的webApps发布目录:
docker tomcat文件传递
 
 docker&Docker-Compose实战
 
posted @ 2020-12-05 09:34  wq9  阅读(184)  评论(0编辑  收藏  举报