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

  1. CPU schedule CPU 사용 시간을 조절
    요청 -> Process -> CPU register등록
    시간할당

  2. container
  3. 번호지정

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

Categories:

Updated:

Comments