制作一个API服务的docker镜像(Nginx+PHP+Laravel)

为什么要把应用服务容器化?因为每次在一个新机器上搭应用服务(比如API服务)时,都需要把所有相关应用的编译、安装、配置过程重新来一遍,比如nginxphpLaravel等。如果把所有相关应用封装到一个docker镜像里,并提交到DockerHub,那么在任何新机器上只需拉取docker镜像直接运行即可,达到 “一次封装,到处运行” 的目的。

一、Docker安装

根据官网文档,在你第一次安装Docker CE(Community Edition,社区版),设置Docker的yum源。

1、安装yum-utils提供yum-config-manager工具,安装device-mapper-persistent-datalvm2提供device mapper存储驱动

$ sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

2、添加Docker的yum源

$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

3、安装Docker CE

$ sudo yum install docker-ce

4、启动Docker daemon进程

$ sudo systemctl start docker

# 查看进程
$ ps aux | grep docker | grep -v grep
root     16212  0.1  5.4 399528 54960 ?        Ssl  14:47   0:00 /usr/bin/dockerd -H unix://
root     16216  0.0  3.2 392232 32804 ?        Ssl  14:47   0:00 containerd --config /var/run/docker/containerd/containerd.toml --log-level info

5、这时你就可以使用docker ps命令查看是否有镜像在运行了。

二、制作Docker镜像

创建镜像的方法主要有三种:①基于已有镜像的容器创建、②基于本地模板导入、③基于Dockerfile创建。

这里主要结合第①种与第③种方法来制作一个API服务的Docker镜像。

1、获取一个CentOS镜像作为基础镜像

$ docker pull centos

2、创建并启动容器

从centos镜像创建一个容器,并指定容器名称--name和网络连接类型--net

$ docker create --net host --name api_server -it centos:latest

查看已创建的容器:

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
ed5068c10567        centos:latest       "/bin/bash"              2 minutes ago       Created                                 api_server

启动容器:

$ docker start api_server

查看已启动的容器:

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
ed5068c10567        centos:latest       "/bin/bash"         3 minutes ago       Up 22 seconds                           api_server

进入容器:

$ docker exec -it api_server bash

3、进入容器搭建API服务

根据文章《搭建Laravel API服务》,主要包括nginxphplaravel三个部分。

在搭建完成API服务以后,另外再安装supervisor服务,用于在启动容器的同时拉起nginxphp进程。

$ yum install -y python-setuptools
$ easy_install supervisor

创建一个/etc/supervisord.conf,内容如下:

[supervisord]
nodaemon=true
[program:nginx]
command=/usr/local/services/nginx/sbin/nginx -g 'daemon off;'
[program:php-fpm]
command=/usr/local/services/php7/sbin/php-fpm -c /usr/local/services/php7/lib/php.ini -y /usr/local/services/php7/etc/php-fpm.conf

由于supervisor不能监控后台程序,如果进程为daemon进程会一直执行启动命令,所以:

  • 命令/../sbin/nginx加上-g 'daemon off;'参数在前台运行。
  • 对于php-fpm进程在php-fpm.conf配置文件中修改配置项daemonize = no即可。

4、从容器创建一个新的镜像

$ docker commit -m "api server image" -a "songlee" api_server apiserver:v1
sha256:b56f7ea6a554c4a05c781b702fce7086a720d878bb5aa1886c9d647beb7c9526

查看本地镜像列表:

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
apiserver           v1                  b56f7ea6a554        2 minutes ago       803MB
centos              latest              1e1148e4cc2c        9 days ago          202MB

5、使用Dockerfile配置镜像运行

编写Dockerfile文件,内容如下:

FROM apiserver:v1
EXPOSE 80 443
CMD ["/usr/bin/supervisord"]

基于apiserver:v1创建镜像:

$ docker build -t songlee24/apiserver:v1 .

Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM apiserver:v1
 ---> 4560436b794b
Step 2/3 : EXPOSE 80 443
 ---> Running in a711a5325f76
Removing intermediate container a711a5325f76
 ---> 6ff88afb491d
Step 3/3 : CMD ["/usr/bin/supervisord"]
 ---> Running in 9a7614ae1669
Removing intermediate container 9a7614ae1669
 ---> 20a38990e223
Successfully built 20a38990e223
Successfully tagged songlee24/apiserver:v1

6、提交到DockerHub

先登录:

$ docker login

Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: songlee24
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

然后push镜像(/前面应该对应DockerHub用户名,如果不是则先使用docker tag打标签):

$ docker push songlee24/apiserver

三、测试

在一台新机器上安装docker,然后拉docker镜像:

$ docker login
$ docker pull songlee24/apiserver:v1

直接创建并运行容器(-p 80:80完成端口映射):

docker run --name api_server -p 80:80 -d songlee24/apiserver:v1

然后直接在浏览器输入http://api.demo.com/test即可:

在这里插入图片描述

你可能感兴趣的:(微服务,-,Docker)