Customizing the SSH Daemon

SSH 설정을 변경할 수 있습니다.  

Cloud-Config

#cloud-config
 
ssh_authorized_keys:
  - ssh-rsa AAAAB3NzaC1y.....
 
write_files:
  - path: /etc/ssh/sshd_config
    permissions: 0600
    owner: root:root
    content: |
      # Use most defaults for sshd configuration.
      UsePrivilegeSeparation sandbox
      Subsystem sftp internal-sftp
      PermitRootLogin no
      AllowUsers core
      PasswordAuthentication no
      ChallengeResponseAuthentication no
 
coreos:
  units:
    - name: sshd.socket
      command: restart
      content: |
        [Unit]
        Description=OpenSSH Server Socket
        Conflicts=sshd.service

        [Socket]
        ExecStartPre=/usr/bin/sleep 5
        ListenStream=2022
        ReusePort=true
        FreeBind=true
        Accept=yes

        [Install]
        WantedBy=sockets.target

'CoreOS' 카테고리의 다른 글

[CoreOS] CoreOS SSH 설정 변경  (0) 2017.01.28
[CoreOS] cloud-config 파일 설정  (0) 2017.01.28
[CoreOS] 네트워크 설정  (0) 2017.01.28
[CoreOS]CoreOS란?  (0) 2017.01.28
[CoreOS] cloud-config 파일 유효성 검사  (0) 2017.01.28
[CoreOS] CoreOS 업데이트  (0) 2017.01.28

Cloud-Config

https://coreos.com/os/docs/latest/cloud-config.html Cloud-Conifg는 CoreOS 설치시 꼭 필요한 config 파일이며, config파일없이 설치되지 않습니다. OS설치시 필요한 네트워크설정, User설정들 다양한 설정을 할 수 있습니다.

Write Files

CoreOS 설치시 파일을 생성할 수 있다.

#cloud-config
 
coreos:
  write_files:
    - path: /etc/systemd/system/discovery.service
      owner: root:root
      permissions: '0644'
      content: |
        [Unit]
        Description=Private Token Discovery Service
        After=docker.service
        Requires=docker.service
 
        [Service]
        TimeoutStartSec=0
        ExecStartPre=-/usr/bin/docker kill discovery
        ExecStartPre=-/usr/bin/docker rm discovery
        ExecStartPre=/usr/bin/docker pull quay.io/coreos/discovery.etcd.io
        ExecStart=/usr/bin/docker run -d --name=discovery -p 80:8087 quay.io/coreos/discovery.etcd.io
        ExecReload=/usr/bin/docker restart discovery
        ExecStop=/usr/bin/docker stop discovery
 
        [Install]
        WantedBy=multi-user.target

'CoreOS' 카테고리의 다른 글

[CoreOS] CoreOS SSH 설정 변경  (0) 2017.01.28
[CoreOS] cloud-config 파일 설정  (0) 2017.01.28
[CoreOS] 네트워크 설정  (0) 2017.01.28
[CoreOS]CoreOS란?  (0) 2017.01.28
[CoreOS] cloud-config 파일 유효성 검사  (0) 2017.01.28
[CoreOS] CoreOS 업데이트  (0) 2017.01.28

Network Configuration

네트워크 설정 가이드

https://coreos.com/os/docs/latest/network-config-with-networkd.html

https://github.com/coreos/docs/blob/master/os/network-config-with-networkd.md

 Static IP Configuration

#cloud-config

coreos:
  units:
    - name: 00-eth0.network
      runtime: true
      content: |
        [Match]
        Name=eth0

        [Network]
        DNS=1.2.3.4
        Address=10.0.0.101/24
        Gateway=10.0.0.1 

Multi IP Configuration

#cloud-config
 
coreos:
  units:
    - name: 20-multi_ip.network
      content: |
        [Match]
        Name=eth0

        [Network]
        DNS=8.8.8.8
        Address=10.0.0.101/24
        Gateway=10.0.0.1
        Address=10.0.1.101/24
        Gateway=10.0.1.1


'CoreOS' 카테고리의 다른 글

[CoreOS] CoreOS SSH 설정 변경  (0) 2017.01.28
[CoreOS] cloud-config 파일 설정  (0) 2017.01.28
[CoreOS] 네트워크 설정  (0) 2017.01.28
[CoreOS]CoreOS란?  (0) 2017.01.28
[CoreOS] cloud-config 파일 유효성 검사  (0) 2017.01.28
[CoreOS] CoreOS 업데이트  (0) 2017.01.28

CoreOS란

  • Docker구동에 특화된 리눅스OS를 목표로 탄생한 OS
  • 최소화된 경량 OS이고, 기존 리눅스에 비해 메모리를 40%정도 적게 사용한다
  • A/B 테스트 방식의 업데이트 (CoreUpdate)
    • CoreOS는 OS용으로 2개의 부트파티션을 가지고 있음.
    • OS업데이트는 B파티션에서 수행함으로서 현재 운영중인A파티션의 실행에는 영향이 없고, 업데이트가 끝나면 리부트 후 바로 업데이트가 적용된 B파티션 OS로 스위칭 되므로 매우 빠르고 안정적인 OS업데이트가 가능해진다.
    • 업데이트시 구글이 개발한 Omaha protocol을 사용하여 업데이트를 진행한다.
  • CoreOS 클러스터링 지원

구성

  • Linux Kernal
  • Docker
  • Systemd
  • etcd2
    • key-value store
    • CoreOS에서 데이터를 공유하기 위해 사용함.
  • fleet
    • Distributed Init System
  • flannel
  • rkt

Architecture

CoreOS 클러스터를 구성하여 Docker Container를 띠우고 특정 클러스터 한대를 정지시키면 정지된 Docker Container를 다른 클러스터에 생성한다.



'CoreOS' 카테고리의 다른 글

[CoreOS] cloud-config 파일 설정  (0) 2017.01.28
[CoreOS] 네트워크 설정  (0) 2017.01.28
[CoreOS]CoreOS란?  (0) 2017.01.28
[CoreOS] cloud-config 파일 유효성 검사  (0) 2017.01.28
[CoreOS] CoreOS 업데이트  (0) 2017.01.28
[CoreOS] CoreOS 설치  (0) 2015.11.14

Web Version

https://coreos.com/validate/

위의 홈페이지에 접속 후 cloud-config.yaml 파일 내용을 복사해서 붙여넣기 한 후에 Validate버튼을 누르면 문법 오류를 알려줍니다.

Command Line

CoreOS Command에서 아래의 명령어를 수행하면 위의 WebVersion과 동일하게 문법 오류를 알려줍니다.

$ sudo coreos-cloudinit -from-file=/path/cloud-config.yaml -validate


Command Update

CoreOS 업데이트는 자동스케쥴링 하지않고 수동으로 업데이트 합니다. 아래의 명령어를 수행하면 업데이트 후 재시작합니다.

https://github.com/coreos/docs/blob/master/os/switching-channels.md

https://github.com/coreos/docs/blob/master/os/update-strategies.md

$ sudo update_engine_client -check_for_update  

Cloud Config

#cloud-config
 
coreos:
  update:
    reboot-strategy: "best-effort"
    group: "stable"


'CoreOS' 카테고리의 다른 글

[CoreOS]CoreOS란?  (0) 2017.01.28
[CoreOS] cloud-config 파일 유효성 검사  (0) 2017.01.28
[CoreOS] CoreOS 업데이트  (0) 2017.01.28
[CoreOS] CoreOS 설치  (0) 2015.11.14
Vagrant 사용하지 않고 CoreOS 3대 클러스터링하기 (VirtualBox)  (0) 2015.11.14
Kubernetes  (0) 2015.11.14

Host OS Timezone 설정

$ sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
$ cat /etc/localtime 


Docker Container Timezone 설정

아래의 명령어처럼 Docker 실행시 localtime 파일을 지정해주어야 한다.


$ sudo docker run -v /etc/localtime:/etc/localtime:ro -it busybox date


Docker 컨테이너 이미지를 생성하여 Private Docker registry에 올리는 방법을 설명합니다.

Dockerfile 작성

자세한 설명은 공식 홈페이지(https://docs.docker.com/engine/reference/builder/) 를 참고하시면 됩니다. 아래의 예시는 nginx 컨테이너를 그대로 사용하는 예시입니다. nginx컨테이너를 받아서 사용하지않고 만드는 방법도 가능합니다.

//원본 컨테이너 이름과 버전을 명시합니다.
FROM nginx:1.10
MAINTAINER name <test@email.com>

Build & Push

Dockerfile 을 기준으로 빌드를 해야합니다.

$ docker build -t Private저장소주소/Container 이름:버전 -f Dockerfile Path
# 예시
$ docker build -t docker.test.com/nginx:1.10 -f ./Dockerfile

 
# Docker Container 이미지를 커밋하고 푸쉬하기 위해 실행해야합니다.
$ docker run -d --name nginx1 docker.test.com/nginx:1.10
 
# Docker Container 이미지 Commit
$ docker commit -m "커밋 메세지" "실행시 옵션으로 주었던 --name" Private저장소주소/Container 이름:버전
# 예시
$ docker commit -m "add nginx:1.10" nginx1 docker.test.com/nginx:1.10

 
//Push
$ docker push docker.test.com/nginx:1.10


Go 인스턴스 실행

이 이미지를 사용하는 가장 직접적인 방법은 Go 컨테이너를 빌드 및 런타임 환경으로 사용하는 것입니다. Dockerfile에서 다음 내용을 따라 뭔가를 작성하면 프로젝트를 컴파일하고 실행할 수 있습니다.

FROM golang:1.6-onbuild

이 이미지에는 대부분의 애플리케이션을 다루는 여러 개의 ONBUILD 트리거가 포함되어 있습니다. 이 빌드는 ./go/src/app 경로에 복사되고, get -d -v 와 같은 명령어를 실행하며, go install -v를 실행합니다.

arguments없이 이미지를 실행할 때, 해당 이미지에 기본명령 인 CMD [ "app"] 명령도 포함되어 있습니다.

Docker 이미지를 작성하고 실행할 수 있습니다.

$ docker build -t my-golang-app . # 사용자의 커스터마이징된 Dockerfile 생성
$ docker run -it --rm --name my-running-app my-golang-app # 사용자가 만든 Dockerfile을 my-running-app이라는 컨테이너 이름으로 실행. 만약 컨테이너가 종료되면 바로 삭제

참고 : golang:onbuild의 기본 명령은 실제로 go-wrapper 실행이며 set -x가 포함되어 있으므로 응용 프로그램 시작시 binary name이 stderr에 인쇄됩니다. 만약 이 동작이 마음에 들지 않으면, CMD [ "app"] (또는 만약 Go custom import 경로가 사용중인 경우 CMD [ "myapp"])를 추가하면 빌드 된 바이너리를 직접 실행합니다.

Docker 컨테이너에서 Go 컴파일하기

컨테이너 내부에서 앱을 실행하는 것이 적절하지 않은 경우가 있습니다. Docker 인스턴스 내부에서 앱을 실행하지 않고 컴파일하기 위해서 다음과 같이 작성합니다.

$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.6 go build -v


위에서 지정한 $PWD 경로의 디렉토리가 컨테이너의 볼륨으로 추가되고, -w 옵션으로 컨테이너 안의 프로세스가 실행될 디렉터리를 설정합니다. go 디렉토리(-w 옵션으로 준 디렉토리)에 프로젝트를 컴파일하고 myapp에 실행 파일을 출력하도록 명령하는 go build 명령을 실행합니다. 또는 Makefile이 있으면 컨테이너에서 make 명령을 실행할 수 있습니다.

$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.6 bash -c make

Docker 컨테이너에서 Go 크로스컴파일하기

만약 사용자의 OS가 리눅스인데 windows/386으로 컴파일을 하고 싶은 경우 아래와 같이 실행합니다.

$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp -e GOOS=windows -e GOARCH=386 golang:1.6 go build -v


또는 한번에 여러 플랫폼에 맞게 컴파일할 수 있습니다.

$ docker run --rm -it -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.6 bash
$ for GOOS in darwin linux; do
>   for GOARCH in 386 amd64; do
>     go build -v -o myapp-$GOOS-$GOARCH
>   done
> done


정의

  • Docker Container Image를 저장하기 위한 저장소이다.
  • 기본적으로 hub.docker.com 에서 이미지를 다운로드 할 수 있고, 비공개된 저장소를 사용하려면 비용을 지불해야 합니다.
  • Docker에서 개인저장소를 구축할 수 있는 시스템을 공개하였고, 저장소 시스템을 Docker Registry라고 부릅니다.
  • Docker Registry 역시 Docker로 제작 되었습니다.

설치

Docker 레지스트리에는 로그인 기능이 없습니다. 따라서 Nginx의 기본 인증(Basic Authentication) 기능을 사용해야 합니다. HTTP 프로토콜에서는 인증을 지원하지 않으므로 반드시 HTTPS 프로토콜을 사용해야 합니다.

SSL 인증서

HTTPS를 사용하기 위해서는 SSL 인증서가 필요한데, 인증서가 없다면 아래의 명령어로 사설 인증서를 만들어서 등록해야 합니다. 사설 인증서 생성시 인증서 서명 요청(Certificate signing request) 파일을 생성하는데 아래의 필요한 정보를 입력해야합니다.

  • Country Name: 국가 코드입니다. 대문자로 KO를 입력합니다.
  • State or Province Name: 주 또는 도입니다. 자신의 상황에 맞게 입력합니다.
  • Locality Name: 도시입니다. 자신의 상황에 맞게 입력합니다.
  • Organization Name: 회사 이름을 입력합니다.
  • Organizational Unit Name: 조직 이름을 입력합니다.
  • Common Name: Docker Registry 실행하는 서버의 도메인입니다. 정확하게 입력하지 않으면 인증서를 사용해도 로그인할 때 에러가 발생합니다. 사용할 도메인을 docker.example.com 입력합니다.
  • Email Address: 이메일 주소입니다.

Step1

$ openssl genrsa -out docker.example.com.key 2048

Step2

$ openssl req -new -key docker.example.com.key -out docker.example.com.csr

Step3

$ openssl x509 -req -days 365 -in docker.example.com.csr -signkey docker.example.com.key -out docker.example.com.crt 

Step4

사설 인증서 사용시 다른 시스템에서 Docker Registry에 접근하기 위해 아래처럼 생성한 인증서를 등록해야 합니다.

Ubuntu 인증서 등록

$ sudo cp docker.example.com.crt /usr/share/ca-certificates/
$ echo "docker.example.com.crt" | sudo tee -a /etc/ca-certificates.conf
$ sudo update-ca-certificates

CentOS 인증서 등록

$ sudo cp docker.example.com.crt /etc/pki/ca-trust/source/anchors/
$ sudo update-ca-trust enable
$ sudo update-ca-trust extract


Step5

$ sudo service docker restart 

사용자 계정 설정

사용자 계정을 설정하기 위해서 .htpasswd 파일을 생성해야 합니다.

Step1

Ubuntu 패키지 설치

$ sudo apt-get install apache2-utils 

CentOS 패키지 설치

$ sudo yum install httpd-tools


Step2

$ htpasswd -c .htpasswd <아이디 입력>
New password:<비밀번호 입력>
Re-type new password:<비밀번호 입력>
Adding password for user <아이디 입력> 

Nginx 설정

아래의 내용을 nginx.conf 이름의 파일을 만들어야 합니다.

worker_processes  4; 
events {
    worker_connections  1024;
}
 
http {
    server {
        listen       443;
        server_name  docker.example.com;
 
        ssl on;
        ssl_certificate /etc/docker.example.com.crt;
        ssl_certificate_key /etc/docker.example.com.key;
 
        proxy_set_header Host           $http_host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header Authorization  "";
 
        client_max_body_size 0;
 
        chunked_transfer_encoding on;
 
        location / {
            proxy_pass          http://docker-registry:5000;
            proxy_set_header    Host  $host;
            proxy_read_timeout  900;
 
            auth_basic            "Restricted";
            auth_basic_user_file  .htpasswd;
        }
    }
} 

Docker Image Pull

docker registry와 nginx 이미지를 다운로드 합니다.

$ sudo docker pull registry
$ sudo docker pull nginx

Docker Run

Docker를 실행합니다.

$ sudo docker run -d --name=docker-registry \
    -v /home/registry:/tmp/registry \
    registry
 
$ sudo docker run -d --name=nginx \
    -v ./nginx.conf:/etc/nginx/nginx.conf \
    -v ./.htpasswd:/etc/nginx/.htpasswd \
    -v ./docker.example.com.key:/etc/docker.example.com.key \
    -v ./docker.example.com.crt:/etc/docker.example.com.crt \
    --link=docker-registry:docker-registry \
    -p 443:443 \
    nginx

Docker Login

위의 설정된 정보로 로그인을 합니다.

$ sudo docker login https://docker.example.com
Username: <아이디 입력>
Password: <비밀번호>
Email:
WARNING: login credentials saved in /root/.docker/config.json
Login Succeeded 


+ Recent posts