docker image에 ssh 서비스 추가 (멀티 서비스 띄우기)

docker 컨테이너는 마지막 CMD 혹은 ENTRYPOINT 명령 하나로 컨테이너를 시작한다.
즉, 아래와 같이 docker file을 생성해도 ssh와 httpd가 모두 실행되지 않는다는 이야기이다.

...전략...
# ssh 시작
CMD ["/usr/sbin/sshd", "-D"]
# httpd 시작
CMD ["/usr/local/apache2/bin/httpd", "-DFOREGROUND"]

하지만 편의상 컨테이너에 ssh로 접속하고, 이를 통해 컨테이너 내부 상황을 확인하거나 하고 싶다면 ssh를 추가해줘야 한다.
이를 위해 실행할 서비스만큼 스크립트를 생성하고 wrapper 스크립트를 만들어서 이들을 실행해줘야 한다. 아래 스크립트와 dockerfile을 참고해서 이미지를 만들면 된다.

## ssh를 실행하기 위한 스크립트 
## ssh_start.sh
#!/bin/bash
/usr/sbin/sshd -D

## apache를 실행하기 위한 스크립트
## httpd_start.sh
#!/bin/bash
/usr/local/apache2/bin/httpd -DFOREGROUND

## wrapper script
## wrapper.sh
#!/bin/bash
set -m
/ssh_start.sh &
/httpd_start.sh &
fg %1
## dockerfile 예시
## httpd 이미지에 ssh를 추가하여 연결하고 싶은 경우에 대한 예시
# base가 될 이미지
FROM httpd

#아래 작업들을 수행할 계정 (apt 등은 root 권한이 필요하다)
USER root

ENV DEBIAN_FRONTEND=noninteractive \
    TZ=Asia/Seoul

# ssh server 설치
### Ubuntu
RUN apt-get update                                            &&\
    apt-get install -y openssh-server                         &&\
    apt-get install -y curl vi vim tcpdump net-tools          &&\  #필요한 경우 설치한다.
    apt-get clean                                             &&\
    rm -rf /var/lib/apt/lists/*    /tmp/*    /var/tmp/*

RUN mkdir /var/run/sshd
RUN echo 'root:password' | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config
RUN sed -i 's/#X11Forwarding no/X11Forwarding yes/' /etc/ssh/sshd_config
RUN echo "export VISIBLE=now" >> /etc/profile


# 사용자 추가
RUN useradd haedong -G sudo -m -d /home/haedong -s /bin/bash
RUN echo 'haedong:password'| chpasswd
RUN echo alias "ls='ls --color=auto'" >> ~/.bash_profile
RUN echo alias "ll='ls -lha" >> ~/.bash_profile

RUN mkdir /var/run/sshd

# 외부로 연결할 포트
EXPOSE 22 80

# 서비스 시작을 위한 스크립트
RUN mkdir -p /root/scripts
COPY ssh_start.sh /root/scripts/ssh_start.sh
COPY httpd_start.sh /root/scripts/httpd_start.sh
COPY wrapper.sh /root/scripts/wrapper.sh

CMD /root/scripts/wrapper.sh

컨테이너 빌드 및 시작

# image build
docker build -t httpd:new .

# 컨테이너 시작
docker run -d -p 2222:20 -p 8888:80 httpd:new

Redmine : docker-compose.yaml

Redmine 이 무엇인지는 링크 참조.

docker-compose.yaml

version: '3.1'

services:

  redmine:
    container_name: redmine
    image: redmine
    restart: always
    ports:
      - 8080:3000
    environment:
      REDMINE_DB_MYSQL: db
      REDMINE_DB_PASSWORD: fpemakdls
      REDMINE_DB_DATABASE: redmine
      REDMINE_DB_ENCODING: utf8
      #REDMINE_NO_DB_MIGRATE: true
    volumes:
      - ./volumes/redmine/usr/src/redmine/files:/usr/src/redmine/files
      - ./volumes/redmine/usr/src/redmine/plugins:/usr/src/redmine/plugins
      - ./volumes/redmine/usr/src/redmine/public/themes:/usr/src/redmine/public/themes

  db:
    container_name: mariadb
    image: mariadb
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: fpemakdls
      MYSQL_DATABASE: redmine
    ports:
      - 3306:3306
    volumes:
      - ./volumes/mysql/var/lib/mysql:/var/lib/mysql
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci

디렉토리 생성

mkdir  -p  ./volumes/redmine/usr/src/redmine/files
mkdir      ./volumes/redmine/usr/src/redmine/plugins
mkdir  -p  ./volumes/redmine/usr/src/redmine/public/themes
mkdir  -p  ./volumes/mysql/var/lib/mysql

Nginx Proxy Manager : docker-compose.yaml

Nginx Proxy Manager가 무엇인지는 링크를 참조.

docker-compose.yaml

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    ports:
      - '80:80'                  # 일반 http 용 port
      - '81:81'                  # 관리 페이지 용 port
      - '443:443'                # https 서비스 용 port
    environment:
      DB_MYSQL_HOST: "db" 
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm" 
      DB_MYSQL_PASSWORD: "npm" 
      DB_MYSQL_NAME: "npm" 
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
  db:
    image: 'jc21/mariadb-aria:latest'
    environment:
      MYSQL_ROOT_PASSWORD: 'npm'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'npm'
    volumes:
      - ./data/mysql:/var/lib/mysql
#      - ./etc/my.cnf.d:/etc/my.cnf.d       mariadb(mysql을 사용할 때도 동일) 설정을 변경하고자 할 때 생성하고 설정 파일을 넣는다.

디렉토리 생성

docker-compose.yaml 파일이 존재하는 디렉토리에 아래와 같이 세 개의 디렉토리를 생성한다.


mkdir ./data
mkdir ./letsencrypt
mkdir -p ./data/mysql
mkdir -p ./etc/my.cnf.d

HAproxy 를 이용한 로드밸런싱 고가용성 구성

개요

HAProxy는 여러 서버에 대해 요청을 확산시키는 TCP 및 HTTP 기반 애플리케이션들을 위해 고가용성 로드밸런서와 리버스 프록시를 제공하는 자유-오픈 소스 소프트웨어이다. C 프로그래밍 언어로 개발되어 있으며 빠르고 효율적인 것으로 유명하다.
공식 사이트 참조

설정에 따라 Server #A와 #B로 번갈아가며 연결해준다.

haproxy를 통해 부하를 분산하는 등의 용도로 서비스 효율을 높일 수 있다.

설치

여기에서 다운 받아도 되며, yum epel-release에 포함되어 있으므로 epel-release 리포지터리 추가 후 yum 이나 dnf 명령 등을 통해 설치할 수 있다.

sudo dnf install -y haproxy
마지막 메타자료 만료확인 7:58:42 이전인: 2022년 07월 28일 (목) 오전 12시 23분 23 초.
종속성이 해결되었습니다.
================================================================================
 꾸러미          구조           버전                    레포지터리         크기
================================================================================
설치 중:
 haproxy         x86_64         1.8.27-4.el8            appstream         1.4 M

연결 요약
================================================================================
설치  1 꾸러미

총계 내려받기 크기: 1.4 M
설치된 크기 : 4.2 M
...중략...
설치되었습니다:
  haproxy-1.8.27-4.el8.x86_64                                                                                                                   
완료되었습니다!

서비스가 구동 될 모든 서버에 설치해준다.
자동으로 서비스가 구동될 수있도록 서비스를 등록 해준다.

sudo systemctl enable haproxy.service
 또는
sudo service haproxy start

설정

기본적으로 /etc/haproxy/haproxy.cfg 가 존재한다.

global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

#---------------------------------------------------------------------
# status web 설정
# haproxy 서비스 상태, 백엔드 서비스의 상태 등을 웹을 통해 확인할 수 있다.
# 필수는 아니다.
#---------------------------------------------------------------------
listen hastats
    mode http
    bind *:8088
    stats enable
    stats show-legends
    stats uri /hastat
# 서버 주소가 192.168.0.1이라면  http://192.168.0.1/hastat으로 접속한다.
    stats auth admin:admin
#  hastats 웹에 접속 시 인증으로 제한하려면 계정과 패스워드를 지정한다.

#---------------------------------------------------------------------
# 프론트 엔드 설정
# 프론트 엔드에서 설정한 포트로 연결이 들어올 경우 백엔드로 보낸다
#---------------------------------------------------------------------
# 외부에서 haproxy를 통해 연결을 시도할 때 사용하는 포트
frontend  kubeproxy
    bind *:16443
    default_backend kubeproxy
    mode tcp

#---------------------------------------------------------------------
# 백엔드 설정
# 프론트엔드에서  defaultbackend 타겟으로 설정 된 백엔드 정보
#---------------------------------------------------------------------
backend kubeproxy
    balance     roundrobin
# Balance Option
# Roundrobin : 순차적으로 분배
# static-rr : 서버에 부여된 가중치에 따라서 분배
# leastconn : 접속수가 가장 적은 서버로 분배
# source : 운영중인 서버의 가중치를 나눠서 접속자 IP 해싱(hashing)해서 분배
# uri : 접속하는 URI를 해싱해서 운영중인 서버의 가중치를 나눠서 분배 (URI의 길이 또는 depth로 해싱)
# url_param : HTTP GET 요청에 대해서 특정 패턴이 있는지 여부 확인 후 조건에 맞는 서버로 분배 (조건 없는 경우 round_robin으로 처리)
# hdr : HTTP 헤더에서 hdr(<name>)으로 지정된 조건이 있는 경우에 대해서만 분배 (조건없는 경우 round robin 으로 처리)
# rdp-cookie : TCP 요청에 대한 RDP 쿠키에 따른 분배
    mode tcp
    option tcp-check
    option tcplog
# 외부에서 16443 포트로 연결을 시도하면 아래의 서버에 순차적으로 연결해준다.
    server  storage01 192.168.0.1:6443 check
    server  storage02 192.168.0.2:6443 check
    server  storage03 192.168.0.3:6443 check

frontend web-console
        bind *:18080
        default_backend web-console
        mode tcp
backend web-console
        balance roundrobin
        mode    tcp
        option  tcp-check
        option  tcplog
        server  storage01       192.168.1.1:8080       check
        server  storage02       192.168.1.2:8080       check
        server  storage03       192.168.1.3:8080       check

백엔드로 동작할 모든 서버에 동일한 설정 파일을 넣어준다.

확인

haproxy 웹 서비스를 통해 정보 확인이 가능한다.

백엔드 서비스에 문제가있다면 붉은색으로 표시된다.

Keepalive를 이용한 linux 로드밸런싱 고가용성 구현

개요

keepalive 참조
keepalive는 Linux 시스템 혹은 Linux 기반 인프라에서의 로드밸런싱 및 고가용성을 위한 기능을 제공한다.
단순하게 설명하면, 두 개 이상의 Linux 시스템이 존재할 경우, virtual IP 를 생성하고 시스템의 상태에 따라 해당 virtual IP를 할당해주는 기능을 한다.

설치

# CentOS (Redhat 계열)
$ sudo isntall -y keepalived

# Ubuntu (Devian 계열)
$ sudo apt-get install -y keepalived

설정

/etc/keepalived/keepalived.conf 를 환경에 맞도록 수정한다.

Master server

! Configuration File for keepalived Master

global_defs {
   router_id rtr_0           # Master와 Backup 구분
}

vrrp_instance VI_0 {          # Master와 Backup과 구분
    state MASTER              # 또는 BACKUP
    interface eth0            # 노드에서 실제 사용할 인터페이스 지정
    virtual_router_id 10      # Master와 Backup 모두 같은 값으로 설정.
    priority 200              # 우선순위, 값이 높은 쪽인 Master가 된다.
    advert_int 1
    authentication {
        auth_type PASS        # Master와 Backup 모두 같은 값으로 설정.
        auth_pass P@ssW0rd    # Master와 Backup 모두 같은 값으로 설정.
    }

    virtual_ipaddress {
        192.168.0.100      # Master와 Backup 동일하게 설정한 VIP
    }
}
# #으로 시작하는 내용은 모두 삭제한다.

Backuo(slave)

! Configuration File for keepalived

global_defs {
   router_id rtr_1           
}

vrrp_instance VI_1 { 
    state BACKUP                    # MASTER가 아니므로 수정              
    interface eth0            
    virtual_router_id 10      
    priority 100                    # 낮은 우선순위를 위해 수정
    advert_int 1
    authentication {
        auth_type PASS        
        auth_pass P@ssW0rd        
    }

    virtual_ipaddress {
        192.168.0.100      
    }
}

구동

각각의 서버에서 서비스를 구동한다.

 sudo systemctl enable keepalived --now
# BACKUP 서버들에서도 동일하게 서비스를 구동해준다. 

확인

ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 4e:be:1a:32:52:04 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.41/24 brd 192.168.1.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet 192.168.1.40/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::4cbe:1aff:fe32:5204/64 scope link
       valid_lft forever preferred_lft forever

192.168.1.40/32가 virtual IP. backup 노드로 설정된 서버에는 해당 ip가 보이지 않는다.

다른 시스템에서 가상아이피를 이용하여 ssh 접속, 혹은 ping 명령등을 수행해서 확인하면 된다.

MS 파워포인트 한/영 자동전환 기능 끄기

마이크로소프트 파워포인트(Microsoft Power Point)를 사용하다 보면 자동으로 한글이 영어로 영어에서 한글로 바뀌는 경우를 볼 수 있다.
아주 아주 편리한 기능으로 ‘database’라는 단어를 입력하고 싶을 때 한글이 선택된 상태로 ‘ㅇㅁㅅ뮴ㄴㄷ’를 입력하면 자동으로 제대로 된 영문으로 고쳐주는 기능이다.

정상적인 동작. 아주 편하다

 

하지만 종종 내가 원하지 않는 경우에도 변환이 되는 경우가 있는데 이런 경우라면 [파일][옵션] [언어교정][자동 고침 옵션(A)…] 메뉴에서 [한/영 자동 고침(K)] 항목을 비활성화 해주면 된다

 

 

하.지.만

사실 위 기능은 구글에 ‘파워포인트 한영전환’ 9자만 검색하면 어떻게 바꾸는지 엄청 많이 나오므로 굳이 이렇게 포스팅할 필요가 없지만…

이런 어처구니 없는 동작을 하는 경우엔?

분명히 [한/영 자동 고침(K)] 항목을 비활성화 했음에도 제 멋대로 변경되는 것을 확인할 수 있다. “spark”의 경우는 아무런 문제가 없는 영단어인데 제 멋대로 자꾸 ‘rk ‘만 ‘가’로 치환하는데다 “repository”의 경우는 ‘sitory’ㅇ를 ‘냐새교’로 있지도 않은 단어로 자꾸 치환 해대니 미쳐버릴 노릇.

사실 이 문제는 파워포인트의 한영 전환 기능이 아니라 윈도우즈에 설치된 한글 입력기가 개입 하는 것으로 비단 파워포인트 뿐 아니라 다른 모든 어플리케이션에서 제 멋대로 문자를 치환해버리는 경우이다. 그러니까 파워포인트 문서를 작성하다가 문자가 변경된다고 옵션을 백번 바꿔봐야 소용이 없고, 엑셀에서도 제 멋대로 문자를 치환하고, 크롬의 경우는 제 멋대로 주소표시줄에서 자동완성을 시전하는 아주 전방위에서 사용자를 괴롭히는 그런 문제가 되겠다.

원인은 ‘한글과 컴퓨터 아래아한글’. 정확히 말하면 한컴 오피스를 설치 할 때 함께 설치되는 “한컴입력기”.

두 번째 동영상과 같은 증상이 나타나면 “한컴 입력기”를 제거함으로써 증상을 고칠 수 있다.
방법은 다음과 같다

  1. 윈도우즈 [설정] [시간 및 언어][언어] 메뉴 진입
  2. 기본 설정 언어“의 “한국어” 메뉴 선택
  3. 한국얼 아래 나타나는 [옵션]에서 “키보드” 항목 선택
  4. [한컴 입력기] 선택
  5. [제거] 버튼 클릭