一、构造镜像
- 在jar包同目录下创建文件Dockerfile(没有后缀名)
文件内容为:
# FROM: 基础镜像,通过jdk8镜像开始
#java:8报错的话替换成openjdk:8
FROM java:8
# MAINTAINER: 维护者
MAINTAINER YangYuxin
# ADD: 复制jar包到镜像内,名字为sentinel.jar。./target/sentinel-1.0-SNAPSHOT.jar
# 官方建议替换为COPY,第一个参数为当前地址下的文件名(隐藏在文件夹下的要加上文件路径),第二个参数为之后命令中的假名
COPY *-1.0-SNAPSHOT.jar *.jar
# EXPOSE: 声明端口,通过(Win Docker)点击Run按钮时,默认显示的port
EXPOSE 8080
# ENTRYPOINT: docker启动时,运行的命令.这里就是容器运行就启动jar服务
ENTRYPOINT ["java","-jar","*.jar"]
- 打开cmd / powershell / terminal,输入
# "IMAGE"表示构造的镜像名,"."表示从当前目录打开Dockerfile文件
$docker build -t IMAGE .
如有发生报错
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get “http://%2Fvar%2Frun%2Fdocker.sock/v1.24/*”: dial unix /var/run/docker.sock: connect: permission denied
表示权限不够,在docker指令前添加"sudo "即可
例如$sudo docker build -t IMAGE .
等待加载完成即可完成镜像的构造。
不要关闭,进行下一步。
二、运行容器
- 查看容器
格式
$docker ps [OPTION]
例子:
# 查看正在运行的容器
$docker ps
# 查看所有容器
$docekr ps -a
2.运行容器
RUN命令基本格式为:
$docker run [OPTION] IMAGE [COMMAND] [ARG...]
例如:
$docker run --name NAME -p 8080:8080 -d IMAGE
NAME 处为自定义的容器名,IMAGE处为镜像名。
-p 指定端口映射 主机端口:容器端口。
-d 后台运行容器,并返回容器ID。
IMAGE指需要容器实现的镜像。
[OPTION]包含各种操作符,包括但不限于上文中的“--name=“NAME” -p 8080:8080”。具体内容可查询官方文档或菜鸟教程等学习。
如果需要在本地生成文件,可以使用-v操作符:docker运行一个容器就会生成一个Linux虚拟机,所以由docker运行的文件只会把文件保存在虚拟机内,而不会同步到本地。而使用-v操作符实现“挂载”,就可以把虚拟机内某个文件夹下的文件同步到指定的本地文件夹内。
例:
# L_PATH指本地目录的路径,V_PATH指虚拟机内的路径,绝对路径和相对路径都允许,程序中要写虚拟机内的路径
$docker run --name NAME -v L_PATH:V_PATH IMAGE
- 当同名容器已存在时,运行会失败,这时可以选择:
(1)移除原有容器
实例
# 强制删除容器 db01、db02:
$docker rm -f db01 db02
# 删除所有已经停止的容器:
$docker rm $(docker ps -a -q)
(2)启动原有容器
# CONTAINER为容器名
# 启动已关闭容器
$docker start CONTAINER
# 中断正在运行的容器
$docker stop [-t|--time TIME] CONTAINER
# 重启容器
# TIME 表示杀死容器之前等待停止的秒数(默认为10)
$docker restart [-t|--time TIME] CONTAINER
# 启动所有容器
# -q表示只显示容器ID
$docker start $(docker ps -a -q)
# 关闭所有容器
$docker stop $(docker ps -a -q)
# 重启所有容器
$docker restart $(docker ps -a -q)
①docker start CONTAINER 包含容器文件系统挂载的操作
docker stop CONTAINER 包含容器文件系统卸载的操作
docker restart CONTAINER 不包含容器文件系统的卸载与挂载操作,本质上docker restart不涉及文件系统的操作,因此restart命令并不是stop与start两个命令的顺序叠加。
但为了保证容器的根文件系统与内存系统mount的正确性,推荐对一个容器的重启使用docker stop xxx,然后 docker start xxx,而非docker restart xxx。
②start和restart没法决定是否打印日志,只能通过
# 查看最近10条日志并打印,CONTAINER为容器ID
$docker logs -f --tail 10 CONTAINER
# 查看某日期至今的所有日志
$docker logs -f --since "2023-01-01" CONTAINER
(3)换一个容器名
三、保存镜像
- 查看本地镜像
$docker images
- 保存镜像到本地
格式如下:
$docker save [OPTIONS] IMAGE [IMAGE...]
IMAGE为镜像ID。
例:
$docker save myimage_latest > myimage_latest.tar
> 可指定保存的文件名称。
- 可以使用 gzip 来保存图像文件并使备份更小
$docker save myimage_latest | gzip > myimage_latest.tar.gz
四、加载镜像
- 查看本地镜像
格式如下:
$docker images
- 加载镜像
格式如下:
$docker load [OPTIONS]
例:
$docker load < myimage_latest.tar.gz
Loaded image: myimage_latest:latest
$docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myimage_latest latest 769b9341d937 7 weeks ago 2.489 MB
- 如果已存在同名同版本的镜像,load指令会报错。
这时可以选择:
(1)换个镜像名
(2)换个版本号
(3)移除原有镜像
# -f 表示强制
$docekr rmi -f IMAGE
再重新load。