
도커 이미지는 한꺼번에 만들어지는 통짜 파일이 아니라, Dockerfile 에 적힌 명령어를 한 줄 실행할 때마다 생성되는
중간 저장 단계들의 집합. 이때의중간 저장 단계들을레이어라고 함.
불변성 (Read-only)공유 (Sharing)캐싱 (Caching)# 이미지 다운로드
docker pull httpd # (docker.io/library/httpd:latest)
# 이미지 확인
docker image history httpd
# 출력되는 결과에서 CREATED BY 열이 이미지를 구성하기 위한 명령
# debian 의 최신 이미지를 다운로드
docker pull debian
# 다운로드 받을 때 보면 httpd 가 레이어가 더 많음

운영체제 (ex: debian)Middleware (ex: httpd - apache web server)Applicationdocker login
docker logout
# 기본 형식
저장소 주소/레포지토리이름:버전
# 태그 이름 부여
docker tag 원본이미지ID 변경할이름
# 업로드
docker push 이름
# 이미지 확인
docker images
# 기존 이미지를 이용해서 새로운 이미지 생성
docker image tag 05813aedc15f test1
docker image tag hello-world:latest test2
# 업로드 하기 위한 이름 생성
docker image tag httpd:latest 레포지토리이름(도커허브이름)/myhttpd:2.0
# 업로드
docker push 레포지토리이름(도커허브이름)/이미지이름:버전
확장자는 tar (Tape Archiver)
저장
docker image save [option] Image_이름 > 파일_경로로드
docker image load < 파일_경로실습
# 1. eclipse/mysql:latest 다운로드
docker image pull eclipse/mysql:latest
# 2. test-mysql57.tar 파일로 저장 (리다이렉션 대신 -o 옵션 권장)
docker image save -o test-mysql57.tar eclipse/mysql:latest
# 3. 로컬에 저장된 eclipse/mysql:latest 이미지 삭제
# (이미지 ID가 같은 test1, test2 등이 있다면 -f 옵션이 필요할 수 있습니다)
docker image rm eclipse/mysql:latest
# 4. test-mysql57.tar 파일로부터 이미지 로드 (리다이렉션 대신 -i 옵션 권장)
docker image load -i test-mysql57.tar
# 이미지 삭제
docker image rm 이미지이름
docker rmi 이미지이름
# 전체 이미지 삭제
docker rmi $(docker images -q)
# 필터링 해서 삭제
docker rmi $(docker images -q | grep 패턴)
docker rmi $(docker images -q | grep -v 패턴)
# 사용하지 않는 이미지 삭제
docker image prune -a
snapshotsnapshot은 읽기 전용의 Docker Image Layer를 복제한 것이고 그 위에 읽고 쓰기가 가능한 컨테이너 레이어를 결합한 것이 컨테이너namespace, cgroup, chroot) 의 표준으로 정의된 OCI로 컨테이너 포맷과 런타임에 대한 개방형 업계 표준을 만들기 위한 목적으로 LFX의 지원을 받아 구성된 프로젝트docker run~ 을 사용하면 컨테이너가 동작하게 되고 가상의 격리 환경에 독립된 프로세스기 동작하는데 서버 호스트 운영체제가 독립적으로 동작하는 것과 유사# gihyodocker/echo:latest 이미지 다운
docker pull hashicorp/http-echo
# 이미지를 컨테이너로 실행
docker run -p 9000:5678 hashicorp/http-echo -text="hello world"
docker run 명령을 내리면 해당 Docker 이미지 복사본 스냅샷 레이어 위에 읽고 쓰기가 가능한 컨테이너 레이어를 추가한 뒤 docker start 명령으로 컨테이너를 시작ndocker ps# 이미지 다운로드
docker pull ubuntu:14.04
# 컨테이너 생성
docker create -it --name 컨테이너이름 이미지이름 # -it 옵션은 터미널 실행
docker create -it --name container-test1 ubuntu:14.04
# 컨테이너 확인
docker ps # 실행 중인 컨테이너 확인
docker ps -a # 모든 컨테이너 확인
# 컨테이너 실행
docker start container-test1
# 컨테이너 접속
docker attach container-test1
# 컨테이너 중지
docker stop container-test1
# 컨테이너 삭제
docker rm container-test1
## 컨테이너 접속까지 한 번에 수행
docker run -it --name container-test1 ubuntu:14.04 bash
run은 항상 컨테이너를 새로 만드는데, 새로 만들 때 동일한 이름의 컨테이너는 만들 수 없음docker image pull + docker container create + docker container start + command 의 기능을 하나로 합친 명령으로 image를 다운로드 한 상태가 아니라면 먼저 이미지를 내려 받은docker run [option] 이미지 [인자]
--name 컨테이너 이름-p [Host Port]:[Container Port]Port Forwarding , 외부에서 접근할려면 포트포워딩을 이용할 수 있음-P, --publish-all=[true|false]-v, --volume=호스트경로:컨테이너경로--net-i , --interface-t-it 와 같이 둘은 항상 같이 사용-d , --detach=true-e , --env--rm--restart [no | on-failure | on-failure 횟수 | always]-h 컨테이너의 호스트 이름--link=[컨테이너이름:컨테이너아이디]-d 는 컨테이너를 백그라운드로 실행하는 옵션이고 -I , -t 는 컨테이너 내부에 터미널로 접속하기 위해 사용하는 옵션-d 를 붙이지 않고 컨테이너를 실행하면 실행된 컨테이너가 프로그램의 실행을 마칠 때까지 터미널의 제어를 차지하므로 그 다음 명령을 입력할 수 없는 상태가 되며 -i , -t 옵션을 붙이지 않으면 컨테이너 안의 파일 시스템에 접근할 수 없음-a 옵션을 이용하면 모든 컨테이너를 확인하는 것이 가능CONTAINER ID : 컨테이너 아이디IMAGE : 이미지 이름COMMAND : 컨테이너가 실행이 될 때 수행하는 명령CREATED : 생성 후 경과된 시간STATUS : 현재 상태로 Up이면 정상 수행이고, Exited 이면 종료 상태PORTS : 포트포워딩 내용NAMES : 컨테이너 이름# 실행 중인 컨테이너 중지
# 특정 컨테이너 중지
docker stop 컨테이너ID 또는 컨테이너이름
# 모든 컨테이너 중지
docker stop $(docker ps -a -q)
# 컨테이너 삭제
# 특정 컨테이너 삭제
docker rm 컨테이너ID 또는 컨테이너이름
# 모든 컨테이너 삭제
docker rm $(docker ps -a -q)
docker run [옵션] 이미지이름 [인자]
# 웹 서버이므로 - 옵션은 필수
# 컨테이너 생성 및 실행
docker run -d --name apa000ex1 httpd
# 컨테이너 실행 상태 확인
docker ps
# 컨테이너 정지
docker stop apa000ex1
# 컨테이너 삭제
docker rm apa000ex1
# 이미지 검색
docker search nginx
# 이미지 다운로드
docker pull nginx
# 컨테이너 생성
docker run -d --name webserver1 nginx
curl http://localhost:80 명령을 수행해도 다운로드 되지 않음
포트포워딩
# 아파피 웹 서버는 80번 포트를 개방
docker run -d -p 8080:80 --name apa000ex2 httpd
# curl http://localhost:80 으로 다운로드 시도
curl http://localhost:8080
리눅스 운영체제가 담긴 컨테이너
웹 서버 및 데이터베이스 서버용 컨테이너
httpd : 아파치 웹 서버nginx : nginx 웹 서버프로그래밍 언어의 런타임 컨테이너
registry : 도커 레지스트리 생성 시 필요wordpress : MySQL 이나 MariaDB 필요redmine : MySQL 이나 MariaDB 필요# 이미지 다운로드
docker pull nginx
# 컨테이너 실행
docker run --name webserver1 -d -p 8001:80 nginx
# 컨테이너 확인
docker ps
# 컨테이너의 리소스 사용량 실시간 확인
docker stats webserver1
# 컨테이너의 실행 중인 프로세스 확인
docker top webserver1
# 컨테이너의 접근 로그를 Docker 명령으로 확인
docker logs -f webserver1
# 컨테이너 중지
docker stop webserver1
# 컨테이너 실행
docker start webserver1
# 실행 중인 Container를 제외한 모든 Container 파기
docker container prune
# 사용하지 않는 Docker image 및 컨테이너, 볼륨, 네트워크 등
# 모든 도커 리소스를 일괄적으로 삭제
docker system prune
# 사용 현황 확인
docker container stats
docker cp 호스트경로 컨테이너이름:컨테이너경로
docker cp 컨테이너이름:컨테이너경로 호스트 경로
# 컨테이너 생성
docker run --name apa000ex19 -d -p 8089:80 httpd
# 컨테이너에서 호스트로 파일을 복사
docker cp apa000ex19:/usr/local/apache2/htdocs/index.html index.html
# 현재 디렉토리에 index.html 파일이 생성됨
# 현재 디렉토리에 있는 index.html 파일 수정
# 호스트에서 컨테이너로 파일을 복사
docker cp index.html apa000ex19:/usr/local/apache2/htdocs/index.html
# 현재 디렉토리에 lotto.py 파일을 생성
# 파이썬 컨테이너 실행
docker run -it -d --name=python_test -p 8900:8900 python
# 파일 복사
docker cp lotto.py python_test:/
# 컨테이너에 명령 수행
docker exec -it python_test bash
# 파이썬 확인
python
# 파이썬 종료
exit()
# 파이썬 관련 도구 확인
pip list
# 파이썬 모듈 확인
python -c 'help("modules")'
# 외부로 나가기
exit
# 외부에서 파이썬 컨테이너 코드 실행
docker exec -it python_test python /lotto.py