728x90

2010 - 클라우드, CNCF(Linux) -> K8S(kubernetes)

 

**CNCF 4개의 구성요소

  1. MSA

  2. CI/CD(지속적인 통합/배포)

  3. DevOps

  4. Container

 

Agile방법론 -> 빠르게 응답 및 개발

- DevOps의 cycle

 

Docker: 컨테이너 가상화 - 이식성이 좋음, 빠르게 개발할 수 있도록 지원

OCI : docker 표준화를 만듦.

-docker, container d, cri-o

 

-cloud (IoT infra 구축, msa 구축 application 개발)

 

-cloud, microservice가 생기면서 docker와 같은 container 가상화 기술이 등장함

 

-Docker

§ 2014년 6월 Docker 1.0 발표

§ 컨테이너 기반의 오픈소스 가상화 플랫폼

§ 백엔드 프로그램, 데이터베이스, 메시지 큐à컨테이너로 추상화 가능

일반PC, AWS, Azure, Google cloud 등에서 실행 가능

**프로젝트 제출할 시에 상대경로로 바꿔서 제출할 것!

 

->3가지 환경이 동일해야 함

Dev              UAT(QA)                Prod

            user acceptable test

 

 

-python + django + scrapy 를 추후에 image로 만들어 배포하면 test할 때 실행만 하면 된다 => 수업의 목표

 

 

§ 기존 가상화 방식 -> OS를 가상화

    - VMWare, VirtualBox (Host OS 위에 Guest OS 전체를 가상화)

    - 무겁고느림

§ CPU의 가상화 기술 이용 방식èKernel-based Virtual Machine

    -  전체OS를가상화하지않음,호스트형식에비해속도향상

    -  OpenStack, AWS 등의 클라우드 서비스

    -  추가적인 OS는 여전히 필요, 성능 문제

§ 프로세스 격리è리눅스 컨테이너

    -  CPU나 메모리는 프로세스에 필요한 만큼만 추가로 사용

    -  성능손실거의없음

    -  컨테이너들 사이는 서로 영향을 주지 않음

    -  ⭐️⭐️컨테이너 생성 속도 빠름 (1-2초 내)

-쉐어하우스 같은 개념

 

-Docker Desktop(=engine, server)

 

§ Docker Image

os + middleware => 하나의 image 파일(상태정보는 없다), 사용할 수는 없는 상태(설치파일 형태)

    -  컨테이너 실행에 필요한 파일과 설정 값 등을 포함 -> 상태값 X, Immutable

    -  실체화 -> Container (실제 사용할 수 있는 환경)

image -> 실행, 실체화, 사용, 설치 -> container

 

$docker image ls

$docker container ls

(container는 image가 있어야 만들 수 있음)

 

  1. image생성

  2. image 다운로드(public, private)

 

 

docker -> 필요한 부분만 내가 설치할 수 있음

VM machine -> 기본적으로 무언가 설치되어 있음

 

 

더보기

VM(OS) : 운영체제 가상화

python -> linux에 설치

Guest OS -> linux

Virtual Box -> macOS설치

Host OS -> macOS

 

더보기

Container : 컨테이너 가상화

container(base:경량os(5MG)위에 python, mysql) => 하나의 image로 만듦 container(base) container(base)

Docker Engine(Docker Desktop) -> macOS(linux면 docker server만 설치하면 됨)

Host OS -> macOS

 

-python, mysql, java, nodejs(middleware,sdk개발언어), excel, ppt(app)

-os(필수 환경)

 

§ Docker Hub에 등록 or Docker Registry 저장소를 직접 만들어 관리

    - 공개된 도커 이미지는 50만개 이상, 다운로드 수는 80억회 이상

§ Layer 저장방식

    - 유니온 파일 시스템을 이용 -> 여러 개의 Layer를 하나의 파일시스템으로 사용 가능

-container사용할 때 image를 지울 순 없음

-nginx : 비동기화 방식을 지원하는 웹 서버 => os필요

-ubuntu위에다 nginx image를 얹음

-base image(base os) = layer A, layer B, layer C

-web app(ex.django) => base image(nginx+Layer C+Layer B+Layer A)

 

**volume mount (도커 안에서 사용할 수 있도록 연결시켜 주는 작업)

-> 그러면 host OS에 새로운 컨테이너를 삭제해도 데이터를 남길 수 있다.

 

-image -> 여러 개의 layer로 이루어져 있음

-한번 다운받았던 layer는 다음에 또 다운받지 않음

 

더보기

$docker pull ubuntu:16.04(ubuntu를 사용하기 위한 최소한의 환경)

16.04: Pulling from library/ubuntu

4007a89234b4: Pull complete 

5dfa26c6b9c9: Pull complete 

0ba7bf18aa40: Pull complete 

4c6ec688ebe3: Pull complete 

Digest: sha256:e74994b7a9ec8e2129cfc6a871f3236940006ed31091de355578492ed140a39c

Status: Downloaded newer image for ubuntu:16.04

docker.io/library/ubuntu:16.04

 

$docker image ls

 

더보기

$docker pull ubuntu:18.04

18.04: Pulling from library/ubuntu

d519e2592276: Pull complete 

d22d2dfcfa9c: Pull complete 

b3afe92c540b: Pull complete 

Digest: sha256:ea188fdc5be9b25ca048f1e882b33f1bc763fb976a8a4fea446b38ed0efcbeba

Status: Downloaded newer image for ubuntu:18.04

docker.io/library/ubuntu:18.04

 

더보기

$docker image ls

REPOSITORY   TAG       IMAGE ID       CREATED       SIZE

ubuntu       16.04     8185511cd5ad   2 weeks ago   132MB

ubuntu       18.04     c090eaba6b94   2 weeks ago   63.3MB

 

더보기

$docker image rm 8185511cd5ad

$docker image rm c090eaba6b94

 

더보기

$docker pull python

9개 layer

 

더보기

$docker image ls

REPOSITORY   TAG       IMAGE ID       CREATED      SIZE

python       latest    e32be9a6f71f   3 days ago   885MB

 

 

§ Dockerfile

    - Docker Image를 생성하기 위한 스크립트 파일

    - 자체 DSL(Domain-Specific language) 언어 사용à이미지 생성과정 기술

        - 서버에 프로그램을 설치하는 과정을 메모장이 아닌 Dockerfile로 관리

        - 소스와함께버전관리가되며,누구나수정가능

§ Docker for Mac/Docker for Windows or 직접 Linux에 설치

    $ curl –fsSL https://get.docker.com | sudo sh

 

§ sudo 없이 사용

    $ sudo usermod –aG docker $USER

    $ sudo usermod –aG docker <your-user>

 

§ 설치 확인

    $ docker version

 

§ 컨테이너 실행

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

 

$docker container  ls -a

root@containerID#

 

$docker container run --rm -> stop 이 되는 시점에 rm(삭제)까지  완료된다.

실습1) ubuntu 16.04 container 생성하고 컨테이너 내부 접속

$ docker run ubuntu:16.04

 

 

§ 컨테이너는 프로세스이기 때문에 실행 중인 프로세스가 없으면 컨테이너는 종료됨

    $ docker run –-rm –it ubuntu:16.04 /bin/bash  ( - - rm임)

hostname = containerID

cat = 화면에 파일 내용 출력

 

$docker container run --rm -it ubuntu:16.04 /bin/bash

->linux로 들어옴

->exit

->다시 원래 os로 돌아옴

 

$docker images

 

실습2) MySQL 5.7 container

    $ docker container run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql mysql:5.7

    $ docker exec –it mysql bash

 

 

🙃만약 서버 3306가 사용중이라는 에러가 난다면(windows)

->서비스에 들어감

->mysql, mariadb 검색

->서버 중지

 

$docker container run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql mysql:5.7

->error 뜸

더보기

docker: Error response from daemon: Conflict. The container name "/mysql" is already in use by container "49dbc3aa4b598748fe4c70df99f564d8f897247fb6b3930cb71d309932a19c45". You have to remove (or rename) that container to be able to reuse that name.

 

$docker container ls -a

$docker container  stop [id or name]

$docker container rm  [id or name]

 

$docker container --help

 

$docker  -exec -it 49dbc3aa4b59 /bin/bash (terminal로 보내겠다)

$docker exec -it mysql /bin/bash(위랑 같은 커맨드)

root@49dbc3aa4b59:/#  => container 내부의 terminal로 접속한 것

 

$mysql -h127.0.0.1 -uroot -p (mysql 사용가능)

 

mysql>show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| sys                |

+--------------------+

4 rows in set (0.00 sec)

 

mysql>create database mydb;

mysql>use mydb;

mysql>create table member;

mysql>select * from member;

mysql>exit

root@49dbc3aa4b59:/# exit

 

$docker container ls -a

CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                               NAMES

49dbc3aa4b59   mysql:5.7   "docker-entrypoint.s…"   39 minutes ago   Up 39 minutes   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql

 

$docker container stop 49dbc3aa4b59

$docker container rm 49dbc3aa4b59

 

HeidiSQL -> table 확인 및 table 생성(windows용)

https://wordpress-tip.tistory.com/3

 

맥(mac)용 Mysql/MariaDB관리 DB툴 다운로드 추천

윈도우(Windows) 운영체제에는 정말 편리한 DB관리 GUI 툴들이 많이 존재합니다. 그중에서도 개인적으로 윈도우 운영체제에서는 HeidiSQL을 사용하고 있는데요. 별도로 학습없이도 사용가능한 간편한

wordpress-tip.tistory.com

mac은 시퀄프로(Sequel Pro)  추천

 

 

🌟🌟복습

$docker container run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql mysql:5.7 (run(pull), d(delete), e(environment), default(pass필수), --name(이름부여), 이미지:tag

$docker container ls -a

$docker container exec -it mysql /bin/bash

root#[container_id] #mysql -h127.0.0.1 -uroot -p(h : 자기자신, p : 내부포트)

mysql>show databases;  (데이터베이스 목록 보기)

mysql>create database mydb;  (데이터베이스 생성)

mysql>use mydb;  (데이터베이스 선택)

mysql>show tables; (테이블 목록 보기)

mysql>create table member(id varchar(20), name varchar(20)); (테이블 생성)

mysql>insert into member(id, name) values('user1', 'moon'); (데이터 추가)

mysql>select * from member; (데이터 조회)

mysql>exit

 

root@[container_id] #exit

$docker container stop __

$docker container rm ___

 

$docker container run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql mysql:5.7

-d : detach,

-p : port, forward 3306:3306(host port, container port),

-e : environment,

--name : container name

 

 

 

더보기

<Docker Server(VM)>

mysql container 127.0.0.1(3306) =>root@[container_id] #

python 127.0.0.1(localhost)

더보기

<Host OS> 127.0.0.1

django => 8000

nodejs => 3000, 5000

spring boot => 8080

mysql => 3306

oracle => 1521

 

 

⭐️⭐️Port Forwarding(container의 내부적인 포트망 3306) -> Host OS(3306 전달)

    mysql -h 127.0.0.1(자신의 localhost)

              -u root

              -p -------

 

windows 3306 -> already in use

forwarding 할 수가 없음

 

 

**아까 뜬 에러 해결법

  1. -p 13306:3306으로 하면 에러 해결(hostPC를 13306으로 하겠다)

  2. 서비스탭에서 3306 포트 죽이기

 

 

-django(8000) -> 사설IP주소

-web browser 는 hostPC에 있음 -> 🌟포트포워딩 8000:8000(host:container)

-http://127.0.0.1:8000(8000번 호출 시 내부에 있는 django container까지 전달됨)

 

-docker의 관리 툴 => 쿠버네티스(K8S)

 

-internet router -> gatewayIP(유일)

 

 

**port번호를 3306에서 13306으로 바꿔서 재접속해보기

$docker container run -d -p 13306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql mysql:5.7

 

$docker container ls -a

CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                                NAMES

7bc67a5f15b4   mysql:5.7   "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes   33060/tcp, 0.0.0.0:13306->3306/tcp   mysql

 

 

**하나 더 다른포트로 만들기

$docker container run -d -p 23306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql_client mysql:5.7

 

$docker container ls -a

CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                NAMES

a6f8afb1b108   mysql:5.7   "docker-entrypoint.s…"   3 seconds ago    Up 2 seconds    33060/tcp, 0.0.0.0:23306->3306/tcp   mysql_client

7bc67a5f15b4   mysql:5.7   "docker-entrypoint.s…"   12 minutes ago   Up 12 minutes   33060/tcp, 0.0.0.0:13306->3306/tcp   mysql

 

$docker inspect --help

$docker container inspect mysql

$docker container inspect mysql_client

 

"Networks": {

                "bridge": {

                    "IPAMConfig": null,

                    "Links": null,

                    "Aliases": null,

                    "NetworkID": "438cc7a004efe7f82141fc3baf082e62ddcb4c381477449d56624c15e2b39896",

                    "EndpointID": "1eafdc6e7e5a8e5f5472dcf9eb4926ee4fb0aa6b81b8377964ccbddb7104fbda",

                    "Gateway": "172.17.0.1",

                    "IPAddress": "172.17.0.2",

                    "IPPrefixLen": 16,

                    "IPv6Gateway": "",

                    "GlobalIPv6Address": "",

                    "GlobalIPv6PrefixLen": 0,

                    "MacAddress": "02:42:ac:11:00:02",

                    "DriverOpts": null

                }

 

 

networkID : 438cc7a004e (13306 -> 3306) 172.17.0.2(mysql)

networkID : 438cc7a004e (23306 -> 3306) 172.17.0.3(mysql_client)

강사님 정리버전

 

 

mysal_client(client) -> mysql(server)를 이용하고 싶다

강사님 정리버전2

container 안에서 다른 container로 접속하고 싶다.

강사님 정리버전3

$docker container ls -a

mysql = django image만 알려줌

mysql_client = scrapy image만 알려줌

docker pull ______run -> 강사님이 안쪽에 있는 그 상황 그대로 실행가능

 

 

더보기

*****server

$docker exec -it mysql /bin/bash

root@7bc67a5f15b4:/# mysql -h127.0.0.1(자기자신)-uroot -p

$create database mydb;

$use mydb;

select id, name from member;

+-------+------+

| id    | name |

+-------+------+

| user1 | moon |

 

******client

$docker exec -it mysql_client mysql -h172.17.0.2 (자기자신)-uroot -p

$use mydb;

$select id, name from member; (클라이언트에서 서버쪽과 동일한 데이터베이스 접근가능)

+-------+------+

| id    | name |

+-------+------+

| user1 | moon |

+-------+------+

 

$docker container ls -a

CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                NAMES

a6f8afb1b108   mysql:5.7   "docker-entrypoint.s…"   38 minutes ago   Up 38 minutes   33060/tcp, 0.0.0.0:23306->3306/tcp   mysql_client

7bc67a5f15b4   mysql:5.7   "docker-entrypoint.s…"   51 minutes ago   Up 51 minutes   33060/tcp, 0.0.0.0:13306->3306/tcp   mysql

 

 

**password 설정해보기

MYSQL_RANDOM_ROOT_PASSWORD

$docker container run -p 33306:3306 -e MYSQL_RANDOM_ROOT_PASSWORD=true --name mysql_moon mysql:5.7 (-d를 빼야지 generated root passwords가 뜸)

 

$docker logs ____ -> generated root passwords 확인 (-d를 넣고 확인했을 때)

 

$docker container ls -a

CONTAINER ID   IMAGE       COMMAND                  CREATED             STATUS             PORTS                                NAMES

63f2fcd79969   mysql:5.7   "docker-entrypoint.s…"   7 seconds ago       Up 6 seconds       0.0.0.0:3306->3306/tcp, 33060/tcp    mysql_moon

a6f8afb1b108   mysql:5.7   "docker-entrypoint.s…"   54 minutes ago      Up 53 minutes      33060/tcp, 0.0.0.0:23306->3306/tcp   mysql_client

7bc67a5f15b4   mysql:5.7   "docker-entrypoint.s…"   About an hour ago   Up About an hour   33060/tcp, 0.0.0.0:13306->3306/tcp   mysql

 

$docker ps -a

$docker exec -it mysql_moon /bin/bash

mysql -h127.0.0.1 -uroot -p

->password 입력하세요

 

 

**

$docker exec -it ____ bash -c mysql -h172.17.0.2 -uroot -p(bash -c : 여러 줄 커맨드를 한꺼번에 동시에 실행하기 위한 커맨드)

 

 

 

 

 

 

 

 

 

 

728x90

+ Recent posts