Docker和虚拟机区别:
虚拟机(virtual machine)是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在 Windows 系统里面运行 Ubuntu 系统,这样就可以运行任意的Ubuntu应用了。
Docker仅仅是封装函数库,并没有模拟完整的操作系统,是一个系统进程
特性 | Docker | 虚拟机 |
---|---|---|
性能 | 接近原生 | 性能较差 |
银盘启动 | 一般为MB | 一般为GB |
启动 | 秒级 | 分钟级 |
Docker常用命令
镜像
Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
docker images 查看所有镜像
docker rmi imagesID 删除id为imagesID 的镜像
docker pull negix:1.20 拉取negix镜像,版本号为1.20,如果没有指定版本就是拉取最新版本
docker push 推荐镜像给仓库
docker save -o ./nginx.tar nginx:1.20 :将nginx 版本为1.20 的镜像打包到当前目录下,打包后的文件名为nginx.tar(名字可以随意)
docker load -i nginx.tar :将nginx.tar加载成镜像文件
docker tar 镜像id 标签:为镜像添加一个新的标签
docker buile 构建镜像
自定义镜像:
当从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
- 从已经创建的容器中更新镜像,并且提交这个镜像(更新镜像)
- 使用 Dockerfile 指令来创建一个新的镜像(Dockerfile文件)
# 执行Dockerfile 生成自定义镜像
# 参数-t 指定要创建的目标镜像名和版本,
# 最后面的参数 . Dockerfile文件所在目录,可以指定Dockerfile的绝对路径
docker buile -t javaweb:1.0 .
# 根据镜像,创建容器并启动(后面有容器的创建命令)
# 镜像id可以通过命令 docker images查看
docker buile --name=myjavaweb -d -p 8090:8090 镜像id
Dockerfile文件必须满足:
- 每一个指令都会在镜像上创建一个新的层
- 每一个指令的前缀都必须是大写的
# Dockerfile文件
# 指定基础镜像
FROM centos:7
# 配置环境变量,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
容器
镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见。
docker run 创建容器并运行
示例: docker run --name[=]mynginx -d -p 8080:80 nginx:1.20
参数:
–name :容器名字,后面的等于号可以省略
-d :后台运行,否则会霸屏运行
-p: 映射端口号,冒号左侧是暴露给外部访问的端口号,冒号右侧是容器内的端口号,
解释:
依据镜像nginx:1.20,创建名为mynginx的容器,并运行,容器外部访问端口为8080,内部端口为80(nginx的默认端口,建议以默认端口号)
常用软件默认端口号nginx(80),tomacat(8080),mysql(3306),redis(6379)
docker pause mynginx :暂停mynginx
docker unpause mynginx : 从暂停转换为运行
docker stop mynginx: 停止mynginx
docker start mynginx : 启动mynginx
docker logs [-f] mynginx :查看运行日志参数 ,参数 -f 动态读取文件末尾
docker ps [-a][-q] :查看所有运行的容器及状态
- -a 可查看所有进程
- -q:只查看CONTAINER ID(运行中的)
docker rm mynginx :删除指定容器(正在运行的无法删除)
docker rm -f mynginx: 强制删除容器,正在运行的也可以被删除
docker exec -it mynginx [/bin] bash :进入mynginx容器
- docker exec :进入容器内部,执行一个命令
- -i 交互操作模式
- -t 终端
- it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。,进入容器后执行的命令,bash是一个linux终端交互命令,/bin可省略
进入容器后输入exit退出容器
数据卷:
概念: 数据卷是虚拟目录,数据卷是一种逻辑概念,是虚拟的,并非真实存在,与容器内的文件有映射关系,还指向宿主文件系统中的某个目录
作用:数据解耦(容器与数据分离),可以数据复用,方便数据维护
语法:docker volume [命令]
docker volume create mydata:创建数据卷mydata
docker volume ls:显示所有数据卷
docker volume rm mydata:删除指定数据卷mydata
docker volume prune[-f]:删除未映射文件 数据卷 参数-f :直接删除,不提示
docker volume inspect mydata:查看数据卷详情,可查看数据卷在虚拟机中的路径
#docker volume inspect mydata的结果
[
{
"CreatedAt": "2022-10-15T16:55:15+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/mydata/_data",
"Name": "mydata",
"Options": {},
"Scope": "local"
}
]
挂载:
容器中的数据与宿主数据创建连接
创建容器时增加 -v 参数,有数据卷挂载和目录挂载两种方式
数据卷挂载:中间有数据卷,虚拟目录由docker管理
目录挂载:没有数据卷,虚拟机跟docker容器产生关系,虚拟机的目录由开发者管理
数据卷挂载
docker run --name mynginx
-v html:/usr/share/nginx/html
-d -p 8080:80 nginx:1.20
参数说明:
- –name 容器名 给容器取名 mynginx
- -v 卷名:容器目录 把数据卷挂载到容器下的指定目录
(/usr/share/nginx/html目录可以通过docker官方网站查看) - -p 主机端口:容器端口 ,把宿主机的端口映射到容器内的端口
- -d 后台运行
目录挂载:
- -v 宿主机目录:容器内目录
- -v 宿主机文件:容器内文件
# 提前在对应目录下创建mysql.cnf文件,并添加[mysql],否则会创建文件夹mysql.cnf
echo [myslq] > mysql.cnf
# docker目录挂载方式创建sql
docker run -di
--name=mysql2
-e MYSQL_ROOT_PASSWORD=123456
-p 23306:3306
-v /root/mysql/mysql.cnf:/etc/mysql/conf.d/mysql.cnf
-v /root/mysql/data:/var/lib/mysql
mysql:5.7
参数说明:
- -e MYSQL_ROOT_PASSWORD=123456:
设置容器的环境变量,设置MySQL root 用户的密码为123456
链接:参数-e的使用 - -v 目录挂载时,文件映射文件,文件夹映射文件夹,
如果没有mysql.cnf文件,会创建一个目录mysql.cnf
# docker数据卷挂载方式创建sql
docker run --name=mysql3
-p 33306:3306
-e MYSQL_ROOT_PASSWORD=123456
-v conf3:/etc/mysql/conf.d
-v mysqldata3:/var/lib/mysql -d mysql:5.7
待解决:为啥数据卷挂载和目录挂载目录不一致???
数据卷挂载时,配置文件路径为/etc/mysql/conf.d
目录挂载时,配置文件路径为/etc/mysql/conf.d/mysql.cnf
参考:菜鸟docker教程