docker在安装某些软件时很方便,记录下来,顺带学习docker

安装docker

详细看官方文档

一个软件

  1. 安装portainer(管理docker) 详情看这里
docker volume create portainer_data
docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

基本命令

  1. run

    • docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    • -p 表示将容器的某个端口暴露出来, 比如-p 7000:8000表示将容器的8000端口暴露出来并映射到本地的7000端口
    • -i 表示可操作,即使未连接STDIN也保持打开状态
    • -t 分配伪TTY,和-i连-it 表示容器的 Shell 映射到当前的 Shell
    • -d 在后台运行容器并打印容器ID
    • -v 绑定挂载卷,用于容器卷和本地卷绑定,比如-v /docekr/mysql/data:/mysql/data表示将容器的目录/mysql/data绑定到本地的/docekr/mysql/data目录上
    • -e 设置环境变量
    • –rm 退出时自动删除容器
    • –name 为容器分配一个名称
  2. exec

    • docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
    • 用于进入一个启动的容器: docker exec -it container_name bash
  3. commit

    • docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    • 用于创建一个自己的镜像: docker commit 89a47b5b749e book-service:latest
  4. 其他的比如container,image,logs命令都很常用,都可以用docker 命令 --help来查看说明

dockerfile

Docker可以通过阅读Dockerfile中的指令来自动构建映像。 Dockerfile是一个文本文档,其中包含用户可以在命令行上调用以组装映像的所有命令。使用docker build的用户可以创建自动执行的构建,该构建可以连续执行几个命令行指令。

docker build -f elasticsearch.Dockerfile -t my-elastic .
  1. .dockerignore 文件

    在Docker CLI将上下文发送到Docker守护程序之前,它将在上下文的根目录中查找名为.dockerignore的文件。如果此文件存在,则CLI会修改上下文以排除与其中的模式匹配的文件和目录。这有助于避免不必要地将大型文件或敏感文件和目录发送到守护程序,并避免使用ADD或COPY将它们添加到映像中。

    规则行为
    # comment忽略这个
    */temp*在根的任何直接子目录中排除名称以temp开头的文件和目录。例如,排除纯文件/somedir/temporary.txt,以及目录/somedir/temp
    */*/temp*从根以下两级的任何子目录中排除以temp开头的文件和目录。例如,排除/somedir/subdir/temporary.txt
    temp?排除名称为temp的一个字符扩展名的根目录中的文件和目录。例如,排除/ tempa和/ tempb。
  2. dockerfile命令:

    • FROM <image>[:<tag>] [AS <name>]]: 挑选一个基础镜像作为基础,FROM指令初始化一个新的构建阶段,并为后续指令设置基本映像。因此,有效的Dockerfile必须以FROM指令开头。
    • RUN
      • RUN <command> (shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows)
      • RUN ["executable", "param1", "param2"] (exec form)
      • RUN指令将在当前映像顶部的新层中执行任何命令,并提交结果。生成的提交映像将用于Dockerfile中的下一步。
      • 在shell形式中,可以使用\(反斜杠)将一条RUN指令继续到下一行
    • CMD
      • CMD ["executable","param1","param2"] (exec form, this is the preferred form)
      • CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
      • CMD command param1 param2 (shell form)
      • Dockerfile中只能有一条CMD指令。如果您列出多个CMD,则只有最后一个CMD才会生效。
    • EXPOSE <port> [<port>/<protocol>...]: EXPOSE指令通知Docker运行时容器在指定的网络端口上进行侦听。您可以指定端口是侦听TCP还是UDP,如果未指定协议,则默认值为TCP。
    • ENV <key> <value>: ENV指令将环境变量设置为值。此值将在构建阶段中所有后续指令的环境中使用,并且在许多情况下也可以内联替换。
    • ADD
      • ADD [--chown=<user>:<group>] <src>... <dest>
      • ADD [--chown=<user>:<group>] ["<src>",... "<dest>"] (路径上有空格必须使用这种方式)
      • ADD指令从<src>复制新文件,目录或远程文件URL,并将它们添加到映像的文件系统中的路径<dest>
      • 源文件解释:
      • ADD hom* /mydir/ adds all files starting with “hom”
      • ADD hom?.txt /mydir/ ? is replaced with any single character, e.g., “home.txt”
      • 目标文件解释:
      • ADD test relativeDir/ adds “test” to WORKDIR/relativeDir/
      • ADD test /absoluteDir/ adds “test” to /absoluteDir/
    • COPY只能是本地文件
    • ENTRYPOINT启动容器会执行
  3. 示例(Dockerfile)

FROM openjdk:11

WORKDIR /book

COPY ./book-service-0.0.1-SNAPSHOT.jar /book/book.jar

EXPOSE 9700

ENTRYPOINT ["java", "-jar", "book.jar", "--spring.profiles.active=release"]

docekr compose

功能列表

Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务

光听很懵逼,实际体验一下

需要一个.yml的配置文件(docker-compose.yml),我这里用docker-compose同时部署java服务MongoDB作为演示

version: '3.5'

services:
  mongo:
    image: mongo
    container_name: book-mongo
    ports:
      - 27010:27017
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: password
    volumes:
      - /docker-data/mongodb/:/data/db/
    networks:
      - kazma_net
    restart: always
  blog:
    build:
      context: ./
      dockerfile: Dockerfile
    container_name: book-service
    volumes:
      - ~/book-service-logs:/book-service-logs
    ports:
      - 9700:9700
    networks:
      - kazma_net
    restart: always
    depends_on:
      - mongo

networks:
  kazma_net:
    name: kazma_network

然后执行

docker-compose -f docker-compose.yml up -d

将会自动构建Dockerfile并且创建好MongoDB的环境

  1. 关于上面的指令

    • version: 表示使用的docker-compose的版本,版本不同有一些命令不一样
    • services: 下面就是所有的docker container了
    • mongoblog是自定义的名字,用于区分不同的配置,这里分别是配置MongoDBjava服务
    • imagebuild: image表示使用docekr shop里的镜像,而build则使用指定的Dockerfile构建的镜像
    • container_name: 可以指定容器的名称
    • ports: 暴露出去端口并且映射到本地,是数组,可以有多个
    • volumes: 绑定挂载卷,用于容器卷和本地卷绑定,其实和docekr run-v一样,然后这个也是数组
    • environment: 环境变量,也是数组
    • networks: 新建一个网段或者使用,我在最后新建了叫kazma_net的网络,然后在前面指定使用
    • restart: 是否重启always
    • depends_on: 依赖某些容器,等某些容器先启动后再启动这个容器,我这里很明显java服务依赖mongo的服务
  2. 其他

    docker-compose stop
    docker-compose restart
    ocker-compose down -v
    
  3. .env

    docker-compose.yml处于同级目录,是docker-compose的环境配置,可以在docker-compose.yml中使用${xxx}来引用

    • 语法:
      1. VAR=VAL格式
      2. #号开头将会被忽略
      3. 空行会被忽略
      4. 如果是VAR=“VAL”,那么"也是字符串,不会被处理