Docker 기본명령

2017. 7. 19. 09:16Docker

Docker의 기본적인 지식

● 컨테이너 : 가상화 시키는 기술 보다 더욱 더 가까운 기술

● Immutable infrastructure

  • 호스트 os와 서비스 운영환경을 분리 (서버프로그램, 소스코드, 컴파일된 바이너리)를 분리
  • 서비스 운영환경을 이미지로 생성한 뒤 서버에 배포하여 실행
  • 서비스가 업데이트 되면, 운영환경 자체를 변경하지 않고, 이미지를 새로 생성하여 배포

즉 클라우드 플랫폼에서 서버를 쓰고 버리는 것과 같이 , 서비스 운영환경 이미지를하 쓰고 버림

● Dockerfile : docker 이미지 생성을 위한 일종의 배치파일이며, 특정 이미지를 기준으로 새로운 이미지 구성에 필요한 명령어를 저장한 파일

  • 파일 및 디렉토리 추가.
  • 환경 변수 만들기
  • 대상 이미지를 사용하여, 컨테이너를 시작할 때 어떤프로세스를 실행할지를 결정

Docker

서비스 운영환경을 묶어서 손쉽게 배포하고 실행하는 경량 컨테이너

Docker의 특징

  • 리눅스 컨테이너를 사용
  • 가상머신과 달리 도커는 게스트 OS를 설치하지 않음
  • 호스트와 OS자원을 공유
  • 이미지 버전 관리도 제공하고, 중앙 저장소에 이미지를 올리고, 받을 수 있음(push/pull)
  • 다양한 API 를 제공하여 원하는 만큼 자동화 가능하고, 개발과 서버 운영에 매우유용
  • 복잡한 리눅스 어플리케이션을 컨테이너로 묶어서 실행할 수 있음
  • 개발, 테스트, 서비스 환경을 하나로 통일하여 효율적으로 관리 할 수 있다.
  • 컨테이너(이미지)를 전세계 사람들과 공유할 수 있다.
  • git hub와 비슷한 방식의 Docker hub 를 제공

가상머신의 등장

  • 미리 구축한 가상머신 이미지를 여러 서버에 복사하여 실행하면 이미지 하나로 서버를 게속 만들어 낼수 있음
  • 가상화 기술을 이용하여, 서버를 임대해주는 서비스가 클라우드 서비스
  • 문제점 : 가상머신은 항상 게스트 OS 를 설치, 즉, 이미지 안에 OS가 포함되기 때문에 이미지 용량이 커짐, 배포/관리 기능 부족

리눅스 컨테이너의 등장

  • 가상 머신의 성능 문제가 있다 보니 리눅스 컨테이너가 나옴
  • 컨테이너 안에 가상공간을 만들지만 실행 파일을 호스트에서 직접 실행
  • 컨테이너 안에 cgroups , namespaces를 사용

Docker image and container Difference

  • 이미지는 서비스 운영에 필요한 서버프로그램 : 소스코드, 컴파일된 실행파일을 묶은 형태(저장소에 올리고 받는것은 이미지)
  • container는 이미지를 실행한 형태
  • 이미지로 여러개의 컨테이너를 만들 수 있음

ex) 운영체제로 치면, 이미지- 실행파일, 컨테이너 - 프로세스

도커의 이미지 처리방식 - 유니온 파일시스템 형식 (aufs, btrsfs, devicemapper)

  • 베이스 이미지에서 어플리케이션의 내용이 바뀐다면, 바뀐부분만 다시 이미지로 생성
  • 컨테이너를 실행할 때 베이스 이미지와 바뀐부분을 합쳐서 실행

Docker-compose

도커로 서버를 구축 할때, 컨테이너를 띄우는데, 한 컨테이너에 필요한 소프트웨어를 몰아서 설치할 수 도 있고, 각각 컨테이너를 따로 만들고

내부적으로 연결 할 수도 있다. 예를 들면, ubuntu 이미지에 nginx, postgres를 모두 설치 할 수도 있고, 각각 따로 설치된 컨테이너 세개를 띄우고 내부 네트워크로 연결할 수 있다. 이 때, 각각의 컨테이너를 띄우고, 설정하는 스크립트를 매번 하기 힘들기 때문에 여러 컨테이너를 한번에 띄울 수 있게 한는 docker-compose를 사용한다.


Docker 기본명령어

● 이미지 Search 하기

$ docker search [image 명] // ex) docker search nginx (nginx에 대한 받을 수 있는 이미지목록을 모두 가져온다.)

● 이미지 가져오기 : pull 명령어를 이용해서 , centos6 이미지를 받아본다.

 $ docker pull centos:centos6

● 이미지가 정상적으로 받아졌다면, images 명령으로 설치된 이미지를 확인하고, 대부분의 Repository 의 상태가 상태인데, 이것은 이미지가 빌드되는 과정에서 만들어진 이미지.

 $ docker images

● 모든 이미지 삭제

 $ docker rmi $(docker images -q)

● 컨테이너 생성 : OOP에 비유해보면 Image는 Class에 해당되고, 컨테이너는 Image를 바탕으로 만들어진 객체.

 $ docker run -i -t centos:centos6 /bin/bash

다운로드를 받은 이미지를 가지고 , 컨테이너를 생성하며 docker는 run 명령을 이용하여, 컨테이너를 생성할 수 있으며, -i 옵션은 STDIN

-t 옵션은 TTY와 관련된 옵션, 기타 다른 옵션을 확인하고 싶으면, run 명령까지만 입력하면 확인 가능 하다

/bin/bash 명령을 실행하면, 이 컨테이너의 쉘에 있는 상태가 되며

centos 이미지에서 바로 /bin/bash를 바로 실행시켰기 때문에 exit 를 하는 순간 여기서 빠져나오면 컨테이너가 정지된다.

● 현재 실행중인 컨테이너 확인

 $ docker ps

● 종료된 container 다시 시작

 $ docker restart [Container ID]

● 종료된 container를 다시 실행하면서 shell까지 입력이 가능하도록 하기

 $ docker attach [Container ID]

● Container 삭제

 $ docker rm [Container ID]

● 모든 Container 삭제

- $ docker stop $(docker ps -a -q)


  $ docker rm $(docker ps -a -q)

● docker exec 명령은 이미 실행된 컨테이너에 apt-get , yum명령으로 패키지를 설치하거나, 각종 데몬을 실행할 때 활용 할 수 있다.

● docker commit 명령 : 컨테이너의 변경사항을 이미지 파일로 생성합니다.

  • docker commit <옵션> <컨테이너 이름> <이미지 이름>: <태그> , 컨테이너 이름 대신 컨테이너를 사용해도 됩니다.
  • ex ) docker commit -a “Foor Bar foo@bar.com“ -m “add hello.txt” hello-nginx hello:0.2
-> 옵션으로 커밋한 사용자와 로그 메세지를 설정한다.

● docker diff <컨테이너 이름 or 컨테이너 ID> 컨테이너가 실행되면서 변경된 파일 목록을 출력합니다. A- 추가된파일, C- 변경된파일, D- 삭제된파일

● docker inspect 명령 <이미지 or 컨테이너 이름> : 이미지와 컨테이너의 세부정보를 출력