docker를 실행하면 대부분 기본 시간이 GMT+0이다.


따라서 시스템 환경에 맞출려면 다음과 같은 옵션을 주어 multiple docker volume을 맞추는 것이 좋다.


  -v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime

Posted by 김용환 '김용환'

docker inspect 커맨드

docker 2018.09.14 19:14



docker run을 실행한 후,  어떤 매개 변수를 썼는지 기억이 안날 때라든가,

현재 docker가 어떻게 실행되고 있는지 보려면 docker inspect 커맨드를 사용하면 된다.


여러 docker volume을 지원하는지도 알 수 있다..



$ sudo docker inspect google-jenkins



$ sudo docker inspect --format "{{ json .Mounts }}" google-jenkins



[{"Type":"volume","Name":"feda69298044ad46ab3444bd40ab81089e84cd5646259fa948b3325b8dfcd35f","Source":"/var/lib/docker/volumes/feda69298044ad46ab3444bd40ab81089e84cd5646259fa948b3325b8dfcd35f/_data","Destination":"/var/jenkins_home","Driver":"local","Mode":"","RW":true,"Propagation":""},{"Type":"volume","Name":"jenkins_home","Source":"/var/lib/docker/volumes/jenkins_home/_data","Destination":"/var/lib/jenkins","Driver":"local","Mode":"z","RW":true,"Propagation":""},{"Type":"bind","Source":"/root/.ssh","Destination":"/root/.ssh","Mode":"","RW":true,"Propagation":"rprivate"}]



https://docs.docker.com/engine/reference/commandline/inspect/#get-an-instances-image-name

Posted by 김용환 '김용환'


docker 실행 후, docker 프로세스의 memory 증가로 oom이 발생되고 os에서 docker 프로세스를 죽일 수 있다.


기본 docker 메모리는 unlimited이다.




$ cat /sys/fs/cgroup/memory/system.slice/docker.service/memory.stat 

cache 878325760

rss 58626048

rss_huge 0

mapped_file 20238336

dirty 0

writeback 0

swap 0

pgpgin 758173

pgpgout 529425

pgfault 431213

pgmajfault 1

inactive_anon 12288

active_anon 58683392

inactive_file 587464704

active_file 290791424

unevictable 0

hierarchical_memory_limit 9223372036854771712

hierarchical_memsw_limit 9223372036854771712

total_cache 878325760

total_rss 58626048

total_rss_huge 0

total_mapped_file 20238336

total_dirty 0

total_writeback 0

total_swap 0

total_pgpgin 758173

total_pgpgout 529425

total_pgfault 431213

total_pgmajfault 1

total_inactive_anon 12288

total_active_anon 58683392

total_inactive_file 587464704

total_active_file 290791424

total_unevictable 0






그런데. docker 메모리가 죽지 않도록 하려면. 다음과 같은 옵션을 docker run시 실행해야 한다. 


--oom-score-adj 값

--oom-kill-disable=true




관련된 도커 문서는 https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources에 존재한다.


문서에는 메모리 설정 내용이 포함되어 있다. 


Runtime constraints on resources

The operator can also adjust the performance parameters of the container:

OptionDescription
-m--memory=""Memory limit (format: <number>[<unit>]). Number is a positive integer. Unit can be one of bkm, or g. Minimum is 4M.
--memory-swap=""Total memory limit (memory + swap, format: <number>[<unit>]). Number is a positive integer. Unit can be one of bkm, or g.
--memory-reservation=""Memory soft limit (format: <number>[<unit>]). Number is a positive integer. Unit can be one of bkm, or g.
--kernel-memory=""Kernel memory limit (format: <number>[<unit>]). Number is a positive integer. Unit can be one of bkm, or g. Minimum is 4M.



잘 파신 분의 블로그

https://blog.2dal.com/2017/03/27/docker-and-oom-killer/


Posted by 김용환 '김용환'


도커 로컬에서 테스트하는 예제이다.


먼더 Dockerfile이 있는 디렉토리에서 빌드한다


$ docker build . --tag oncall-api:latest



제대로 이미지가 생성되었는지 확인한다


$ docker images

REPOSITORY                                   TAG                 IMAGE ID            CREATED              SIZE

oncall-api                                   latest              e80b7411faea        About a minute ago   94MB



실행한다


$ docker run --name oncall-api -d -p 5000:5000 oncall-api:latest

9198cbd7a9daf801e243393462ee3e9a6a3f046e6e347cf2ab4aea1262ba2d51


$ docker start oncall-api



도커 프로세스로 떠 있는지 확인한다.


$ docker ps -a

CONTAINER ID        IMAGE                                        COMMAND                  CREATED             STATUS                    PORTS                                                      NAMES

9198cbd7a9da        oncall-api:latest                            "gunicorn --workers …"   9 seconds ago       Up 8 seconds              0.0.0.0:5000->5000/tcp                                     oncall-api



Dockerfile에 수정했다면 container를 삭제한다.


$ docker container rm $container_id


빌드(docker build)를 다시하고 재시작한다



$ docker restart oncall-api





Posted by 김용환 '김용환'


kubernetes에서 배포 이미지 생성시 유의 사항은 다음과 같다.




https://kubernetes.io/docs/concepts/containers/images/#updating-images



imagePullPolicy의 기본값은 IfNotPresent이다. 이미 존재하면 계속 사용한다는 점이다.


예를 들어 image:lastest를 사용 중이라면 IfNotPresent라면 한번만 이미지를 다운받고 다시 pod를 재시작하지 않는다.


따라서 똑같은 에러가 계속 발생한다.


이 문제를 해결하려면


imagePullPolicy를 Always로 변경해야 한다.





만약 tag를 사용해 버전닝을 하는 경우라면 imagePullPolicy의 값을 IfNotPresent로 설정하는 것이 좋다.





Posted by 김용환 '김용환'

docker 이미지가 alpine이라면 /bin/bash를 지원하지 않을 수 있다. /bin/bash을 지원하는 sh가 많아지고 있다.




$ docker exec -it 9198cbd7a9da /bin/bash

OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused "exec: \"/bin/bash\": stat /bin/bash: no such file or directory": unknown


이 때는 /bin/sh를 사용한다.


$ docker exec -it 9198cbd7a9da /bin/sh

/app # ps -ef


(나도 모르게 늘 bash를 사용한다..ㅠ)

Posted by 김용환 '김용환'


docker build 할 때 이미지를 한 번 다운로드하면 캐싱하는 것이 정책이다.


따라서 no-cache 옵션을 변경해서 매번 docker build할 때 마다 이미지를 생성하도록 한다.


--no-cache=true


https://docs.docker.com/engine/reference/commandline/build/






Posted by 김용환 '김용환'



도커 환경을 정리하는 커맨드가 여럿 있다.




· docker container prune은 중지된 모든 컨테이너를 삭제한다.


· docker image prune은 이름 없는 모든 이미지를 삭제한다.


· docker network prune은 사용되지 않는 도커 네트워크를 모두 삭제한다.


· docker volume prune은 도커 컨테이너에서 사용하지 않는 모든 도커 볼륨을 삭제한다.


· docker system prune -a는 중지된 모든 컨테이너, 사용되지 않은 모든 네트워크, 하나 이상의 컨테이너에서 사용되지 않는 모든 이미지를 삭제한다. 따라서 남아있는 컨테이너 또는 이미지는 현재 실행 중인 컨테이너에서 필요하다.



Posted by 김용환 '김용환'



 docker-compose up 커맨드는 모든 서비스를 결합한 표준 출력을 리턴한다. 


모든 로그의 표준 출력을 본다해도 거의 도움이 되지 않아서 


docker-compose up -d를 사용하는 것이 더 나은 선택이다. 


docker-compose up -d 커맨드를 사용하면 표준 출력을 리턴하지 않는다. 


https://docs.docker.com/compose/reference/up/

Posted by 김용환 '김용환'


docker 컨테이너 로그를 계속 보고 싶다면(tail -f효과)를 다음 url을 확인할 수 있다.


https://docs.docker.com/engine/reference/commandline/container_logs/#related-commands


docker logs --tail 커맨드를 사용한다.




docker logs -f --tail  --it $container-ps-id


docker logs --follow --tail  --it $container-ps-id

Posted by 김용환 '김용환'