예)


ENV WIDTH 360 ...

CMD ["sh", "-c", "phantomjs --ssl-protocol=any rasterize.js 
      3001 $WIDTH"]


docker run -e WIDTH=360 -p 3001:3001 phantomjs


CMD 안에서는 제약사항이 많으니 sh를 잘 사용하는 것이 좋다. 








Posted by '김용환'
,


도커의 network 설정 중 bridge는 docker0이라는 네트워크를 사용한다. 



$ docker network inspect bridge

[

    {

        "Name": "bridge",

        "Id": "2b3831fb8f909d0a44d7a74f4f0df3327f1f02409096b4b8f4ba5a2ce5a5a7d6",

        "Created": "2019-06-28T22:52:24.973773315Z",

        "Scope": "local",

        "Driver": "bridge",

        "EnableIPv6": false,

        "IPAM": {

            "Driver": "default",

            "Options": null,

            "Config": [

                {

                    "Subnet": "1.1.0.0/16",

                    "Gateway": "1.1.0.1"

                }

            ]

        },

        "Internal": false,

        "Attachable": false,

        "Ingress": false,

        "ConfigFrom": {

            "Network": ""

        },

        "ConfigOnly": false,

        "Containers": {},

        "Options": {

            "com.docker.network.bridge.default_bridge": "true",

            "com.docker.network.bridge.enable_icc": "true",

            "com.docker.network.bridge.enable_ip_masquerade": "true",

            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",

            "com.docker.network.bridge.name": "docker0",

            "com.docker.network.driver.mtu": "1500"

        },

        "Labels": {}

    }

]




host라는 모드가 있는데 이는 eth0을 사용하는 것이다. 

$ docker network inspect host

[

    {

        "Name": "host",

        "Id": "ee9bddcf9dc5a7804f63522a9740d3226e8df3ce31575cfc9a7ebbd0f7d5a23d",

        "Created": "2018-10-15T07:14:31.9624055Z",

        "Scope": "local",

        "Driver": "host",

        "EnableIPv6": false,

        "IPAM": {

            "Driver": "default",

            "Options": null,

            "Config": []

        },

        "Internal": false,

        "Attachable": false,

        "Ingress": false,

        "ConfigFrom": {

            "Network": ""

        },

        "ConfigOnly": false,

        "Containers": {},

        "Options": {},

        "Labels": {}

    }

]


또한 17.06부터 docker container create를 사용할 때 --network host를 사용하면 eth0을 바로 사용할 수 있다. 



kubernetes에서도 이와 비슷한 기능이 있다. 

pod의 모든 컨테이너에서 노드의 eth0을 사용할 수 있도록 HostNetwork(즉 hostNetwork: true)을 설정할 수 있다.  








Posted by '김용환'
,




proxy를 사용하는 환경에서 아래와 같은 커맨드를 사용해 실행하는데, 


$ setproxy sudo -E  docker service create  \

 --name myservice --network overnet --replicas 2 alpine sleep 1d

 

 

아래와 같이 에러가 발생할 수 있다. 


unable to pin image alpine to digest: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)


문제를 해결하려면. proxy 이슈를 해결해야 한다.


https://docs.docker.com/config/daemon/systemd/#httphttps-proxy



/etc/systemd/system/docker.service.d/http-proxy.conf 설정 파일을 수정한다.



$ sudo mkdir /etc/systemd/system/docker.service.d

  

$ sudo vi /etc/systemd/system/docker.service.d/http-proxy.conf

$ cat  /etc/systemd/system/docker.service.d/http-proxy.conf

[Service]

Environment="HTTP_PROXY=http://proxy.daumkakao.io:3128" "HTTPS_PROXY=http://proxy.daumkakao.io:3128" "NO_PROXY=idock.daumkakao.io,mdock.daumkakao.io,docker-auth.daumkakao.io,mirror.kakao.com,repo.kakao.com,pdr.kakaopay.com,hw-repo.daumkakao.io"





systemctl 데몬을 릴로드 한다.


$ sudo systemctl daemon-reload


다음과 같이 확인한다.


$ sudo systemctl show --property Environment docker

Environment=GOTRACEBACK=crash DOCKER_HTTP_HOST_COMPAT=1 PATH=/usr/libexec/docker:/usr/bin:/usr/sbin HTTP_PROXY=http://proxy.google.io:1111 HTTPS_PROXY=http://proxy.google.io:2222


도커 데몬을 재시작한다.


$ sudo systemctl restart docker




Posted by '김용환'
,

docker compose에서 특정 컨테이너를 재시작해서 테스트하고 싶을 때가 있다.

Failover와 같은 문제를 테스트하려면 특정 시간 멈춤 뒤에 재현할 때 유용하다.

 

 

docker-compose restart mysql

 

docker-compose restart -t 30 mysql

Posted by '김용환'
,

도커만 봤을 때는.. 메모리 설정 안 해도 된다. 일반적인 도커 메모리 설정은 unlimited이다.


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

hierarchical_memory_limit 9223372036854771712

hierarchical_memsw_limit 9223372036854771712


그런데, 왜 도커 메모리로 인해 도커가 죽는 일이 발생하기도 한다. 


바로 그것은 도커 메모리가 이슈가 아니라 도커 컨테이너의 애플리케이션이 이슈인 경우가 있다.



예를 들면,



다만, 일래스틱서치는 mmapfs를 사용하기에 vm 메모리 설정을 해야 한다. mmap은 매핑된 파일의 크기와 동일한 프로세스에서 사용 가능한 가상 메모리 주소 공간의 일부를 사용하는 형태이다(루씬의 MMapDirectory를 사용) 


그래서 운영체제 캐시 없이 바로 루신 인덱스에서 파일을 읽으면 빠르기 때문인데요. 이게 도커에 미치는 영향이다.



참고 자료


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


http://blog.thetaphi.de/2012/07/use-lucenes-mmapdirectory-on-64bit.html


http://jprante.github.io/lessons/2012/07/26/Mmap-with-Lucene.html

Posted by '김용환'
,


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



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