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容器的快速部署。