Docker Containerization/zh CN

From Lazarus wiki
Jump to navigationJump to search

Docker 容器化

Docker

Docker 容器镜像是个轻量级、独立且可执行的软件包,应用程序运行所需的一切均包含其中:代码、运行时环境、系统工具、系统库和配置参数。在运行时,容器镜像会转换为容器。容器将软件与环境隔离开来,确保在不同环境下(例如开发环境和预生产环境)运行的一致性。

Docker 容器可在 Windows、Linux、macOS 和 Amazon Web Services、Microsoft Azure 之类的云服务中运行。

以 Unix 守护进程或 Windows 服务这些传统形式运行的应用,如 Web 服务和数据库,正越来越多以容器化的形式运行。

Alpine Linux

Alpine Linux 是一种注重安全、轻量级的 Linux。基于 Alpine Linux 的最小 Docker 容器镜像只有 5MB 大小。

fcl-web 示例 - HelloHeaders

以下例程能响应 web 请求,回送请求信息。

program HelloHeadersPure;
 
{$mode objfpc}{$H+}
 
uses
  cthreads, httpdefs, httproute, webutil,
  fphttpapp;
 
procedure doEchoRequest(aReq: TRequest; aResp: TResponse);
begin
  DumpRequest(aReq, aResp.contents, true);
end;
 
begin
  HTTPRouter.registerRoute('*', @doEchoRequest);
  Application.Port:=8080;
  Application.Threaded:=True;
  Application.Initialize;
  Application.Run;
end.

Docker 化 HelloHeaders

下面在 Ubuntu 下编译此例程。可执行文件命名为 helloheaders。用以下 Dockerfile 为 helloheaders 创建 Docker 镜像。

Dockerfile

 # Start with the Alpine 3.12 Docker image.
 FROM alpine:3.12

 # Install libc6-compat, required for executables generated by FPC.
 RUN apk --no-cache --update add libc6-compat

 # Set working directory in the container image.
 WORKDIR /app

 # Copy the executable from host into container image.
 COPY helloheaders /app/helloheaders

 # Add uid/gid to run the binary. Don't want to run as root.
 RUN addgroup -g 1099 apprunner \
   && adduser -D -u 1099 -G apprunner -h /home/apprunner apprunner

 # Set uid/gid for the running program.
 USER apprunner:apprunner

 # Make the TCP port 8080 available to outside the container.
 EXPOSE 8080

 # Run the program.
 CMD ["/app/helloheaders"]

Build Docker Image

% sudo docker build -t helloheaders:fpc .
Sending build context to Docker daemon  1.331MB
Step 1/8 : FROM alpine:3.12
 ---> a24bb4013296
Step 2/8 : RUN apk --no-cache --update add libc6-compat
 ---> Using cache
 ---> 8bd9ae66e9fe
Step 3/8 : WORKDIR /app
 ---> Using cache
 ---> 1c69cb1c14e3
Step 4/8 : COPY helloheaders /app/helloheaders
 ---> de5ffddf76bb
Step 5/8 : RUN addgroup -g 1099 apprunner   && adduser -D -u 1099 -G apprunner -h /home/apprunner apprunner
 ---> Running in 54199f0a8f4f
Removing intermediate container 54199f0a8f4f
 ---> c7d18145bc02
Step 6/8 : USER apprunner:apprunner
 ---> Running in 0a544c5fc8f6
Removing intermediate container 0a544c5fc8f6
 ---> a3868d1f2033
Step 7/8 : EXPOSE 8080
 ---> Running in 829a1b804c0d
Removing intermediate container 829a1b804c0d
 ---> 7389810c7acf
Step 8/8 : CMD ["/app/helloheaders"]
 ---> Running in 882e002e08b0
Removing intermediate container 882e002e08b0
 ---> 399269970984
Successfully built 399269970984
Successfully tagged helloheaders:fpc

查看 Docker 镜像的大小

% sudo docker images
REPOSITORY                TAG               IMAGE ID            CREATED             SIZE
helloheaders              fpc               399269970984        2 minutes ago       7.51MB

运行容器

%  sudo docker run --rm -p 8080:8080 helloheaders:fpc

然后即可用浏览器访问 http://127.0.0.1:8080/

参见