💻 프로그래밍/K8s & Docker

local 개발환경 세팅부터 배포까지 - 2부(docker-compose, ssh)

피트웨어 제이 (FitwareJay) 2019. 8. 14. 06:56

안녕하세요! 운동하는 개발자 Jay입니다.

1부에 이어서 오늘은 docker-compose 를 통한 개발환경 세팅을 해보겠습니다.

 

 

 

1. docker-compose 란?


compose는 도커 multi-container Docker application 들을 정의하고 실행시키는 Tool입니다.

compose와 함께 YAML파일을 config로 application service를 사용 할 수 있습니다.

다음과 같은 세가지 step으로 compose를 사용할 수 있습니다.

 

  1. Dockerfile과 함께 app의 환경을 정의합니다. 그리고 이것은 어디서든지 (재)실행시킬 수  있습니다.
  2. docker-compose.yml 에 app을 만들기 위한 서비스를 정의하면, 독립적인 환경에서 함께 실행시킬 수 있습니다.
  3. docker-compose up 그리고 compose start 로 완전한 app을 실행합니다.

* docker-compose.yml 은 아래처럼 정의 됩니다.

version: '3'
services:
    web
        build: .
        ports:
        - "5000:5000"
        volumes:
        - .:/code
        - logvolume01:/var/log
        links:
        - redis
    redis:
        image: redis
volumes:
    logvolume01: {}

위 내용을 보면, web, redis 앱을 띄우는 서비스를 실행하는 것을 의미합니다. 

ports host port를 docker port로 포워딩 해주는 port 설정
volumes host 경로 또는 생성된 volume으로 마운트
links container에서 다른 container로 접속하기 위한 설정, 이때 IP가 아닌 hostname으로 접속
environment 환경 변수 추가
networks 네트워크 설정 (각각의 컨테이너가 속해있는 네트워크에서만 서로 통신이 가능)
image 사용할 도커 이미지

참고로 version은 compose로 실행하는 서버들의 version을 의미하는게 아니라 compose의 버전을 의미합니다. 

version: 1 은 서비스가 곧 종료된다고 하니 2 이상을 사용하면 됩니다.

 

* compose referene: https://docs.docker.com/compose/compose-file/

* docker-compose 설치: https://docs.docker.com/docker-for-mac/install/

 

 

 

2. docker-compose 작성


여기까지 정리해 보면, docker-compose는 docker container를 여러개 띄울수 있고, 관리할 수 있는 tool입니다.

docker composer가 설치되면, docker-compose.yml을 작성해보겠습니다.

 

docker-compose 가 제대로 설치 되었는지 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
version: '2' 
services:
  #배포 테스트용
  deploy:
    image: ubuntu:16.04
    container_name: bt-deploy
    volumes:
      - /Users/jay/.ssh:/root/.ssh
      - /Users/jay/.ssh:/home/deploy/.ssh
    tty: true
    links:
      - api:bt-api.docker
    networks:
      - back
 
  api:
    image: ubuntu:16.04
    container_name: bt-api
    volumes:
      - /Users/jay/.ssh:/root/.ssh
      - /Users/jay/.ssh:/home/deploy/.ssh
    tty: true
    links:
      - db:bobtong_db.docker
    networks:
      - back
 
networks:
  back:
    external: true # docker compose 외부에 volume이 존재 할때
cs

version:2 의 compose를 사용하고, deploy, api 서비스를 띄울겁니다.

deploy는 배포 서버로 사용될 것이며, 로컬에서 바로 배포하는게 아닌 deploy 서버를 따로 만드는 이유는 mac에서 ip로 docker container로 접속해서 배포하는게 문제(?)가 있다고 들었습니다.

(이 부분에 대해서는 좀 더 알아보고 추가하도록 하겠습니다)

 

정리하자면, deploy -> api 로 배포하는 형태의 개발환경입니다.

tty: true 는 콘솔 터미널 실행(?)을 의미하는데, 이걸 정의해주지 않으면 container가 바로 종료됩니다.

작성된 compose 파일이 있는 폴더로 가서, docker-compose up 명령어를 실행합니다.

 

* docker-compose 명령어

up 서비스 시작, 컨테이너가 생성된 상태가 아니면 새로 생성
down 서비스 종료, 컨테이너가 아예 삭제됨. 이미지를 저장하지 않으면 그동안 작업했던 내용이 날라감.
start 존재하는 컨테이너 시작
stop 존재하는 컨테이너 정지
restart 존재하는 컨테이너 재시작

 

 

 

3. Container에서 Container SSH 접속


* SSH(Secure Shell)네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사할 수 있도록 해 주는 응용 프로그램 또는 그 프로토콜을 가리킨다. (출처: 위키백과)

 

(SSH 참고 블로그 : http://delspon.blogspot.com/2015/05/ssh.html)

 

SSH란 무엇인가?

SSH란 무엇인가? SSH는 안전한 원격 통신을 위해 사용된다. SSH가 사용되기 이전에는 텔넷(Telnet)이 사용되었다. 텔넷 통신에는 기본적으로 23번 포트가 사용되었다. 통신에서 데이터를 암호화하는 과정이 없기 때문에 같은 네트워크 상...

delspon.blogspot.com

배포를 위해서는 서버에서 서버로 접속할 수 있어야 합니다. ssh를 이용해 접속해보도록 하겠습니다.

먼저 각 서버에서 해줘야할 세팅을 아래 step으로 진행하도록 하겠습니다.

 

- deploy 서버

1. docker exec -it "컨테이너명" /bin/bash (컨테이너 터미널 접속)

2. apt-get update

3. apt-get install ssh(서버만 설치할 경우 openssh-server

4. service ssh start

처음 접속시 apt-get update 를 실행해야 install을 할 수 있습니다.

apt-get update 하지 않고 package install을 실행했을때

- api 서버

1. docker exec -it "컨테이너명" /bin/bash (컨테이너 터미널 접속)

2. apt-get update

3. apt-get install ssh(서버만 설치할 경우 openssh-server

4. service ssh start

5. apt-get install vim (vi 텍스트 편집기)

6. vi /etc/ssh/sshd_config 에서 22번 포트 개방

처음 접속시 apt-get update 를 실행해야 install을 할 수 있습니다.

22번 포트는 ssh 전용 포트입니다. 

추가로 root말고 deploy 계정을 만들어 줍니다. adduser deploy

 

- deploy -> api, ssh 접속

ssh-keygen 공용, 개인키 생성
ssh-copy-id 로컬호스트의 공용 키를 원격 호스트의 authorized_keys 파일에 복사.
또한 알맞은 권한을 원격 호스트의 홈, ~/.ssh, ~/.ssh/authorized_keys에 부여합니다.

deploy서버에서 ssh-keygen으로 공용, 개인키를 생성한 후, ssh-copy-id deploy@'컨테이너명' 명령어로 api서버로 authorized_keys를 복사합니다.

이제, ssh deploy@bt-api 명렬어로 접속을 시도하면

deploy 서버에서 api서버에 deploy 계정으로 접속

정상적으로 접속한 화면을 볼 수 있습니다.

 

혹시나, docker-compose down하고 up으로 재실행 시켰을때 SSH 접속하면 아래와 같은 메시지를 볼 수 있습니다.

RSA 공유키 충돌

기존에 이미 동일한 IP로 접속한 상태에서 서버가 바뀌었기 때문에 나오는 오류입니다. 

ssh-keygen -R [ IP or DomainName] 명령어로 known_hosts를 초기화 해줍니다.

다시 ssh 로 접속을 하면, 정상적으로 접속이 됩니다.

왠만하면 docker-compose down을 하기 전에는 image를 commit해서 저장해놉시다. 

 

 

 

4. 2부를 마치며...


2부에서는 간단히 docker-compose와 ssh에 대해서 알아봤습니다.

ssh같은 경우에는 별거 아닌데 처음에 많이 해매게 되더라고요.(저같은 경우엔...) 몇번 해보다 보면 익숙해집니다 ㅎㅎ

개발환경은 구성했으니, 3부에서는 배포를 위한 fabric 에 대해 알아보겠습니다.

감사합니다.