2010 - 클라우드, CNCF(Linux) -> K8S(kubernetes)
**CNCF 4개의 구성요소
-
MSA
-
CI/CD(지속적인 통합/배포)
-
DevOps
-
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가 있어야 만들 수 있음)
-
image생성
-
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 할 수가 없음
**아까 뜬 에러 해결법
-
-p 13306:3306으로 하면 에러 해결(hostPC를 13306으로 하겠다)
-
서비스탭에서 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)를 이용하고 싶다

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

$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 : 여러 줄 커맨드를 한꺼번에 동시에 실행하기 위한 커맨드)
'CLOUD > Docker' 카테고리의 다른 글
2/9 - 도커/쿠버네티스 활용 컨테이너 개발 4차시 (0) | 2021.02.09 |
---|---|
2/8 - 도커/쿠버네티스 활용 컨테이너 개발 3차시 (0) | 2021.02.08 |
2/4 - Linux 2차시 +도커/쿠버네티스 활용 컨테이너 개발 1차시 (0) | 2021.02.04 |
2/3 - Cloud Fundamentals 3차시 + Linux 1차시 (0) | 2021.02.03 |
2/2 - Cloud Fundamentals 2차시 (0) | 2021.02.02 |