안녕하세요 서후아빠입니다. ^_^
이번 세션은 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
'Compute' 카테고리의 다른 글
[이론/실습] EC2 Auto Scaling 구성, 동적 조정 및 스케줄링 (2) | 2022.12.20 |
---|---|
[Tip] Amazon EC2 다양한 Error 상황 알아보기 (0) | 2022.08.04 |
[Tip] Windows에서 EC2 RDP 접속 2가지 방법 알아보기 (0) | 2022.07.13 |
[Tip] EC2 터미널 접속하는 4가지 방법 알아보기 (0) | 2022.07.12 |
[Tip] 종료된 인스턴스 복구하는 방법 알아보기 (0) | 2022.07.12 |