Docker 데몬 서버 시작시 container 함께 시작시키기

로컬에서 개발할 때 출근 하고 랩탑을 켜고 Docker desktop을 실행시키면 매번 docker run명령을 통해 자주 쓰는 container를 실행시켜줘야 한다. 주로 로컬 DB가 있는 경우 이런 귀찮음이 엄청나다. 이럴 때는 –restart 옵션을 주면 docker desktop을 실행시킬 때 마다 container를 항상 같이 띄울 수 있다.

혹은 서버에서 docker container가 죽는 경우 재시작을 할 수 있도록 설정할 수도 있다.

 docker run --name mysql57 \
    -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=th.deng \
    -e MYSQL_ROOT_HOST='%' \
    --restart=unless-stopped \
    -d \
    mysql/mysql-server:5.7 \
    --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ciCode language: JavaScript (javascript)
--restart 옵션은 4가지가 있다.:
no: container를 재시작 시키지 않는다. (default)
on-failure[:max-retries]: container가 정상적으로 종료되지 않은 경우(exit code가 0이 아님)에만 재시작 시킨다. max-retries도 함께 주면 재시작 최대 시도횟수를 지정할 수 있고, 테스트 서버 등과 같은 리모트에 설정하면 좋을 것 같다.
always: container를 항상 재시작시킨다. exit code 상관 없이 항상 재시작 된다.
unless-stopped: container를 stop시키기 전 까지 항상 재시작 시킨다.

리눅스 시스템에서 디스크 용량 확장하기

디스크 확장
디스크 확장이란 말 그대로 디스크의 크기를 늘리는 것입니다.

도식화 하자면 위의 그림과 같다. 하드디스크의 용량이 늘어난 것이다.
하지만 운영 중인 시스템에는 영향이 없다. 그저 상관없는 공간이 늘어났을 뿐.

디스크 파티션이 이미 정해져있기 때문에(파티션 테이블은 변경되지 않았기 때문에)
물리 디스크의 크기를 확장했어도, 리눅스 시스템상의 사용 가능 용량은 변함없이 그대로이다.

1. 디스크 확장 적용

따라서 디스크 확장을 적용하기 위해 해야할 일은 다음과 같다.

  1. 파티션 크기 조정
  2. 변경사항 시스템에 적용

사용 중인 서버의 용량 추가가 가능한 이유?

디스크 용량 축소와 다르게, 용량 확장은 빈공간을 추가하는 것이므로, 시스템에 영향을 주지 않기 때문이다.

– 현재 사용중인 시스템 디스크 정보 확인하기

사용 중인 디스크의 용량이나 장치파일 정보, 마운트 포인트를 살펴 보도록 하자.

다음의 3가지 명령어가 주로 사용된다. 한번씩 입력해보고 정보를 확인해 보도록 하자.

# lsblk
# fdisk -l
# df -hCode language: PHP (php)

용량 확장

클라우드 콘솔이나 기타 방법을 통해 디스크 용량을 확장하도록 하자.

* 주의 : 대부분의 클라우드 사업자는 용량의 증가만 허용합니다. 즉, 테스트 한다고 많이 큰 숫자를 입력하면 의도하지 않은 돈 지출이 생길 수 있습니다.
* 주의 : 일부 클라우드의 경우 디스크 용량 변경 횟수를 제한하고 있습니다. (예시 : 6시간에 1회 변경가능)

물리 장치 적용 확인

이 단계에서 재부팅 필요 유무가 결정됩니다.

# lsblkCode language: PHP (php)

위 명령어의 결과에서 물리장치의 표시 용량이 설정한 값으로 표시되어야 합니다.

만약 변경된 값으로 표시된 경우 -> 다음 단계 진행.
만약 변경된 값으로 표시되지 않은 경우 -> 재부팅 후, 다음 단계 진행.

파티션 크기 증가 프로그램을 사용하여 파티션 크기를 키우기

지정한 파티션을 사용가능한 최대 크기로 변경하는 작업을 합니다.
먼저 사용할 프로그램의 도움말을 살펴봅시다.

# growpart --helpCode language: PHP (php)

growpart 는 이런 명령어 프로그램입니다 :
rewrite partition table so that partition takes up all the space it can .


lsblk 명령어의 결과를 바탕으로  growpart 명령어를 입력하도록 하자.

# lsblk
# growpart /dev/xvda 1
# lsblkCode language: PHP (php)
# df -hCode language: PHP (php)

파티션 크기를 늘려 주었는데도 용량이 그대로 일 것이다.

왜냐하면 동작중인 시스템에서 파티션의 변경을 다시 불러오지 않았기 때문이다.

이 상태에서 파티션 테이블의 변경사항을 시스템에 적용하는 방법은 두가지이다.

  • 재부팅
  • resize2fs 명령어를 사용해서 파티션 크기 변경 적용

– 재부팅으로 해결하는법

# rebootCode language: PHP (php)

재부팅되면 당연히 모든 시스템 정보를 다시 불러오게 된다.

– 재부팅하지 않고 resize2fs 로 해결하는법

# resize2fs /dev/xvda1Code language: PHP (php)

Ubuntu swap 생성

용량이 큰 프로그램을 사용하다 보면 화면 업데이트 업데이트가 안되는 freezing 현상이 발생되고, 마우스 클릭을 하더라도 반응이 없거나 매우 느린 현상이 발생한다면 “Memory 부족 현상”을 의심할 필요가 있다. 이런 현상이 발생하는 경우 ‘시스템 감시’ 를 띄워 놓고 Memory 와 SWAP 사용량을 확인하면 메모리 부족 현상 여부를 정확하게 판단할 수 있다. 아래 그림에서 시스템 감시는 8GB RAM 은 다 사용했고, 부족한 메모리를 대신 SWAP 을 사용하고 있지만 대략 50% 정도 사용 중이다.

emory 부족 현상은 1) 실제 메모리와 2) SWAP 메모리를 모두 사용한 상태이다. 이 경우 리눅스 커널의 OOM(Out of Memory) killer가 실행 중인 프로그램을 우선 순위에 따라서 필요한 메모리를 확보할때 까지 하나씩 강제 종료 시킨다. 사용자에 메모리 부족 현상을 알려주는 팝업도 없이 백그라운드 프로그램부터 포그라운드 프로그램까지 강제 종료 시키기 때문에 사용자가 메모리 부족현상을 인지하지 못할 수 도 있다. 예를 들어, 8GB RAM의 우분투 환경에서 Android ASOP소스를 m -j8 (=thread 8개) 옵션으로 full build 하는데 ninja 프로그램이 에러 메시지 없이 종료해서 원인을 찾는데 한참 걸렸다.

메모리가 부족 현상은 근본적으로 RAM을 늘려서 해결해야 하지만, 일시적으로 메모리가 부족한 현상인 경우 SWAP 파일의 크기를 늘려 해결이 가능하다. 최근에 SSD가 빨라서 SWAP을 하더라도 사용성에는 큰 문제는 없다.

1. SWAP 파일 확인 방법

Ubuntu 18.04 부터는 swap 은 /swap parition으로 생성하는 것이 아니고 /swap file로 개선되어 parition 변경 없이 편하게 swap file의 크기를 조절할 수 있다. swapfile은 root 폴더 하위에 /swapfile 로 생성되며 사용 현항은 free 명령어로 확인할 수 있다. (시스템 감시의 자원의 메모리와 Swap 현황과 동일). Ubuntu 20.04버전에서는 디폴트로 2GB의 스왑이 잡혀있다.

root@ubuntu_vir:/# ll / | grep swap
-rw-------   1 root root 2147483648 Oct 24  2019 swap.img
root@ubuntu_vir:/# Code language: PHP (php)

swapfile은 / 하위에 생성된다.

free 명령어로 swap의 사용현황 확인

root@ubuntu_vir:/# free -m 
              total        used        free      shared  buff/cache   available
Mem:          16017         304       15113           1         600       15432
Swap:          2047           0        2047
Code language: PHP (php)

2.swapfile 만들기

리눅스에서 파일공간을 할당하는 명령어인 fallocate를 이용하여 2GB용량의 파일을 만들겠습니다.
여기서는 루트폴더에 swapfile이라고 이름을 지었는데 이름은 원하는데로 지으면 됩니다.
파일을 만든 후 권한 설정을 수정하여 swap메모리로 지정합니다.

sudo fallocate -l 2G /swapfile  → swapfile 생성
sudo chmod 600 /swapfile → root 사용자만 사용할 수 있도록 권한 변경
$ sudo mkswap /swapfile  → 스왑메모리로 변경
$ sudo swapon /swapfile  → 스왑메모리 활성화

free명령어를 이용하여 지정된 스왑메모리에 대한 정보를 확인 할 수 있습니다.

이렇게 지정하면 스왑 메모리가 활성화 되는데 재부팅 후에도 계속 스왑 메모리가 필요한 경우 /etc/fstab에 마운트 내용을 추가합니다.

$ sudo vi /etc/fstab
$ /swapfile swap swap default 0 0  → 입력내용
또는
$ echo "/swapfile swap swap default 0 0" >> /etc/fstabCode language: JavaScript (javascript)

이제 부터는 재부팅 후에도 스왑메모리가 자동으로 지정이 됩니다.

3. Swap file 크기 조정

Swap file 을 사용 중이라면 swap off 명령어로 비활성화 시켜야 한다. Swap file이 활성화된 상태에서는 “failed 메모리를 할당할 수 없습니다” 라는 에러 메시지와 함께 크기 조정이 안된다.

# swap 비활성
$ sudo swapoff -v /swapfileCode language: PHP (php)

swap 메모리 크기 조정은 fallocate 명령어를 사용한다. 이후 권한을 설정하고 mkswap 명령어로 swapfile 을 만들고 swapon 으로 활성화 시킨다.

# swap 을 8GB 로 조정한 경우 
$ sudo fallocate -l 8G /swapfile

#권한 설정
$ sudo chmod 600 /swapfile

#swap file 만들기
$ sudo mkswap /swapfile

#swap file 활성화 : 리부티하지 않아도 swap file이 활성화 된다.
$ sudo swapon /swapfileCode language: PHP (php)

/etc/fstab 을 수정해서 swap file을 마운트 한다.

# /etc/fstab 을 열어서 내용 추가  
swapfile none swap sw 0 0Code language: PHP (php)

swap이 정상동작되는지 free 명령어로 확인하다.

4. swapfile 제거하기

스왑메모리는 디스크의 용량이 부족한 일이 아니고는 특별히 제거할 이유가 없습니다.
하지만, 방법은 알고 있어야겠죠?
지정된 스왑메모리를 해제하는 방법은 다음과 같습니다.
/etc/fstab에 저장된 스왑메모리의 마운트 내용을 삭제 또는 주석처리 합니다.
그리고 스왑을 비활성화 하고 파일을 삭제 하면됩니다.

sudo vi /etc/fstab → 자동마운트 내용 제거 및 주석처리
sudo swapoff -v /swapfile
sudo swapoff on /swapfile
sudo rm -r /swapfile

우분투 SSH 접속시 텔래그램 알림

보안이 중요한 웹사이트에 로그인 할 때마다 SMS, 이메일, 전화 등을 통해 유용한 알림이 전송됩니다. SSH를 통하여 로그온 할때 내 VPS가 동일하게 작동하기를 원합니다. 왜냐하면 다른 사람이 내 키를 사용하여 로그인하지 않았는지 확인할 필요가 있습니다.

휴대폰을 가지고 있으면 텔레그램 봇을 통하여 푸시 알림을 받을수 있습니다.

1단계: 봇 생성

Telegram의 @BotFather 와 대화해야 합니다.
자세한 안내는 Telegram 사이트를 참고해주세요.
마지막에는 다음과 같은 봇 토큰을 받아야 합니다.
987654321:ABCDEFGHIJKLMNopqrstUVWXYZ123456789

2단계: /etc/ssh 에 스크립트 추가

사용자가 로그인 할 때 PAM이 실행할 스크립트를 만듭니다. 아무 곳에나 둬도 상관없지만 이번에는 /etc/ssh 안에 넣겠습니다.

sudo touch /etc/ssh/login_notify.sh
sudo chmod +x /etc/ssh/login_notify.sh
sudo editor /etc/ssh/login_notify.sh

스크립트 내용은 다음과 같습니다.

#!/usr/bin/env bash
# Content of /etc/ssh/login_notify.sh
TELEGRAM_TOKEN="987654321:ABCDEFGHIJKLMNopqrstUVWXYZ123456789"
CHAT_ID=""

if [ ${PAM_TYPE} = "open_session" ]; then
  MESSAGE="$PAM_USER@$PAM_RHOST: knock knock via $PAM_SERVICE"
  curl -s -X POST "https://api.telegram.org/bot$TELEGRAM_TOKEN/sendMessage" -d chat_id="$CHAT_ID" -d text="$MESSAGE" > /dev/null 2>&1
fiCode language: PHP (php)

login_notify.sh를 지금 실행하면 스크립트 내부 $CHAT_ID가 설정되지 않았고 Telegram이 이 메세지를 누구에게 보낼지 모르게 때문에 아무것도 수신할 수 없습니다.

채팅 ID를 얻으려면 먼저 봇에게 /start 메시지를 보내세요. 그런 다음 터미널에서

curl https://api.telegram.org/bot<BOT TOKEN>/getUpdates
# { ..."chat": { "id": 12345, ... }... }Code language: PHP (php)

에서 찾은 채팅 ID를 입력해 보겠습니다.

--- a/etc/ssh/login_notify.sh
+++ b/etc/ssh/login_notify.sh
- CHAT_ID=""
+ CHAT_ID="12345"Code language: JavaScript (javascript)

최소한의 환경 변수를 설정하며 스크립트를 실행하여 보겠습니다.

PAM_TYPE="open_session" /etc/ssh/login_notify.sh
# Telegram > "@: knock knock via"Code language: PHP (php)

3단계: 스크립트를 트리거 하도록 PAM 구성 수정

각 서비스에 대한 PAM구성은 /etc/pam.d에 있습니다. 특히 이번에는 /etc/pam.d/sshd 를 수정해야 합니다.

sudo editor /etc/pam.d/sshd

끝에 다음과 같은 내용을 추가합니다.

# Login Telegram Notification
session optional pam_exec.so /etc/ssh/login_notify.shCode language: PHP (php)

4단계: 테스트

ssh -l username hostname -P port

끝.

Linux 루트 인증서 확인 및 추가 방법

CentOs 5

cat USERTrust RSA Certification Authority.crt >>/etc/pki/tls/certs/ca-bundle.crtCode language: JavaScript (javascript)

CentOs 6

yum install ca-certificates (패키지가 없는 경우)
update-ca-trust force-enable
cp USERTrust RSA Certification Authority.crt /etc/pki/ca-trust/source/anchors/
update-ca-trust extract

Debian, Ubuntu

sudo cp USERTrust RSA Certification Authority.crt /usr/local/share/ca-certificates/USERTrustRSACertificationAuthority.crt
sudo update-ca-certificates

Updating certificates in /etc/ssl/certs… 1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d….
Adding debian:USERTrustRSACertificationAuthority.pem
done.