当前位置: 首页 > news >正文

Docker安装与使用

文章目录

      • 0.关键词
      • 1.安装docker
      • 2.镜像和容器
      • 3.Docker基础
        • 1.常见命令
        • 2.数据卷(volume)
          • 要解决的问题:
          • 什么是数据卷:
          • 解决的办法:
        • 3.数据卷的使用
          • 基本命令
          • 挂载数据卷(nginx)
          • 基于本地目录数据挂载(mysql)
          • O创建容器时添加到数据卷
        • 4.自定义镜像
          • 镜像的结构:
          • Dockerfile
          • Dockerfile使用
          • 构建镜像步骤
          • Docker网络(network)
            • 默认bridge
            • 自定义网络
            • O创建容器的时候添加到网络
      • 4.项目部署
        • 比较
        • 项目部署步骤
      • 5.DockerCompose
        • 什么是DockerCompose

0.关键词

镜像/自定义镜像

Dockerfile

容器

数据卷(默认/自定义)

网络(默认/自定义)

1.安装docker

根据自己操作系统版本选取对应

参考文档: https://docs.docker.com/engine/install/ubuntu/#prerequisites

2.镜像和容器

3.Docker基础

1.常见命令

(命令不会写,在命令后–help会打印提示)

镜像操作

1.docker pull 镜像名 【拉取镜像】

2.docker images 【查看本地镜像列表】

3.docker rmi 镜像名:版本号【删除镜像】

4.docker save -o 镜像名.tar 镜像名 【保存镜像到本地压缩包】

5.docker load -i 要读取的镜像.tar -q(可选,打印的信息) 【读取本地压缩包到镜像】

容器操作

6.docker run 【创建并运行容器】

6.docker ps 【查看容器状态:默认查看已启动的容器】-a查看所有的容器

7.docker logs 镜像名【查看日志】-f 持续查看

8.docker stop 容器名【停止容器】

9.docker start 容器名 【启动容器】

10.docker rm 容器id 【删除容器】

11.docker exec -it 容器名 bush【进入容器内部】

12.exit【退出容器】

13.docker inspect 容器名【查看容器挂载信息】

2.数据卷(volume)
要解决的问题:

当我们需要修改nginx内的静态文件使用vi命令,但是在docker中是没有这个命令的,所有无法修改,那么我们就要用到数据卷解决问题

什么是数据卷:

一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁

解决的办法:

由于nginx内的文件无法修改,那么我们通过数据卷做容器内目录与宿主机目录之间的双向绑定,只要宿主机目录改变,那么容器内目录也会发生改变

3.数据卷的使用
基本命令

查看如何使用 docker --help

14.docker volume ls【查看数据卷】

15.docker volume rm 数据卷名【删除指定数据卷】

16.docker volume inspect 数据卷名【查看指定数据卷详情】

17.docker volume prune【删除未被使用的数据卷】

挂载数据卷(nginx)

创建容器时,利用-v 数据卷名:容器内目录 完成挂载

//以nginx为例
//创建并且挂载数据卷
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx//查看卷,就能看到有一个名为html的数据卷
docker volume ls//查看html卷的详细信息
docker volume inspect html
宿主机/var/lib/docker/volumes/html/_data与容器/usr/share/nginx/html完成映射
[{"CreatedAt": "2024-12-24T14:04:32+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/html/_data","Name": "html","Options": null,"Scope": "local"}
]//到达宿主机的该目录下做修改
cd /var/lib/docker/volumes/html/_data//再进入nginx容器查看,我们发现再宿主机做的修改,容器内也发生了修改
docker exec -it nginx bush//查看nginx容器的挂载信息
docker inspect nginx"Mounts": [//这里就可以看到挂载到的宿主机目录和容器内目录{"Type": "volume",//类型数据卷"Name": "html",//数据卷名"Source": "/var/lib/docker/volumes/html/_data",//宿主机目录"Destination": "/usr/share/nginx/html",//容器内目录"Driver": "local","Mode": "z","RW": true,"Propagation": ""}],
基于本地目录数据挂载(mysql)

挂载到宿主机任意(自己定义的)目录,而不是固定的/var/lib/docker/volumes目录下

**解决了什么问题****:**如果mysql做版本升级,删除了mysql容器,但是数据不会被删除会存在宿主机默认目录下,但是如果重新创建mysql容器,那么mysql数据卷就会产生一个新的命名的匿名数据卷,原来的数据就用不了了,那么我们通过指定的宿主机目录,每次mysql做版本升级,只需要指定到这些目录,这些数据即可使用

匿名数据卷:由于mysql的数据会越来越多,容器放不下,所以会自动把数据挂载出去,产生的数据卷就是匿名的

注意:mysql数据目录、配置文件(cnf文件,配置一些字符格式)、初始化脚本(sql文件)目录都需要挂载

O创建容器时添加到数据卷
docker run -d \--name mysql \-p 3306:3306 \-e TZ=Asia/Shanghai \ -e MYSQL_ROOT_PASSWORD = root1234\-v /root/mysql/data:/var/lib/mysql \-v /root/mysql/init:/docker-entrypoint-initdb.d \-v /root/mysql/conf:/etc/mysql/conf.d \mysql-e TZ=Asia/Shanghai \ 用户指定时区,防止日志等修改有差异
4.自定义镜像

**问题:**有一些镜像docker是没有的,那么我们需要自己去制作镜像,例如java应用,每一个java应用都不一样,所以我们需要自己定义自己java项目的镜像

镜像的结构:

镜像就是包含了应用程序程序运行的系统函数库运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。例如我们要运行java项目,不同操作系统的要有对应的JRE才能运行,那么我们需要配置对应的环境

1.基于Ubuntu构建的java镜像结构

我们只需要清楚的描述镜像的结构,docker就会自动帮我们完成整个镜像的构建

Dockerfile

copy命令拷贝到镜像的指定目录,目录不一定存在,但docker制作过程中会自动创建出来

Dockerfile使用

18.docker build -t 镜像名:版本 所在目录【构建镜像】

# 基础镜像 注意基础镜像需要引入,可以通过docker load -i .tar文件
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/shanghai
RUN ln -snf /usr/share/zoneinfo/$Tz /etc/localtime && echo $Tz > /etc/timezone
# 拷贝jar包
copy hm-service.jar /app.jar
# 入口
ENTRYPOINT ["java","-jar","/app.jar"]
构建镜像步骤

基础镜像.tar包需要提前上传并加入镜像

1.上传jar包到当前目录下,

2.编写好Dockerfile文件

3.执行docker build的命令(这个时候镜像已经完成,通过docker images查看)

4.执行docker run -d --name 自定义容器名 -p 指定的启动端口:端口 镜像名【创建并运行容器】

5.查看运行状态(日志) docker log -f 容器名

Docker网络(network)

环境之间需要相互访问

默认bridge

自定义网络

解决的问题:默认方式下的网桥,要是A服务停止后,B服务开启就会占用A的ip,A再次开启就会分配其他ip,那么其他引用A服务的服务需要更改A服务现用的ip

那么我们使用自定义网络,通过容器名就可以互相访问,不需要知道对方的ip

19.docker network create 自定义网络名【创建一个网络】
20.docker network ls【查看全部网络】
21.docker network prune 【清楚未使用的网络】
22.docker network inspect 网络名【查看网络详情】
23.docker network connect 自定义的网络名 容器名【指定容器加入某个网络】

24.docker network rm 网络名【删除自己定有的网络/网桥】

**注意:**如果我们通过(docker inspect 容器名)查看容器的网络详情,发现ip是空的,那么就是该容器,没有被启动

O创建容器的时候添加到网络

那么查看容器网络详情就不会看到默认bridge的网桥,就只剩自己自定义的网桥,那么我们访问其他该网络下的容器就可以直接 (ping 容器名)访问了

docker run -d --name 需要创建的容器名 -p 端口号:映射的端口号 --network 自定义的网络名 镜像名

4.项目部署

比较

java应用原来再本地访问数据库需要访问localhost:3306地址,我们使用容器化部署后配置自定义网络通过容器名就可以访问了

现:注意这里的mysql是自定义网络的网络名

前端配置nginx(这里采用自定义数据卷)

项目部署步骤

1.打包jar包,

2.编写Dockerfile文件

3.执行docker build -t 镜像名:版本 所在目录 命令来构建java镜像

4.docker run启动java镜像

5.准备号静态资源和nginx配置文件(文件需要做修改,所以挂载到数据卷)

注意:自定义网络需要再同一个网络下,【java容器、mysql容器、nginx容器】

【可以创建容器时指定–network 网络名】或者【通过docker netword connect 自定义的网络名 容器名】命令连接到网络

5.DockerCompose

什么是DockerCompose

Docker Compose通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署。

http://www.lryc.cn/news/509532.html

相关文章:

  • 通过nginx设置一个图片服务器,并使用 Nginx 作为反向代理
  • MacOS M3源代码编译Qt6.8.1
  • 【Pytorch实用教程】PyTorch 自带的数据集全面解读
  • Flask使用的正例和反例
  • 2024年河北省职业院校技能大赛云计算应用赛项赛题第2套(私有云)
  • 我的软件架构师——Java 职位面试经历。
  • npm error code ETIMEDOUT
  • (11)(3.2) ESC信号问题
  • Postman最新接口自动化持续集成
  • windows nacos安装配置
  • 重温设计模式-外观模式和适配器模式的异同
  • 数据中台从centos升级为国产操作系统后,资源增加字段时,提交报500错误
  • 云原生后端开发(一)
  • 实现用户登录系统的前后端开发
  • 双刃剑下的机遇与风险:交易中的杠杆效应
  • 伏羲0.13(文生图)
  • 深度学习blog-卷积神经网络(CNN)
  • 深度学习中的残差网络、加权残差连接(WRC)与跨阶段部分连接(CSP)详解
  • 在Nginx部署Web应用,如何保障后端API的安全
  • arm架构 uos操作系统离线安装k8s
  • OpenCV-Python实战(1)——图像or视频文件处理
  • Flink SQL Cookbook on Zeppelin 部署使用
  • 【hackmyvm】DC04靶机wp
  • 记录jvm进程号
  • day19——web自动化测试(1)
  • go window安装protoc protoc生成protobuf文件
  • 微信小程序中momentjs无法切换中文问题处理
  • 数据结构:链表
  • 领克Z20结合AI技术,革新自动驾驶辅助系统
  • vector快慢指针+例题详解