DockerFile的基本使用

为什么要使用

之前的方式去部署应用还是有点繁琐,因为之前使用的镜像并不能很好的符合我们自己的需求。

使用dockerFile可以自定义镜像

快速入门

构建一个最简单的HelloWorld镜像

  • 创建一个文件
1sudo mkdir images
  • 在文件中编写相关指令
FROM ubuntu:22.04
CMD ["echo","helloworld"]
  • 编译镜像
1docker build -t hello:1.0 -f HelloWorld .
  • 容器运行测试
1docker run hello:1.0

指令学习

FROM

  • 作用

    定义基础镜像

  • 用法

    FROM 镜像名:标签名

    FROM ubuntu:22.04

  • 作用时机

    构建镜像的时候

CMD

  • 作用

    用来定义容器运行时的默认命令。可以在使用docker run的时候覆盖掉CMD中定义的命令

  • 用法

    CMD [“命令1”,“参数1”,“参数2”]

    CMD echo $HOME

  • 注意

    一个DockerFile中写多个CMD的时候只有最后一个CMD会去作用

ENV

  • 作用

    用来定义环境变量

  • 用法

    ENV 变量名=“变量值”

  • 作用时机

    构建镜像的时候

  • 脚本

    1#第一种使用参数的方法
    2FROM ubuntu:22.04
    3ENV CONTENT hello
    4CMD ["sh","-c","echo $CONTENT"]
    5#第二种使用参数的方法
    6FROM ubuntu:22.04
    7ENV CONTENT="helloword"
    8CMD echo $CONTENT
    

RUN

  • 作用

    它是用来定义构建过程中要执行的命令的

  • 用法

    RUN 命令

    例如:RUN echo sg

  • 作用时机

    构建镜像的时候

WORKDIR

  • 作用

    用于设置当前工作的目录,如果该目录不存在会自动创建。

  • 用法

    WORKDIR 目录

    WORKDIR /root/app

  • 作用时机

    构建镜像的时候

案例:

定义一个CONTENT变量,默认值为hellodocker,在镜像的/app目录下创建一个sg目录,在其中创建一个content.txt文件,文件的内容为CONTENT变量的值。容器启动时打印content.txt的内容

  • 在Linux环境下执行这些命令

    1export CONTENT=hellodocker
    2mkdir /app
    3cd /app
    4mkdir sg
    5cd sg
    6echo $CONTINT>content.txt
    7cat content.txt
    
  • 使用dockerfile构建响应的容器

1FROM ubuntu:22.04
2ENV CONTINT="hellodocker"
3WORKDIR /app/sg
4RUN echo $CONTINT>content.txt
5CMD ["cat","content.txt"]
  • 构建
1docker build -t test:2.0 -f Test1 .
  • 运行
1docekr run test:2.0

ADD

  • 作用

    把构建上下文中的文件或者网络文件添加到镜像中,如果文件是一个压缩包会自动解压,如果是网络中的文件并不会自动解压

  • 用法

    ADD 原路径 目标路径

    ADD sg-blog-vue.tar.gz .

  • 作用时机

    构建镜像的时候

EXPOSE

  • 作用

    暴露需要发布的端口,让镜像使用者知道应该发布哪些端口

  • 用法

    EXPOSE 端口号1 端口号2 ….

    EXPOSE 80 8080

  • 作用时机

    构建镜像的时候

COPY

  • 作用

    从构建上下文中复制内容到镜像中

  • 用法

    COPY 原路径 目标路径

    COPY sg-blog-vue.tar.gz .

ENTRYPOINT

  • 作用

    用来定义容器运行时的默认命令。docker run的时候无法覆盖ENTRYPOINT里的内容。

  • 作用时机

    运行容器的时候

  • 用法

    ENTRYPOINT [“命令1”,“参数1”,“参数2”]

    ENTRYPOINT [“echo”,“helloworld”]

  • 解释

    与CMD结合,把不希望被覆盖的命令用ENTRYPOINNT定义,其他部分用CMD定义,这样启动容器的时候只会覆盖CMD的部分

  • ENTRYPOINT [“java”,"-jar"] CMD [“app.jar”]

    上述写法的app.jar就是可以被覆盖的,而java -jar就是不能被覆盖

上传镜像

  • 注册账号

    上传镜像需要有dockerhub的账号

  • 本地登录验证

    docker login

    然后输入用户名和密码

  • 给镜像打标签

    docker tag username/镜像名:tag #username是DockerHub的用户名

  • 推送镜像

    docker push username/镜像名:tag

DockerCompose的基本使用

概述

  • 为什么要学习

我们在部署运行一个项目的时候可能需要运行多个容器。 还要去处理这些容器的网络,数据卷等。 如果用docker命令一个个去处理还是不方便。 DockerCompose就是去解决这个问题的。

DockerCompose是用来定义和运行一个或多个容器(通常都是多个)运行和应用的工具

可以使用 YAML 文件来配置应用程序的服务。然后,使用单个命令,您可以根据配置创建并启动所有服务。

  • 检查是否安装DockerCompose

使用docker compose version 可以查看版本

快速入门

  • 编写docker-compose.yaml模板文件
  • 运行 docker compose up -d
  • 停止 docker compose down

默认运行的文件时docker-compose,当使用docker compose up时会自动寻找docker-compose.yaml这个文件,如果更改文件名需要添加新的参数进行指定文件位置

1docker-compose -f docker-compose.override.yml up

模板文件中的元素

command

  • 覆盖容器启动后的默认指令

environment

  • 指定环境变量,相当于run的-e选项

image

  • 用来指定镜像

networks

  • 指定网络,相当于run的–network

ports

  • 用来指定要发布的端口,相当于run的-p

volumes

  • 用来指定数据卷,相当于-v

restart

  • 用来指定重启策略,相当于–restart

案例

在之前自定义镜像版本的基础上,用DockerCompose来部署

 1services:
 2  # mysql
 3  blog_mysql:
 4    image: mysql:5.7
 5    volumes:
 6      - mysql_data:/var/lib/mysql
 7    ports:
 8      - 3306:3306
 9    environment:
10      MYSQL_ROOT_PASSWORD: *******
11    restart: always
12    networks:
13      - blog_net
14  # redis
15  blog_redis:
16    image: redis:7.0
17    volumes:
18      - redis_data:/data
19    ports:
20      - 6379:6379
21    restart: always
22    command: ['redis-server','--appendonly','yes']
23    networks:
24      - blog_net
25  # 后端服务
26  sg_blog:
27    image: sg_blog:01
28    ports:
29      - 7777:7777
30    networks:
31      - blog_net
32    restart: always
33  # 前端服务
34  sg_blog_vue:
35    image: sg_blog_vue:01
36    ports:
37      - 80:80
38    restart: always
39
40networks:
41  blog_net:
42
43volumes:
44  mysql_data:
45    #使用已经存在的数据卷
46    external: true
47  redis_data:
48    external: true