28

【docker】构建ssh+nginx+fpm镜像并通过supervisor实现开机自启动

 4 years ago
source link: https://segmentfault.com/a/1190000022755961
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

写在前面

docker 容器编排可能更合适的是 Docker Compose 和 Kubernetes。日常开发,往往也不想要这么复杂,就丢一个容器里得了。

创建镜像

创建镜像有两种方式

1.从已经创建的容器中更新镜像

2.使用 Dockerfile 指令来创建一个新的镜像

这里我们选用第一种方式,并选用 centos7 官方镜像作为初始镜像。

拉取初始镜像(Centos7)

docker pull centos:7

启动容器

docker run -itd centos:7 /bin/bash
  • -i 表示交互示操作
  • -t 表示打开一个终端
  • -d 后台运行
  • centos:7 是我们镜像名称
  • /bin/bash 指定一个交互窗口,启动容器一个要有一个窗口,否则容器会自动关闭

进入容器

docker exec -it ab3d851192b2 /bin/bash
  • ab3d851192b2 是我们刚才启动的 CONTAINER ID

开始安装软件

安装软件之前我们先更新一下系统

yum update -y

安装一些常用的工具,下面用的着

yum -y install wget bzip2 gcc gcc-c++  pcre pcre-devel zlib zlib-devel openssl openssl-devel libxml2 libxml2-devel curl curl-devel

安装 ssh (服务端和客户端)

yum -y install passwd openssh-server openssh-clients

修改配置文件

vi /etc/ssh/sshd_config

找到 PermitRootLogin yes 把前面的注释符号 # 去掉,允许 root 用户登录,因为是日常开发用,就用root吧,可以省很多事

为 root 用户设置一个密码

passwd root

测试一下服务能不能正常启动

/usr/sbin/sshd -D

哦,报错了

Could not load host key: /etc/ssh/ssh_host_rsa_key

Could not load host key: /etc/ssh/ssh_host_ecdsa_key

Could not load host key: /etc/ssh/ssh_host_ed25519_key

sshd: no hostkeys available -- exiting.

提示缺少可用的 hotskeys,没关系,创建它们

ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key

再试下,就可以了

安装 nginx

创建一个程序用户

useradd nginx

我们用源码安装的方式,下载源码

cd /usr/local/src
wget  http://nginx.org/download/nginx-1.18.0.tar.gz

tar -xvf nginx-1.18.0.tar.gz

cd nginx-1.18.0

./configure --prefix=/usr/local/nginx --with-http_ssl_module 

make && make install

修改环境变量

echo 'export PATH=/usr/local/nginx/sbin:$PATH' >> /etc/profile 

source /etc/profile

修改 nginx 配置

cd /usr/local/nginx/conf

mkdir conf.d​ # 创建这个目录,用来放我们的配置文件

vi nginx.conf

修改如下三处

6bQZRbr.png!web

user nginx;
daemon off;
include /usr/local/nginx/conf/conf.d/*.conf;

安装 php

cd /usr/local/src
wget https://www.php.net/distributions/php-7.3.18.tar.bz2

tar -xvf php-7.3.18.tar.bz2

cd php-7.3.18

./configure --prefix=/usr/local/php --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --enable-inline-optimization --enable-shared --enable-soap --enabbe-opcache --enable-pdo --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-libzip --with-zlib --with-openssl --with-curl --enable-mbstring

make && make install

修改环境变量

echo 'export PATH=/usr/local/php/bin:$PATH' >> /etc/profile 

source /etc/profile

修改 php 配置

cd /usr/local/php/etc
cp php-fpm.conf.default cp php-fpm.conf
vi php-fpm.conf

# 找到下面这行,把前面的注释打开
pid = run/php-fpm.pid

cd /usr/local/php/etc/php-fpm.d/
cp www.conf.default www.conf

安装 supervisor

直接用 yum 安装的方式

yum install -y epel-release
yum install -y supervisor

修改配置文件

vi /etc/supervisord.conf

# 如下几行注释打开,这了是为了作 web 的方式管理 supervisor,修改port为 port=0.0.0.0:9001 ,username 和 password 修改为你自己的
[inet_http_server]         ; inet (TCP) server disabled by default
port=0.0.0.0:9001        ; (ip_address:port specifier, *:port for all iface)
username=user              ; (default is no username (open server))
password=123               ; (default is no password (open server))

# 找到 nodaemon ,改为 true (因为 docker 本身就是个服务,里面不允许再说其他常驻服务,所有的应用同理)
nodaemon=true

配置 sshd 启动服务

cd /etc/supervisord.d/

vi sshd.ini

# 填加如下内容,保存就好
[program:sshd]
command=/usr/sbin/sshd -D

配置nginx + fpm 启动服务

vi webserver.ini

# 填加如下内容,保存
[program:nginx]
command=/usr/local/nginx/sbin/nginx
stopsignal=QUIT

[program:php-fpm]
command=/usr/local/php/sbin/php-fpm  --nodaemonize
stopsignal=QUIT

提交镜像

到这里我们镜像就更新完全了,我们把这个容器作为镜像保存

docker commit -m="nginx+fpm" -a="actors315" ab3d851192b2 actors315/webdev:v1
  • -m 提交的描述信息
  • -a 作者
  • ab3d851192b2 我们的 CONTAINER ID
  • actors315/nginx-fpm:v1 镜像名称
docker images

会发现我们的镜像已经建好了

使用镜像

docker run --name lingyin-dev -p 9001:9001 -p 2222:22 -p 80:80 -p 443:443 -v F:\www:/data/www -itd actors315/webdev:v1 /usr/bin/supervisord
  • --name 指定容器名称
  • -p 本机和容器端口映射,可以有多个
  • -v 挂载目录,可以有多个

查看一下效果

docker exec -it /bin/bash
ps -ef|grep sshd
ps -ef|grep nginx
ps -ef|grep php-fpm

浏览器访问 http://127.0.0.1 :9001/ 也可以看到服务都正常启动了

访问 http://127.0.0.1/ 熟悉的 nginx 欢迎页面。

到这里就大功告成了。

如果你想共享镜像,也可以提交到公共仓库

docker push actors315/webdev:v1

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK