为什么要把应用服务容器化?因为每次在一个新机器上搭应用服务(比如API服务)时,都需要把所有相关应用的编译、安装、配置过程重新来一遍,比如nginx
、php
、Laravel
等。如果把所有相关应用封装到一个docker镜像里,并提交到DockerHub,那么在任何新机器上只需拉取docker镜像直接运行即可,达到 “一次封装,到处运行” 的目的。
根据官网文档,在你第一次安装Docker CE
(Community Edition,社区版),设置Docker的yum源。
1、安装yum-utils
提供yum-config-manager
工具,安装device-mapper-persistent-data
和lvm2
提供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
命令查看是否有镜像在运行了。
创建镜像的方法主要有三种:①基于已有镜像的容器创建、②基于本地模板导入、③基于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服务》,主要包括nginx
、php
、laravel
三个部分。
在搭建完成API服务以后,另外再安装supervisor
服务,用于在启动容器的同时拉起nginx
和php
进程。
$ 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
即可: