Docker란?
• 참고) Kubernetes와 Docker 비교를 한마디로 정리한다면, Docker는 ‘이미지를 만들고 컨테이너에 띄우는 도구’이고,
Kubernetes는 ‘도커를 관리하는 툴’
컨테이너는 Host OS 상에서 리소스를 논리적으로 구분하여 마치 별도의 서버인 것처럼 사용할 수 있게 하는 기술이다.
이를 Virtual Machine과 비교를 하면,
- Virtual Machine(Hosted/ Bare Metal Hypervisor)
- 애플리케이션 자체와 필요한 바이너리, 라이브러리 외에 OS 전체가 포함된다.
- CPU, 메모리, 하드 디스크 등의 하드웨어를 가상화하기에 하드웨어나 OS 부팅에 시간소요가 발생한다.
- 가상화된 하드웨어 및 하이퍼바이저를 통해 처리하기에 물리적 시스템보다 처리에 부가적인 오버헤드가 필요하다.
- Docker Container
- 애플리케이션과 꼭 필요한 바이너리, 라이브러리만 갖추며, Host OS의 커널을 공유한다.
- 부팅시 OS는 이미 시작하고 있기에 프로세스만 시작하면 되므로 부팅 소요시간이 절약된다.
- 커널을 공유하기에 개별 프로세스가 작업을 하는 것과 같은 정도의 시간이 걸리기 때문에 오버헤드가 적다.
협업을 위한 이식성 문제 해결
Docker는 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 이 컨테이너는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있다.
docker를 사용하면 환경에 구애받지 않고 개발이 가능하며, 호환성도 뛰어나다.
Docker Architecture
Docker는 내부적으로 Client-Server구조를 사용한다. 도커는 Docker daemon이라는 데몬을 실행하여 컨테이너와 관련된 모든 요청(빌드, 실행 등)을 처리한다.
- Docker daemon
- Docker API 요청을 수신하고 이미지, 컨테이너, 네트워크, 볼륨 등의 도커 오브젝트를 관리한다.
- Docker Client
- 도커 서버와 통신하기 위한 가장 주요한 기능을 수행한다.
- ex) docker run 명령어 실행 -> Docker Client는 해당 명령어를 REST API Call로 변환하여 도커 데몬으로 전송한다.
- Docker Registries
- 도커 이미지를 저장하는 저장소 역할을 한다.
- Docker Objects
- 도커의 컨테이너 기술의 핵심 기능들을 담당하며, 다양한 도커 오브젝트를 지원한다.
- Images : read-only 템플릿으로 필요한 프로그램, 라이브러리, 소스 등을 설치한 뒤에 이를 파일로 만든 것이다. 이렇게 만든 이미지를 레지스트리에 올리고, 레지스토리에 올라와 있는 다른 이미지를 받을 수도 있다.
- Container : 이미지를 실행한 결과로 생성되는 인스턴스를 의미한다. 이미지를 여러번 실행시키면 하나의 여러 개의 컨테이너가 만들어진다. OS로 본다면 이미지는 일종의 실행파일, 컨테이너는 프로세스와 유사한 개념이다. 사용자는 도커 클라이언트 명령어를 호출함으로써 컨테이너를 관리할 수 있다.
Docker 실습(Docker로 MySql 서버에 배포하기)
1. repository 인덱스 갱신하기(최신 패키지로 저장소에 있는 패키지들을 업데이트)
$ sudo apt update
2. 도커 다운을 위해 필요한 패키지 설치
$ sudo apt install apt-transport-https
-> http 접근을 위한 패키지
$ sudo apt install ca-certificates
-> ssi 디지털 서명을 위한 패키지
$ sudo apt install curl
-> 특정 사이트를 위한 패키지
$ sudo apt install software-properties-common
-> 소스코드를 받으면 자동 패키지화 해주는 패키지
3. curl 명령어로 도커 다운받기
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add
4. repository에 경로 추가하여 apt 리스트에 패키지 다운 경로 추가
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
->저장소에 url 주소 추가하고
$ sudo apt update
-> 저장소의 패키지 갱신 및 도커 자동연결 update
5. 도커 설치하기
$ apt-cache policy docker-ce
$ sudo apt install docker-ce
6. 도커 시스템 확인하기
$ sudo systemctl status docker
Hello world 이미지 받기
$ sudo docker pull hello-world
$ sudo docker images
-> 생성된 docker image 확인
$ sudo docker run hello-world
-> 컨테이너 실행
$ sudo docker ps -a
-> 실행 중인 컨테이너 확인
$ sudo docker rm 컨테이너ID
-> 컨테이너 삭제
$ sudo docker images
-> 삭제가 되었는지 확인
7. 도커 버전 확인
$ docker -v
8. MySql 5.6 버전을 다운로드
$ sudo docker pull mysql:5.6
9. Docker 이미지를 확인한다.
$ sudo docker images
10. MySql Docker 컨테이너 생성 및 실행(e: 환경변수 설명, d: detach-데몬 백그라운드)
$ sudo docker run --name mysql-lecture -e MYSQL_ROOT_PASSWORD=<password> -d -p 3306:3306 mysql:5.6
11. Docker 컨테이너 리스트 출력
$ sudo docker ps -a
12. MySQL Docker 컨테이너 시작/중지/재시작
# MySQL Docker 컨테이너 중지
sudo docker stop mysql-lecture
# MySQL Docker 컨테이너 시작
sudo docker start mysql-lecture
# MySQL Docker 컨테이너 재시작
sudo docker restart mysql-lecture
13. MySQL Docker 컨테이너 접속(-i, --interactive, -t, tty)
sudo docker exec -it mysql-lecture /bin/bash
root@dc557b92f573:/# mysql -u root -p
Enter password:
14. DB, User 생성하기, User권한주기
CREATE DATABASE testdb;
CREATE USER 'tuser'@'%' IDENTIFIED BY '1234';
GRANT ALL PRIVILEGES ON testdb.* TO 'tuser'@'%';
flush privileges;
15. ip로 바로 컨테이너 MYSQL로 접속해보기
컨테이너 ip 확인
sudo docker inspect 03f4ffa9d684
컨테이너 MYSQL로 바로 접속하기( 바로 mysql 터미널로 접속됨 )
mysql -u root -p -h 172.17.0.2 --port 3306
16. 외부에서 Mysql 접속해 보기(DBeaver or MySQL workbench)
host -> 퍼블릭 아이피
17. 컨테이너, 이미지 모두 삭제 후 port 설정 연습
sudo docker run --name mysql-lecture -e MYSQL_ROOT_PASSWORD=<password> -d -p 8088:3306 mysql:5.6
12. aws ec2 보안 그룹에서 8088 port 열어준다.
Dockerfile Build
다음은 도커파일을 빌드해 이미지와 컨테이너를 생성하는 과정을 알아보자.
'☁️ Cloud' 카테고리의 다른 글
[AWS]Chapter09_AWS S3 (0) | 2023.05.23 |
---|---|
[AWS]Chapter08_AWS RDS 생성 (0) | 2023.05.14 |
[AWS]Chapter07_AWS RDS 생성(feat.MySQL) (0) | 2023.05.01 |
[AWS] Chapter06_리눅스 명령어 (0) | 2023.04.13 |
[AWS] Chapter05_AWS EC2생성 (0) | 2023.04.06 |