Docker基础
1. Docker简介
Docker 通过 Docker Hub 实现一行命令安装应用(镜像)【Nginx,Mysql等】,避免繁琐的部署操作。同时通过轻量级(相对于虚拟机)的容器化的思想(容器共享内核),将每个应用所需的环境进行隔离,使得同一台服务器上部署管理多个环境变得更为简便。
简单来说,可以把 Docker 是一个大容器,里边可以根据需求下载各类镜像,再根据需要自定义镜像并创建出一个个小容器,容器环境是最终暴露给外部的环境。
2. Windows环境部署docker
确保Windows为专业版(否则无 Hyper-V 选项)且做如下设置
docker安装
docker下载地址【Windows的x86架构对应AMD64】
第一次启动时要使用管理员身份!
3. 入门案例
拉取nginx镜像,自定义带有 nginx 镜像的容器名为 mynginx ,启动 nginx 服务,并成功访问欢迎界面
1 | |
4. 镜像相关命令
查询是否有 nginx 镜像
1
docker search nginx
下载 nginx 镜像
无法科学上网的需要配置国内下载仓库,具体看其他帖子
1
docker pull nginx
如果需要下载指定版本的镜像,需要去 Docker Hub 查询
找到需要版本后,可以用框框处语句进行下载
查询当前所拥有的镜像
1
docker images
删除 nginx 镜像
1
2# 需要输入镜像完整名(也可以使用Image ID删除)
docker rmi nginx:latest保存镜像
保存的镜像可像正常文件一样传输,用户只需要拿到镜像加载即可复刻镜像环境
1
2
3
4# 将指定容器环境(此处是mynginx)保存为镜像(mynginx:1.0 ,1.0是标签)
docker commit -m "update xxx" mynginx mynginx:1.0
# 将mynginx:1.0镜像保存为压缩包
docker save -o mynginx.tar mynginx:1.0加载镜像
用于复刻封装好的镜像环境
1
2# 加载mynginx.tar封装的镜像
docker load -i mynginx.tar加载完毕后使用 run 语句即可将其复刻为容器实例
5. 镜像推送社区
准备好 Docker Hub 账号并在终端登录
1
docker login
复制镜像并使用指定名称,格式为:
用户名/镜像名1
docker tag mynginx:1.0 excellentlong/mynginx:v1.0
推送镜像到指定仓库
1
2# 确保账号为excellentlong且存在mynginx仓库
docker push excellentlong/mynginx:v1.0
后续别人需要使用只需要搜索使用 pull 命令即可拉取到本地
6. 容器相关命令
运行 nginx:latest 镜像
1
2
3
4# 创建并启用一个新的容器实例
docker run nginx:latest
# 后台启动服务,自定义容器名为mynginx,完成容器内部端口80到实际端口88的映射
docker run -d --name mynginx -p 88:80 nginx容器内部的端口是独立的(此处的80),暴露在外的端口是唯一的(此处的88)
查看应用
1
2
3
4# 查看运行中的容器
docker ps
# 查看所有容器
docker ps -a
启动
1
2# 启用一个已经存在的容器(容器ID可以不写全,只要足够区分即可)
docker start 容器ID/容器NAMES停止
1
docker stop 容器ID/容器NAMES重启
1
docker restart 容器ID/容器NAMES状态
1
docker stats 容器ID/容器NAMES日志
1
docker logs 容器ID/容器NAMES删除
1
2# f参数是强制删除,即不关闭容器的情况下也能删除
docker rm [-f] 容器ID/容器NAMES进入某个容器的bash环境
1
2# 进入app01容器的bash环境
docker exec -it app01 bash
7. 文件挂载
由于docker内部容器非常轻量级,因此管理编辑容器内部文件并不方便,为此我们可以在启动容器时使用文件挂载的方式将内部容器与外部环境进行关联,从而只需要在外部进行操作即可完成对内部容器的修改。
1 | |
使用👆这一方式进行挂载是以外部环境为准,即挂载的外部目录为空,则对应的内部环境也会被置空
另外一种挂载方式是卷映射,它以内部环境为准,同样是使用 -v 进行指定,如下👇
1 | |
卷常见操作
1 | |
8. 自定义网络
Docker 内部有专属网络环境,容器内部可通过此内部网相互访问(此时使用的端口是容器内部端口),默认的网络环境是 docker0
1 | |
进入 app02 的 bash 模式,即可通过内部 IP:端口号 直接访问
IP地址由于种种原因会容易发生变化,我们希望可以通过容器名称完成访问(类似域名),而在 docker0 网络环境下不支持这种方式,因此引入自定义网络机制
1 | |
1 | |
app01 访问 app02 的 nginx 界面
1 | |
7. 批量操作容器
通过 compose.yaml 文件可以批量操作容器,省去繁琐的多次参数配置,且在迁移时依旧可以执行
实验:使用 compose.yaml 实现如下命令
1 | |
顶级元素:compose.yaml 中第一层的元素
name,service,networks,volumes,conifgs(少用),secrets(少用)
1 | |
各顶级元素更详细写法可参考:https://docs.docker.com/reference/compose-file/
1 | |
若能成功访问此界面,说明部署启动成功
1 | |
1 | |
9. 自定义镜像
当我们需要将本地项目部署至docker中时,需要自定义镜像,后续别人只要拥有此镜像即可运行项目
自定义镜像关键是使用 Dockerfile 文件指定所需环境,暴露端口,启动命令等信息,常见语句如下:
实验:在 docker 部署 SpringBootDemo.jar 项目
SpringBootDemo.jar 下载地址如下👇
通过百度网盘分享的文件:SpringBootDemo.jar 链接:https://pan.baidu.com/s/1vxxQdOTdXrasuU_cHGAAAg 提取码:alib
编辑dockerfile文件
1
2
3
4
5
6
7
8
9
10# 依赖jdk17镜像
FROM meddream/jdk17
# 指定作者名字
LABEL author=zzzz
# 将当前目录下SpringBootDemo.jar复制到镜像根目录下【一个镜像可以理解为一个Linux系统】,并重命名为app.jar
COPY SpringBootDemo.jar /app.jar
# 服务器启动指令
ENTRYPOINT ["java","-jar","/app.jar"]
# 声明访问端口
EXPOSE 8080构建镜像
1
2
3# 使用编辑好的Dockerfile构建镜像,镜像名称为myjavaapp,版本号是v1.0,最后的.代表需要构建镜像的项目在当前目录下
# 如果构建失败,可以先尝试使用pull将依赖镜像拉取到本地,相关镜像信息可在Docker Hub寻找
docker build -f Dockerfile -t myjavaapp:v1.0 .
创建镜像对应容器并测试
1
docker run -d -p 8888:8080 myjavaapp:v1.0