Docker
Iac(Infrastructure as Code)
- 코드로만 인프라 개발
- 도커 이미지를 활용한 컨테이너 개발(Docker-compose.yml)
- 컨테이너는 이미지의 실체에 프로세스를 합친것
- 도커 이미지 코드를 공유 hub.docker.com(github과 연동됨)
- github에 올라간 코드 수정시 hub.docker 이미지 자동 수정
Container 기술
- Container는 VM가상화보다 훨씬 경량화된 기술
- 핵심은 LXC(Linux Container)
Docker engine 핵심 3가지
- dockerd
- containerd
- runc
- 프로세스를 격리시키기 위해 3가지를 제공
- docker 커맨드를 사용하면 dockerd가 받음
- dockerd가 containerd로 전달
- containerd가 라이브러리 호출 후 Kernel 생성
- runc가 namespaces, cgroups, chroot역할을 통해 동작
- docker가 가벼울수 있는 이유는 os는 있지만 Kernel이 없음
- 실제 필요한 Kernel은 docker engine이 LXC를 호출
- LXC 핵심 namespaces, cgroups, chroot
namespaces
- 기본적으로 container의 네트워크, 디바이스 기능 제공
- docker는 호스트 운영체제의 커널을 빌림
cgroups
- 자원을 제공(CPU, 메모리, 디스크)
chroot
- 독립성을 제공
- systemd 프로세스 pid 1 제공
Docker는 LXC를 편리하게 사용할 수 있도록 기능 제공
container와 container 간에 nfc가 필요없음(volume)
8000(Host Port):80(Container Port)
외부에서 container에 들어갈 수 있는 방법은 PORT 퍼블리싱
https://www.docker.com/play-with-docker
docker pull nginx:1.19
//nginx 이미지를 다운로드
docker images
//docker 이미지 목록 조회
docker run -itd -p 8000:80 --name=webserver nginx:1.19
//nginx 웹서버를 80번 포트로 webserver라는 이름으로 띄움
// dockerd -> containerd -> runC -> LXC
docker ps
// 프로세스 목록 조회
vi index.html
<h1>Hello, docker</h1>
docker cp index.html webserver:/usr/share/nginx/html/index.html
curl localhost:8000
Docker 설치 제약사항
- 64bit
- kernel(uname -ar) 3.1이상
Container 자원관리
CPU
-
CPU schedule CPU 사용 시간을 조절
요청 -> Process -> CPU register등록
시간할당 - container
- 번호지정
Memory
- process 를 Block단위로 메모리에 올려 실행함
- 메모리가 금방 소진될 가능성이 농후함
- 메모리가 가득차면 Idle상태의 프로세스를 스왑으로 전달, 생긴 공간에 들어오는 프로세스 배치
- 스왑이 발생할 때 쿠버네티스 설치할 수 없음
Disk
- IOPS, MBPS 로 성능지표를 삼음
- 프로비저닝(예약) : 100GB의 용량을 다 사용했을 때 예약해놓은 100GB의 공간을 사용
Linux Docker 설치
- Docker Container + Docker Image : /var/lib/docker
- 다운로드 될때 Layer 단위로 다운로드
- Layer가 모여서 이미지가 만들어짐
- Layer 단위로 다운로드 받으면 재사용이 가능해서 공간효율성이 좋음
- UFS(union filesystem) : 여러개의 Layer를 하나의 파일시스템으로 사용할 수 있게 해줌
- container에서 유일하게 R/W Layer를 만들어서 수정가능함
~$ sudo apt-get update
~$ sudo apt-get install -y \
> apt-transport-https \
> ca-certificates \
> curl \
> software-properties-common
~$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
~$ sudo apt-key fingerprint
/etc/apt/trusted.gpg
--------------------
pub rsa4096 2017-02-22 [SCEA]
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid [ unknown] Docker Release (CE deb) <docker@docker.com>
sub rsa4096 2017-02-22 [S]
/etc/apt/trusted.gpg.d/ubuntu-keyring-2012-archive.gpg
------------------------------------------------------
pub rsa4096 2012-05-11 [SC]
790B C727 7767 219C 42C8 6F93 3B4F E6AC C0B2 1F32
uid [ unknown] Ubuntu Archive Automatic Signing Key (2012) <ftpmaster@ubuntu.com>
/etc/apt/trusted.gpg.d/ubuntu-keyring-2012-cdimage.gpg
------------------------------------------------------
pub rsa4096 2012-05-11 [SC]
8439 38DF 228D 22F7 B374 2BC0 D94A A3F0 EFE2 1092
uid [ unknown] Ubuntu CD Image Automatic Signing Key (2012) <cdimage@ubuntu.com>
/etc/apt/trusted.gpg.d/ubuntu-keyring-2018-archive.gpg
------------------------------------------------------
pub rsa4096 2018-09-17 [SC]
F6EC B376 2474 EDA9 D21B 7022 8719 20D1 991B C93C
uid [ unknown] Ubuntu Archive Automatic Signing Key (2018) <ftpmaster@ubuntu.com>
~$ sudo add-apt-repository \
> "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
> $(lsb_release -cs) \
> stable"
~$ sudo apt-get update
~$ sudo apt-get -y install docker-ce
~$ sudo docker version
~$ sudo usermdo -aG docker jeff
~$ sudo systemctl enable docker
~$ sudo reboot
~$ docker version
~$ docker pull nginx:1.20
// /var/lib/info에 다운로드 됨
Ubuntu Docker installation (shell script 방식)
~$ curl -fsSl https://get.docker.com -o get-docker.sh
~$ chmod +x get-docker.sh
~$ sudo sh get-docker.sh
새 가상머신 생성(복제)
~$ sudo hostnamectl set-hostname hostos2
~$ ifconfig
~$ sudo vi /etc/hosts
//192.168.56.111 hostos1
//192.168.56.112 hostos2
//추가
Docker 사용하기
~$ docker pull ubuntu:18.04
~$ docker run -it ubuntu:18.04 echo "Hello world~"
Hello world~
~$ docker run -it ubuntu:18.04 bash
/# apt-get update
/# apt-get install net-tools
/# apt-get -y install iputils-ping
/# ifconfig
// 새 터미널창 실행
~$ docker pull centos:7
~$ docker run -it centos:7 echo "Hello world"
Hello world
~$ docker run -it centos:7 bash
# yum -y install net-tools
# ifconfig
// 세번째 터미널창에서 실행
~$ ifconfig
// docker0 172.17.0.1 확인할 수 있음
// veth 위에서 실행한 두개의 docker Container 확인할 수 있음
~$ docker inspect 프로세스이름 | grep IPA
~$ docker start quizzical_blackburn
~$ docker exec 프로세스이름 bash
~$ docker exec -it quizzical_blackburn bash
Mysql Container
~$ docker pull mysql:5.7
~$ docker run -it mysql:5.7 /bin/bash
/# /etc/init.d/mysql start
/# mysql -uroot
// mysql 실행
> create database dockerdb;
> show databases;
/# cd /var/lib/mysql
/# ls
//dockerdb 조회됨
(ctrl + p + q) -> 컨테이너 중지하지 않고 exit
MariaDB Container 생성
// ~$ docker pull mariadb:10.2 (docker run을 하면 docker pull 생략해도 알아서 가져옴)
~$ docker run --name maria-test -e MYSQL_ROOT_PASSWORD=mjeff -d -p 3306:3306 mariadb:10.2
// 패스워드 설정하면서 Container 프로세스 실행
~$ docker exec -it maria-test /bin/bash
/# mysql -uroot -p
> create database item;
> CREATE TABLE Projects (id int(11) NOT NULL, name varchar(255)
-> DEFAULT NULL, code varchar(255) DEFAULT NULL, PRIMARY KEY(id));
> show tables;
> insert into item.Projects (id, name, code) values(1, 'DevOps', 'D0180');
> select * from item.Projects;
Cadvisor + MariaDB
~$ docker run \
> --volume=/:/rootfs:ro \
> --volume=/var/run:/var/run:rw \
> --volume=/sys:/sys:ro \
> --publish=9559:8080 \
> --detach=true \
> --restart=always \
> --name=cadvisor \
> google/cadvisor:latest
// 192.168.56.111(ip주소):9559로 접속하면 cadvisor 실행됨
~$ docker exec -it maria-test /bin/bash
~# mysql -uroot -p
> create datebase empdb;
> grant all privileges on empdb.*
-> to emp_admin@localhost identified by 'docker_4U'
-> with grant option;
> flush privileges;
> exit;
/# apt-get update
/# apt-get install git
/# git clone https://github.com/datacharmer/test_db.git
/# cd test_db/
# ls
# mysql -u emp_admin -p empdb
> status;
> source employees.sql
> show tables;
> select * from dept_emp;
nginx Container 생성
- nginx 80번 포트가 열려있음 -p 8001:80 -p(퍼블리싱)해서 host포트 8001번을 container포트 80번으로 연결
~$ docker run --name=webserver1 -d -p 8001:80 nginx:1.2
~$ sudo netstat -nlp | grep 8001
~$ ps -ef | grep xxxx
~$ docker stats webserver1docker
~$ docker stop webserver1
~$ docker start webserver1
~$ docker cp index.html webserver1:/usr/share/nginx/html/index.html
~$ docker restart webserver1
// localhost:8001 로 접속하여 확인
nginx Docker파일 생성
~$ git clone https://github.com/brayanlee/docker-phpserver.git
~$ mkdir nginx
~$ cd nginx
~$ nano index.html
:~/nginx$ docker build -t my-nginx-image:1.0 .
php Docker 이미지 생성
~$ cd docker-phpserver/
~$ docker build -t phpserver:1.0
~$ docker images | grep php
~$ docker run -it -d -p 8004:80 \
> --name=phpserver phpserver:1.0
Comments