Docker compose(도커 컴포즈)란?

복수 개의 컨테이너를 실행시키는 도커 애플리케이션을 정의하기 위한 툴이다.

 

도커 컴포즈를 이용해, DB와 Wordpress 두개의 컨테이너를 만들어 실행해서 워드프레스를 설치해보도록 하겠다.

시작 전에 도커 컴포즈가 설치되어 있어야 한다. https://docs.docker.com/compose/install/

 

프로젝트 정의

1. 빈 프로젝트 디렉토리를 생성한다.

디렉토리 명은 편한것으로 만들면 된다. 이 디렉토리 안에 docker-compose.yml 파일을 저장할 것이다.

 

2. 방금 만든 디렉토리 안으로 이동한다.

예를 들어, my_wordpress라는 폴더를 만들었다면 아래 명령으로 해당 디렉토리 안으로 이동 가능하다 :

$ cd my_wordpress/

 

3. 아래의 내용으로 docker-compose.yml 파일을 생성한다. (워드프레스 블로그와, 볼륨 마운드를 한 별도의 MySQL 인스턴스를 생성할 수 있는 스크립트이다.)

services:
  db:
    # We use a mariadb image which supports both amd64 & arm64 architecture
    image: mariadb:10.6.4-focal
    # If you really want to use MySQL, uncomment the following line
    #image: mysql:8.0.27
    command: '--default-authentication-plugin=mysql_native_password'
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=somewordpress
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wordpress
      - MYSQL_PASSWORD=wordpress
    expose:
      - 3306
      - 33060
  wordpress:
    image: wordpress:latest
    ports:
      - 80:80
    restart: always
    environment:
      - WORDPRESS_DB_HOST=db
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=wordpress
      - WORDPRESS_DB_NAME=wordpress
volumes:
  db_data:

 

프로젝트 빌드

프로젝트 디렉토리 안에서 아래 명령을 실행한다.

$ docker compose up -d

위 명령은 docker compose up 을 detached mode로 실행하고, 도커 이미지를 가져오고, 워드프레스와 데이터베이스 컨테이너를 시작한다. 

브라우저에서 워드프레스 접속 및 설치

이제, 워드프레스가 도커 호스트의 80 포트에서 동작한다. 브라우저로 접속해보면, 설지 시작 화면을 볼 수 있다.

도커가 로컬호스트에 설치되어 있다면, 브라우저 주소창에 http://localhost  를 입력하면 접속 가능하다.

원격 서버에 설치되어 있다면, localhost 대신 서버의 ip 주소나, 도메인명을 입력하면 된다.

종료 및 삭제

컨테이너와 기본 네트워크를 종료하지만 워드프레스 데이터베이스를 남기고 싶다면 docker compose down 명령을 입력한다.

컨테이너, 기본 네트워크, 데이터베이스까지 모두 삭제하고 싶다면 docker compose down --volumes 명령을 입력한다.

 

참고

https://docs.docker.com/samples/wordpress/

 

도커란?

컨테이너 기반의 오픈소스 가상화 플랫폼이다. 어플리케이션을 인프라스트럭처와 분리하여 신속하게 개발, 배포, 운영할 수 있게 해준다.  Docker는 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있다. Docker를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있으며 코드가 문제없이 실행될 것임을 확신할 수 있다.

 

가상화란, 물리적 자원인 하드웨어를 효율적으로 활용하기 위해서 하드웨어 공간 위에 가상의 머신을 만드는 기술이고

컨테이너란, 컨테이너가 실행되고 있는 호스트 os의 기능을 그대로 사용하면서 프로세스를 격리해 독립된 환경을 만드는 기술이다.

 

도커를 사용하는 이유

  • 개발 과정에서 다른 라이브러리와 충돌하는 것을 방지하기 위해 격리된 환경이 필요할 때(컨테이너 별로 상이한 설정이 가능, 서로 간섭 안받음)
  • 개발 환경과 운영 환경의 동일성이 보장됨(실행환경의 비일관성 문제가 해결됨)
  • 완성된 서비스를 배포할 때, 또는 배포 중인 서비스를 받아서 실행해 볼 때 용이함(이미지만 가져다 컨테이너에 올리면 됨)
  • 운영중인 서버를 다른 서버로 옮겨야 할 때(서버 스펙이 달라져도 동일한 실행을 보장)
  • 다수의 서버를 운영해야 할 때 (클라우드 서버를 이용하거나, 로드 분산을 위해 동일한 서비스를 여러 서버에 배포해야 하는 등의 경우, 다수 서버를 각각 설정할 필요 없으므로 배포 및 관리가 쉬워짐)

 

도커 아키텍처

도커는 클라이언트-서버 아키텍처를 사용한다. 도커 데몬은 컨테이너를 빌드, 실행, 배포하는 역할을 담당하고, 도커 클라이언트는 이러한 도커 데몬과 REST API로 통신한다. 도커 클라이언트와 데몬은 한 컴퓨터 내에서 실행될 수도 있고, 별개의 컴퓨터에서 실행될 수도 있다.

도커 데몬 (The Docker daemon)

도커 데몬은, 도커 API 요청을 받아 도커 객체(이미지, 컨테이너, 네트워크 볼륨 등)을 관리하는 역할을 한다.

 

도커 클라이언트 (The Docker client)

도커 클라이언트는, 사용자가 도커와 상호작용 하는 주요 수단이다. 사용자가 docker run 같은 명령어를 사용하면, 도커 클라이언트가 해당 명령을 데몬에 보내고, 데몬이 명령을 수행한다. 도커 클라이언트는 하나 이상의 데몬과 통신할 수 있다.

 

도커 데스크탑 (Docker Desktop)

도커 데스크탑은 컨테이너화된 애플리케이션과 마이크로서비스를 구축하고 공유할 수 있는 Mac, Windows 또는 Linux 환경을 위한 설치하기 쉬운 애플리케이션이다. 도커 데스크탑에는 도커 데몬(dockerd), 도커 클라이언트(docker), Docker Compose, Docker Content Trust, Kubernetes 및 Credential Helper가 포함된다.

 

도커 레지스트리 (Docker registries)

도커 레지스트리는 도커 이미지를 저장한다. 도커 허브(Docker Hub)는 공개된 레지스트리(저장소)로, 누구나 이용 가능하다.  도커는 기본적으로 도커 허브에서 이미지를 찾도록 설정되어 있으나, 자신만의 비공개 레지스트리를 운영하는 것도 가능하다.

 

도커 객체

Docker를 사용하면 이미지, 컨테이너, 네트워크, 볼륨, 플러그인 및 기타 개체를 만들고 사용하게 된다. 이러한 개체 중 일부에 대한 간략한 개요를 살펴보면 다음과 같다.

 

이미지

이미지는 읽기 전용 템플릿으로, 도커 컨테이너를 생성하는 명령어들이 포함되어 있다. 주로 이미지는, 다른 이미지를 기반으로 생성해서 약간의 커스터마이징을 하게 된다. 예를 들어, 사용자는 ubuntu 이미지를 기반으로 이미지를 빌드하여 아파치 웹 서버나 다른 어플리케이션을 설치 및 설정 할 수 있다.

 

이미지는 직접 생성하거나, 공개된 레지스트리에 등록된 이미지를 가져다 사용할 수도 있다. 자신만의 이미지를 생성하려면, 이미지 생성하는 명령과 스텝을 기술한 Dockerfile을 작성하고 실행하면 된다. Dockerfile의 각 명령은 이미지 안의 하나의 레이어를 생성한다. Dockerfile을 변경하고 이미지를 다시 빌드하면, 변경된 레이어만 다시 빌드된다. 이점이 이미지를 가볍고, 작고, 빠르게 만들 수 있는 기술이다.

 

컨테이너

컨테이너는 이미지의 실행 가능한 인스턴스이다. 사용자는 Docker API나 CLI를 이용해 컨테이너를 생성, 시작, 중지, 이동, 삭제할 수 있다. 컨테이너를 하나 이상의 네트워크에 연결하거나, 스토리지를 연결하거나, 현재 상태를 기반으로 새 이미지를 생성할 수도 있다.

 

기본적으로 컨테이너는 다른 컨테이너 및 해당 호스트 시스템과 비교적 잘 격리되어 있다. 컨테이너의 네트워크, 스토리지 또는 기타 기본 하위 시스템이 다른 컨테이너나 호스트 시스템과 얼마나 격리되었는지 제어할 수 있다.

컨테이너는 이미지 + 환경설정 옵션(컨테이너를 만들거나 시작할때 설정 옵션 추가 가능)으로 정의된다. 컨테이너가 제거되면 영구 저장소에 저장되지 않은 상태 변경 사항은 사라진다.

 

 

참고

https://docs.docker.com/get-started/overview/

https://en.wikipedia.org/wiki/Docker_(software) 

https://velog.io/@markany/%EB%8F%84%EC%BB%A4%EC%97%90-%EB%8C%80%ED%95%9C-%EC%96%B4%EB%96%A4-%EA%B2%83-1.-%EB%8F%84%EC%BB%A4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

1. 수정된 파일의 차이점 보기

git diff filename

2. 수정된 파일 히스토리 보기

git log --follow -p -- filename

3. 누가 어느 부분을 수정했는지 보기

git blame filename

4. 커밋 내용만 보기

git log --follow filename

git을 사용해서 원격 저장소를 clone 해오면, master 브랜치만 가져와지고 다른 브랜치들은 로컬로 가져와지지 않는다.

다른 브랜치들은 따로 가져와야 한다.

 

원격 저장소 정보 업데이트

git remote를 갱신해서 원격 브랜치들의 정보를 최신으로 업데이트 한다.

(업데이트 안하면, 새로 추가된 원격 브랜치들이 조회가 안된다.)

$ git remote update

 

원격 저장소 branch 확인

1. 원격 저장소의 branch 리스트 보기

$ git branch -r

 

2. 원격, 로컬 모든 저장소의 branch 리스트 보기

$ git branch -a

 

원격 저장소의 branch 가져오기

1. 로컬에 원격 저장소와 동일한 이름의 branch를 생성하며 해당 브랜치로 checkout하기

$ git checkout -t [원격 저장소의 브랜치 이름]

 

원격 저장소의 test라는 브랜치를 가져오고 싶은 경우, 아래처럼 하면 된다.

$ git checkout -t origin/test

 

2. branch 이름을 변경하며 가져오고 싶은 경우

$ git checkout -b [생성할 브랜치 이름] [원격 저장소의 브랜치 이름]

 

test라는 브랜치를 new_test라는 이름으로 가져오고 싶은 경우, 아래처럼 하면 된다.

$ git checkout -b new_test origin/test

 

Git은 브랜치별로 소스를 관리하기 편하다.

개발하려는 기능을 새로운 브랜치를 만들어 작업한 후, 작업이 완료되면 master로 통합해주는 방식으로 많이 활용된다.

 

아래는 쉘에서 사용 가능한 브랜치 관련 git 명령어들이다.

 

1. 브랜치 생성

git branch 명령으로, test라는 브랜치를 만든다

$ git branch test

 

2. 브랜치 이동

git checkout 명령으로 test라는 브랜치로 이동한다.

$ git checkout test

 

3. 브랜치 이름 변경

로컬 저장소의 브랜치 이름 변경

$ git branch -m [old_branch] [new_branch]

 

test라는 브랜치의 이름을, new_test로 변경하는 예는 다음과 같다.

(브랜치 명령어는 브랜치만 생성하기 때문에, 작업을 하려면 checkout을 해야 한다.)

$ git branch -m test new_test
$ git checkout new_test

 

원격 저장소의 브랜치 이름 변경

원격 저장소의 old_branch를 삭제하고, new_branch를 push 해주면 된다. 아래의 명령어로 한번에 할 수 있다.

$ git push origin :[old_branch] [new_branch]

 

원격 저장소의 test라는 브랜치를 new_test라는 브랜치명으로 바꾸는 예는 다음과 같다.

$ git push origin :test new_test

 

4. 브랜치 합치기

두 브랜치를 합치는 방법으로는, Merge와 Rebase가 있다.

양자는 최종 결과물은 같고, 커밋 히스토리만 다르다.

Rebase 는 브랜치의 변경사항을 순서대로 다른 브랜치에 적용하면서 합치고,

Merge는 두 브랜치의 최종 결과만을 가지고 합친다.

 

브랜치 Merge

git merge 명령으로, test 브랜치를 master 브랜치에 합친다.

$ git checkout master
$ git merge test

 

브랜치 Rebase

rebase를 통해 test 브랜치를 master에 합치는 예는 다음과 같다.

$ git checkout test
$ git rebase master
$ git checkout master
$ git merge test

Rebase시 주의! 

이미 공개 저장소에 Push한 커밋을 Rebase 해서 다시 push 하지 마라.

Rebase는 기존의 커밋을 그대로 사용하는 것이 아니라 내용은 같지만 다른 커밋을 새로 만든다.

따라서 이미 공개 저장소에 c1이라는 커밋을 push 해서 다른 사람이 그 커밋을 바탕으로 작업을 했는데, 해당 커밋 c1을 rebase로 다시 push 해버리면, 동료는 rebase 내용을 pull 했을 때 본인의 코드와 충돌이 일어나게 된다.

그래서인지, rebase는 로컬작업에서만 사용하라고 권장하는 사람들도 있다.

 

합친 브랜치 master를 원격 저장소에 push하기

$ git push origin master

 

5. 브랜치 삭제

merge 후 필요 없어진 브랜치는 삭제한다.

$ git branch -d [branch_name]

 

아래는 test라는 브랜치를 삭제하는 예이다.

$ git branch -d test

1. clone

원격 저장소를 내 컴퓨터에 복제한다. (폴더명을 입력해주면, 폴더가 생성되며 그 안으로 원격 저장소가 복제된다.)

git clone [클론할 git repository 주소] [폴더명]

 

2. checkout

특정 브랜치를 가져온다.

git checkout [브랜치명]

 

3. username과 email 설정

커밋을 하려면 내가 누구인지를 설정해 주어야 한다. (그래야 누가 커밋했는지 알 수 있음)

--global : 모든 프로젝트에 이 계정을 적용

git config --global user.name "Your Name"
git config --global user.email you@example.com

 

4. add

생성한 파일을 git 인덱스에 추가한다. (커밋을 위한 준비)

git add "생성한 파일명"

 

5. commit

인덱스에 추가된 파일을 로컬 저장소에 커밋한다.

git commit -m "커밋 메시지"

 

6. push.default 설정

push의 기본동작을 matching과 simple 중에 선택할 수 있다.

1) matching : 전체 브랜치 push

git config --global push.default matching

 

2) simple : 현재 브랜치만 push

git config --global push.default simple

 

7. push

로컬 커밋 내용을 원격 저장소에 반영한다.

1) master 브랜치에 push하는 경우

git push origin master

2) 이미 브랜치가 설정되어 있다면, git push만 해도 된다.

git push

 

1. 터미널에 git 설치 명령어 입력

# yum install git

 

2. 중간에, disk size 보여주고, 계속 할지 물어보면 y 입력

=============================================================================================================================================================================================
 Package                                            Arch                                     Version                                            Repository                              Size
=============================================================================================================================================================================================
Installing:
 git                                                x86_64                                   1.8.3.1-23.el7_8                                   base                                   4.4 M
Installing for dependencies:
 perl-Error                                         noarch                                   1:0.17020-2.el7                                    base                                    32 k
 perl-Git                                           noarch                                   1.8.3.1-23.el7_8                                   base                                    56 k
 perl-TermReadKey                                   x86_64                                   2.30-20.el7                                        base                                    31 k
 rsync                                              x86_64                                   3.1.2-10.el7                                       base                                   404 k

Transaction Summary
=============================================================================================================================================================================================
Install  1 Package (+4 Dependent packages)

Total download size: 4.9 M
Installed size: 23 M
Is this ok [y/d/N]: y

3. 완료됨. 간단하다. (아래는 완료 화면)

Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : 1:perl-Error-0.17020-2.el7.noarch                                                                                                                                         1/5
  Installing : rsync-3.1.2-10.el7.x86_64                                                                                                                                                 2/5
  Installing : perl-TermReadKey-2.30-20.el7.x86_64                                                                                                                                       3/5
  Installing : perl-Git-1.8.3.1-23.el7_8.noarch                                                                                                                                          4/5
  Installing : git-1.8.3.1-23.el7_8.x86_64                                                                                                                                               5/5
  Verifying  : git-1.8.3.1-23.el7_8.x86_64                                                                                                                                               1/5
  Verifying  : 1:perl-Error-0.17020-2.el7.noarch                                                                                                                                         2/5
  Verifying  : perl-TermReadKey-2.30-20.el7.x86_64                                                                                                                                       3/5
  Verifying  : perl-Git-1.8.3.1-23.el7_8.noarch                                                                                                                                          4/5
  Verifying  : rsync-3.1.2-10.el7.x86_64                                                                                                                                                 5/5

Installed:
  git.x86_64 0:1.8.3.1-23.el7_8

Dependency Installed:
  perl-Error.noarch 1:0.17020-2.el7              perl-Git.noarch 0:1.8.3.1-23.el7_8              perl-TermReadKey.x86_64 0:2.30-20.el7              rsync.x86_64 0:3.1.2-10.el7

Complete!

원격지원이란?

원격 지원(遠隔 支援, Remote Support)이란 특정 사람 혹은 단체에게 일정 거리 이상 멀리 떨어진 온라인 상에서 소수 또는 다수의 공급자가 서비스나 용역을 제공하는 것을 말한다.

 

출처: <https://ko.wikipedia.org/wiki/%EC%9B%90%EA%B2%A9_%EC%A7%80%EC%9B%90>

 

원격지원 소프트웨어란(Remote Desktop Software)?

컴퓨터를 별도의 클라이언트에서 원격으로 실행하는 것을 허용하는 소프트웨어나 운영체제 기능.

개인용 컴퓨터의 데스크탑 환경이 하나의 시스템(일반적으로 PC이지만 개념은 서버에도 동일하게 적용됨)에서 원격으로 실행되는 동시에 별도의 클라이언트 장치에 표시되도록 하는 소프트웨어 또는 운영 체제 기능이다.

software or operating system feature that allows a personal computer's desktop environment to be run remotely on one system (usually a PC, but the concept applies equally to a server), while being displayed on a separate client device.

 

출처: <https://en.wikipedia.org/wiki/Remote_desktop_software>

 

원격지원의 목적

1. 내 컴퓨터를 원격에서 제어하기 위한 목적 (장소에 상관 없이 내 컴퓨터/회사 컴퓨터에 접속하기 위한 용도)

2. 불특정 다수의 다른 사람들 컴퓨터를 제어하기 위한 목적 (고객지원 용도)

 

같은 원격지원 기술을 이용하지만, 위 두 경우는 용도가 다르다. 따라서 원격지원 솔루션 업체마다 두 가지를 다른 상품으로 판매하는 경우들이 있다. (일반적으로 1번이 조금 더 저렴하다.)

 

원격지원 소프트웨어 비교

검색해보면 원격지원 소프트웨어들이 굉장히 많다.

 

팀뷰어, 알서포트(리모트 ), 애니데스크, 프리모, Iperius 리모트, VNC 연결, Ammy.y Admin, ThinVNC, UltraVNC, 스플래시탑(SplashTop), 리모트(국내), 이지리모트(국내) 등등...

 

그 중 고객지원 용도로 사용할, 대표적인 4가지를 비교해보고자 한다.

4가지 모두 기본적인 원격지원 기능은 잘 갖추어진듯 하여, 결국은 가격/기타 편의성 등이 관건일듯 싶다.

 

결론은 (내 개인적인 생각),

  • 무난한 것은 팀뷰어
  • 가격 상관 없이, 아시아에 최적화된 프로그램을 찾는다면 리모트콜
  • 저렴한 것을 찾는다면 애니데스크나 수프리모
    • 방화벽 등록을 해야 하는게 문제가 안된다면 애니데스크(일단 한글지원이 된다, 연결이 팀뷰어보다 훨씬 편하다)
    • 방화벽에서 자유로운 상품을 찾는다면 수프리모(근데 영어다..)
  • 근데.. 써볼수록 애니데스크가 팀뷰어보다 편한 느낌도 든다.. 일단 연결할때 비밀번호 안불러도 되는 것이 엄청 큰 메리트! 연결에 부담이 없고 빠르다.
  팀뷰어(TeamViewer) 알서포트
리모트콜(RemoteCall)
애니데스크(AnyDesk) 수프리모(Supremo)
특징 - 세계에서 가장 많이 사용되는 제품
- 애니데스크나 수프리모에 비해 기능이 조금 더 많은듯
- 아시아 1위
(아시아 환경에 최적화)
- 팀뷰어에 비해 가벼움
- 가입하지 않아도 사용 가능
- 원격 연결 요청 > 상대방의 '승인' 버튼 클릭이면 연결이 됨
- 방화벽 등록 필요 없음
파일전송 가능 O O O O
원격재부팅 가능 O O O O
한국어 지원 O O O X
기타 - 해킹이슈?
- 첫 실행 시, 라이센스 동의창이 뜸
- 비쌈 - 첫 실행 시, 방화벽 등록창이 뜸 => '허용' 눌러주면 됨.
(사실 '허용' 누르기 전에도 이미 원격이 연결되어 상대방 컴퓨터가 보임)
- 첫 실행 시, 라이센스 동의 창이 뜸(중간에 password 넣는 부분이 있어 뭐지? 하고 당황하게 됨) => 그냥 Accept 눌러주고 실행 가능
제작사 국가 독일 한국 독일 이탈리아
가격 42,900원/월
(연단위 결제만 가능)
>> 약 52만원/년
130,000원/월
(월단위 결제 가능)
>> 약 156만원/년
19.9달러/월
(연단위 결제만 가능)
>> 약 29만원/년
178유로/년
(분기별, 연단위 결제 가능. 분기별 결제시 가격이 더 올라감)
>> 약 25만원/년
무료정책 비상업용 무료
(but 라이센스 잘 막힘..)
14 무료 체험 비상업용 무료
(팀뷰어보다 완화된 정책)
비상업용, 비정기적 사용 무료

+ Recent posts