Dockerfile

2023-11-30 16:26:38 浏览数 (2)

简介

代码语言:shell复制
FROM golang:latest

WORKDIR $GOPATH/src/github.com/xx/yy
COPY . $GOPATH/src/github.com//xx/yy
RUN go build .

EXPOSE 8000
ENTRYPOINT ["./yy"]
CMD [ "./crawler","worker" ]

golang:latest 镜像为基础镜像,将工作目录设置为 $GOPATH/src/go-gin-example,并将当前上下文目录的内容复制到 $GOPATH/src/go-gin-example 中

在进行 go build 编译完毕后,将容器启动程序设置为 ./go-gin-example,也就是我们所编译的可执行文件

注意 go-gin-exampledocker 容器里编译,并没有在宿主机现场编译

Dockerfile 文件是用于定义 Docker 镜像生成流程的配置文件,文件内容是一条条指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建;这些指令应用于基础镜像并最终创建一个新的镜像

  1. FROM
    • 指定基础镜像(必须有的指令,并且必须是第一条指令)
  2. WORKDIR

格式为 WORKDIR <工作目录路径>

使用 WORKDIR 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,        如果目录不存在,WORKDIR z会帮你建立目录

  1. COPY

COPY <源路径>... <目标路径>

COPY "<源路径1>",... "<目标路径>"

  1. RUN

用于执行命令行命令

格式:RUN <命令>

RUN 通常会是 Dockerfile 里最复杂的指令,会包含很多的 Shell 命令,但 Dockerfile 里一条指令只能是一行,所以有的 RUN 指令会在每行的末尾使用续行符 ,命令之间也会用 && 来连接,这样保证在逻辑上是一行,就像下面这样:

代码语言:shell复制
RUN apt-get update 
    && apt-get install -y 
        build-essential 
        curl 
        make 
        unzip 
    && cd /tmp 
    && curl -fSL xxx.tar.gz -o xxx.tar.gz
    && tar xzf xxx.tar.gz 
    && cd xxx 
    && ./config 
    && make 
    && make clean

把这些 Shell 命令集中到一个脚本文件里,用 COPY 命令拷贝进去再用 RUN 来执行:

代码语言:shell复制
COPY setup.sh  /tmp/                # 拷贝脚本到/tmp目录

RUN cd /tmp && chmod  x setup.sh   # 添加执行权限
    && ./setup.sh && rm setup.sh    # 运行脚本然后再删除
  1. MAINTAINER
  2. EXPOSE

对外的端口

CMD

声明了容器启动时运行的命令,在这里我们运行的是./crawler worker

https://hujb2000.gitbooks.io/docker-flow-evolution/content/cn/basis/dockerfiledetail.html

-p 8081:8080 是将容器的 8080 端口映射到主机的 8081 端口。

多阶段构建的 Dockerfile 文件。这里第一个阶段命名为 builder,它是应用程序的初始构建阶段。第二个阶段以 alpine:latest 作为基础镜像,去除了很多无用的依赖。我们利用 COPY --from=builder,只复制了第一阶段的二进制文件和配置文件。

代码语言:shell复制
FROM golang:1.18-alpine as builder
LABEL maintainer="zhuimengshaonian04@gmail.com"
WORKDIR /app
COPY . /app
RUN go mod download
RUN go build -o crawler main.go

FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/crawler ./
COPY --from=builder /app/config.toml ./
CMD ["./crawler","worker"]

docker-compose

代码语言:shell复制
version: "3"
services:
  mysql:
    image: mysql:5.7
    ports:
      - 3306:3306
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
      - --skip-character-set-client-handshake
      - --default-time-zone=SYSTEM
      - --log-timestamps=SYSTEM
      - --max-connections=10240
    environment:
      MYSQL_ROOT_PASSWORD: 1234567890///
      TZ: Asia/Shanghai
    volumes:
      - ./sql:/docker-entrypoint-initdb.d
    restart: always

  redis:
    image: redis:alpine
    ports:
      - 6379:6379
    environment:
      - TZ=Asia/Shanghai

  nsqlookupd:
    image: nsqio/nsq
    command: /nsqlookupd
    ports:
      - 4160:4160
      - 4161:4161
  nsqd:
    image: nsqio/nsq
    command: /nsqd --lookupd-tcp-address=nsqlookupd:4160
    depends_on:
      - nsqlookupd
    ports:
      - 4150:4150
      - 4151:4151

  nsqadmin:
    image: nsqio/nsq
    command: /nsqadmin --lookupd-http-address=nsqlookupd:4161
    depends_on:
      - nsqlookupd
    ports:
      - 4171:4171
代码语言:shell复制
version: "3.9"
services:
  worker:
    build: .
    command: ./crawler worker
    ports:
      - "8080:8080"
    networks:
      - counter-net
    volumes:
      - /tmp/app:/app
    depends_on:
      mysql:
          condition: service_healthy
  mysql:
    image: mysql:5.7
    #    restart: always
    environment:
      MYSQL_DATABASE: 'crawler'
      MYSQL_USER: 'myuser'
      MYSQL_PASSWORD: 'mypassword'
      # Password for root access
      MYSQL_ROOT_PASSWORD: '123456'
      #      docker-compose默认时区UTC
      TZ: 'Asia/Shanghai'
    ports:
      - '3326:3306'
    expose:
      # Opens port 3306 on the container
      - '3306'
      # Where our data will be persisted
    volumes:
      -  /tmp/data:/var/lib/mysql
    networks:
      counter-net:
    healthcheck:
      test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
      interval: 5s
      timeout: 5s
      retries: 55
networks:
  counter-net:
  • version
    • 指令是 Compose 配置文件中必须要有的,它始终位于文件的第一行。version 定义了 Compose 文件格式的版本,我们这里使用的是最新的 3.9 版本。注意,version 并未定义 Docker Compose 和 Docker 的版本。
  • services
    • services 指令用于定义应用程序需要部署的不同服务。这个例子中定义了两个服务,一个是我们爬虫项目的 Worker,另一个是 Worker 依赖的 MySQL 数据库。networksnetworks 的作用是告诉 Docker 创建一个新网络。默认情况下,Compose 将创建桥接网络。但是,你可以使用 driver 属性来指定不同的网络类型。
  • networks
    • networks 的作用是告诉 Docker 创建一个新网络。默认情况下,Compose 将创建桥接网络。但是,你可以使用 driver 属性来指定不同的网络类型。

在对 Worker 服务的配置中,各个配置的含义如下所示。

  • build 用于构建镜像,其中 build: . 告诉 Docker 使用当前目录中的 Dockerfile 构建一个新镜像,新构建的镜像将用于创建容器。
  • command,它是容器启动后运行的应用程序命令,该命令可以覆盖 Dockerfile 中设置的 CMD 指令。
  • ports,表示端口映射。在这里, "SRC:DST" 表示将宿主机的 SRC 端口映射到容器中的 DST 端口,访问宿主机 SRC 端口的请求将会被转发到容器对应的 DST 端口中。
  • networks,它可以告诉 Docker 要将服务的容器附加到哪个网络中。
  • volumes,它可以告诉 Docker 要将宿主机的目录挂载到容器内的哪个目录。
  • depends_on,表示启动服务前需要首先启动的依赖服务。在本例中,启动 Worker 容器前必须先确保 MySQL 可正常提供服务。

而在对 MySQL 服务的定义中,各个配置的含义如下所示。

  • image,用于指定当前容器启动的镜像版本,当前版本为 mysql:5.7。如果在本地查找不到镜像,就从 Docker Hub 中拉取。
  • environment,它可以设置容器的环境变量。环境变量可用于指定当前 MySQL 容器的时区,并配置初始数据库名,根用户的密码等。
  • expose,描述性信息,表明当前容器暴露的端口号。
  • networks,用于指定容器的命名空间。MySQL 服务的 networks 应设置为和 Worker 服务相同的 counter-net,这样两个容器共用同一个网络命名空间,可以使用回环地址进行通信。
  • healthcheck,用于检测服务的健康状况,在这里它和 depends_on 配合在一起可以确保 MySQL 服务状态健康后再启动 Worker 服务。

要使用 Docker Compose 启动应用程序,可以使用 docker-compose up 指令,它是启动 Compose 应用程序最常见的方式。docker-compose up 指令可以构建或拉取所有需要的镜像,创建所有需要的网络和存储卷,并启动所有的容器。

默认情况下,docker-compose up 将查找名称为 docker-compose.yml 的配置文件,如果有自定义的配置文件,需要使用 -f 标志指定它。另外,使用 -d 标志可以在后台启动应用程序。

Compose 生命周期管理

如果想要关闭应用程序,可以执行 docker-compose down

当应用程序启动后,使用 docker-compose ps 命令可以查看当前应用程序的状态。

要注意的是,docker-compose up 构建或拉取的任何镜像都不会被删除,它们仍然存在于系统中,这意味着下次启动应用程序时会更快。同时我们还可以看到,当前挂载到宿主机的存储目录并不会随着 docker-compose down 而销毁。

同样,使用 docker-compose stop 命令可以让应用程序暂停,但不会删除它。再次执行 docker-compose ps,可以看到应用程序的状态为 exited。

因为 docker-compose stop 而暂停的容器,之后再执行 docker-compose restart 就可以重新启动。

代码语言:shell复制
version: "3.9"
services:
  worker:
    build: .
    command: ./crawler worker --id=2 --http=:8080  --grpc=:9090
    ports:
      - "8080:8080"
      - "9090:9090"
    networks:
      - counter-net
    volumes:
      - /tmp/app:/app
    depends_on:
      mysql:
          condition: service_healthy
      etcd:
        condition: service_healthy
  master:
    build: .
    command: ./crawler master --id=3 --http=:8082  --grpc=:9092
    ports:
      - "8082:8082"
      - "9092:9092"
    networks:
      - counter-net
    volumes:
      - /tmp/app:/app
    depends_on:
      mysql:
        condition: service_healthy
      etcd:
        condition: service_healthy
  mysql:
    image: mysql:5.7
    #    restart: always
    environment:
      MYSQL_DATABASE: 'crawler'
      MYSQL_USER: 'myuser'
      MYSQL_PASSWORD: 'mypassword'
      # Password for root access
      MYSQL_ROOT_PASSWORD: '123456'
      #      docker-compose默认时区UTC
      TZ: 'Asia/Shanghai'
    ports:
      - '3326:3306'
    expose:
      # Opens port 3306 on the container
      - '3306'
      # Where our data will be persisted
    volumes:
      -  /tmp/data:/var/lib/mysql
    networks:
      counter-net:
    healthcheck:
      test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
      interval: 5s
      timeout: 5s
      retries: 55
  etcd:
    image: gcr.io/etcd-development/etcd:v3.5.6
    volumes:
      - /tmp/etcd:/etcd-data
    ports:
      - '2379:2379'
      - '2380:2380'
    expose:
      - 2379
      - 2380
    networks:
      counter-net:
    environment:
      - ETCDCTL_API=3
    command:
      - /usr/local/bin/etcd
      - --data-dir=/etcd-data
      - --name
      - etcd
      - --initial-advertise-peer-urls
      - http://0.0.0.0:2380
      - --listen-peer-urls
      - http://0.0.0.0:2380
      - --advertise-client-urls
      - http://0.0.0.0:2379
      - --listen-client-urls
      - http://0.0.0.0:2379
      - --initial-cluster
      - etcd=http://0.0.0.0:2380
      - --initial-cluster-state
      - new
      - --initial-cluster-token
      - tkn
    healthcheck:
      test: ["CMD", "/usr/local/bin/etcdctl" ,"get", "--prefix", "/"]
      interval: 5s
      timeout: 5s
      retries: 55

networks:
  counter-net:

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞