컨테이너 기반의 가상화 플랫폼. 컨테이너 상에서 서버를 설정할 수 있기 때문에 기반 환경이 다르더라도, 언제든 해당 컨테이너를 실행만 하면 동일한 서버 셋업이 가능하다.
즉, Docker란 LXC기술을 사용하여 도커를 만들 때마다 Container를 만들어서 개별적인 시스템이 동작하도록 만든 프로그램이다.
여러 명령들을 가진 script의 집합이다. 이러한 script를 최종적으로 실행을 하여 하나의 이미지를 만든다.
script로 이루어져 있는 도커 이미지가 실행한 상태(instance)를 의미한다.
docker container는 분리된 공간이므로, docker daemon process를 통해 접속할 수도 있고, 코드 수정, 재실행 등도 가능하다.
👉도커를 사용한다는 것은,
1. 도커 이미지를 만들고,
2. '생성한 이미지를 기반으로 Docker Container를 만들어 실행을 한다'
가 되겠다.
하나의 Docker Image로 동일한 기능을 수행하는 여러개의 docker container를 만들 수도 있다.
다운로드 받을 이미지 검색
docker search <이미지명>
실행 결과를 살펴보면,
1. Name
이미지의 이름이다. 슬래시(/)로 구분되어져 있는 이름이 있는데, / 앞단은 Docker Hub 사용자명이고, 뒷단은 이미지명이다. 즉, 공식 이미지가 아닌, 사용자가 만든 이미지이다.
2. Description
이미지에 관한 설명이다.
3. stars
사용자가 누른 추천수. (깃허브인줄)
4. Official
[OK]라고 적혀 있다면 공식이미지이다.
이미지 다운로드
docker pull <이미지명>
만약, "docker pull ubuntu"와 같은 형태가 아닌,
"docker pull ubuntu:20.10"
과 같이 콜론 뒤에 숫자를 적음으로서 특정 버전을 다운로드 받을 수 있다. 만약, 태그가 없다면 디폴트로 가장 최신 버전(lateset)을 다운로드받는다.
이미지 다운로드 목록 확인
docker images 혹은 docker image ls
실행결과 :
다운로드 받은 이미지 삭제하기
docker rmi <이미지ID 또는 이미지repository 이름> 혹은 docker image rm <이미지ID 또는 이미지repository 이름>
주의해야 할 점은, 이미지 ID 말고 이미지 이름으로 삭제할 시, 이미지 repository 이름 뒤에 태그명까지 정확하게 입력을 해야 한다는 것이다.
컨테이너 생성
docker create <이미지명>
근데 그냥 생성만 했다고 딱히 변화가 있는 것은 아니다.
주요 옵션을 부가적으로 달아준 채로 실행을 해야 뭐 이것저것 한다. 그 옵션은 밑에...
생성된 컨테이너 확인
docker ps
docker ps -a -q (실행중이지 않은 컨테이너를 포함해서, 전체 컨테이너의 ID만 출력하기) (a : 전체를 출력하라) (q : 아이디만 출력하라)
1. container ID
컨테이너 생성시, 도커에서 자동으로 부여해 주는 컨테이너 ID
2. IMAGE
컨테이너에 사용된 이미지 이름
3. COMMAND
컨테이너 실행시 실행되는 프로세스 이름.
도커는 기본적으로, 프로그램이 실행할 명령을 감싸는 컨테이너의 종합이다. 그 실행될 명령을 알려주는 요소라고 생각하자.각 이미지마다, 컨테이너 생성시 실행되는 프로세스를 기재할 수 있다. 예를 들어 ubuntu의 경우, bash프로그램이 실행되는데, 이러한 실행되는 프로그램의 이름을 COMMAND 항목에서 확인을 할 수 있다. (bin/bash라고 뜨게 될 것이다.)
4.CREATED
컨테이너 생성 후 경과 시간
5. STATUS
컨테이너 실행 상태(Created:생성, Up: 실행중, Pause : 중지, Exited: 종료)
6. PORTS
호스트와 컨테이너 포트 사이의 연결 관계
7.NAMES
컨테이너 이름.
컨테이너 ID뿐만 아니라, 컨테이너의 이름을 가지고도 제어를 할 수 있다. 만약 컨테이너를 만들 때 명시를 안 해 주었다면 프로그램이 임의로 만들어준다.
컨테이너 삭제
docker rm <삭제할 컨테이너 이름>
내가 원하는 이름으로 컨테이너를 생성하기
docker create --name <내가 원하는 컨테이너 이름> <이미지 이름>
컨테이너 실행
docker start <컨테이너 이름>
근데 보통 docker run 을 쓴다.
docker run
docker run(옵션1) (옵션2) ... <이미지명>
이미지 다운로드와 해당 이미지로 컨테이너 생성, 실행을 동시에 해준다.(pull, create, start)
docker run 옵션 | 설명 |
---|---|
-i | 컨테이너 입력(STDIN)을 열어놓는 옵션(주로 -it로 -i옵션과 -t옵션을 같이 사용 |
-t | 가상 터미널(tty)를 할당하는 옵션 |
--name | 컨테이너 이름 설정 |
-d | 컨테이너를 백그라운드에서 실행 |
--rm | 컨테이너 종료시 컨테이너를 자동으로 삭제 |
-p | 호스트와 컨테이너 포트를 연결하는 옵션(-p 9999:80 👉host PC의 9999번 포트로 접속하면, 컨테이너의 80번 포트와 연결해 준다.) |
-v | 호스트와 컨테이너 디렉토리를 연결하는 옵션 |
-it : -i옵션과 -t옵션을 합친 것으로, 입력(-i)을 가상터미널(-t)에서 stdin으로 받는 기능(주로 많이 사용한다.) 👉pc상에서의 입력이 컨테이너 입력으로 들어가게 된다.
가상터미널(tty) : teletypewriter의 약자/ 리눅스에서는 콘솔 혹은 터미널을 의미.
-d옵션을 주지 않는다면, 컨테이너가 foreground로 실행되기 때문에, 다음 명령을 실행 할 수 없게 된다.
-p 9999:80
컨테이너 종료
docker stop <컨테이너명>
- 중지한 컨테이너는 docker start로 재실행 가능
컨테이너 재실행
docker restart <컨테이너명>
컨테이너 잠깐 멈추기/멈춘 컨테이너 실행
docker pause <컨테이너명> docker unpause<컨테이너명>
실행중인 컨테이너에 명령 실행하기
docker exec <옵션> <컨테이너 ID> <명령어>
컨테이너 안의 쉘을 실행하여, 나 자신이 해당 컨테이너에 들어가기 위해 사용하는 경우가 많다.
예를 들어, docker exec -it <컨테이너 ID> /bin/sh
라고 쓰면, /bin/sh 쉘 프로그램을 실행하면서, 터미널에 연결되므로 컨테이너 안으로 들어갈 수 있게 된다.(ubuntu 이미지로 만든 컨테이너는 /bin/bash이고, alpine으로 만든 컨테이너는 /bin/sh이다.
따라서 명령어를 실행하기 이전에 docker ps명령어를 통해 이미지가 httpd:alpine인지, httpd:ubuntu인지를 확인해야만 한다.)
실행중인 컨테이너에 연결하기
docker attach <컨테이너ID>
단, 연결하고자 하는 컨테이너가 백그라운드(-d)로 실행중이어야 하고, 가상터미널로 입력을 받는 상태(-it)이어야 한다.
그렇게 한다면, 해당 컨테이너로 연결이 되어, 컨테이너 내의 쉘 프로그램에 신규 명령어를 쓸 수 있게 된다.
즉, attach는 컨테이너에 연결을 하는 명령어
exec는 컨테이너에 신규 명령어를 내리는 명령어
컨테이너 / 이미지 삭제
모든 컨테이너를 삭제하기 위해서는, 모든 컨테이너를 중지시킨후,
docker stop $(docker ps -a -q)
모든 컨테이너를 삭제해야 한다.
docker rm $(docker ps -a -q)
- 모든 이미지 삭제
docker rmi $(docker images -q) docker rmi -f $(docker images -q) #삭제가 안될 경우, 강제로 삭제되도록 하는 옵션(-f)
- 정지된 컨테이너 삭제
docker container prune
- 실행중인 컨테이너의 image외의 모든 이미지 삭제
docker image prune
- 정지된 컨테이너, 실행중인 컨테이너 이미지 외의 이미지, 볼륨, 네트워크 삭제
docker system prune