본문 바로가기

Compute

[이론] 도커 (Docker) 기본 개념

반응형

안녕하세요 서후아빠입니다. ^_^

이번 세션은 AWS Container 이해를 돕기 위해 docker에 대해서 업무적으로 필요한 최소한의 개념에 대해서 간단히 정리해 보았습니다.


Docker 도입 시 주의사항

linux 친화적 : 태생 자체가 linux의 cgroup과 namespace라는 기술에 기반

개발 초기의 오버헤드 : docker를 처음 다뤄보는 개발자라면 초반 환경 설정에 시행착오를 겪을 확률이 높음

Docker 구조

Client : container를 관리/실행하기 위해서 daemon과 상호작용하는 binary 파일(API)
Registry : image가 저장되어 있는 장소 (ex : docker hub, ECR)
Docker daemon : Host에 설치되어 container 관리
Image : daemon을 통해 container로 실행 가능하도록 필요한 프로그램, 라이브러리, 소스 등이 설치된 파일
Container : Image를 실행한 상태

 

Docker 네트워크 구조

veth : container 생성 시 Host(Server)와 container 통신을 위한 가상 인터페이스, 내부 IP이며 자동 할당

  ※ 내부 IP : docker 내부에서만 사용되고 외부에서 접근 불가, 순차적으로 할당, container 재시작때마다 변경
docker0 : veth와 바인딩되어 있으며 Host NIC과 이어주는 역할

  - 네트워크 드라이버 : bridge, host, none, overlay, macvlan, ipvlan, weave, flannel, openvswitch
Host 구조 주의사항

  - Host와 격리되지 않음 (Host IP = Container IP)

  - Linux Host에서만 동작

  - 광범위한 포트 처리하고 최적화된 성능 구현 시 유용

Overlay 구조

container 오케스트레이션에서 동작하는 방식 

10.0.0.0 대역은 Container에서 중복이 발생하면 안됨

Linux에 docker 설치

# 노트북(=Local PC)에 설치하는 경우 설치 가능한 환경(인텔 vmx, AMD svm, 가상서버 none)인지 확인 
grep -E --color 'vmx|svm' /proc/cpuinfo // 

# 다운로드 및 설치 (아래 명령어 말고 yum or apt-get으로 설치 가능)
sudo curl -fsSL https://get.docker.com -o get-docker.sh;sh get-docker.sh
(or sudo wget -O get-docker.sh https://get.docker.com/;sh get-docker.sh)
sudo rpm -qa | grep docker
sudo groupadd docker
sudo usermod -aG docker $USER
sudo systemctl enable docker.service
sudo  systemctl start docker.service
docker -v

# docker 제거
sudo yum remove docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

Docker 기본 명령어

# Version, Status, Infomation
docker -v
docker stats
docker info

# docker hub에서 "tomcat" images 검색
docker search tomcat     
NAME    DESCRIPTION                       STARS           OFFICIAL     AUTOMATED
tomcat  Apache Tomcat is an open source   implementati…   3076         [OK]

# "tomcat" images download
docker pull tomcat

# container 생성 (포트포워딩 9000>8080, 이름 tomcat)
docker run -dit -p 9000:8080 --name tomcat --privileged tomcat /sbin/init

# 구동 중인 container 확인
docker ps
CONTAINER ID   IMAGE   COMMAND             CREATED        STATUS        PORTS                                       NAMES
c93751c00c30   tomcat  "catalina.sh run"   2 minutes ago  Up 2 minutes  0.0.0.0:9000->8080/tcp, :::9000->8080/tcp   tomcat

# container 재구동
docker restart tomcat

# container에 Shell Access
docker exec -it tomcat /bin/bash
[root@container~] # exit

# file(ex : web)을 container로 업로드
docker cp /home/test tomcat:/usr/local/tomcat/testHome

# file(ex : server.xml)을 local pc로 다운로드
docker cp tomcat:/usr/local/tomcat/conf/server.xml /home/

# container 동작 상태 확인 (OK or Failed)
docker logs -t tomcat
2021-07-24T01:03:12.946703900Z [  OK  ] Started Update UTMP about System Runlevel Changes.

# container 중지
docker stop tocmat

# 생성된(중지 상태 포함) container 확인
docker ps -a
CONTAINER ID   IMAGE   COMMAND           CREATED         STATUS                     PORTS   NAMES
c93751c00c30   tomcat  "catalina.sh run"  7 minutes ago  Exited (143) 5 seconds ago         tomcat

# container 삭제, 강제 삭제는 끝에 --force 붙임
docker rm tomcat

# REPOSITORY에 있는 모든 docker images 확인
docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
tomcat-7.0   latest    300e315adb2f   7 months ago     209MB

# commit : 현재 상태의 container를 새로운 image로 저장
docker commit -a "Mr.Cho" -m "tomcat" c93751c00c30 tomcat:1.0
sha256:e065b9edf4cc1c647ef2c4a03ec4e3b77db40add1b03ef5f7cc2fcb5e105ae44

docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
tomcat       1.0       e065b9edf4cc   22 seconds ago   210MB
tomcat-7.0   latest    300e315adb2f   7 months ago     209MB

# save : container 생성 전의 image를 tar형태로 저장
docker save -o /home/tomcat01.tar tomcat-7.0

# export : 현재 상태의 container를 tar형태로 저장
docker export c93751c00c30 > /home/tomcat02.tar

# load : tar파일을 image로 업로드
docker load -i /home/tomcat01.tar
Loaded image: tomcat01:latest

# docker image 삭제(container 삭제 후 가능), 강제 삭제는 끝에 --force 붙임
docker rmi tomcat
Deleted: sha256:e065b9edf4cc1c647ef2c4a03ec4e3b77db40add1b03ef5f7cc2fcb5e105ae44

docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
tomcat-7.0   latest    300e315adb2f   7 months ago     209MB

# 불필요한 image + container 일괄 삭제 
docker system prune --all
docker system prune --force 
docker image prune  --all      // images 만 정리할 경우

# 불필요한 네트워크 일괄 삭제 
docker network prune

# 네트워크 목록 확인
docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
d5a492b46a7f   bridge    bridge    local
c9f521020ad4   host      host      local
74d9838efe5a   none      null      local

# bridge 네트워크 세부 내용 확인, hosts or none은 대역정보가 없음
docker network inspect bridge
… 
"Subnet": "172.17.0.0/16",  // container eth0 
"Gateway": "172.17.0.1"     // docker0
…

# 사용자 정의 bridge 네트워크 "mybridge" 생성
docker network create --driver bridge mybridge

# mybridge로 지정하여 container 생성
docker run -dit --privileged --net mybridge --name tomcat tomcat-7.0 /sbin/init

# bridge 네트워크 세부 내용 확인 (기존 bridge와 다른 대역으로 생성)
docker network inspect mybridge
… 
"Subnet": "172.19.0.0/16",
"Gateway": "172.19.0.1"  …
… 

# mybridge 연결 해제
docker network disconnect mybridge tomcat

# mybridge 연결
docker network connect mybridge tomcat

# mybridge 네트워크 삭제
docker network rm mybridge

# MariaDB password 지정하여 container 생성 후, MariaDB Setting을 위한 접근 과정
docker run -dit -p 3306:3306 --name mariadb -e MYSQL_ROOT_PASSWORD=mariadbpw mariadb
docker exec -it mariadb /bin/bash
[root@container~]# mysql -u root -p
Enter password: mariadbpw
MariaDB [(none)]> status
MariaDB [(test)]> exit
[root@container~] # exit

docker restart mariadb

 

반응형