====== Docker ======
* [[https://www.docker.com/|Docker]]
* [[https://hub.docker.com/|Docker Hub]]
* [[https://docs.docker.com/engine/userguide/basics/|Docker Quickstart Containers]]
* [[http://www.dockerbook.com/|DockerBook]]
* [[https://github.com/wsargent/docker-cheat-sheet|Docker Cheat Sheet]]
* [[docker:install_ubuntu|Docker Install on Ubuntu Linux]]
* [[docker:install_redhat|Docker Install on Redhat/CentOS/Amazon Linux]]
* [[docker:install_arch|Docker install on Arch/Manjaro]]
* [[docker:install_debian|Docker install on Debian Linux]]
* [[docker:install_fedora|Docker install on Fedora Linux]]
* [[docker:build|Docker Image Build]]
* [[docker:moby|moby]]
* [[docker:runlike|docker runlike]]
* [[docker:distroless|distroless]]
* [[linux:ctop|ctop]]
* [[docker:network|Docker Network]]
* [[docker:desktop|Docker Desktop]]
* [[docker:rootless|Docker Rootless]]
===== Usage =====
==== 설치 후 테스트 ====
docker run hello-world
==== Docker Hub Search ====
docker search [검색어]
==== 이미지 관리 ====
* ''docker pull [image-name]:[tag]'' : 이미지의 ''tag'' 버전을 다운로드함. ''latest''는 최신버전.
* ''docker images'' : 이미지 목록보기
* ''docker rmi [image-name]:[tag]'' : 이미지 삭제. ''tag'' 생략시 버전 상관없이 모두 삭제.
==== Container 관리 ====
* ''run'' 명령으로 컨테이너 생성
docker run [option] [image-name] {[실행명령]}
* ''-i -t'' or ''-it'' : interactive, pseudo-tty : 실행된 명령에서 인터랙티브하게 입력/출력 가능
* ''%%--%%name [container-name]'' 컨테이너 이름지정
* ''-d'' : detached 상태로(background로) 실행
* ''%%--%%rm'' : 기존에 이미 도커 컨텐이너가 존재하면 삭제하고 다시 실행
* ''-v $HOSTDIR:$DOCKERDIR'' : HOST의 디렉토리를 컨테이너의 디렉토리에 마운트
* ''-p 127.0.0.1:$HOSTPORT:$CONTAINERPORT'' : HOST의 특정포트로 들어오는 요청을 Container의 특정포트로 보내기.
# 11211 port로 실행되는 memcached docker 이미지가 있다고 할 때 아래 명령으로 컨테이너 생성하면
docker run -d -p 127.0.0.1:11211:11211 --name memcachedtest memcached
# 앞의 "127.0.0.1:" 생략 가능.
* ''%%--%%restart=[option]'' : ''no'',''on-failure[:max-retries]'',''always'',''unless-stopped'' 등을 지정하면 해당 컨테이너 자동 리스타트를 옵션으로 지정할 수 있다. 개발환경에서는 ''unless-stopped''(명시적 중지가 아니면 자동 재시작) 정도이면 될 듯.
* ''docker ps -a'' : 모든 컨테이너 목록 출력. ''-a''는 전체 목록, ''-a''없으면 현재 실행중인 것들만.
* ''%%--%%no-trunc'' 명령줄 줄이지 않고 보여주기
* ''docker start [container-name|id]'' : 컨테이너 시작
* ''docker restart [container-name]'' : 재시작
* ''docker attach [container-name]'' : 컨테이너에 접속
* ''exit'' 혹은 ''Ctrl-D'' 사용시 컨테이너 정지
* ''Ctrl-P, Ctrl-Q''를 차례로 누르면 실행상태로 그냥 빠져나옴.
* ''docker exec [container-name] [명령] ...'' : 외부에서 컨테이너 안의 명령 실행하기
* ''docker exec -it [container-name] /bin/bash'' : 외부에서 컨네이너 안의 bash interactive 하게 실행
* ''docker exec -it -u [user]:[group] [container-name] /bin/bash'' : docker 컨테이너 안에 있는 특정 user:group 으로 접속
* ''docker stop [container-name]'' : 컨테이너 정지
* ''docker rm [container-name]''
* [[https://stackoverflow.com/questions/17236796/how-to-remove-old-docker-containers|불필요한 Container, Image 삭제]]
# 이름없는 모든 이미지 삭제
docker image prune
# 중지된 모든 컨테이너 삭제
docker container prune
# 사용하지 않는 모든 도커 볼륨 삭제
docker volume prune -f
# 사용하지 않는 모든 도커 네트워크 삭제
docker network prune
# 위 모든 명령을 합친 것. 이것에 의해 삭제되지 않는 다는 것은 사용중인 컨테이너, 이미지, 기타 등등이라는 의미
docker system prune -a
* [[https://docs.docker.com/engine/reference/commandline/volume_prune/|docker volume prune | Docker Documentation]]
==== Shell 만 즉시 실행 ====
* docker 이미지의 entrypoint 는 실행하지 않고 해당 이미지의 shell 실행하고자 할때. ''/bin/sh'' 말고 알고 있다면 해당 shell 을 지정.
docker run --rm -it --entrypoint /bin/sh
* 원하는 명령 즉시 실행하고, 명령 인자 전달. '''' 뒤의 내용을 인자로 전달함.
docker run --rm --entrypoint /bin/cat "/etc/redhat-release"
==== Volume Mount ====
* host 의 diretory를 docker container에 마운트하기
* [[https://docs.docker.com/engine/tutorials/dockervolumes/|Manage data in containers - Docker]]
* ''run -v /volume/dir'' : ''/volume/dir'' 을 컨테이너에 생성, 실제 저장될 위치는 ''inspect''로 확인
docker run -d -P --name web -v /webapp training/webapp python app.py
* ''docker inspect [container-name]'' 으로 마운팅 상황 확인 가능
* Host 디렉토리를 마운트하려면 ''-v /host/dir:/container/dir''로 host 디렉토리를 container의 특정 디렉토리에 마운팅
* [[https://stackoverflow.com/questions/41485217/mount-current-directory-as-a-volume-in-docker-on-windows-10|현재 디렉토리 마운팅 script]]
#The following two options will work on both PowerShell and Linux:
docker run --rm -it -v ${PWD}:/usr/src/project gcc:4.9
docker run --rm -it -v $(pwd):/usr/src/project gcc:4.9
==== Docker Proxy ====
* Linux에서 Docker Proxy 프로세스가 뜨는 것을 막으려면, 커널 2.6을 제외하고,
docker daemon --userland-proxy=false
/etc/default/docker 파일에 DOCKER_OPTS 을 추가한 후 docker daemon 을 재시작하면 된다.
$ cat /etc/default/docker
DOCKER_OPTS="--userland-proxy=false"
* [[http://bluese05.tistory.com/53|Docker Network 구조(3) - container 외부 통신 구조]]
==== /etc/hosts ====
* [[https://docs.docker.com/engine/reference/run/#managing-etchosts|Docker run reference | Docker Documentation - managing-etc/hosts]]
docker run --add-host="some.example.com:127.17.0.1"
===== 오류 대응 =====
==== centos ====
''unable to remount sys readonly: unable to mount sys as readonly max retries reached'' 오류를 만나면
''/etc/sysconfig/docker'' 파일에 ''%%--%%exec-driver=lxc'' 추가 후 docker 재시작.
other_args="--selinux-enabled --exec-driver=lxc"
===== Docker & Java / JVM / JDK =====
* [[java:openjdk:docker|OpenJdk Docker]]
* [[https://www.javacodegeeks.com/2017/12/docker-java-developers-develop-docker.html|Docker for Java Developers: Develop on Docker]]
* Docker의 JVM에서 ''jmap'' 으로 Heap Dump를 뜰 수 없다.
* [[https://jarekprzygodzki.wordpress.com/2016/12/19/jvm-in-docker-and-ptrace_attach/|JVM in Docker and PTRACE_ATTACH]]를 참조하여 Docker 실행시에 ''%%--%%cap-add=SYS_PTRACE'' 옵션을 준다.
# 설정 안했을 경우 관련 오류
Caused by: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 142: Operation not permitted
* [[https://dzone.com/articles/running-a-jvm-in-a-container-without-getting-kille|Running a JVM in a Container Without Getting Killed]] Java 8u131 에서 Docker의 메모리할당량과 관련된 옵션 사용가능
* [[java:options|Oracle(SUN) JVM Options]] 참조
* [[https://dzone.com/articles/improved-docker-container-integration-with-java-10|Improved Docker Container Integration With Java 10 - DZone Java]]
* [[https://dzone.com/articles/pitfalls-in-jvm-and-docker-defaults|Pitfalls in JVM and Docker Defaults - DZone Java]]
===== Windows 10 & Docker CE=====
* Windows 10과 Docker 사용시 Hyper-V 에 오류를 발생시키는 것으로 보임 - 정확하지는 않음
vmswitch.sys DRIVER_IRQL_NOT_LESS_OR_EQUAL 어쩌구 오류
* sqlserver 2017 을 docker로 실행했을 때 오류가 발생하는 것으로 예상됨.
* https://github.com/Microsoft/mssql-docker/issues/88#issucomomment-314618471
===== Mac OS X 성능 문제 =====
* [[https://docs.docker.com/docker-for-mac/osxfs/#performance-issues-solutions-and-roadmap|Mac OS Docker Preformance Issue]]
* 볼륨 마운트시에 엄청 느려지는 현상이 2017년 현재 존재하는 듯.
===== Docker Log rotation =====
* ''/var/lib/docker/containers/*/*.log'' 에 STDOUT 이 모두 계속 출력되므로 log rotate가 필요하다.
* [[http://mcchae.egloos.com/11259352|[Docker] 로그 rotate]]
===== Localhost 접속 =====
* 보통은 그냥 ''192.168.x.x''로 접속하면 될 듯.
* [[https://nickjanetakis.com/blog/docker-tip-35-connect-to-a-database-running-on-your-docker-host|Docker Tip #35: Connect to a Database Running on Your Docker Host — Nick Janetakis]]
===== Gnome Shell Docker Integration =====
* https://github.com/gpouilloux/gnome-shell-extension-docker
* https://extensions.gnome.org/extension/1065/docker-status/
===== volume 저장소 =====
* [[https://docs.docker.com/storage/volumes/|Manage data in Docker | Docker Documentation]]
* ''/var/lib/docker/volumes/'' 에 볼륨 데이터 저장됨.
===== 참조 =====
* [[http://pyrasis.com/docker.html|가장 빨리 만나는 Docker]]
* [[http://www.slideshare.net/pyrasis/docker-fordummies-44424016|Docker 무작정 따라하기]]
* [[https://dzone.com/articles/introducing-docker-toolbox-the-fastest-way-to-star?oid=top_cta|Introducing Docker Toolbox: the Fastest Way to Get Started With Docker]]
* [[https://dzone.com/articles/5-real-world-docker-tips-from-oscons-most-popular|5 Real-World Docker Tips From OSCON’s Most Popular Session]]
* [[https://dzone.com/articles/new-features-in-docker-19-including-virutal-networ|New Features in Docker 1.9, Including Virtual Networks and Persistent Storage]]
* [[https://dzone.com/articles/minimal-docker-container|Making a Minimal Docker Container - DZone Cloud]]
* [[http://www.dasblinkenlichten.com/docker-networking-101-host-mode/|Docker Networking 101 – Host mode - Das Blinken Lichten]]
* [[https://blog.2dal.com/2017/03/27/docker-and-oom-killer/|Docker and OOM(Out Of Memory) Killer – asbubam's blog]]
* [[https://spoqa.github.io/2017/06/22/docker-tip.html|개발 환경에서 유용한 Docker 명령어 소개]]
* [[https://gracefullight.dev/2020/01/13/Dockerfile%EC%9D%98-%EB%AA%A8%EB%93%A0-%EA%B2%83/?utm_campaign=%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%8A%A4%EB%9F%BD%EB%8B%A4|Dockerfile의 모든 것 | Gracefullight]]
* [[https://www.baeldung.com/ls-course-start|Guide to Docker Volumes | Baeldung]]