Error – docker 내부에서 자꾸 다른 서버를 찾아

local dns
dockerhub local proxy를 설정했는데
redis 캐시에서 자꾸 다른 서버의 ip를 찾고있다.
docker 컨테이너 ip면 172.x.x.x라야하는데
192.168.0.x을 찾는다

????설정이 잘못됐나??? 않인데
container insptection
컨테이너 내부 /etc/hosts를 봐도 이상없음

문제

nslookup를 실행했더니 data-redis.polypia.net을 찾고 있다

local dns에 *.polypia.net 을 설정했더니

docker registry에서 data-redis를 찾을 때
*.polypia.net를 찾는다
일반적으로는 이상이 없을텐데
/etc/hosts를 우선적으로 참고할테니까
docker registry에서만 발생

docker registry 소스에서도 별거 사용된게 안보인다
좆같은 뉴트리아 언어 특성상 /etc/hosts를 보지 않는 모양

https://github.com/golang/go/issues/22846

뉴트리아 잘못 쓰다가 네트워크에 dns하나 심으면 아주 통째로 털어먹히겠네

[나중에 AI가 깔끔하게 정리해줄 문서]

Docker – local mirror

Dockerhub 제한 발표

https://www.docker.com/pricing/resource-consumption-updates

  • 안쓰는 리포지터리 삭제
  • 다운로드 제한

클라우드를 사용하는 경우에는 aws, gcp에서 클라우드 제공하는 미러 사용
앞으로는 어떻게든 mirror가 자동으로 잡히는 방향으로 설정이 잡히겠지만
아직까지는 수동으로 설정을 해 줘야한다.

dns를 잡아서 자동으로 처리 해 버릴수도 있지만 마음대로 그렇게 했다가 오류가 발생할 가능성도 있으니
개별 서버는 개별적으로 mirror 설정을 잡아줘야 한다

로컬 proxy registry 설치

https://github.com/docker/distribution

도커 소스코드가 생각보다 잘 관리되지 않고 있는 것 같다. 의존성 때문인지
https://github.com/docker/engine
이게 도커 메인코드인데 여기도 registry가 있는데 이걸 안쓰고 위의 리포를 사용해야한다.
그리고 moby는 뭘까

보통 받는이미지를 받고 또받고 하는데 이 과정에서 서버 부하가 과도하게 가니까 이걸 로컬 프록시로 처리 해 준다. 또 컨테이너 업로드는 dockerhub, quay, ecr, 개별설치 뭐가 됐건 레지스트리를 지정하고 할테니까
PROXY가 중요

도커 커맨드라인 실행

https://maelvls.dev/docker-proxy-registry-kind/

docker run -d --name docker-proxy-registry --restart=always -p 5000:5000 -e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io registry:2

docker compose

https://docs.docker.com/registry/deploying/

registry:
  restart: always
  image: registry:2
  ports:
    - 5000:5000
  environment:
    REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt
    REGISTRY_HTTP_TLS_KEY: /certs/domain.key
    REGISTRY_AUTH: htpasswd
    REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
    REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
  volumes:
    - /path/data:/var/lib/registry
    - /path/certs:/certs
    - /path/auth:/auth

도커 데몬에 mirror에서 다운받도록 설정

도커 설정파일

  • /lib/systemd/system/docker.service 서비스실행시
  • /etc/docker/daemon.json 원래파일
  • /etc/systemd/system/docker.service.d 환경변수형태로
    https://docs.docker.com/config/daemon/systemd/

접속테스트 daemon.json, 윈도우 맥에서는 태스크아이콘에서 설정파일 편집

https서버인 경우

{
    "insecure-registries" : [
    ],
    "registry-mirrors": ["https://dockerhub-mirrror-addr.kr/"],
    "debug" : true,
    "experimental" : false
}

로컬 http로 실행하는 경우

{
  "insecure-registries": [
    "127.0.0.1:5000"
  ],
  "registry-mirrors": [
    "http://127.0.0.1:5000"
  ],
  "debug": true,
  "experimental": false
}

실행시킨 도커 로그를 켜놓은 다음
docker pull ubuntu를 해보면
로그에서 해당 서버를 통해 다운받는걸 확인할 수 있다

quay나 aws쓰는 경우에도
개발시에 자동으로 도커 이미지 받다보면
서버를 엄청 긁어댈 수도 있는데 그럴경우 속도도 더 빠르고 좋다.

Orchestration Infra

설치형

  • Kubernetes https://github.com/kubernetes/kubernetes
  • Docker swarm https://github.com/docker/swarm
  • rancher https://github.com/rancher/rancher
  • flynn https://github.com/flynn
  • mesos https://github.com/mesos/mesos
  • nomad https://github.com/hashicorp/nomad

SaaS

  • AWS ECS
  • GCP
  • AWS
  • Azure
  • Heroku

서비스형으로 쓰면 되는데 또 설치 해 보고싶고 그러면 Docker Swarm정도는 해볼만할 것 같다

Docker Volume 중첩해서 셋팅하는 경우 발생하는 문제 확인

초기 디렉토리 구조 생성

도커에서 볼륨을 셋팅하고 실행

도커 실행 후 HOST에서 봤을 때 변경된 파일구조

도커 실행 후 Container 내부에서 변경된 파일구조

volume 마운트 시켰는데 파일이 복사돼버림

중복된 마운트를 할 경우 생각과 다르게 동작할 가능성

Error: 인터넷이 되다말다~ Docker 사용시에 네트워크 충돌인 경우

원인 :

Docker Network에서 192.168.0.1을 잡아먹고 있다.

일반적으로 공유기에서 192.168.0.1을 게이트웨이로 쓰니까.. .충돌이 날 수밖에…

안될라면 안되던가… 분명히 어딘가 충돌나는게 확실한데

우분투 네트워크 다 날렸다가 초기화도 해보고 별짓도 다해봤었는데

원인이 이런데 있었다.

해결 :

도커 네트워크를 다 지워버린다.

192.168.0.1 잡고 있는놈만 지워도 된다.

그냥 확 날려버리느라 이걸 어느놈이 잡고 있었는지 확인도 안 했는데… 또 생성되면 봐야겠다.

원래 사용중인 네트워크를 침범하지는 않을텐데… 회사에서 192.168.1.1을 써서..

회사에서 생성할 때 192.168.0.1을 안쓰는 줄 알고 지가 쓴 것 같다.

Docker Registry 사용

로컬과 클라우드

로컬 레지스트리는 거의 필요가 없다.

인터넷 환경이 안좋거나 로컬 kubernetes 클러스터를 구축해서 쓸게 아니라면..

보통은 도커 이미지 공개해도 별 상관없고 실행코드는 실행시간에 로컬 빌드해서 집어넣는게 보통이니까..

kuebernetes 클러스터를 로컬에서 쓰는일도 잘 없다. 보통 구글클라우드같은데다 깔아서 쓰니까 로컬에 놓으면 비효율적… 테스트 용도라면 로컬에 저장해도 되니까 레지스트리까지 필요없고

그냥 클라우드 쓰자.

로컬

Nexus (sonatype/nexus3)

도커로 설치해서 쓰면 된다.
https://hub.docker.com/r/sonatype/nexus3/

OpenStack Swift

깔기 쉽나?

클라우드

DockerHub(hub.docker.com)

기본적으로 공개

유료서비스 사용시 프라이빗

Quay(quay.io)

안써봄.
CoreOS에서 제공

AWS EC2 Container Registry

아뭐존
AWS 쓸 때 씀.

Google Container Registry

구글
GCP 쓸 때 씀

Dokku 장단점 간략

개요

이름처럼 Docker기반으로 동작하는 소형 배포시스템이다.

미니 헤로쿠(Heroku)라고 하는데

Heroku를 써본적이 없으니 미닌지 빅인지 뭐 알수가 없다.

헤로쿠가 빌드배포가 그렇게 편리하다며?

도쿠는 그 컨셉을 따라서 만든 오픈소스

Github : https://github.com/dokku/dokku

Homepage : http://dokku.viewdocs.io/dokku/

간략사용법

설치

설치는 홈페이지에 써있는 스크립트를 그대로 실행시키면 된다

이렇게 하면 docker, nginx설치 + dokku계정이 생성된다.

이제 80포트와 docker는 따로 손대지 않는게 좋다.

Dokku를 쓴다면 아마 Cloud Instance를 쓸 것 같으니 별 문제없을 것 같은데…
서버에 설치해서 쓰는 경우에는 리눅스 서버관리에 익숙하지 않다면 dokku가 설치된 서버는 단독으로 사용하는게 좋다.

도메인 연결

두가지를 등록 해 줘야한다.

dokku.<domain>.tld : 도커 GIT-SSH 접속주소 겸 초기 홈페이지 설치주소

*.dokku.<domain>.tld : 도쿠 배포된 프로젝트 주소가 된다.

예를들어 webwww라는 앱을 다음 주소로 푸시를 한다면 dokku@dokku.<domain>.tld:webwww

webwww.dokku.<domain>.tld 이 주소가 된다.

GIT 사용자 추가

/home/dokku/.ssh 에 public key를 등록 해 줘야하는데

일반적인 키 등록하는 것과는 다르다.

(등록과 동시에 스크립트가 실행되는 방식)

이 부분이 좀 헷갈리는 부분인데… 홈페이지 구석에 숨어있어서 찾기가 좀 힘들다.

http://dokku.viewdocs.io/dokku/deployment/user-management/

public key를 올려놓고

배포

http://dokku.viewdocs.io/dokku/deployment/application-deployment/

Heroku build pack에 의존한다

react 앱 같은경우는 잘 안된다

Dockerfile을 별도로 사용하는 방법도 지원하니까 이걸로 처리(어디선가퍼온거)

앱생성

dokku apps:create webwww

환경변수 등록

프로파일 관리를 할 때는 서버별로 변수를 등록해주는게 좋다.

배포할 때 소스에 박아서 넣을수는 없잖아

http://dokku.viewdocs.io/dokku/configuration/environment-variables/

이렇게 하고나면 /home/dokku/webwww/ENV 파일에 환경변수가 추가된다.
export spring.profiles.active=prod
SPRING_PROFILES_ACTIVE=prod
일지도 모른다. 두개 다 등록해놔서.. .확인해보고 안되는걸 지워야되는데

GIT PUSH

아까 등록해놓은 git 주소로 push하면된다.

git push dokku master

정도가 될까…

위에서 create를 먼저 한 것은 환경변수(서버프로파일)을 등록하려고 먼저한건데 create를 꼭 먼저 해야하는건 아니다. 그냥 소스코드 업로드하면 리포지터리가 생성+앱추가+빌드가 자동으로 된다.

LETSENCRYPT

플러그인 설치 후

sudo dokku letsencrypt <appname>

장단어이없는점

설치가 쉽고 쓰기도 쉽?다? 도큐먼트가 튜토리얼 형태로 작성된게 의외로 별로 없어서… 생각처럼 간단하지는 않다.

설계 사상이 직관적으로 이해가 가면 괜찮은데… 그렇지도 않아서 어떻게 써야할지 바로 떠오르질 안는게 문제

git listen방식이 아닌 직접 push방식만을 지원하는건가? 좀 복잡하게 하면 설정도 가능할 것 같은데…

인터페이스 화면이 없다. 일단 화면이 없으면 쓰기가 어렵다. 도큐먼트를 무조건 들여다 봐야하니까… dokku도 일단 개발외적인 부분으로 이런거 설정하는데 시간낭비를 하게된다면… 손해 아닌가

build 이미지와 deploy 이미지가 분리되면 좋을텐데… build 이미지가 그대로 사용되는 것 같다. 그래서 이미지 용량이 1기가…

Dockerfile을 사용하려면 또 이런저런 설정을 해줘야하는건가? 내가 셋팅해놓은 Dockerfile을이 제대로 안돌아가는 것 같다. 뭔가를 덮어씌우는건지

사용후기

여러가지 솔루션 오픈소스를 보면서 느낀건데 잘 만들어진 솔루션은 군더더기가 없었고 머리를 짜내서 고민을 해도 정말 최선?최적?의 방법으로 구현되었다는 생각이 든다.
이렇게 설계가 잘 된 솔루션을 사용하면 필요한 기능이 있을 때 그것을 찾기가 쉽다. 당연한 방법으로 설계가 되어 있으니까

1등급 SpringFramework, WordPress, Docker, docker-compose, vagrant, Angular, VirtualBox, Netty,

2등급 chef,

딱 생각은 안나는데 대강 이정도…

Docker가 익숙하다면 docker-compose와 스크립트를 이용한 배포가 더 낫지 않나 싶다.

그닥 좋은지 모르겠다.

아니면 그냥 Heroku를 쓰던가

Dokku에서 이런저런 기능이 많이 지원되는 것 같은데…

심플함은 놓치고 있는 것 같다.

애초에 복잡한 서비스를 하라고 만든 컨셉이 아니었을텐데

복잡한 인프라 구성을 할것같으면 docker-swarm이나 kubernetes를 쓰지 않을까

Docker 개념, 그리고 처음 프로젝트 적용 소감

도커 이미지로 동일한 환경을 구성하면

이 환경을 개발/테스트/운영 모두 동일한 환경에서 의존성 문제없이 사용할 수 있다.

동일환경 배포라는 문제를 해결하기 위해 등장한 도구들

  • 가상화 도구 : VMware, KVM, VirtualBox, HyperV
  • 클라우드 플랫폼 : OpenStack, CloudStack
  • 서버설정 자동화 : Puppet, Chef
  • 배포도구 : Capistrano, Fabric
  • 작업부하 관리 : Mesos, Fleet
  • 개발환경 설정 : Vagrant

도커와 함께 쓰이기도 하고 따로 쓰이기도 한다.

도커를 일주일정도 쓰면서 프로젝트에 적용하고나니 이제서야 감을 좀 잡겠다.
도커관련 책이 많이 나와있는데… 이걸 다 외울게 아니라면 한번훑어보고 넘어가는게 좋겠다.
명령어는 인덱스만 잡아놓고 그때그때 찾아서 쓰다보면 외워지는게 제일 나은것같다.

도커 개념을 잡으려면 먼저 써보는게 좋다.

일단 명령어 하나도 몰라도 윈도우/맥에서 쉽게 설치해서 쓸 수 있게 나와있다.
Docker(https://www.docker.com/)
GUI도구 (https://kitematic.com/)

도커의 아키텍처

리눅스의 컨테이너가 발달한 형태로
iptables, virtual bridge, cgroups, namespace.. 등의 커널매커니즘이 얽혀서 돌아간다.
(자세한 것은 리눅스커널을 먼저 이해해야 알 수 있을 것 같다.)

도커는 클라이언트, 서버데몬, 레지스트리로 나뉜다.

서버데몬이 우리가 생각하는 도커 컨테이너를 구동하는 녀석이고
docker 명령어를 친다고 생각하는게 클라이언트
레지스트리는 도커허브의 역할이다.
(자세한 것은 책에 잘 나온다)

도커 도구

도커 도구가 많이 나왔던 것같은데…
초기에 나온것들은 많이 정리가 됐는지 책에 나와있는것들도 바뀐게 좀 있는 것 같다.
최신 방법론은 도커 최신 공식문서를 찾아봐야 하지 않을까

활용법

도커 컨테이너는 쓰고버리는 1회용품으로 생각하면 쉽다.
영구적으로 저장하는 데이터를 여기 저장하면 안되겠지
API서버를 돌린다면 사용자 정보와 디비는 별도로 돌아가도록…
테스트에 한해서 DB를 돌리기도 한다. 저장경로를 컨테이너 외부로 잡으면 디비를 직접 돌려도 상관없지 않을까 싶기도 하지만… 디비를 업그레이드 하면서 파일이 깨질가능성도 생각해보면.. 좋은 생각은 아니다.

사용법

http://tutorial.polypia.net/w/Docker

설치방법

다운받아서 깔아도 되고 apt yum 등.. 자동설치 지원이 잘 된다.

사용후기

적용을 하려면 이해가 좀 필요할 것 같다.
그리고 도커에 맞춰서 아키텍처의 변형도 좀 필요해 보인다.
지금까지 gradle bulid 를 war로 만드는게 목표였다면
docker내에서 사용하는 방법은 좀 다를 수 있다.
docker이미지 내에 maven/gradle빌드환경을 구축 해 놓을수도 있고
docker하에서는 spring boot에서 기본옵션으로 사용하는 embedded was컨셉이 기존 별도 was실행하는 방식보다 더 적합해 보인다.
embedded하는게 spring boot가 꼭 필요하진 않지만…
어쨌든 오래된 자바 컨셉에 적합한 구조는 아니다. 도커에 맞춰서 설계를 새로 잡아야 할 것 같다. 설정파일 관리부터 많은 부분이 바뀌어야한다.

윈도우에 도커 설치

도커 공식사이트 http://Docker.io

 

도커 공식홈페이지에서 지원하는 버전이 2가지가 있다.

DockerToolbox  // Docker for Windows
두 버전의 차이는 가상화 솔루션을 뭘 사용하냐의 차이다.
VirtualBox // Hyber-v

 

도커를 실행시키면 가상화솔루션에 리눅스os를 한개 띄워놓고 그걸 이용해서 서비스들을 실행시키는것으로 보인다.

윈도우에서 내장된 HyperV 서비스를 실행시키면 VT-d를 점유 해 버려서 VirtualBox에서는 64Bit OS를 사용할 수 없게 되기 때문에 …

두 가지를 동시에 쓸 수는 없고 한가지를 선택해서 사용해야한다.

 

성능상으로는 Docker for Windows가 더 뛰어나다는 말이 있다.
(http://bryan7.tistory.com/774)
그런데 Docker for Windows는 윈도우 10 Pro 빌드넘버 10586 이상에서만 사용 가능하니까 그 하위버전이라면 윈도우를 다시 설치해야한다.

윈도우 7,8 사용자는 Docker-Toolbox를 설치하면 될 것 같다.

그리고 버추어박스를 계속 사용해야한다면 DockerToolbox를 설치하자.

성능차이가 좀 있다고 하지만 어차피 테스트용인데 좀 느려봐짜 먼상관

 

Docker for Windows를 설치하는 경우

  1. Docker for Windows는 도커 공식사이트 메인에 있다. 그냥 설치하면 설치 완료 후에 hyper-v도 알아서 켜준다.

2. Kitematic  다운로드 설치

Docker Toolbox를 설치하는 경우

  1. 다음을 따라해서 윈도우hyperV가 켜져있을 수도 있으니 먼저 끄고 설치하도록!

 

2. 도커 툴박스를 다운받아서 설치하라!
https://www.docker.com/products/docker-toolbox
현재는 다음 항목이 설치된다.

 

 

 

도커 kine기초 사용은 튜토리얼이 필요없을 정도로 간단하다.
나는 이렇게 설치하긴 했는데 제대로 한건지는 모르겠다 아직 도커초보라서…