#keywords docker, container

[[TableOfContents]]

== Install & Service Start ==
https://www.docker.com/get-started

== 자주 쓰는 명령어 ==
=== search ===
[https://registry.hub.docker.com/ Docker Hub]를 통해 이미지를 검색
{{{#!code
$ docker search ubuntu
NAME                          DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
ubuntu                        Ubuntu is a Debian-based Linux operating sys…   12545     [OK]
rastasheep/ubuntu-sshd        Dockerized SSH service, built on top of offi…   254       [OK]
...
}}}

=== pull ===
저장소에서 이미지 가져오기
{{{#!code
sudo docker pull ubuntu:latest
}}}
yhyacinth/ubuntu 처럼 / 앞에 사용자명이 있으면 그 사용자가 올린 이미지를 받음.
공식 이미지는 사용자명이 붙지 않음.

=== ls ===
{{{
$ docker images
}}}
또는
{{{
$ docker image ls
}}}
이미지 목록 확인

=== run ===
이미지를 컨테이너로 생성한 뒤 컨테이너 실행
{{{#!code
$ docker run -i -t --name hello ubuntu /bin/bash
}}}

=== ps ===
모든 컨테이너 목록 출력
{{{#!code
$ docker ps -a
}}}

=== start ===
정지한 컨테이너 실행
{{{#!code
$ docker start <컨테이너 이름>
}}}

=== exec ===
이미 실행된 컨테이너 안의 명령을 실행
예) /bin/bash 로 실행되어 있을 때 명령어 실행
{{{#!code
$ docker exec <컨테이너 이름> echo "Hello World"
Hello World
}}}

=== attach ===
시작한 컨테이너에 접속
{{{#!code
$ docker attach <컨테이너 이름>
}}}

=== stop ===
컨테이너 정지
{{{#!code
$ docker stop <컨테이너 이름>
}}}

=== restart ===
컨테이너 재시작
{{{#!code
$ docker restart <컨테이너 이름>
}}}

=== rm ===
생성된 컨테이너 삭제
{{{#!code
$ docker rm <컨테이너 이름>
}}}

=== rmi ===
이미지 삭제
{{{
$ docker rmi <컨테이너 이름>:latest
}}}

== Quick Start ==
=== go alpine 빌드&Hub 배포 ===
["/go alpine 빌드&Hub 배포"]

=== Docker Build ===
{{{
$ docker build -t sample-app .
}}}

=== Docker Hub push ===
1) tag
{{{
docker tag <이미지 이름:태그> <hub 계정 이름>/<hub 레파지토리 이름:태그>
예) $ docker tag sample-app:latest yhyacinth/sample-app:latest
}}}
*) 로컬 이미지 확인
{{{
$ docker images
}}}

2) Docker Hub에 이미지를 push
{{{
$ docker push yhyacinth/sample-app:latest
}}}
*) Docker Hub 로그인
{{{
$ docker login
}}}

=== Docker Hub pull ===
{{{
$ docker pull yhyacinth/dev-web 
}}}

=== Docker image run ===
{{{
docker run -p <포트>:<포트>/<프로토콜(생략시tcp)> <IMAGE ID>
예) $ docker run -p 3000:3000 24e776178046
$ docker run -p 3001:3001/udp 24e776178046
}}}
docker run -p 옵션: 호스트와 클라이언트 포트를 매핑
docker run -d 옵션: 백그라운드 모드로 실행

=== Docker image stop ===
1) docker ps 로 NAMES(실행 중인 컨테이너 이름) 확인

2) stop
{{{
docker stop <컨테이너 이름>
예) docker stop adoring_meninsky
}}}

== Tips ==
=== Windows Server Core에서 IIS 사용 ===
(FROM mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019 을 사용하지 않을 경우)

Dockerfile에 추가
{{{
# escape=`
FROM mcr.microsoft.com/windows/servercore:ltsc2019
RUN powershell -Command `
Add-WindowsFeature Web-Server; `
Invoke-WebRequest -UseBasicParsing -Uri "https://dotnetbinaries.blob.core.windows.net/servicemonitor/2.0.1.6/ServiceMonitor.exe" -OutFile "C:\ServiceMonitor.exe"
WORKDIR /inetpub/wwwroot
EXPOSE 80
ENTRYPOINT ["C:\\ServiceMonitor.exe", "w3svc"]
}}}
첫 줄의 [[code(# escape=,)]]는 Dockerfile에서 powershell 인자를 `으로 여러 줄을 표현하기 위해 쓰일 뿐이며 Docker 설정과 관계가 없다.

=== Alpine에서 bash 사용 ===
Dockerfile에 추가
{{{
RUN apk update
RUN apk add --no-cache bash
}}}

=== tensorflow 사용 ===
[[code(docker run -p 8888:8888 -p 6006:6006 -it tensorflow/tensorflow)]]

=== get bash into a running container in background mode ===
1. 실행 중인 container id 확인 
[[code(docker ps)]]

2. /bin/bash 실행
[[code(docker exec -it 665b4a1e17b6 /bin/bash)]]

=== mount directory ===
==== for windows ====
1. Tray 아이콘 Settings
2. Shared Drive 탭 > Shared C: 체크
3. Apply

적용 후 run 할 때 다음 추가
[[code(-v //c/my_folder:/home/test_container)]]
[[code(-v //c/Users/user/my_folder:/home/test_container)]]

여러 개를 mount 할 때는 디렉터리마다 -v를 붙여준다.

=== docker VM Disk(disk.vmdk) 경로 변경 ===
(for mac)
1. stop docker
2. vi /etc/default/docker 편집
경로 수정
[[code(DOCKER_OPTS="-g /docker/var/lib/docker")]]

3. start docker

(for windows)
1. %PROGRAMFILES%\Docker Toolbox\start.sh 편집
2. docker-machine.exe 실행 시 -s 옵션을 사용하도록 수정한다.
수정 전
[[code(DOCKER_MACHINE=./docker-machine.exe)]]
수정 후
[[code(DOCKER_MACHINE_FILE=./docker-machine.exe)]]
[[code(DOCKER_MACHINE="./docker-machine.exe -s D:/docker/")]]

수정 전
[[code(if [ ! -f "${DOCKER_MACHINE}" ]; then)]]
수정 후
[[code(if [ ! -f "${DOCKER_MACHINE_FILE}" ]; then)]]

수정 전
[[code(VM_STATUS="$(${DOCKER_MACHINE} status ${VM} 2>&1)")]]
수정 후
[[code(VM_STATUS="$(${DOCKER_MACHINE_FILE} status ${VM} 2>&1)")]]

3. [[code(%USERPROFILE%\.docker\machine)]] 폴더들을 설정 변경한 위치로 복사

4. docker machine 재시작
[[code(cmd> docker-machine stop)]]
[[code(cmd> start.sh)]]

(...mac, windows 공통으로 경로 설정 바꾸는 것보다 그냥 심볼릭 링크 만들어도 무방하고 그 편이 더 쉬울 수 있다.)

----
CategoryDev