dockerfile笔记

1.docker数据卷

1.1.简介

  • 实现宿主机和容器之间的文件或者文件的同步,一般用来解决容器的持久化存储或者是宿主机和容器之间的数据共享

1.2.操作

  • 设置数据卷
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 绝对路径
$ docker run -v 数据机目录:容器目录[读写权限] 镜像名
# 别名 如果不存在对应数据卷,docker将自动创建
$ docker run -v 数据卷: 容器目录[读写权限] 镜像名
# eg:
$ docker run -d -p 80:80 -v nginx_html:/usr/share/nginx/html nginx
# 查看数据卷
$ docker inspect 容器id
# 列出数据卷
$ docker volume ls
# 查看数据卷详细信息
$ docker volume inspect 容器名
# 创建数据卷
$ docker volume create 数据卷名
# 删除数据卷 rm -f强制删除,但不能删除使用中的数据卷
$ docker volume rm 数据卷名

2.Dockerfile

2.1.简介

  • dockerfile可以用来定义镜像具体的变更

  • 用自己的方式自定义镜像

  • 镜像分层,每一层一个变更

  • 基本语法以FROM开头,#为注释

2.2.构建一个简单的dockerfile

CMD

只有CMD和ENTRYPOINT指令是在容器运行的时候执行,其余命令都是在构建镜像的时候执行。

  1. 创建文件 HelloWorld
  2. 编写指令
1
2
FROM centos:7 
CMD ["echo", "helloworld"]
  • 使用数组形式命令并不会解析$环境变量调用

  • 而使用CMD echo $HOME则会解析环境变量

  • 如果使用数组格式可以使用**[“sh”,”-c”,”echo $HOME”]**便可以解析环境变量

  • 如果多个CMD命令,只会执行最后一个

  1. 编译镜像
1
2
3
4
$ docker build -t hello:1.0 -f HelloWorld .
# -t 指定镜像名和标签
# -f 指定DockerFile文件
# 表示在当前目录下查找对应的DockerFile来构建

2.3.ENV

  • 定义环境变量
1
2
3
4
FROM centos:7 
ENV CONTENT="helloworld"
CMD ["sh","-c","echo $CONTENT"]
# CMD echo $CONTENT

2.4.WORKDIR

  • 设定工作目录
1
2
3
4
5
WORKDIR /a
WORKDIR b
WORKDIR c
# WORKDIR /a/b/c
# 表示当前工作目录为 /a/b/c
  • WORKDIR也可以使用$引用环境变量

2.5.RUN

  • 构建过程中使用的命令
1
2
3
4
5
FROM centos:7 
ENV CONTENT="helloworld"
WORKDIR /app/takake
RUN echo ${CONTENT} > content.txt
CMD ["sh","-c","cat content.txt"]

2.6.ADD

  • 将网络文件或者本地文件上传至容器
1
2
3
4
5
6
7
8
9
10
11
12
FROM nginx:1.21.5
WORKDIR /app
# 从本地田添加包
# ADD dist.tar.gz .
# ADD文件上传镜像,如果文件是压缩包会自动解压
# 从网络加载gz
ADD http://192.168.31.246:8000/dist.tar.gz .
# 在远程上无法自动解压文件,同时不能使用本地回环地址127.0.0.1或者localhost,但可以使用本地局域网ip,因为RUN是在docker里执行,而不是本地机上执行
RUN tar -zxvf dist.tar.gz
RUN cp -r dist/* /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]

2.7.EXPOSE

  • 声明端口(没有实际意义),哪怕是不声明也无所谓,也可以使用-p映射端口,当然声明了也需要使用-p映射
1
EXPOSE 80

2.8.COPY

  • 单纯复制本地文件,但不解压tar.gz文件,且无法加载网络文件
1
COPY dist.tar.gz .

2.9.ENTRYPOINT

  • 设置容器启动时的命令,且该命令不会由docker run命令覆盖,而CMD命令会被DOCKER RUN命令覆盖。
1
CMD ["echo", "helloworld"]
  • 实际应用场景
1
2
ENTRYPOINT ["java","-jar"]
CMD ["app.jar"]

3.docker push

1
2
3
4
5
6
7
8
# 登陆docker hub账号
$ docker login
# 输入密码
# 打包需要用户名在前
$ docker build -t takakie/dist:1.3 -f DockerFile .
# 打标签docker tag username/镜像名:tag username/镜像名:tag
# 第一个为本地镜像,第二个为远程镜像名
$ docker tag takakie/dist:1.3 takakie/dist:1.3