beadss / docker-study

0 stars 0 forks source link

week(1): 도커 관련 미세팁 #2

Open beadss opened 5 years ago

beadss commented 5 years ago

docker 자동완성 기능 사용하기

mac 기준 팁(windows는 설치만 하면 기능 적용돼있음) docker 입문 시기에는 container 이름 등을 써야될때가 많은데, 매번 확인하기도, 따라치기도 힘듭니다.

아래 과정을 거치면 docker exec -it 까지 입력하고 탭 누르면 자동으로 나머지 글자가 완성됩니다.(혹은 후보군을 보여줌)

# 자동완성 기능 설치
brew install bash-completion

# CLI 켤때 자동완성 기능 실행시켜줄 내용
cat >> ~/.bash_profile <<EOL
if [ -f $(brew --prefix)/etc/bash_completion ]; then
. $(brew --prefix)/etc/bash_completion
fi
EOL

# docker 관련 자동완성 리소스를 자동완성 기능 디렉토리에 링크 걸어줌
cd /usr/local/etc/bash_completion.d
ln -s /Applications/Docker.app/Contents/Resources/etc/docker.bash-completion
ln -s /Applications/Docker.app/Contents/Resources/etc/docker-machine.bash-completion
ln -s /Applications/Docker.app/Contents/Resources/etc/docker-compose.bash-completion

참고: https://blog.alexellis.io/docker-mac-bash-completion/

docker run에서 -i와 -t 옵션

개인적으로 뭔소린가 싶었어서, 나름대로 찾아본 내용을 공유합니다.

-i 옵션은 표준 입력을 받을지 여부입니다. 파이프라이닝이나 키보드 입력 등이 이에 해당됩니다.

-t 옵션은 가상 터미널을 제공할지 여부입니다.

-i와 -t가 조합되면, 가상 터미널로 표준 입력을 입력할 수 있게 됩니다.

-t 하나만 쓰여서는 아무런 의미가 없습니다.(터미널은 있는데 입력은 안되는 상황이므로)

-i는 홀로 쓰여도 의미가 있습니다. 파이프라이닝 등으로 터미널 없이 입력하는 기능이 존재하기 때문입니다.

-d는 -i -t와 함께 쓰일 수 없습니다. background에서 돌아가기 때문에, -i로 입력을 대기할수도, -t로 가상 터미널을 제공할수도 없습니다.

다만, background에서 돌아가는 상황에서도 docker exec 명령으로 -i -t 옵션을 사용할 수 있습니다.

ex)

# 표준 입력과 함께하는 docker exec
docker exec -it brave_stonebraker /bin/bash
echo adsf | docker exec -i brave_stonebraker grep a

# 그냥 명령만 전달하는 docker exec
docker exec brave_stonebraker echo "abcd"

docker ps 필터 사용 예제

docker compose down을 사용하면 필요 없는 예제입니다. 도커 이미지 기반으로 컨테이너를 셧다운 시키는 내용이구요. 이런 방식으로도 쓸 수 있다 정도로 보시면 되겠습니다. 그나저나 ancestor 필터 말고는 쓸일이 있을까 싶습니다 -_-ㅋ

#!/bin/bash
DOCKER_PID=$(docker ps -q -a —filter="ancestor=example_image")
if [ -n "$DOCKER_PID" ]; then
        docker kill $DOCKER_PID
        docker rm $DOCKER_PID 2> /dev/null
fi

질문

  1. 도커 컨테이너 IP 관련

    • 일반적인 서비스에서는 각각 장비들이 고정 IP를 사용할텐데, 도커 IP는 어떻게 해결하는지?
    • 외부로부터 들어오는 request는 포트포워딩으로 해결하더라도, 외부 API call을 위해 도커 컨테이너도 IP가 필요함
  2. 도커 이미지 버전 관리

    • git tag == 도커 이미지 tag라는 전제 하에서, 이미 훌륭한 버전관리 도구인 git이 있는데, 연계해서 처리할 수 있는 방법이 없는지?
    • ex) git tagging hook -> docker image build&tagging
  3. 코드 관리 관련

    • 간단하게 생각해보면, [운영체제용 도커 이미지, infra용 도커 이미지, 어플리케이션용 도커 이미지] 3depth 구성이 주류일 것으로 예상됨
    • docker-expose.yml은 local용, 개발용, 서비스용 3가지가 존재할 것으로 예상됨
    • 기타등등 구성이 매우 복잡해질 것 같은데, 현업에서는 어떻게 사용하고 있는지?
    • 환경별로 중복되는 설정을 별도 파일로 분리하고, import 해서 사용할 수 있는 기능이 있는지?
beadss commented 5 years ago

1. 도커 컨테이너 IP 관련: 조사 결과

도커 네트워크 동작 방식(https://bluese05.tistory.com/15) 도커 데몬은 브릿지 모드인 컨테이너의 외부 요청에 대해 NAT, Port forwarding 등을 수행해주는 공유기라고 생각할 수 있음 공유기 아래의 기기들의 IP가 외부와는 연관이 없듯, 마찬가지로 컨테이너의 IP도 외부와 연관이 없음(도커 데몬이 있어서 외부랑도 잘 통신함)

번외

docker-compose.yml에서 links가 뭔지?

https://docs.docker.com/compose/compose-file/compose-file-v2/#links 단순한 호스트명 등록을 의미함(/etc/hosts 에 등록되는건 아님) http://이미지명(혹은 별칭):8080 식으로 사용 가능

docker.sock이 뭔지?

https://stackoverflow.com/questions/35110146/can-anyone-explain-docker-sock/35110344 Docker daemon이 리스닝 하고 있는 소켓 그 자체로 별다른 의미는 없고, 컨테이너에서 도커 데몬에 API를 날려야할 때 사용함(컨테이너 목록 얻어오기 등)

docker-cloud/haproxy 에서는 원본 서버들을 자동으로 찾아내는데 쓰임(찾을 port 설정같은게 없는걸 보니, EXPOSE 된 모든 port를 검색 대상으로 하는듯) https://medium.com/@benoittellier3/automatic-load-balancing-for-your-docker-compose-services-aa6b96f20d20