docker与虚拟机的区别
首先要知道三个层次
硬件层:计算机硬件
内核层:与硬件交互,提供操作硬件的指令
应用层: 系统应用封装内核指令为函数,便于程序员调用。用户程序基于系统函数库实现功能。
docker在打包的时候直接把应用层的函数库也进行打包,所以不管是linux的什么系统都可以跑docker。
虚拟机基于Hypervisor,这个技术可以模拟计算机硬件,所以可以运行不同的操作系统。
docker的架构
镜像和容器
docker和DockerHub
docker架构
镜像基本命令
拉取镜像
docker pull ubuntu:20.04:拉取一个镜像
docker pull nginx
列出本地所有镜像
docker images
删除镜像
docker image rm ubuntu:20.04
docker rmi ubuntu:20.04
导出压缩镜像
docker save -o ubuntu_20_04.tar ubuntu:20.04
加载镜像
docker load -i ubuntu_20_04.tar
创建某个容器的镜像
docker [container] commit CONTAINER IMAGE_NAME:TAG
容器相关命令
容器生命周期管理命令
docker exec :在运行的容器中执行命令
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 :删除一个或多个容器。
docker rm [OPTIONS] CONTAINER [CONTAINER...]
-f :通过 SIGKILL 信号强制删除一个运行中的容器。
-l :移除容器间的网络连接,而非容器本身。
-v :删除与容器关联的卷。
docker run :创建一个新的容器并运行一个命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-i: 以交互模式运行容器,通常与 -t 同时使用
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-d: 后台运行,并返回容器ID
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
--name="nginx-lb": 为容器指定一个名称
docker kill :杀掉一个运行中的容器。
docker kill [OPTIONS] CONTAINER [CONTAINER...]
-s :向容器发送一个信号
杀掉运行中的容器mynginx
runoob@runoob:~$ docker kill -s KILL mynginx
mynginx
运行与暂停之间切换的两条
docker pause 容器名或ID
docker unpause 容器名或ID
运行与停止之间切换
docker start 容器名或ID
docker restart 容器名或ID
docker stop 容器名或ID
容器操作命令
docker ps : 列出容器
docker ps [OPTIONS]
-a :显示所有的容器,包括未运行的。
-f :根据条件过滤显示的内容。
--format :指定返回值的模板文件。
-l :显示最近创建的容器。
-n :列出最近创建的n个容器。
--no-trunc :不截断输出。
-q :静默模式,只显示容器编号。
-s :显示总的文件大小。
docker inspect : 获取容器/镜像的元数据。
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
-f :指定返回值的模板文件。
-s :显示总的文件大小。
--type :为指定类型返回JSON。
docker top :查看容器中运行的进程信息,支持 ps 命令参数。
docker top [OPTIONS] CONTAINER [ps OPTIONS]
docker attach :连接到正在运行中的容器。(建议不要用这个,用docker exec比较好)
区别如下:docker exec与docker attach的区别_Christina_2020的博客-CSDN博客
docker attach [OPTIONS] CONTAINER
docker exec -it CONTAINER bash 这个代替
--sig-proxy=false 保证按下ctrl+c不会关闭容器
docker logs : 获取容器的日志
docker logs [OPTIONS] CONTAINER
-f : 跟踪日志输出
--since :显示某个开始时间的所有日志
-t : 显示时间戳
--tail :仅列出最新N条容器日志
docker export :将文件系统作为一个tar归档文件导出到STDOUT。
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 用于列出指定的容器的端口映射
docker port [OPTIONS] CONTAINER
docker stats : 显示容器资源的使用情况,包括:CPU、内存、网络 I/O 等。
docker stats [OPTIONS] [CONTAINER...]
--all , -a :显示所有的容器,包括未运行的。
--format :指定返回值的模板文件。
--no-stream :展示当前状态就直接退出了,不再实时更新。
--no-trunc :不截断输出。
其他一些命令
docker cp xxx CONTAINER:xxx 或 docker cp CONTAINER:xxx xxx:在本地和容器间复制文件
docker rename CONTAINER1 CONTAINER2:重命名容器
docker update CONTAINER --memory 500MB:修改容器限制
docker数据卷
容器和数据耦合的问题
挂载好数据卷之后就可以在外面修改相关配置文件。
操作数据卷
挂载数据卷
直接用宿主机目录挂载到容器目录
总结
自定义镜像
镜像结构
镜像就是将应用程序及其需要的系统函数库,环境,配置,依赖打包而成。
DockerFile
案例
dockerfile文件命令如下
依赖一个基础的镜像,配置了JDK,又准备了相对应项目和入口文件,然后制作了一个项目镜像。
# 指定基础镜像
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是命令的版本,这里有多个版本。
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,后台运行。
构建镜像
docker build -t web:1.0 .
创建容器
docker run --name web -p8090:8090 -d web:1.0
而第二个则是将这两个命令集合,里面的 . 就是从当前目录先构建镜像再运行容器。属于临时构建镜像并运行。
实践的视频讲的不行。
docker镜像仓库
docker私人仓库除非是做运维,不然没什么必要搭建。
官方搭建是没有UI界面的,有人人提供的UI界面。
部署好之后就如下所示