微服务——Docker

docker与虚拟机的区别

首先要知道三个层次

硬件层:计算机硬件

内核层:与硬件交互,提供操作硬件的指令

应用层: 系统应用封装内核指令为函数,便于程序员调用。用户程序基于系统函数库实现功能。

docker在打包的时候直接把应用层的函数库也进行打包,所以不管是linux的什么系统都可以跑docker。

虚拟机基于Hypervisor,这个技术可以模拟计算机硬件,所以可以运行不同的操作系统。

docker的架构

镜像和容器

docker和DockerHub

docker架构

镜像基本命令

拉取镜像

docker pull ubuntu:20.04:拉取一个镜像
docker pull nginx

列出本地所有镜像

java 复制代码
docker images

删除镜像

java 复制代码
docker image rm ubuntu:20.04
docker rmi  ubuntu:20.04

导出压缩镜像

java 复制代码
docker save -o ubuntu_20_04.tar ubuntu:20.04

加载镜像

java 复制代码
docker load -i ubuntu_20_04.tar

创建某个容器的镜像

java 复制代码
docker [container] commit CONTAINER IMAGE_NAME:TAG

容器相关命令

容器生命周期管理命令

**docker exec :**在运行的容器中执行命令

java 复制代码
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

-d :分离模式: 在后台运行

-i :即使没有附加也保持STDIN 打开

-t :分配一个伪终端
bash: 进入容器后执行的命令


在容器 mynginx 中以交互模式执行容器内 /root/runoob.sh 脚本:
runoob@runoob:~$ docker exec -it mynginx /bin/sh /root/runoob.sh
http://www.runoob.com/


在容器 mynginx 中开启一个交互模式的终端:
runoob@runoob:~$ docker exec -i -t  mynginx /bin/bash
root@b1a0703e41e7:/#

**docker rm :**删除一个或多个容器。

java 复制代码
docker rm [OPTIONS] CONTAINER [CONTAINER...]


-f :通过 SIGKILL 信号强制删除一个运行中的容器。

-l :移除容器间的网络连接,而非容器本身。

-v :删除与容器关联的卷。

**docker run :**创建一个新的容器并运行一个命令

java 复制代码
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]


-i: 以交互模式运行容器,通常与 -t 同时使用
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-d:  后台运行,并返回容器ID

-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
--name="nginx-lb": 为容器指定一个名称

docker kill :杀掉一个运行中的容器。

java 复制代码
docker kill [OPTIONS] CONTAINER [CONTAINER...]

-s :向容器发送一个信号


杀掉运行中的容器mynginx

runoob@runoob:~$ docker kill -s KILL mynginx
mynginx

运行与暂停之间切换的两条

java 复制代码
docker pause 容器名或ID

docker unpause 容器名或ID

运行与停止之间切换

java 复制代码
docker start 容器名或ID

docker restart 容器名或ID

docker stop 容器名或ID

容器操作命令

**docker ps :**列出容器

java 复制代码
docker ps [OPTIONS]

-a :显示所有的容器,包括未运行的。

-f :根据条件过滤显示的内容。

--format :指定返回值的模板文件。

-l :显示最近创建的容器。

-n :列出最近创建的n个容器。

--no-trunc :不截断输出。

-q :静默模式,只显示容器编号。

-s :显示总的文件大小。

docker inspect : 获取容器/镜像的元数据。

java 复制代码
docker inspect [OPTIONS] NAME|ID [NAME|ID...]



-f :指定返回值的模板文件。

-s :显示总的文件大小。

--type :为指定类型返回JSON。

**docker top :**查看容器中运行的进程信息,支持 ps 命令参数。

java 复制代码
docker top [OPTIONS] CONTAINER [ps OPTIONS]

**docker attach :**连接到正在运行中的容器。(建议不要用这个,用docker exec比较好)

区别如下:docker exec与docker attach的区别_Christina_2020的博客-CSDN博客

java 复制代码
docker attach [OPTIONS] CONTAINER
docker exec -it CONTAINER bash 这个代替


--sig-proxy=false 保证按下ctrl+c不会关闭容器

**docker logs :**获取容器的日志

java 复制代码
docker logs [OPTIONS] CONTAINER

-f : 跟踪日志输出

--since :显示某个开始时间的所有日志

-t : 显示时间戳

--tail :仅列出最新N条容器日志

**docker export :**将文件系统作为一个tar归档文件导出到STDOUT。

java 复制代码
docker export [OPTIONS] CONTAINER

-o :将输入内容写到文件。

docker export -o xxx.tar CONTAINER:将容器CONTAINER导出到本地文件xxx.tar中

docker export/import与docker save/load的区别:
    export/import会丢弃历史记录和元数据信息,仅保存容器当时的快照状态
    save/load会保存完整记录,体积更大

docker port用于列出指定的容器的端口映射

java 复制代码
docker port [OPTIONS] CONTAINER

**docker stats :**显示容器资源的使用情况,包括:CPU、内存、网络 I/O 等。

java 复制代码
docker stats [OPTIONS] [CONTAINER...]

--all , -a :显示所有的容器,包括未运行的。

--format :指定返回值的模板文件。

--no-stream :展示当前状态就直接退出了,不再实时更新。

--no-trunc :不截断输出。

其他一些命令

java 复制代码
docker cp xxx CONTAINER:xxx 或 docker cp CONTAINER:xxx xxx:在本地和容器间复制文件
docker rename CONTAINER1 CONTAINER2:重命名容器
docker update CONTAINER --memory 500MB:修改容器限制

docker数据卷

容器和数据耦合的问题

挂载好数据卷之后就可以在外面修改相关配置文件。

操作数据卷

挂载数据卷

直接用宿主机目录挂载到容器目录

总结

自定义镜像

镜像结构

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

DockerFile

案例

dockerfile文件命令如下

依赖一个基础的镜像,配置了JDK,又准备了相对应项目和入口文件,然后制作了一个项目镜像。

java 复制代码
# 指定基础镜像
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

如果是基于一个完成度更高的镜像来搭建,比如说一个配置好了jdk的ubuntu镜像,那么就可以减少配置的流程。

DockerCompose

version是命令的版本,这里有多个版本。

java 复制代码
docker run \
    --name mysql \
    -e MYSQL_ROOT_PASSWORD=123 \
    -p 3306:3306
    -v tmp/mysgl/data:/var/lib/mysql \
    -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
    -d \
mysql:5.7.25

这个里面将上面这个docker run语句中的必要参数都转换为了docker指令。在微服务集群里面mysql只供给集群内的服务,不需要暴露。然后这里默认就是-d,后台运行。

java 复制代码
构建镜像
docker build -t web:1.0 .
创建容器
docker run --name web -p8090:8090 -d web:1.0 

而第二个则是将这两个命令集合,里面的 . 就是从当前目录先构建镜像再运行容器。属于临时构建镜像并运行。

实践的视频讲的不行。

docker镜像仓库

docker私人仓库除非是做运维,不然没什么必要搭建。

官方搭建是没有UI界面的,有人人提供的UI界面。

部署好之后就如下所示

相关推荐
Mr.朱鹏2 分钟前
设计模式之策略模式-工作实战总结与实现
java·spring·设计模式·kafka·maven·策略模式·springbbot
计算机毕设指导65 分钟前
基于SpringBoot共享汽车管理系统【附源码】
java·spring boot·后端·mysql·spring·汽车·intellij idea
蜗牛丨32 分钟前
Go Vue3 CMS管理后台(前后端分离模式)
mysql·docker·go·vue3·axios·gin·jwt·分页·跨域·ant design vue·log·gorm·otp动态码登录·validator·模型绑定·权限判断
春风十里不如你95271 小时前
【设计模式】【行为型模式(Behavioral Patterns)】之责任链模式(Chain of Responsibility Pattern)
java·设计模式·责任链模式
菜鸟小灰灰1 小时前
搭建私有docker仓库
运维·docker·容器
一只小菜鸡1 小时前
python+django5.1+docker实现CICD自动化部署springboot 项目前后端分离vue-element
python·docker·自动化
csdn_金手指1 小时前
docker 通过Dockerfile自定义的镜像部署Springboot项目
spring boot·docker·容器
小宋10211 小时前
实现Excel文件和其他文件导出为压缩包,并导入
java·javascript·excel·etl
guihong0041 小时前
JAVA面试题、八股文学习之JVM篇
java·jvm·学习