온라인 사업을 하는 주요 기업의 주된 매출은 광고로 부터 발생한다.

다시 온라인사업이 메인인 회사로 이직을 하였더니, 다시금 옛 생각이 절로 남과 동시에, 그 사이에 엄청나게 발전한 광고 플랫폼들을 보며, 놀라움을 금할 수 없다.

예전에도 구글은 종합광고 업체라고 생각했었는데, 이제 구글 없이는 광고 시장이 움직이지 않고 있으며,

예전엔 광고에 덜 집중 했었던 얼굴책도, 또 하나의 거의 완벽한 광고 플랫폼이 되어 있다.

광고 시장에서 풀플랫폼을 기획 개발하는건 왠만한 정성과 노력이 있지 않으면 안된다. 사실 정확하겐 왠만한 업체는 하면 안된다고 생각한다.

그런데 한국의 메이져 포털들은 그걸 하고 있다.


덕분에 오랜만에 블로그에 글을 올리고, 구글 상품도 걸어 보고, 어드민도 만져보고, 어날리틱스도.....

먼가 엄청 많이 연동되고 또 분리되고, 각자의 기능을 다 하면서도 아름답게 연동되어 있는걸 보고 또 감탄 중이다.


티스토리로만으론 한계가 있어, 설치형으로도, 모바일로도 하나씩 테스트를 해 봐야 될거 같아서...

EC2 라도 하나...열어야 쓰겠다


공부공부.

16년 인듯한데, 개인적으로 어렸을때 부터 친한 회계사 친구가, X퍼센트 라는 P2P 펀딩 스타트업으로 이직을 하면서 관심을 가지고, 달달이 발생해서 어딘가로는 저축을 해야 되는 여윳돈을 투자하기 시작했다. 그래봐야 매달 2-30만이 기본이고, 많을때 50-60정도? 잘 모아서 차를 사야지 하는 수준의 각종 교통비, 출장비 등등의 짜투리 수익을 기왕이면 고수익이 기대되는 곳으로 투자해 보자 하는 머 그런 심리?


브랜드 이름은 X퍼센트는, 기대 금리를 직설적으로 표방한 이름이다. 그런데 나의 경우에는 아쉽게도 해당 수익률이 나오진 않았다.

여전히 메인에는 수익률이 10% 가까워서, 해당 브랜드 이름보다 훨씬 많은 수익을 낼 수 있을것으로 광고 하고 있는데, 현실은 좀 의문이다.


16,17년도 사이에는 생각보다 수익률이 괜찮았다, 한참 거래금액이 200억 에서 300억으로 급성장하고 있고, 프로모션도 많았으며

36개월 상품이 있어서, 원리금 납부의 부담이 적어서 인지 연체도 적었던것 같다.

그런데 P2P 펀드의 규모와 취급 회사가 많이지고 수탁고가 늘면서 부턴 연체가 급격하게 늘기 시작했다.

특히 연체자 중에 회생이 많아서, 언제 회수가 될지 잘 모르겠고;;

회생이 아니더라도, 추심이 잘 되고 있는지 의문이 들 정도로, 연체자 중에 다시 정상으로 돌아오는 경우를 보지 못했다 ㅠㅠ


초반에는 안심펀드라를 일정 리스크율에 따라서 기대 이자로 부터 일정 금액을 공제하여, 장기 (180일) 연체가 되면, 투자금의 50%를 지급해 주는 제도가 있었으나,

(따라서 초반에는 리스크가 현재 보다는 훨씬 적었다) 재원의 고갈로 인해서, 중단 되었다. (기공제 상품은 계속 보장 된다)


더불어, P2P 의 이자에는 일반적인 이자 수익률 보다 높은 세금이 부과 되는데, 세법상 비영업 대금의 세금으로 25%에, 지방소득세 10%를 합산하여 27.5%가 됨으로

금융권 이자 수익과 비교할때 주의 할 필요가 있다.(세금이 생각보다 크다;;, 인하 청원도 진행 중이다)


또한 작년부터 P2P 건전성강화의 일환으로 년간 투자 금액 제한 등의 여러가지 제도적 장치가 마련되어서, 소비자에게는 안전장치가 들어 갔다 착각 할 수 있지만, 

개인적인 관점에선, 안전장치가 없는 풍선의 사이즈만 작게 만들어서 큰 노이즈를 방지 했을뿐, 풍선이 커질때의 안전장치가 된다거나,

터지는 폭발력을 상쇄하기는 어려운 제도이고, 오히려 해당 업의 발전에 저해요소가 되지 않을까 생각 됩니다.


개인적으로 약 2년 동안 누적 투자액은 2600만원 정도, 기대 이자는 160만원, 현재 연체는 150만원 남짓이며, 앞으로 연체가 전혀 없이 다 회수 되었을때 비로서

본전? 비슷한 금액을 돌려 받을 수 있다. 분산투자를 못한건지, 고르는 운이 억세게 없는건지 잘 모르겠지만, 그래서 작년부터는 회수되는 금액을 출금만 하고 있다.


이 정도 리스크면 그냥 주식이 나은것 같기도 하고;;;



sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"

제6장 여러 컨테이너를 통합 관리―Docker Compose

이 장에서는 지금까지 설명한 인프라 기초 지식과 Docker 커맨드 및 Dockerfile 코드로 구축한 인프라를 바탕으로 여러 컨테이너를 통합하여 관리하기 위한 툴인 Docker Compose를 사용하여 웹 시스템 실행 환경을 구축하는 방법에 대하여 설명합니다.


6-1 Docker로 구축하는 웹 시스템에 대한 기초 지식

3계층 웹 시스템 아키텍처

각각의 기능과 역할에 맞는 여러 대의 서버로 애플리케이션 실행을 위한 인프라를 구성하는 것을 인프라 아키텍처라 합니다.

시스템에서 많이 사용하고 있는 웹 애플리케이션의 대표적인 인프라 아키텍처인 3계층 웹 시스템 아키텍처는 다음과 같이 각 기능을 가진 3개의 서버로 구성되어 있습니다.

프론트 서버

  • 클라이언트의 웹 브라우저에서 전송된 HTTP request를 받아 HTTP response를 보내는 서버로 '웹 프론트 서버' 또는 '웹 서버'라고 함
  • Apache HTTP Server, nginx, Microsoft의 IIS(Internet Information Services) 등의 미들웨어가 동작
  • 처리량이 많이 부하가 클 때에는 스케일 아웃으로 서버 대수를 늘리고 로드 밸런서 등으로 부하를 분산시킴

애플리케이션 서버

업무를 처리하는 서버

  • GlassFish와 Apache Tomcat, JBoss Application Server, IBM의 WebSphere Application Server, Oracle의 Oracle Application Server 등의 미들웨어로 구현
  • PHP나 Perl 실행 환경이 필요할 때에는 Apache HTTP Server에 mod-perl이나 mod-php 등을 함께 설치

데이터베이스(DB) 서버

  • 영구적인 데이터를 관리하기 위한 서버
  • 데이터는 DBMS(Database Management System) 기능을 가진 MySQL이나, PostgreSQL, Oracle의 Oracle Database, IBM의 DB2 등의 미들웨어에서 관리
  • 높은 가용성이 필요하기 때문에 클러스터링 기술로 이중화하는 경우가 많음
  • 성능을 높이기 위해 상황에 따라 OS나 미들웨어의 매개변수 설정을 변경하는 등 튜닝하는 것이 좋음

데이터 관리

시스템을 운영하다보면 다양한 데이터가 생성·축적되며 이 데이터는 프로그램이 종료된 후에도 스토리지 등에 저장됩니다. 이를 영속 데이터라 하며 시스템 가동 시간에 따라 증감하고 변화합니다. 스토리지 저장 공간은 한정되어 있고 장애로 인해 데이터가 소실될 수도 있으므로 이를 잘 관리하는 것이 중요합니다.

데이터 백업 및 복원

  • 서버 장애에 대비하여 데이터를 백업
  • 테이프 장치 등의 물리 매체 또는 클라우드상의 스토리지 등에 보관
  • 재해 대책의 일환으로 원격지에 보관하기도 함

로그 수집

  • 여러 서버를 통합 모니터링하는 경우에는 일반적으로 로그 수집을 위한 전용 서버를 설치
  • UNIX 계열의 OS인 경우에는 syslogd 데몬으로 커널과 애플리케이션 로그를 관리
  • Docker는 컨테이너를 통해 서버 기능을 제공
  • 서버 컨테이너 : 애플리케이션에서 실행 모듈과 각종 라이브러리 모듈 및 미들웨어 설정 파일 등을 저장
  • 데이터 전용 컨테이너 : 시스템 구동 시 생성되는 데이터 저장(로그, 데이터, ...)
  • 소실되면 안되는 중요한 데이터는 데이터 전용 컨테이너에 저장

Docker 컨테이너 간 링크

컨테이너들을 연계할 때 Docker의 링크 기능을 사용

링크 기능은 컨테이너 구동 시 docker run 커맨드로 다음과 같은 형식의 link 옵션을 지정하여 사용

docker run --link <접속하고자 하는 컨테이너명:alias명> <이미지명> <실행 커맨드>
#postgres를 사용하여 데이터베이스 서버 기능을 가진 'dbserver' 컨테이너 구동
docker run -d --name dbserver postgres

#'dbserver 컨테이너에 'pg'라는 alias명으로 링크를 설정한 appserver 웹 애플리케이션 서버 구동
docker run -it --name appserver --link dbserver:pg centos /bin/bash
#appserver의 환경변수 확인
set | grep PG

위와 같은 명령을 통해 서버를 구동하고, appserver의 환경변수를 확인해보면, 다음과 같이 링크로 연결된 dbserver에 접속하기 위해 prefix로 컨테이너의 alias명인 <PG_>가 붙어있는 것을 볼 수 있습니다.


예를 들어 'PG_PORT_5432_TCP_ADDR'라는 환경변수에는 앞서 링크로 연결된 dbserver에 할당된 IP address가 설정됩니다. 설정이 완료된 appserver 컨테이너에서 dbserver 컨테이너로 ping을 확인하려면 다음의 커맨드를 실행합니다.

#appserver 컨테이너에서 dbserver 컨테이너로 ping 확인(컨테이너 내에서 실행)
ping $PG_PORT_5432_TCP_ADDR

appserver 컨테이너의 /etc/hosts에 네트워크 설정 정보가 기록됩니다. 이를 통해 다음과 같이 링크로 연결된 dbserver에 pg라는 이름으로 ping 커맨드를 날릴 수도 있습니다

#/etc/hosts에 기록된 네트워크 설정 정보 확인(컨테이너 내에서 실행)
cat /etc/hosts

#링크로 연결된 dbserver에 pg라는 이름으로 ping(컨테이너 내에서 실행)
ping pg

Docker 컨테이너 리소스는 분산되어 있으므로 컨테이너끼리 액세스가 필요할 때에는 이와 같이 링크 기능을 사용합니다. 단, 링크 기능은 동일한 호스트 머신에서 구동 중인 컨테이너 사이에서만 액세스할 수 있으므로 주의해야 합니다.


※ 참고

Linux에서는 '/etc/hosts' 파일에 각 호스트의 호스트명과 IP address 매핑을 저장하고 확인합니다.


6-2 Docker Compose 설치

Docker Compose

Docker Compose는 여러 컨테이너를 하나로 관리할 수 있는 툴입니다. Docker Compose는 'docker-compose.yml' 파일에 컨테이너 구성 정보를 정의하여 동일한 호스트상의 여러 컨테이너를 하나로 관리할 수 있습니다.

Docker Compose는 Docker사가 제공하는 툴이며 여기에서는 최신 버전인 1.8.0을 기준으로 설명합니다.


Docker Compose 설치

Docker Compose는 아래의 GitHub에 공개되어 있으며, Windows용의 Docker Toolbox에는 설치되지 않습니다.

Docker Compose는 지금도 계속 개발 중에 있으며 자주 버전업되므로 정기적으로 최신 버전을 체크해야 합니다.

Docker Compose 1.8.0을 설치할 때에는 관리자 권한에서 다음의 커맨드를 실행해야 합니다.

#Docker Compose 설치
sudo su
curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

#실행 파일에 액세스 권한 설정
chmod +x /usr/local/bin/docker-compose

#Docker Compose 설치 확인
docker-compose --version


6-3 구성 파일(docker-compose.yml)

여기에서는 Docker Compose 인프라 구성관리 파일인 docker-compose.yml에 대한 개요 및 기본 구문에 대하여 설명합니다.


docker-compose.yml로 구성관리

Docker Compose는 'docker-compose.yml' 설정 파일 시스템 내에서 구동하는 여러 서버 구성을 한데 모아 정의할 수 있습니다. 이 설정 파일은 YAML 형식으로 작성됩니다.

YAML

  • 구조화된 데이터를 표현하기 위한 데이터 포맷
  • Python처럼 들여쓰기로 데이터 계층을 표기
  • 들여쓰기를 할 때에는 Tab이 아닌 Space Bar를 사용
  • 다른 사람이 보더라도 코드를 이해하기 쉬워 설정 파일에 적합한 형식
  • 배열을 나타낼 때에는 데이터 앞에 '-'를 붙이며 뒤에는 반드시 Space Bar를 입력해야함
  • 공식 사이트 http://yaml.org/

docker-compose.yml라는 한 파일 안에는 여러 컨테이너 설정 내용이 저장됩니다. 내용을 이해하기 쉽도록 <#>로 주석을 달아두는 것이 좋습니다.


베이스 이미지 지정(image/build)

image

  • Docker 컨테이너의 기반이 되는 베이스 이미지를 지정
  • 이미지명 또는 이미지 ID를 입력
  • 이미지 태그를 지정하지 않은 경우에는 최신 버전(latest)이 다운로드
  • 로컬 환경에 베이스 이미지가 있다면 해당 이미지를 사용, 없다면 Docker Hub에서 자동으로 다운로드받아 사용
  #이미지 태그가 없는 경우
  webserver:
    image: ubuntu

  #Docker Hub의 이미지를 지정하는 경우
  webserver2:
    image: ewshin/dockersample:1.0

build

  • Dockerfile에 이미지 구성을 저장하고 이를 자동으로 build하여 베이스 이미지로 지정
  • docker-compose.yml이 있는 디렉터리를 현재 디렉터리로 하여 Dockerfile의 경로를 입력
  #build 지정(docker-compose.yml 파일과 Dockerfile이 같은 경로에 있다고 가정)
  webserver:
    build: .

이처럼 docker-compose.yml에는 image 또는 build 중 하나를 꼭 설정해야 합니다.


컨테이너 내에서 동작하는 커맨드 지정(command)

  • 컨테이너 내에서 동작하는 커맨드 지정
  #컨테이너 내에서 동작하는 커맨드 지정
  webserver:
    image: ubuntu
    command: /bin/bash


컨테이너 간 링크 연계(links/external_links)

  • 링크를 통해 다른 컨테이너와 연결
  • 연결할 컨테이너명을 입력
  • 컨테이너명과 다른 alias명을 붙이고자 할 때에는 '서비스명:alias명'을 설정
  #링크 설정
    links:
      - dbserver
      - dbserver:mysql

위와 같이 설정하면 컨테이너의 /etc/hosts 파일에 다음과 같이 alias명이 붙은 엔트리가 추가됩니다.

172.17.62.217  dbserver
172.17.62.217  mysql
  • 동일한 docker-compose.yml에 정의하는 것이 아닌, 외부에 위치한 다른 컨테이너와 링크할 때 사용
  • 이미 동작하고 있는 데이터 전용 컨테이너 등을 사용할 때 활용
  #링크 설정
    external_links:
      - redis
      - project_db:mysql


컨테이너 간 통신(ports/expose)

ports

  • 컨테이너가 공개한 포트를 '호스트 머신의 포트 번호:컨테이너의 포트 번호' 또는 '컨테이너의 포트 번호'로 지정
  • 컨테이너의 포트 번호로만 지정한 경우에는 호스트 머신 포트 번호가 랜덤 값으로 설정됨
  • YAML은 xx:yy형식을 시간으로 인식하므로 포트 번호를 설정할 때 다음과 같이 꼭 쌍따옴표("")안에서 문자열을 입력해야 함
  #공개 포트 지정
    ports:
      - "3000"
      - "8000:8000"
      - "49100:22"
      - "127.0.0.1:8001:8001"

expose

  • 포트 번호를 호스트 머신에는 공개하지 않고 링크로 연계된 컨테이너에만 공개
  • 데이터베이스 서버와 같이 호스트 머신에서 직접 액세스하지 않고 웹 애플리케이션 서버를 통해 액세스하는 경우에 많이 사용
    #컨테이너 내부에만 공개하는 포트 지정
    expose:
      - "3000"
      - "8000"


컨테이너 데이터 관리(volumes/volumes_for)

volumes

  • 컨테이너에 볼륨을 마운트
  • 호스트에서 마운트하는 경로를 지정할 때에는 '호스트의 디렉터리 경로:컨테이너의 디렉터리 경로' 형식을 사용
  • 볼륨을 읽기 전용(read only)로 마운트하고자 할 때에는 마지막에 :ro를 붙임
  • 설정 파일이 저장된 볼륨의 경우 :ro를 붙여 쓰기를 금지할 수도 있음
#볼륨 지정
volumes:
  - /var/lib/mysql
  - cache/:/tmp/cache

#읽기 전용 볼륨 지정
volumes:
  - ~/configs:/etc/configs/:ro

volumes_from

  • 다른 컨테이너에서 모든 볼륨을 마운트
#모든 볼륨 마운트 지정(log 컨테이너에 마운트)
volumes_from:
  - log


컨테이너 환경변수 지정(environment)

  • 컨테이너 내의 환경변수 지정
  • YAML 배열 형식 또는 hash 형식 중 하나를 사용
#배열 형식으로 지정
environment:
  - HOGE=fuga
  - FOO

#hash 형식으로 지정
environment:
  HOGE: fuga
  FOO:

env_file

  • 환경변수를 정의한 파일을 호출
  • 설정하고자 하는 환경변수가 많을 경우에 사용
  • docker-compose.yml과 동일한 디렉터리에 파일을 생성해야함
  • 파일을 지정할 때, YAML 배열 형식으로 지정하면 한 번에 여러 개의 환경변수 파일을 읽어 들일 수 있음
  • 파일 경로는 상대 경로든 절대 경로든 상관 없음
#환경변수 파일 읽기
env_file: envfile

#여러 개의 환경변수 파일 읽기
env_file:
  - ./envfile1
  - ./app/envfile2
  - /tmp/envfile3


컨테이너 정보 설정(container_name/labels)

container_name

  • Docker Compose에서 생성된 컨테이너에 이름을 붙임
#컨테이너명 지정(web-container)
container_name: web-container

labels

  • 컨테이너에 라벨을 붙임
  • 라벨을 여러 개 붙일 때에는 YAML 배열 또는 hash 형식을 사용
  • 설정한 라벨을 확일할 때에는 docker inspect 명령 사용
#컨테이너 라벨 설정

#배열 형식으로 지정
labels: 
  - "com.example.description=Accounting webapp"
  - "com.example.department=Finance"
  
#hash 형식으로 지정
labels: 
  com.example.description: "Accounting webapp"
  com.example.department: "Finance"

다른 설정 항목에 대한 자세한 설명은 다음의 공식 사이트를 참조


[참고] docker-compose.yml의 GUI 툴

YAML 형식으로 작성된 docker-compose.yml 파일은 들여쓰기와 스페이스가 많아 작성하는 데 어려움이 많습니다. 그래서 GUI에서 필요한 값만 입력하면 docker-compose.yml이 자동으로 생성되는 웹 사이트를 이용하면 편리합니다.

Lorry는 docker-compose.yml을 생성하는 기능뿐만 아니라 이미 생성된 docker-compose.yml을 수정하는 기능도 가지고 있습니다. 별도의 사용자 등록 절차도 필요 없기 때문에 편리하게 사용할 수 있다는 것이 장점입니다.


[참고] Docker Compose의 설정 파일

Docker Compose의 설정 파일로는 다음 4가지가 대표적입니다. 파일명이 다음 4가지 이외의 이름인 경우에는 f 옵션으로 설정 파일을 지정해주어야 합니다.

  • docker-compose.yml
  • docker-compose.yaml
  • fig.yml
  • fig.yaml

Fig는 Docker 컨테이너 구성관리 툴 중 하나로, Orchard Labs에서 개발했으며 2014년 Docker사로 합병되었습니다.


 6-4 Docker Compose 커맨드

여기에서는 Docker Compose를 사용하기 위하여 알아두어야 할 커맨드에 대해 설명합니다.


Docker Compose의 커맨드

Docker Compose 커맨드(docker-compos)에는 서브 커맨드가 몇 가지 있습니다. 주로 사용되는 서브 커맨드는 다음과 같습니다.

서브 커맨드설명
up컨테이너 생성 및 구동
scale생성할 컨테이너 개수 지정
ps컨테이너 목록 확인
logs컨테이너 로그 출력
run컨테이너 실행
start컨테이너 구동
stop컨테이너 중지
restart컨테이너 재가동
kill실행중인 컨테이너 강제 종료
rm컨테이너 삭제

docker-compose 커맨드는 docker-compose.yml을 저장한 디렉터리에서 실행합니다. 현재 디렉터리가 아닌 다른 디렉터리에서 docker-compose.yml을 실행해야 하는 경우에는 f 옵션으로 파일 경로를 지정합니다.

#docker-compose.yml을 기반으로 컨테이너 생성 및 구동
docker-compose -f ./sample/docker-compose.yml up

서브 커맨드 뒤에 컨테이너명을 지정하면 해당 컨테이너만 조작할 수 있습니다.

#특정 컨테이너 중지
docker-compose stop dbserver


여러 개의 컨테이너를 한 번에 생성(up)

docker-compose.yml을 기반으로 여러 컨테이너를 생성하고 구동할 때에는 docker-compose up 커맨드를 사용합니다.

#여러 개의 컨테이너를 한 번에 생성
docker-compose up [옵션] [서비스명]

실행중인 컨테이너를 중지시킬 때에는 Ctrl + C를 누릅니다.

컨테이너를 백그라운드에서 실행시킬 때에는 d 옵션을 사용합니다. d 옵션으로 구동시키면 프롬프트 화면으로 돌아갑니다.

#여러 컨테이너를 한 번에 생성 및 구동
docker-compose up

#여러 컨테이너를 백그라운드에서 구동
docker-compose up -d

다음 명령을 통해 위에서 작성한 docker-compose-pig.yml을 기반으로 pig-trace-application 컨테이너들을 생성하고 구동시켜 봅시다.

cd /opt/gopath/src/github.com/hyperledger/pig-trace-application/packages/pig-lifecycle

#pig-trace-application 컨테이너를 한 번에 백그라운드에서 생성 및 구동
docker-compose -f docker-compose-pig.yml up -d


생성할 컨테이너 개수 지정(scale)

생성할 컨테이너의 개수를 지정할 때에는 docker-compose scale 커맨드를 사용합니다.

#생성할 컨테이너 개수 지정
docker-compose scale [서비스명=개수]

예를 들어 docker-compose.yml에 serverA와 serverB가 정의되어 있고, serverA 컨테이너를 10개, serverB 컨테이너를 20개 구동하고자 한다면 다음의 커맨드를 실행합니다.

#컨테이너 개수 지정
docker-compose scale serverA=10 serverB=20

YAML 설정 파일의 이름이 기본 이름이 아닐 경우에는 -f 옵션으로 해당 파일을 지정해주어야 합니다.

#docker-compose-pig의 컨테이너 개수 지정
docker-compose -f docker-compose-pig.yml scale pig-enrollment=3

※ 하나의 컨테이너를 여러 개 구동하려고 한다면, 이름과 포트번호가 충돌이 나지 않도록 잘 설정해주어야 합니다.

위 소스를 실행하기 위해 docker-compose-pig.yml 파일에서 pig-enrollment 서비스 부분을 다음과 같이 수정하였습니다.

  pig-enrollment:
    #container_name: pig-enrollment
    image: miyoung35/pig-enrollment
    environment:
      - COMPOSER_BASE_URL=http://pig-rest:3000
      - NODE_RED_BASE_URL=ws://pig-node-red:1880
    ports:
      - "8100"
    network_mode: composer_default

여러 컨테이너 확인(ps/logs)

여러 컨테이너 목록을 확인하고자 할 때에는 docker-compose ps 커맨드를 사용합니다.

#여러 컨테이너 확인
docker-compose ps [옵션] [서비스명]

docker-compose ps 커맨드로 구동한 컨테이너 목록을 확인할 수 있습니다.

커맨드를 실행하면 구동 중인 컨테이너명, 실행중인 커맨드, 상태, 포트를 확인할 수 있습니다. -q 옵션을 사용하면 컨테이너 ID만 출력됩니다.

또한, Docker Compose를 사용하여 구동하는 경우에도 일반 Docker 커맨드를 사용할 수 있습니다.

#여러 컨테이너의 목록 확인
docker-compose ps

#컨테이너 ID 확인
docker-compose ps -q

#Docker 커맨드로 컨테이너 확인
docker ps

YAML 설정 파일의 이름이 기본 이름이 아닐 경우에는 -f 옵션으로 해당 파일을 지정해주어야 합니다.

#docker-compose-pig의 컨테이너 목록 확인
docker-compose -f docker-compose-pig.yml ps

#컨테이너 로그 확인
docker-compose logs

YAML 설정 파일의 이름이 기본 이름이 아닐 경우에는 -f 옵션으로 해당 파일을 지정해주어야 합니다.

#docker-compose-pig의 컨테이너의 로그 확인
docker-compose -f docker-compose-pig.yml logs

컨테이너 로그를 확인할 때에는 docker-compose logs 커맨드를 사용합니다.


컨테이너에서 커맨드 실행(run)

Docker Compose에서 구동한 컨테이너에서 새로운 커맨드를 실행하고자 할 때에는 docker-compose run 커맨드를 사용합니다. 다음 커맨드는 docker-compose run 커맨드에서 구동한 serverA 컨테이너의 /bin/bash를 실행하고 있습니다.

#컨테이너에서 커맨드 실행
docker-compose run serverA /bin/bash

YAML 설정 파일의 이름이 기본 이름이 아닐 경우에는 -f 옵션으로 해당 파일을 지정해주어야 합니다.

#docker-compose-pig의 컨테이너에서 커맨드 실행
docker-compose -f docker-compose-pig.yml run pig-enrollment /bin/sh

여러 컨테이너 구동·중지·재가동(start/stop/restart)

Docker Compose를 사용하면 여러 컨테이너를 한 번에 구동·중지·재가동 할 수 있습니다.

#여러 컨테이너를 한 번에 구동
docker-compose start

#여러 컨테이너를 한 번에 중지
docker-compose stop

#여러 컨테이너를 한 번에 재가동
docker-compose restart

특정 컨테이너만 조작하고자 한다면 커맨드 값으로 컨테이너명을 입력합니다. 예를 들어 serverA 컨테이너만 재기동하고자 한다면 다음 커맨드를 실행시킵니다.

#특정 컨테이너 재가동
docker-compose restart serverA

YAML 설정 파일의 이름이 기본 이름이 아닐 경우에는 -f 옵션으로 해당 파일을 지정해주어야 합니다. docker-compose-pig의 컨테이너를 모두 중지시켜 봅시다.

#docker-compose-pig의 컨테이너를 한 번에 중지
docker-compose -f docker-compose-pig.yml stop

여러 컨테이너 강제 종료 및 삭제(kill/rm)

실행 중인 컨테이너를 강제로 중지시킬 때는 docker-compose kill 커맨드를 사용하여 컨테이너에 시그널을 보낼 수 있습니다.

시그널이란 프로세스 간의 통신을 위한 것으로서 Linux 커널에서 사용합니다. 실행 중인 프로세스를 중지시키고 다른 프로세스를 실행할 때나 프로세스를 강제 종료하고자 할 때 사용할 수 있습니다.

예를 들어 다음 커맨드를 실행하면 컨테이너에 키보드 인터럽트인 SIGINT 시그널이 보내지며 Ctrl + C를 입력한 것과 동일하게 동작합니다.

#컨테이너에 시그널 보내기
docker-compose kill -s SIGINT

옵션 지정 없이 docker-compose kill을 실행하면 프로세스를 강제 종료하는 SIGKILL을 보냅니다.

주요 Linux 시그널은 다음과 같습니다.

시그널설명
SIGHUP프로그램 재기동
SIGINT키보드로 인터럽트. Ctrl + C 입력과 동일
SIGQUIT키보드로 중지. Ctrl + \ 입력과 동일
SIGTERM프로세스 정상 종료
SIGKILL프로세스 강제 종료
SIGSTOP프로세스 일시 정지

YAML 설정 파일의 이름이 기본 이름이 아닐 경우에는 -f 옵션으로 해당 파일을 지정해주어야 합니다. docker-compose-pig의 컨테이너를 모두 강제 종료시켜 봅시다.

#docker-compose-pig의 컨테이너를 한 번에 강제 종료
docker-compose -f docker-compose-pig.yml kill

여러 컨테이너를 한 번에 삭제할 때에는 docker-compose rm 커맨드를 실행시킵니다. f 옵션을 지정하면 확인 메세지 없이 바로 삭제할 수 있습니다.

#여러 컨테이너 한 번에 삭제
docker-compose rm

YAML 설정 파일의 이름이 기본 이름이 아닐 경우에는 -f 옵션으로 해당 파일을 지정해주어야 합니다. docker-compose-pig의 컨테이너를 모두 삭제시켜 봅시다.

#docker-compose-pig의 컨테이너를 한 번에 삭제
docker-compose -f docker-compose-pig.yml rm -f


Streaming video in real time (which is cool, cause you can pass this to f in matcherservice and indexer-service

ffmpeg -re -i ~/Desktop/kung-fury-channel/kung_fury_ads.mp4 -acodec copy -vcodec copy -f mpegts udp://127.0.0.1:9000
ffmpeg -re -i ~/projects/videos/kung-fury-channel/kung_fury_ads.mp4 -q 0 -f mpegts udp://localhost:9000





Scaling, width: 1/2,  height scaled accordingly to preserve aspect ratio

ffmpeg -i input -vf scale=iw/2:-1 output

Add black pads on margin

ffmpeg -i input_file -vf "pad=output_width:output_height:sizeofwidth:siezeofheight:color" output_file.mp4

Convert to 1080p

ffmpeg -i KidsPlay4x3.mp4 -vf scale=1920:1080 KidsPlay_1080p.mp4
ffmpeg -i MLFLong.mxf -vf "movie=squeeze_icon.png [watermark]; [in][watermark] overlay=main_w-overlay_w-20:main_h-overlay_h-20 [out]" MLFLongLogo.mp4

Increase contrast by 25%(https://ffmpeg.org/ffmpeg-filters.html#eq)

ffmpeg -i MLFLong.mxf -vf eq=1.25:0:1:1:1:1:1:1 MLFLongContrast125Percent.mp4

Change video bit rate to 200K

ffmpeg -i zombie.mp4 -b:v 200k zombie_v200k.mp4

Change frame rate to 10 frames per second

ffmpeg -i zombie.mp4 -r 10 zombie_fps10.mp4

Cut 19 seconds of video and audio from cbs_1b_watch.mxf

ffmpeg -i cbs_1b_watch.mxf -ss 00 -c copy -t 19 geico.mxf

Figure out # of frames in video

ffmpeg -i ~/Desktop/TimeCode_1080p.mov -f null /dev/null

General information about a file

ffmpeg -i file

Draw Box(https://ffmpeg.org/ffmpeg-filters.html#drawbox)

ffmpeg -i input_file drawbox=x=10:y=20:w=200:h=60:color=red output_file

Convert HLS to MP4

ffmpeg -i playlist.m3u8 -bsf:a aac_adtstoasc -vcodec copy video.mp4


Splice 

ffmpeg -i input.wmv -ss 00:00:30.0 -c copy -t 00:00:10.0 output.wmv
ffmpeg -i input.wmv -ss 30 -c copy -t 10 output.wmv

Get Every Frame of a Video

// read frames from movie saving to jpeg

ffmpeg -i file.mpg -r 1/1 $filename%03d.jpg


Get Only One Frame

// extract one frame, starting at second 20, get one frame

ffmpeg -i 1.1Burger_King.mp4 -ss 00:00:20.000 -vframes 1 out.png

Crop out 10%

ffmpeg -i MLFLongScaleUp10Percent.mp4 -vf crop=1920:1080:96:54 MLFLongScaleCrop10Percent.mp4
or 
// origin at (0.05w, 0.05h) with size 0.9w x 0.9h
ffmpeg -i 1.1Burger_King.mp4 -vf crop=0.9*in_w:0.9*in_h:0.05*in_w:0.05*in_h 1.1Burger_King_crop_out_10percent.mp4
 
 
//On Mac
ffmpeg -i 1.1Burger_King.mp4 -vf "crop=0.9*in_w:0.9*in_h:0.05*in_w:0.05*in_h" 1.1Burger_King_crop_out_10percent.mp4

Pixelation

ffmpeg -i input -qscale # output

Where # = 0 preserves the quality of the input video, and the higher the number the more pixilation (noticeable at >15-20) 

Closed Captions / Subtitles

(text only)

ffmpeg -i input -vf subtitles=subfile output

(text with black box border outline)

ffmpeg -i input -vf subtitles=subfile:force_style='BorderStyle=3' output

Where subfile = .srt format subtitle file.

Rotate Video

ffmpeg -i input -vf transpose=# output

Where # = 0,1,2,3 for Vertical Flip, 90 degrees Clockwise, 90 degrees Counterclockwise, 90 degrees Clockwise + Vertical Flip.

Adjust Volume

(1/10x)

ffmpeg -i input -af "volume=0.1" output

(10x)

ffmpeg -i input -af "volume=10" output

Picture in Picture

(Top Right Corner)

ffmpeg -i input -r 29.97 -vf "movie=small, scale=212:120 [vid2]; [in][vid2] overlay=main_w-overlay_w-10:10" output

Where small = the smaller embedded video.

The following PIP is a working example using chain of filters.

// Scale ad.mp4 by half, and overlay it on top of main.mp4, overlaid at middle of main.mp4

ffmpeg -i main.mp4 -i ad.mp4 -filter_complex "[1]scale=iw/2:ih/2 [pip]; [0][pip] overlay=main_w/2:main_h/2"  pip_output.mp4

Adjust Brightness

(darker, val * (< 1))

ffmpeg -i input -vf "lutyuv=val*0.5" output

(brighter, val * (> 1))

ffmpeg -i input -vf "lutyuv=val*2" output


Splicing Video

ffmpeg -i input.wmv -ss 00:00:30.0 -c copy -t 00:00:10.0 output.wmv
ffmpeg -i input.wmv -ss 30 -c copy -t 10 output.wmv


Simulate sending frames (and then playing them back) over a TCP port

Simulate sending frames
ffmpeg -i video.mp4 -f avi -vcodec rawvideo -pix_fmt yuv420p -acodec pcm_alaw tcp://localhost:1234
ffplay tcp://localhost:1234?listen

Correct Timestamps

Correct Timestamps
ffmpeg -i video.mp4 -vsync drop -f avi -vcodec rawvideo -pix_fmt yuv420p -acodec pcm_alaw tcp://localhost:1234


Get Number of Frames From Video File

ffprobe -select_streams v -show_streams constant-frame-rates/1_Jar_jar_Gecko_Commercial.mp4 | grep nb_frames

Install imagemagick

required for 'convert' and 'display' commands used below.

Install imagemagick
brew install imagemagick # on Mac
sudo apt-get install imagemagick # on Ubuntu

Convert between Raw Y bytes files and other common image formats


Convert y <-> png
convert -size 852x480 -depth 8 gray:TimeCode57.y TimeCode57.png # y -> png
convert TimeCode57.png -depth 8 gray:TimeCode57.y # png -> y


Display raw y frame

display -size 256x256 -depth 8 gray:image.y

Or you can always set the output file on a convert command to "x:" which will display instead of save:

convert -size 852x480 -depth 8 gray:TimeCode57.y x:


Add Frame number or timecode to any video

Requires ffmpeg --with-freetype

ffmpeg -i test2.mov  -vf "drawtext=fontfile=Arial.ttf: text=%{n}: x=(w-tw)/2: y=h-(2*lh): fontcolor=white: box=1: boxcolor=0x00000099" -y output.mov

On Linux you need to specify the whole font path: /usr/share/fonts/truetype/msttcorefonts/Arial.ttf


ffmpeg -i TimeCode.mov -r 30 -vf "[in]setpts=0.7992*PTS[middle1];[middle1]scale=960:540[middle] ; [middle]drawtext=fontfile=/Library/Fonts/Arial\ Narrow\ Bold.ttf: text='':timecode='00\:00\:00\:00':r=30: fontcolor=white: fontsize=35: x=750: y=430[out]" -filter:a "atempo=1.25125125125" TimeCode540p.mp4

This one takes every .mp4 file in a directory and rescales it to 1920x1080, and adds a frame counter on the top and bottom left. (Two counters to detect possible tearing artefacts while rendering from ffplay)

for i in `ls *.mp4` ; do ffmpeg -i ${i} -vf "[in]scale=1920:1080[middle];[middle]drawtext=fontfile=/Library/Fonts/Arial.ttf: text=%{n}: x=lh/2: y=h-(3*lh/2): fontcolor=white: box=1: boxborderw=4: boxcolor=0x000000ff: fontsize=32[middle2];[middle2]drawtext=fontfile=/Library/Fonts/Arial.ttf: text=%{n}: x=lh/2: y=lh/2: fontcolor=white: box=1: boxborderw=4: boxcolor=0x000000ff: fontsize=32[out]" -y 1080p/${i} ; done 



Rename captures frames without timecode

Using rename
sudo apt-get install perl # On Ubuntu - rename comes with perl
brew install rename # On Mac
rename 's/(frame.*)-[^\.]*(.*)/$1$2/g'*
Using pure bash
for file in frame*-*.y; do mv $file ${file%%-*.y}.y; done


This renames all files with names like frame213-143920102.y to frame213.y.


Linux (Ubuntu) installation instructions

The instructions on this page will allow you to compile ffmpeg from source on Ubuntu, Debian, or Mint, including many important libraries.

https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu


Reverse video frames (Rotate 180 degrees)

ffmpeg -i input.mp4 -vf "transpose=2,transpose=2,format=yuv420p" -metadata:s:v rotate=0 -codec:v libx264 -codec:a copy output.mp4

(from http://superuser.com/a/578329/152361)

통합이라고 하긴 그렇고,
여러가지 포털 서비스에 있던
블록그들을 통합 해서 하나의 블로그로 쓰려고 합니다.

http://kenny.pe.kr
호스팅 받고, 네이버에서 주신 pe.kr 도메인 붙이고
텍스트 큐브 설치 했어요.

이게 또 얼마나 갈진 모르겠지만 ㅎㅎ

--> 유지 보수의 노력대비 효과가 없어서, 다시 접고
https://ekenny.tistory.com 으로 다시 돌아 왔어요.


포털에서 제공하던 틀에 박혀 있던 블로그에 답답함을 느낀 사용자들이
보다 자신들이 편하게 이용할 수 있는 블로그로 이동하고 있는데,
그 불씨의 화약이 이글루스 였다. 하지만, 이글루스는 SK Communications 에게
인수됨으로서 그 자유성이 포털의 굴레를 벗어나지 못하는 한계를 보여 주었다.
(실제로 그렇지는 않을지 몰라도 사용자들은 그렇게 느끼는거 같다.)

그 전부터 설치형 블로그로 이름이 있던 테터툴즈는 그 설치의 번거로움과 유로
호스팅이 필요하다던 단점 덕분에 대중화와는 조금 먼, 클래식 같은 존재 였으나,
다음과의 제휴를 통한 접근성의 완화를 통해 대중 음악과 같이 편리한 존재로 다가왔다.

아직 수익모델이 확고하지 않고, 다음이 언제까지 서포트 해 줄 수 있을지는 모르겠으나,
비교적 많이 자유로운 형태로의 블로그의 모습을 띄게 되었고,
그 덕분에 다른 형태의 블로그로 부터의 이전도 눈에 띄게 늘고 있다.

이상하게도 서비스의 퀄리티가 비슷비슷해 지니까,
마치 다나와가 처음 나와서, 가격 비교를 하기 시작하니, 단골이 끊어지고,
100원이라도 싼곳이 장사가 잘 되는 것 처럼,
사용자들의 충성도는 점점 떨어지고, 반대로 조금이나마 품질이 좋은 서비스로의
쏠림현상은 심해 지는것 같다.

사용자를 화악! 당길수 있는 절대적인 매리트가 있지 않고서는,
더 이상 경쟁력이 없는,
정말 빨간 바다의 한가운데 존재하는 블로그. 어렵다.

+ Recent posts