Python 서버배포 – Docker이미지 만들 때 poetry 사용?

poetry로 개발환경 구축하고 배포 할 때도 poetry 를 쓰려고 적용하다 보니…

현상.

docker에서 poetry 쓰니까 설치할 때 느리다.. 심지어 타임아웃이 나버리는 상황..

의문.

  • poetry를 왜 쓰나?
  • 배포할 때 poetry를 왜 쓰나
  • docker!

결론.

Docker 배포할 때 Poetry 쓰지마라!

.gitignore에 requirements.txt 추가

poetry export --without-hashes --format=requirements.txt > requirements.txt
Dockerfile에서
pipenv install -r requirements.txt

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 중첩해서 셋팅하는 경우 발생하는 문제 확인

초기 디렉토리 구조 생성

➜  $ tree
 .
 ├── test1
 │   ├── test1
 └── test2
     └── test2
$ cat test1/test1
test1 file
$ cat test2/test2
test2 file

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

$ docker run --rm -it \
-v $(pwd)/test1:/test \
-v $(pwd)/test2:/test/kkk \
-v $(pwd)/test2/test2:/test/test2file \
-v $(pwd)/test1/test1:/test/test1file \
-v $(pwd)/test2:/test/kkk1 \
alpine sh

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

$ tree
 .
 ├── test1
 │   ├── kkk
 │   ├── kkk1
 │   ├── test1
 │   ├── test1file
 │   └── test2file
 └── test2
     └── test2

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

# tree
 .
 ├── kkk
 │   └── test2
 ├── kkk1
 │   └── test2
 ├── test1
 ├── test1file
 └── test2file

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 쓸 때 씀