一、镜像管理
构建镜像
参考下面 👇
删除镜像
删除本地一个或多个镜像
docker rmi [参数] 镜像1 [镜像2...]
参数说明:
参数 | 作用 |
-f | 强制删除镜像。 |
--no-prune | 不移除该镜像的过程镜像,默认移除。 |
# 按镜像ID删除镜像
docker rmi 镜像ID
# 删除所有镜像
docker rmi `docker images ‐q`
给镜像打标签
标记本地镜像,将其归入某一仓库
docker tag 原镜像名称[:原镜像标签] [镜像仓库/][账号/]新镜像名称[:新镜像标签]
docker tag centos centos-vim
列出本地镜像
docker images [参数] [镜像名称[:镜像标签]]
参数说明:
参数 | 作用 |
-a | 列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层) |
–digests | 显示镜像的摘要信息 |
–no-trunc | 显示完整的镜像描述 |
--limit | 显示的数量 |
-f <过滤条件> | 列出指定条件的镜像 支持的过滤器:
|
--format | 格式化输出
使用 --format 选项时,search 命令将完全按照模板的声明输出数据。如果显示列标题,需要加上 table 伪指令 |
-q | 只显示镜像ID |
# 查看本地镜像列表
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 3edbb69f9a49 7 weeks ago 117MB
wurstmeister/kafka latest a692873757c0 3 months ago 468MB
dushixiang/kafka-map latest e732f1d7306a 3 months ago 295MB
mysql 5.7.29 5d9483f9a7b2 2 years ago 455MB
wurstmeister/zookeeper latest 3f43f72cb283 3 years ago 510MB
# 列出本地镜像中REPOSITORY为ubuntu的镜像列表。
docker images ubuntu
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 90d5884b1ee0 9 weeks ago 188 MB
ubuntu 15.10 4e3b13c8a266 3 months ago 136.3 MB
字段名 | 字段描述 |
REPOSITORY | 镜像名称 |
TAG | 镜像标签 |
IMAGE ID | 镜像ID |
CREATED | 镜像的创建日期(不是获取该镜像的日期) |
SIZE | 镜像大小 |
这些镜像都是存储在Docker宿主机的/var/lib/docker目录下
images子命令
docker image inspect命令 -Docker教程
查看镜像创建历史
docker history [参数] 镜像
参数说明:
参数 | 作用 |
-H | 以可读的格式打印镜像大小和日期,默认为true |
--no-trunc | 显示完整的提交记录 |
-q | 仅列出提交记录ID |
# 查看本地镜像runoob/ubuntu:v3的创建历史
docker history runoob/ubuntu:v3
IMAGE CREATED CREATED BY SIZE COMMENT
4e3b13c8a266 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B
<missing> 3 months ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/ 1.863 kB
<missing> 3 months ago /bin/sh -c set -xe && echo '#!/bin/sh' > /u 701 B
<missing> 3 months ago /bin/sh -c #(nop) ADD file:43cb048516c6b80f22 136.3 MB
导出镜像
将指定镜像保存成 tar 归档文件
docker save [参数] 镜像1 [镜像2...]
参数说明:
参数 | 作用 |
-o | 输出到的文件 |
runoob@runoob:~$ docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3
runoob@runoob:~$ ll my_ubuntu_v3.tar
-rw------- 1 runoob runoob 142102016 Jul 11 01:37 my_ubuntu_v3.ta
加载镜像
导入使用
docker save
命令导出的镜像
docker load [参数]
参数说明:
参数 | 作用 |
--input 或 -i | 指定导入的文件,代替 STDIN |
--quiet 或 -q | 精简输出信息 |
# 导入本地镜像到服务器的docker中
docker load -i d:/www/centos.tar
导入镜像
从归档文件中创建镜像
docker import [参数] 文件路径|文件外链|- [镜像名称[:镜像标签]]
参数说明:
参数 | 作用 |
-c | 应用docker 指令创建镜像 |
-m | 提交时的说明文字 |
# 从镜像归档文件my_ubuntu_v3.tar创建镜像,命名为runoob/ubuntu:v4
runoob@runoob:~$ docker import my_ubuntu_v3.tar runoob/ubuntu:v4
sha256:63ce4a6d6bc3fabb95dbd6c561404a309b7bdfc4e21c1d59fe9fe4299cbfea39
runoob@runoob:~$ docker images runoob/ubuntu:v4
REPOSITORY TAG IMAGE ID CREATED SIZE
runoob/ubuntu v4 63ce4a6d6bc3 20 seconds ago 142.1 MB
二、构建镜像(Dockerfile)
什么是Dockerfile
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个
新的镜像
- 对于开发人员:可以为开发团队提供一个完全一致的开发环境;
- 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了;
- 对于运维人员:在部署时,可以实现应用的无缝移植。
Dockerfile 常用命令
指定 | 指定说明 |
FROM image_name:tag | 一般需要一个非常基础的镜像来做构建 |
RUN command | 编译镜像时运行的脚本,可以写多条 |
ENV key value | 设置环境变量,可以设置多个 |
CMD | 设置容器的启动命令 |
ENTRYPOINT | 设置容器的入口程序 |
ADD source_dir/file des_dir/file | 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压 |
COPY source_dir/file des_dir/file | 与ADD相似,但是不会自动解压 |
WORKDIR path_dir | 设置工作目录 |
ARG | 设置编译镜像时加入的参数 |
VOLUMN | 设置容器的挂载卷 |
EXPOSE 端口号 | 向外开放一个端口号 |
看了这么多指令,感觉有点懵?别担心,通过一个实例来熟悉它们。这是一个 Dockerfile:
FROM centos:7
COPY nginx.repo /etc/yum.repos.d/nginx.repo
RUN yum install -y nginx
EXPOSE 80
ENV HOST=mynginx
CMD ["nginx","-g","daemon off;"]
逐行分析一下上述的 Dockerfile。
- 第一行表示我要基于 centos:7 这个镜像来构建自定义镜像。这里需要注意,每个 Dockerfile 的第一行除了注释都必须以 FROM 开头。
- 第二行表示拷贝本地文件 nginx.repo 文件到容器内的 /etc/yum.repos.d 目录下。这里拷贝 nginx.repo 文件是为了添加 nginx 的安装源。
- 第三行表示在容器内运行yum install -y nginx命令,安装 nginx 服务到容器内,执行完第三行命令,容器内的 nginx 已经安装完成。
- 第四行声明容器内业务(nginx)使用 80 端口对外提供服务。
- 第五行定义容器启动时的环境变量 HOST=mynginx,容器启动后可以获取到环境变量 HOST 的值为 mynginx。
- 第六行定义容器的启动命令,命令格式为 json 数组。这里设置了容器的启动命令为 nginx ,并且添加了 nginx 的启动参数 -g ‘daemon off;‘ ,使得 nginx 以前台的方式启动。
上面这个 Dockerfile 的例子基本涵盖了常用的镜像构建指令
构建镜像
Dockerfile自动构建docker镜像
Spring Boot项目
构建镜像
① 将项目打成jar包
项目jar包名称为:demo-project.jar
② 上传Jar包到docker服务器
# 创建项目目录
mkdir -p /apps/server/demo-project
# 上传jar包到项目目录下
# 创建日志文件目录
mkdir -p /apps/server/demo-project/logs
# 创建项目存储目录,例如项目相关的一些图片模板等,可以存放在该目录下
mkdir -p /apps/server/demo-project/storage
③ 创建Dockerfile文件
注意:Dockerfile只能读取到所在的目录及所在目录的子级目录,jar包存放的位置最好和Dockerfile同一目录
rm -rf /apps/server/demo-project/Dockerfile
touch /apps/server/demo-project/Dockerfile
tee /apps/server/demo-project/Dockerfile <<-'EOF'
# 该镜像需要依赖的基础镜像
FROM openjdk:8
# 指定维护者的名字
MAINTAINER hbsc
# 设置时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 工作目录
ENV WORCSPACES="/apps/server/demo-project"
# 设置工作目录
WORKDIR $WORCSPACES
# 将jar包复制到工作目录下
ADD demo-project.jar $WORCSPACES
# jar包名字改查app
RUN mv demo-project.jar app.jar
# 指定docker容器启动时运行jar包
ENV PARAMS=""
ENTRYPOINT ["sh","-c","java -jar $JAVA_OPTS $WORCSPACES/app.jar $PARAMS"]
EOF
④ 执行命令构建镜像
# 进入项目目录
cd /apps/server/demo-project
# 执行构建命令,构建完成后通过docker images查看镜像列表,验证是否构建成功了
docker build -t aliyun/demo-project:0.1 .
创建和运行容器
# 指定项目运行的环境及容器内的时区
docker run --name demo-project-0.1 -p 8082:8082 \
-v /apps/server/demo-project/logs:/apps/server/demo-project/logs \
-v /apps/server/demo-project/storage:/apps/server/demo-project/storage \
-e TZ=Asia/Shanghai -e JAVA_OPTS='-Dspring.profiles.active=test' \
-d aliyun/demo-project:0.1
注意:项目的日志路径你需要跟你实际配置的来,我在项目中配置的日志路径就是/apps/server/demo-project/logs/out.log
⑤ 放开防火墙,使其它电脑也能访问8082
firewall-cmd --permanent --add-port=8082/tcp
firewall-cmd --reload
连接容器
docker exec -i -t demo-project-0.1 /bin/bash
查看日志
① 容器日志
# 实时查看日志
docker logs -ft demo-project-0.1
# 查看最近 n 行日志
docker logs -t --tail 10 demo-project-0.1
② 应用日志
因为之前创建容器时,已经将容器的日志目录挂载到了宿主机的/apps/server/demo-project/logs
目录下,所以直接可以访问宿主机/apps/server/demo-project/logs
目录下的日志文件
# 实时查看文件内容
tail -f /apps/server/demo-project/logs/out.log
# 日志搜索 less -mp/?'需要搜索的内容' 文件
less -mp/?'Exception' /apps/server/demo-project/logs/out.log
卸载镜像及容器
docker stop demo-project-0.1
docker rm demo-project-0.1
docker rmi aliyun/demo-project:0.1
Dockerfile文件示例
jar包项目
war包项目
# 使用 Tomcat 8.5 作为基础镜像
FROM tomcat:8.5-jdk8
# 指定维护者的名字
MAINTAINER hy
# 切换到Tomcat的工作目录
WORKDIR /usr/local/tomcat
# 设置时区
ENV TZ=Asia/Shanghai LANG=C.UTF-8 LANGUAGE=C.UTF-8 LC_ALL=C.UTF-8
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 将 WAR 包复制到 Tomcat 的 webapps 目录中
COPY target/*.war /usr/local/tomcat/webapps/ROOT.war
#COPY $APP_DIR/target/*.war /usr/local/tomcat/webapps/ROOT.war
# 暴露 Tomcat 的 HTTP 端口(默认为 8080)
EXPOSE 8080
# 启动 Tomcat 服务器
CMD ["catalina.sh", "run"]
html项目
# 使用 nginx 作为基础镜像
FROM nginx:1.20.0-alpine
# 指定维护者的名字
MAINTAINER hy
# 切换到nginx的工作目录
WORKDIR /usr/share/nginx
# 复制静态文件到 nginx的 html 目录中
COPY dist /usr/share/nginx/html
#RUN sed -i "30a server_tokens off;" /etc/nginx/nginx.conf
# 暴露 nginx 的 HTTP 端口(默认为 80)
EXPOSE 80