docker 개념정리

Posted by HULIA(휴리아)
2017. 10. 17. 20:25 호스팅_서버_툴/도커(DOCKER)

Docker란

컨테이너 기반(프로세스)의 오픈소스 가상화 플랫폼(OS가상화와 조금은 다른 개념)

 

Docker의 주요 개념

-컨테이너

-도커이미지

-오버레이 네트워크

-유니온 파일 시스템

 

도커이미지란

컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 것으로 상태값을 가지지 않고 변하지 않음

 

도커이미지 관리

-URL방식으로 태그를 붙일 수 있음

-docker.io/library/ubuntu:14.04(public)

-my.private.image:5000/hello-app:123(private)

 

컨테이너란

도커이미지를 실행한 상태, 추가되거나 변하는 값은 컨테이너에 저장

 

도커이미지와 컨테이너관계

도커이미지에서 여러개의 컨테이너를 생성가능

컨테이너의 상태가 바뀌거나 삭제되어도 도커이미지는 변하지 않고 그대로 남아있음

 

도커이미지 배포서버

-docker hub(public)

-docker registry(private)

 

도커 이미지 만들기

-dockerfile 이용

-예시

# vertx/vertx3 debian version
FROM subicura/vertx3:3.3.1
MAINTAINER chungsub.kim@purpleworks.co.kr

ADD build/distributions/app-3.3.1.tar /
ADD config.template.json /app-3.3.1/bin/config.json
ADD docker/script/start.sh /usr/local/bin/
RUN ln -s /usr/local/bin/start.sh /start.sh

EXPOSE 8080
EXPOSE 7000

CMD ["start.sh"]

 

 

도커설치(윈도우)

 

윈도우용 설치 조건

-Windows 10 Enterprise, Professional 또는 Education

-두 번째 수준 주소 변환(SLAT)을 사용하는 64비트 프로세서.

-VM 모니터 모드 확장(Intel CPU의 VT-c)을 지원하는 CPU.

-최소 4GB의 메모리


 

[명령어]

1.도커버젼 확인

docker version

client와 server정보가 출력되면 설치 완료

 

2. 컨테이너 실행하기(이미지가 저장되었는지 확인하고 없다면 다운로드 한후 컨테이너를 생성하고 시작함)

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

ex) docker run ubuntu:16.04 -> 뭘 하라는 명령어를 주지 않았기 때문에 컨테이너는 생성되자마자 종료됨

 

ex) docker run --rm -it ubuntu:16.04 /bin/bash -> 컨테이너내부의 명령어 프롬프트 띄우기

cat /etc/isssue입력

ls입력

exit로 빠져나옴

 

-it 옵션은 키보드 입력

--rm 프로세스가 종료되면 컨테이너가 자동으로 삭제

 

ex) docker run -d -p 1234:6379 redis

-d 옵션은 background로 실행되도록 하는 것

-p 옵션은 컨테이너 포트를 호스트의 포트로 연결

호스트의 1234 포트를 컨테이너의 6379포트로 연결

 

telnet localhost 1234 입력

ctrl + c

 

 

ex) docker run -d -p 3306:3306 \
  -e MYSQL_ALLOW_EMPTY_PASSWORD=true \
  --name mysql \
  mysql:5.7

 

-e 환경변수(mysql docker hub에 여러가지 환경변수 있음)

--name 옵션을 이용하여 컨테이너에 읽기 어려운 ID대신 쉬운 이름을 부여할 예정

--name 생략하면 도커가 자동으로 이름을 지어줍니다

 

mysql -h127.0.0.1 -uroot 입력

show databases; 입력

 

3. 컨테이너 목록 확인

docker ps [OPTIONS]

ex)docker ps -a

 

4. 컨테이너 중지하기

docker stop [OPTIONS] CONTAINER [CONTAINER...]

ex) docker stop ${TENSORFLOW_CONTAINER_ID}

 

***도커 ID의 전체 길이는 64자리 입니다. 하지만 명령어의 인자로 전달할 때는 전부 입력하지 않아도 됩니다. 예를 들어 ID가 abcdefgh...라면 abcd만 입력해도 됩니다. 앞부분이 겹치지 않는다면 1-2자만 입력해도 됩니다.

 

5. 컨테이너 제거하기

docker rm [OPTIONS] CONTAINER [CONTAINER...]

ex)docker rm ${UBUNTU_CONTAINER_ID} ${TENSORFLOW_CONTAINER_ID}

ex)docker rm -v $(docker ps -a -q -f status=exited)  한번에 삭제

 

6. 도커 이미지 목록 확인하기

docker images [OPTIONS] [REPOSITORY[:TAG]]

ex) docker images

 

7. 도커 이미지 다운

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

ex) docker pull ubuntu:14.04

 

8. 도커 이미지 삭제

docker rmi [OPTIONS] IMAGE [IMAGE...]

ex)docker images # get image ID
docker rmi ${TENSORFLOW_IMAGE_ID}

 

9. 컨테이너 로그 보기

docker logs [OPTIONS] CONTAINER

ex) docker logs ${WORDPRESS_CONTAINER_ID}

ex) docker logs --tail 10 ${WORDPRESS_CONTAINER_ID}  마지막 10줄

ex) docker logs -f ${WORDPRESS_CONTAINER_ID}   실시간

 

10. 컨테이너에서 실행

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

run명령어는 새로 컨테이너를 만들어서 실행하고

exec는 실행중인 컨테이너에 명령어를 내리는 것이 다름

 

ex) docker exec -it mysql /bin/bash

ex) docker exec -it mysql mysql -uroot

 

 

도커 컨테이너를 업데이트

-새버전의 이미지를 다운(pull) 기존컨테이너를 삭제(stop, rm) 새 이미지를 기반으로 새 컨테이너를 실행(run) 하면 됨

 

컨테이너 삭제시 유지해야 되는 데이터 보관

-클라우드 서비스(아마존 S3)

-데이터 볼륨(호스트의 디렉토리에 마운트)

ex)docker run -d -p 3306:3306 \
  -e MYSQL_ALLOW_EMPTY_PASSWORD=true \
  --name mysql \
  -v /my/own/datadir:/var/lib/mysql \ # <- volume mount
  mysql:5.7

- >호스트의 /my/own/datadir디렉토리를 컨테이너의 /var/lib/mysql디렉토리로 마운트 하였습니다. 이제 데이터베이스 파일은 호스트의 /my/own/datadir디렉토리에 저장되고 컨테이너를 삭제해도 데이터는 사라지지 않습니다.

 

 

Docker compose

도커는 복잡한 설정을 쉽게 관리하기 위해 YAML방식의 설정파일을 이용한 docker compse라는 툴을 제공함

docker를 설치하면 깁노적으로 설치되어있음

 

docker-compose version 으로 버젼확인

 

overlay network

http://naver.me/FnTD925p
오버레이 네트워크의 중요한 처리(상자에 넣어 라벨을 붙이는 처리)를 ‘캡슐화’라고 합니다. 이 장치의 경우, 캡슐화라는 처리를 해서 캡슐로부터 내용을 꺼내 보낼 곳으로 데이터를 보내는 작업을 하거나, 누가 어떤 공장에 있는지를 작업자 Y씨나 Z 씨에게 적절히 알려주는 역할(기능)이 필요합니다. 사실 요즘은 Hyper-V 등과 같은 서버 가상화가 그 역할을 담당할 수 있게 되어 있습니다.

즉, 지금까지 라우터나 스위치 등과 같은 물리 네트워크 기기가 담당하던 처리의 일부를 서버 가상화가 담당해주는 것입니다. 이로써 네트워크 사이에 데이터를 보내는 물리적인 네트워크 기기의 종류에 구애받지 않게 됩니다. 따라서 싼 가격에 심플한 기기를 잘 활용할 수 있으면 ‘비교적 비싸다’라고 여겨지는 네트워크 기기의 비용을 줄일 수 있습니다.