YJWANG

Docker 교육용 (기초) 본문

60.Cloud/70.Docker

Docker 교육용 (기초)

왕영주 2021. 1. 18. 11:19

컨테이너 vs VM


Architecture

설치


컨테이너 기반 기술은 컨테이너 엔진을 통해 구현을 할 수 있다.
일반적으로 Docker를 사용하는데 CentOS기준 Docker를 기본으로 사용하지 않고 PodMan을 사용하기 때문에 repo먼저 구축을 하고 설치해야한다.

추가로 Docker 컨테이너의 Network는 Docker-Proxy를 통해 구성되는데 이를 위해 iptables가 필요하다.

[root@kube62_deploy_0 ~]# curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
[root@kube62_deploy_0 ~]# yum -y install iptables
[root@kube62_deploy_0 ~]# yum -y install docker-ce


[root@kube62_deploy_0 ~]# ip a show dev docker0
5: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:5c:f4:e5:a9 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

Sample container


one time

[root@kube62_deploy_0 ~]# docker run -it centos:7 /bin/bash

[root@ab4fbeb887c1 /]# yum install iproute
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: mirror.kakao.com
...

[root@ab4fbeb887c1 /]# hostname
ab4fbeb887c1

[root@ab4fbeb887c1 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

[root@kube62_deploy_0 ~]# docker ps
CONTAINER ID   IMAGE      COMMAND              CREATED              STATUS              PORTS                  NAMES
ab4fbeb887c1   centos:7   "/bin/bash"          About a minute ago   Up About a minute                          bold_edison

[root@ab4fbeb887c1 /]# exit
exit

컨테이너 중지됨.

running container

iptables의 rule을 통해 실제 서버가 8888로 서비스를 listen하고 이를 80으로 포워드한다.
실행중인 컨테이너는 하나의 프로세스로 동작하며

[root@kube62_deploy_0 ~]# docker run -d --name test-httpd1 -p 8888:80 httpd
2cb042e1cb2811fcb7acb345ea3d006f14a7c82594cd2faa032ce8e86cd02567

[root@kube62_deploy_0 ~]# docker ps
CONTAINER ID   IMAGE      COMMAND              CREATED         STATUS         PORTS                  NAMES
2cb042e1cb28   httpd      "httpd-foreground"   3 seconds ago   Up 2 seconds   0.0.0.0:8888->80/tcp   test-httpd1

[root@kube62_deploy_0 ~]# ps -ef |grep 2cb042e1cb28
root       35091       1  0 01:46 ?        00:00:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 2cb042e1cb2811fcb7acb345ea3d006f14a7c82594cd2faa032ce8e86cd02567 -address /run/containerd/containerd.sock


[root@kube62_deploy_0 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy DROP)
target     prot opt source               destination         
DOCKER-USER  all  --  0.0.0.0/0            0.0.0.0/0           
DOCKER-ISOLATION-STAGE-1  all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain DOCKER (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            172.17.0.3           tcp dpt:80


[root@kube62_deploy_0 ~]# ss -antp |grep 8888
LISTEN    0         128                0.0.0.0:8888            0.0.0.0:*         users:(("docker-proxy",pid=35074,fd=4))

host network container

[root@kube62_deploy_0 ~]# docker run -d --name test-httpd2 --network host httpd
991efd21e145bb6f51ea6a545686ddd7d733b859a9bf31af47e711dad07bf43e

[root@kube62_deploy_0 ~]# ss -antp |grep 80
LISTEN    0         128                      *:80                    *:*         users:(("httpd",pid=36013,fd=4),("httpd",pid=36012,fd=4),("httpd",pid=36011,fd=4),("httpd",pid=35992,fd=4))

위 컨테이너들의 데이터는 컨테이너가 삭제되는 즉시 같이 삭제됨
영구적인 데이터를 위해서는 Volume을 별도로 Mount 하기도 하고 컨테이너 구축 후 여러 설정 및 환경을 설정하기 위해
yaml 파일로 사전 정의 해서 아래와 같이 자동화 하기도 한다.

https://yjwang.tistory.com/entry/Docker-%ED%85%8C%EC%8A%A4%ED%8A%B8-httpd-%EA%B5%AC%EC%84%B1-ssl-%EC%9D%B8%EC%A6%9D%EC%84%9C-%EC%A0%81%EC%9A%A9-%ED%8F%AC%ED%95%A8

허나 컨테이너 자체의 LifeCycle이나 HA node간 통신 및 HA등 관리를 위해 Kubernetes의 필요성이 생기게됐다.

반응형