updated_at: 2025-06-23 01:54

php-fpm, mariadb, nginx and laravel 하기 3

이전 장에서 만든것에 대해 최적화에 대해서 조금 설명드리겠습니다.
이전 장에서는 테스트용으로 pod.yaml을 만들었지만 실제 서비스에서는 Deployment 를 사용합니다.
따라서 먼저 만들어 둔 pod.yaml을 파일을 아래의 deployment.yaml 파일로 대처하겠습니다.
또한 emptyDir 대신 pvc를 이용한 영구적인 스토리지를 만들어 서비스에 안정성을 주었습니다.

  • deployment.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: shared-files-pvc
spec:
  accessModes:
    - ReadWriteMany  # 여러 Pod에서 동시에 읽고 쓸 수 있게
  resources:
    requests:
      storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-phpfpm-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-phpfpm
  template:
    metadata:
      labels:
        app: nginx-phpfpm
    spec:
      volumes:
        - name: shared-files
          # emptyDir: {} : 이렇게 하면 파드가 삭제될때 함께 삭제됨
          persistentVolumeClaim: # 따라서  pvc를 이용하여 처리함
            claimName: shared-files-pvc

        - name: nginx-config-volume
          configMap:
            name: nginx-config

      containers:
        - name: phpfpm82
          image: php-8-2-fpm:1.0.0
          imagePullPolicy: Never
          volumeMounts:
            - name: shared-files
              mountPath: /usr/share/nginx/html

        - name: nginx
          image: nginx:1.27.5
          volumeMounts:
            - name: shared-files
              mountPath: /usr/share/nginx/html
            - name: nginx-config-volume
              mountPath: /etc/nginx/conf.d

sftp 및 ssh 접속 추가

아래와 같이 하면 user 에 대한 모든 것을 처리할 수 있습니다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: shared-files-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
  name: sftp-ssh-service
spec:
  selector:
    app: nginx-phpfpm
  type: NodePort
  ports:
    - name: sftp
      protocol: TCP
      port: 22
      targetPort: 22
      nodePort: 30222
    - name: ssh
      protocol: TCP
      port: 2222
      targetPort: 2222
      nodePort: 30223
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-phpfpm-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-phpfpm
  template:
    metadata:
      labels:
        app: nginx-phpfpm
    spec:
      volumes:
        - name: shared-files
          persistentVolumeClaim:
            claimName: shared-files-pvc
        - name: nginx-config-volume
          configMap:
            name: nginx-config

      initContainers:
        - name: init-symlink
          image: busybox
          command: ['sh', '-c', 'rm -rf /home/user && ln -s /usr/share/nginx/html /home/user']
          volumeMounts:
            - name: shared-files
              mountPath: /usr/share/nginx/html

      containers:
        - name: phpfpm82
          image: php-8-2-fpm:1.0.0
          imagePullPolicy: Never
          volumeMounts:
            - name: shared-files
              mountPath: /usr/share/nginx/html

        - name: nginx
          image: nginx:1.27.5
          volumeMounts:
            - name: shared-files
              mountPath: /usr/share/nginx/html
            - name: nginx-config-volume
              mountPath: /etc/nginx/conf.d

        - name: sftp
          image: atmoz/sftp:latest
          ports:
            - containerPort: 22
              name: sftp
          volumeMounts:
            - name: shared-files
              mountPath: /usr/share/nginx/html
            - name: shared-files
              mountPath: /home/user
          args: ["user:password:1001"]

        - name: ssh
          image: linuxserver/openssh-server
          env:
            - name: PUID
              value: "1001"
            - name: PGID
              value: "1001"
            - name: TZ
              value: "Asia/Seoul"
            - name: PASSWORD_ACCESS
              value: "true"
            - name: USER_PASSWORD
              value: "password"
            - name: USER_NAME
              value: "user"
          ports:
            - containerPort: 2222
              name: ssh
          volumeMounts:
            - name: shared-files
              mountPath: /usr/share/nginx/html

multiple user에 대한 sftp 및 ssh 접속

위와 같은 방식(linuxserver/openssh-server) 에서는 하면의 user 만 ssh 로 접근 가능합니다.
만약 웹호스팅 서비스를 계획중이거나 다양한 user에대한 권한 등을 제어하고 싶다면 Docker 파일을 만들어 사용하는 방식입니다.

  • Dockerfile
FROM ubuntu:22.04

RUN apt update && \
    apt install -y openssh-server && \
    mkdir /var/run/sshd

RUN useradd -m -u 1001 user1 && echo "user1:password1" | chpasswd && \
    useradd -m -u 1002 pondol && echo "pondol:password2" | chpasswd

RUN echo "Port 2222" >> /etc/ssh/sshd_config && \
    echo "AllowUsers user1 pondol" >> /etc/ssh/sshd_config && \
    echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config && \
    echo "PermitRootLogin no" >> /etc/ssh/sshd_config

EXPOSE 2222
CMD ["/usr/sbin/sshd", "-D"]
docker build -t ssh-multiuser .
평점을 남겨주세요
평점 : 2.5
총 투표수 : 1

질문 및 답글