데비안/우분투에서 다음과 같은 에러가 발생한다면 호스트의 설정을 변경해야 한다.



WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.

WARNING: No memory limit support

WARNING: No swap limit support




참고 자료는 다음과 같다.

(호스트 머신의 재시작을 잊지 말자!)





https://docs.docker.com/install/linux/linux-postinstall/



Your kernel does not support cgroup swap limit capabilities

On Ubuntu or Debian hosts, You may see messages similar to the following when working with an image.

WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.

This warning does not occur on RPM-based systems, which enable these capabilities by default.

If you don’t need these capabilities, you can ignore the warning. You can enable these capabilities on Ubuntu or Debian by following these instructions. Memory and swap accounting incur an overhead of about 1% of the total available memory and a 10% overall performance degradation, even if Docker is not running.

  1. Log into the Ubuntu or Debian host as a user with sudo privileges.

  2. Edit the /etc/default/grub file. Add or edit the GRUB_CMDLINE_LINUX line to add the following two key-value pairs:

    GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
    

    Save and close the file.

  3. Update GRUB.

    $ sudo update-grub
    

    If your GRUB configuration file has incorrect syntax, an error occurs. In this case, repeat steps 2 and 3.

    The changes take effect when the system is rebooted.


Posted by 김용환 '김용환'



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/




그러나 일래스틱의 경우 mmapfs를 사용하기에 리눅스 사용자는 메모리 설정이 필요하다.

https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html


sysctl -w vm.max_map_count=262144


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 김용환 '김용환'