简介
代码语言: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-example
在 docker
容器里编译,并没有在宿主机现场编译
Dockerfile 文件是用于定义 Docker 镜像生成流程的配置文件,文件内容是一条条指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建;这些指令应用于基础镜像并最终创建一个新的镜像
- FROM
- 指定基础镜像(必须有的指令,并且必须是第一条指令)
- WORKDIR
格式为 WORKDIR
<工作目录路径>
使用 WORKDIR
指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录, 如果目录不存在,WORKDIR
z会帮你建立目录
- COPY
COPY <源路径>... <目标路径>
COPY "<源路径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 # 运行脚本然后再删除
- MAINTAINER
- 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腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!