⭐ 가시다(gasida) 님이 진행하는 KANS(**K**ubernetes **A**dvanced **N**etworking **S**tudy)3기 실습 게시글입니다.
게시글 상 소스코드, 사진에서 ****굵게**** '''코드쉘''' 에 대한 부분이 들어가있을수도 있습니다.
⭐코드에서 실습 시 사용하는 변수가 들어갈 수 있습니다. 아래의 정보를 사용하고있습니다.
#route53 Domain: jjongguet.com
#AWS Secret Key: jjongkey
#Aws .pem Key: jjong-key.pem
실습환경구성
# YAML 파일 다운로드
curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/kans/kans-1w.yaml
# CloudFormation 스택 배포
# aws cloudformation deploy --template-file kans-1w.yaml --stack-name mylab --parameter-overrides KeyName=<My SSH Keyname> SgIngressSshCidr=<My Home Public IP Address>/32 --region ap-northeast-2
예시) aws cloudformation deploy --template-file kans-1w.yaml --stack-name mylab --parameter-overrides KeyName=jjongkey SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32 --region ap-northeast-2
## Tip. 인스턴스 타입 변경 : MyInstanceType=t2.micro
예시) aws cloudformation deploy --template-file kans-1w.yaml --stack-name mylab --parameter-overrides MyInstanceType=t2.micro KeyName=kp-gasida SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32 --region ap-northeast-2
# CloudFormation 스택 배포 완료 후 작업용 EC2 IP 출력
aws cloudformation describe-stacks --stack-name mylab --query 'Stacks[*].Outputs[0].OutputValue' --output text --region ap-northeast-2
# [모니터링] CloudFormation 스택 상태 : 생성 완료 확인
while true; do
date
AWS_PAGER="" aws cloudformation list-stacks \
--stack-status-filter CREATE_IN_PROGRESS CREATE_COMPLETE CREATE_FAILED DELETE_IN_PROGRESS DELETE_FAILED \
--query "StackSummaries[*].{StackName:StackName, StackStatus:StackStatus}" \
--output table
sleep 1
done
# Ansible Server EC2 SSH 접속
ssh -i ~/.ssh/jjong-key.pem ubuntu@$(aws cloudformation describe-stacks --stack-name mylab --query 'Stacks[*].Outputs[0].OutputValue' --output text --region ap-northeast-2)
1. 도커 소개
용어소개: Docker
- 가상실행 환경을 제공해주는 오픈소스 플랫폼
용어소개: Container
- Docker 에서 제공한 가상실행 환경
- 컨테이너화 된 프로세스(Containerized Process) 라고 부르는게 조금 더 명확한 표현
1.1 컨테이너와 가상머신
특징비교
- 컨테이너: 하드웨어 에뮬레이션 없이, 리눅스 커널을 공유해서 바로 프로세스를 실행한다.
- 가상머신: 운영체제 위에 하드웨어를 에뮬레이션 이후, 운영체제를 올리고 프로세스를 실행한다.
격리수준 비교
- 가상머신(하드웨어 레벨 가상화)
- 서버에 Hypervisor 설치, 그 위에 가상OS, 패키징한 VM 을 만들어 실행한다
- 독립된 OS 를 사용하여 보안이 좋지만, 오버헤드가 크고 무겁다.
- 컨테이너(OS레벨 가상화)
- Application 작동에 필요한 모든파일(OS제외)을 패키징 한다.
- 구조상 GuestOS, Hypervisor 필요가 없기때문에 오버헤드를 줄일수 있어서 가볍다.
- Container는 OS(Host OS) 의 커널을 공유하지만, 개별적인 user space 를 가진다.
- 가상화된 공간을 생성하기 위해 pivot-root, namespace, cgroup 을 사용
⇒ 프로세스 단위의 격리 환경과 리소스를 제공한다.
1.2 도커 아키텍쳐
DOCKER_HOST
- 도커 관련 명령어가 작동하는 장소
- Docker Daemon 이 띄워져있다.
⇒ Docker Client 와 Docker Host 가 구분되어있음을 확인
- 일반적으로 Registry 는 Dockerhub 에 기본등록되어있음
2. 도커 기본사용
2.1 사전 준비 사항
Linux Process 의 이해
배경설명
- 영억구분: user, kernel, H/W 로 구성
- HW스펙: CPU 4core, 16램
특징
- Process 는 실행중인 프로그램의 인스턴스를 의미함
- OS에서 프로세스를 관리하며, 각 프로세스는 고유의 ID(PID값) 을 가짐
프로세스
- CPU, Memory 를 사용하는 기본 단위
- OS 커널(Cgroup)에서 각각의 프로세스를 관리함
- 자원 및 I/O 를 관리한다.
자주 사용하는 명령어
ps aux
ps -ef | grep {something}
free -h
htop
이런식으로 프로세스2 에 sleep 걸어놓고, ps -ef | grep 으로 확인하는것도 가능함 .
/proc/{PID} 는 커널이 동적으로 생성하는 정보가 표현된다
- 계속 ls 를 할때마다 다른 디렉토리가 생성되는걸 확인 할수 있음
- 리눅스의 /proc 디렉터리는 커널이 동적으로 생성하는 정보를 실시간 제공 : 시스템 상태, 프로세스(/proc/[PID]), HW 정보
/proc/cpuinfo
: CPU에 대한 정보가 포함되어 있습니다. CPU 모델, 코어 수, 클럭 속도 등의 정보를 확인할 수 있습니다./proc/meminfo
: 메모리 사용 현황을 보여줍니다. 전체 메모리, 사용 중인 메모리, 가용 메모리, 캐시 메모리 등 다양한 메모리 관련 정보를 제공합니다./proc/uptime
: 시스템이 부팅된 후 경과된 시간을 초 단위로 보여줍니다. 첫 번째 숫자는 총 가동 시간, 두 번째 숫자는 시스템의 유휴 시간입니다./proc/loadavg
: 시스템의 현재 부하 상태를 나타냅니다. 첫 번째 세 개의 숫자는 1, 5, 15분간의 시스템 부하 평균을 의미하며, 네 번째 숫자는 현재 실행 중인 프로세스와 총 프로세스 수, 마지막 숫자는 마지막으로 실행된 프로세스의 PID를 나타냅니다./proc/version
: 커널 버전, GCC 버전 및 컴파일된 날짜와 같은 커널의 빌드 정보를 포함합니다./proc/filesystems
: 커널이 인식하고 있는 파일 시스템의 목록을 보여줍니다./proc/partitions
: 시스템에서 인식된 파티션 정보를 제공합니다. 디스크 장치와 해당 파티션 크기 등을 확인할 수 있습니다.
- 프로세스(/proc/[PID]) 별 정보
/proc/[PID]/cmdline
: 해당 프로세스를 실행할 때 사용된 명령어와 인자를 포함합니다./proc/[PID]/cwd
: 프로세스의 현재 작업 디렉터리에 대한 심볼릭 링크입니다.ls -l
로 확인하면 해당 프로세스가 현재 작업 중인 디렉터리를 알 수 있습니다./proc/[PID]/environ
: 프로세스의 환경 변수를 나타냅니다. 각 변수는 NULL 문자로 구분됩니다./proc/[PID]/exe
: 프로세스가 실행 중인 실행 파일에 대한 심볼릭 링크입니다./proc/[PID]/fd
: 프로세스가 열어놓은 모든 파일 디스크립터에 대한 심볼릭 링크를 포함하는 디렉터리입니다. 이 파일들은 해당 파일 디스크립터가 가리키는 실제 파일이나 소켓 등을 참조합니다./proc/[PID]/maps
: 프로세스의 메모리 맵을 나타냅니다. 메모리 영역의 시작과 끝 주소, 접근 권한, 매핑된 파일 등을 확인할 수 있습니다./proc/[PID]/stat
: 프로세스의 상태 정보를 포함한 파일입니다. 이 파일에는 프로세스의 상태, CPU 사용량, 메모리 사용량, 부모 프로세스 ID, 우선순위 등의 다양한 정보가 담겨 있습니다./proc/[PID]/status
: 프로세스의 상태 정보를 사람이 읽기 쉽게 정리한 파일입니다. PID, PPID(부모 PID), 메모리 사용량, CPU 사용률, 스레드 수 등을 확인할 수 있습니다.
#
mount -t proc
**findmnt /proc**
TARGET SOURCE FSTYPE OPTIONS
/proc proc proc rw,nosuid,nodev,noexec,relatime
#
ls /proc
tree /proc -L 1
tree /proc -L 1 | more
# 커널이 동적으로 생성하는 정보
cat /proc/cpuinfo
cat /proc/meminfo
cat /proc/uptime
cat /proc/loadavg
cat /proc/version
cat /proc/filesystems
cat /proc/partitions
# 실시간(갱신) 정보
cat /proc/uptime
cat /proc/uptime
cat /proc/uptime
# 프로세스별 정보
ls /proc > 1.txt
# [터미널1]
sleep 10000
# [터미널2]
## 프로세스별 정보
ls /proc > 2.txt
ls /proc
diff 1.txt 2.txt
pstree -p
ps -C sleep
pgrep sleep
## sleep 프로세스 디렉터리 확인
tree /proc/$(pgrep sleep) -L 1
tree /proc/$(pgrep sleep) -L 2 | more
cat /proc/$(pgrep sleep)/cmdline ; echo
ls -l /proc/$(pgrep sleep)/cwd
ls -l /proc/$(pgrep sleep)/exe
cat /proc/$(pgrep sleep)/environ ; echo
cat /proc/$(pgrep sleep)/maps
cat /proc/$(pgrep sleep)/stat
cat /proc/$(pgrep sleep)/status
/proc/pid 확인
- 터미널1: ls /proc > 1.txt 이후 sleep
- 터미널2: ls /proc > 2.txt 이후 diff 1.txt 2.txt
⇒ 차이발생(1.txt에는 터미널1 일때 생성했는 PID 가 존재할거고, 2.txt 에는 터미널1이 멈춰있는 상태에서 실행한 PID)
디렉토리 구조로 확인해보면 제대로 보임(pstree -p
)
2.2 도커 설치 및 확인
도커 설치
# [터미널1] 관리자 전환
sudo su -
whoami
id
# 도커 설치
curl -fsSL https://get.docker.com | sh
# 도커 정보 확인 : Client 와 Server , Storage Driver(overlay2), Cgroup Version(2), Default Runtime(runc)
docker info
docker version
# 도커 서비스 상태 확인
systemctl status docker -l --no-pager
# 모든 서비스의 상태 표시 - 링크
systemctl list-units --type=service
# 도커 루트 디렉터리 확인 : Docker Root Dir(/var/lib/docker)
tree -L 3 /var/lib/docker
sudo su -
root@MyServer:/var/lib/docker# ls
buildkit containers engine-id image network overlay2 plugins runtimes swarm tmp volumes
root@MyServer:/var/lib/docker# tree .
.
├── buildkit
│ ├── cache.db
│ ├── containerdmeta.db
│ ├── content
│ │ └── ingest
│ ├── executor
│ ├── history.db
│ ├── metadata_v2.db
│ └── snapshots.db
├── containers
├── engine-id
├── image
│ └── overlay2
│ ├── distribution
│ ├── imagedb
│ │ ├── content
│ │ │ └── sha256
│ │ └── metadata
│ │ └── sha256
│ ├── layerdb
│ └── repositories.json
├── network
│ └── files
│ └── local-kv.db
├── overlay2
│ └── l
├── plugins
│ ├── storage
│ │ └── ingest
│ └── tmp
├── runtimes
├── swarm
├── tmp
└── volumes
├── backingFsBlockDev
└── metadata.db
26 directories, 10 files
root@MyServer:/var/lib/docker#
도커유저가 root 가 아니여도 사용하게 하는 법!
Manage Docker as a non-root user & Socket 소켓
⛔ [Warning] The `docker` group grants root-level privileges to the user. For details on how this impacts security in your system, see [Docker Daemon Attack Surface](https://docs.docker.com/engine/security/#docker-daemon-attack-surface).
- The Docker daemon binds to a Unix socket, not a TCP port. By default it's the
root
user that owns the Unix socket, and other users can only access it usingsudo
.
⇒ Docker client 랑 Docker daemon 은 TCP 가 아니라, Unix 소켓으로 바인딩되어있음
- The Docker daemon always runs as the
root
user - https://www.youtube.com/watch?v=3jQ2dBpiqPo
- 소켓(Socket)은 OS 커널에 구현되어 있는 프로토콜 요소에 대한 추상화된 인터페이스, 장치 파일의 일종
# [터미널2] 일반 유저 ubuntu 로 실습 진행
whoami
# 도커 서버 정보 획득 실패
**docker info**
...
Server:
ERROR: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.46/info": dial unix /var/run/docker.sock: connect: permission denied
errors pretty printing info
#
ls -l /run/docker.sock /var/run/docker.sock
file /var/run/docker.sock
# [터미널1] 관리자
sudo su -
#
sudo systemctl status docker -l --no-pager
docker info
# 소켓 정보 확인 : tcp, udp, sctp, Unix Domain
ss -h | grep sockets
ss -tl # 혹은 ss --tcp --listening
ss -xl # 혹은 ss --unix --listening
**ss -xl | grep -i docker**
u_str LISTEN 0 4096 /run/docker.sock 69239 * 0
u_str LISTEN 0 4096 /var/run/docker/metrics.sock 69882 * 0
u_str LISTEN 0 4096 /var/run/docker/libnetwork/914c2d2f1446.sock 69422 * 0
# 특정 소켓 파일을 사용하는 프로세스 확인
**lsof /run/docker.sock**
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 40u unix 0xffff96bd96236a80 0t0 69239 /run/docker.sock type=STREAM
dockerd 5178 root 4u unix 0xffff96bd96236a80 0t0 69239 /run/docker.sock type=STREAM
# unix domain socket 중 docker 필터링
lsof -U | grep -i docker
일반유저로 docker info 하게되면 permission dinied 받는다.
이때 해당되는 파일이 /run/docker.sock 이랑 /var/run/docker.sock 인데, 이거 두개를 통해서 docker client - docker daemon 통신한다고 생각하면 될거같다.
ss
: 소켓 정보를 확인하는 명령어
Unix Domain Socket by ChatGPT : 예) UDS 사용 - mysql 로컬 접속 시 , Istio proxy 와 Envoy 프로세스(XDS, SDS)간 로컬 통신 시
- Unix Domain은 동일한 시스템 내에서 실행되는 프로세스들 간의 통신을 의미하며, "Domain"은 로컬 시스템 내의 통신 영역을 나타냅니다.
- 이 용어는 1980년대에 BSD Unix에서 로컬 IPC 메커니즘을 구현하기 위해 처음 도입되었습니다.
- "Unix Domain Socket"이라는 이름은 네트워크 소켓과 유사한 API를 사용하면서도, 로컬 시스템 내에서만 동작하는 소켓이라는 의미.
https://miintto.github.io/docs/os-ipc
https://miintto.github.io/docs/unix-socket
https://m.blog.naver.com/wjdeogks18/221730623136
https://sthyun.tistory.com/entry/프로세스간-통신-UDS
https://www.lesstif.com/linux-core/unix-domain-socket
https://www.verycosy.net/posts/2023/09/unix-domain-socket
- Manage Docker as a non-root user
# [터미널2] 일반 유저 ubuntu 로 실습 진행
whoami
# Create the docker group : 도커 스크립트 생성 시 자동 생성되어 그룹 확인만 진행
~~sudo groupadd docker~~
getent group | tail -n 3
# Add your user to the docker group.
echo $USER
sudo usermod -aG docker $USER
# ssh logout
exit
# ssh 재접속 후 확인
#
docker info
# 컨테이너 실행
docker run hello-world
#
docker ps
docker ps -a
docker images
# 중지된 컨테이너 삭제
docker ps -aq
docker rm -f $(docker ps -aq)
docker ps -a
docker 가 설치되면서 docker 라는 그룹이 생기는데, 일반유저는 해당그룹에 존재하지 않아서 생기는 문제.
⇒ docker 그룹에 ubuntu 라는 일반유저를 추가해서 문제해결
getent group | tail -n 3
_chrony:x:121:
ubuntu:x:1000:
docker:x:999:ubuntu
[심화] 컨테이너가 host의 docker socket file 공유로 도커 실행 - Link1 , Link2
#
docker run --rm -it **-v /run/docker.sock:/run/docker.sock -v /usr/bin/docker:/usr/bin/docker** ubuntu:latest bash
--------------------
docker info
docker run -d --rm --name webserver nginx:alpine
docker ps
docker rm -f webserver
docker ps -a
exit
--------------------
⇒ 신기한점: 도커소켓파일(/run/docker.sock), 도커클라이언트(/usr/bin/docker) 를 파일마운트를 해서 DOOD 를 하는거임
# Jenkins 컨테이너 실행
**docker run -d -p 8080:8080 -p 50000:50000 --name jenkins-server --restart=on-failure -v jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker jenkins/jenkins**
# 확인
docker ps
**docker volume ls**
*local jenkins_home*
# 초기 암호 확인
**docker exec -it jenkins-server cat /var/jenkins_home/secrets/initialAdminPassword**
# Jenkins 컨테이너 웹 접속 주소 확인 : 초기 암호 입력
echo "http://$(curl -s ipinfo.io/ip):8080"
# jdk 확인
docker exec -it jenkins-server java --version
# JAVA_HOME 확인
docker exec -it jenkins-server sh -c **'echo $JAVA_HOME'**
# Git 확인
docker exec -it jenkins-server git -v
# 기본 사용자 확인
docker exec -it jenkins-server whoami
# Jenkins 컨테이너에서 도커 명령 실행
docker exec -it --user 0 jenkins-server **whoami**
docker exec -it --user 0 jenkins-server **docker info**
docker exec -it --user 0 jenkins-server **docker run --rm hello-world**
docker exec -it --user 0 jenkins-server **docker ps**
# Jenkins 컨테이너 삭제
docker rm -f jenkins-server
docker volume rm jenkins_home
⇒ Jenkins 특징) Jenkins 는 Container 를 build 가 가능해야한다.
이를위해 Docker Container 로 띄운 Jenkins 는 build하게하는 socket 을 바인딩시켜주어야한다.
도커 설치 후 기본 정보 확인
# [터미널1] 관리자 권한
# 프로세스 확인 - [셸변수](https://youtu.be/Y88jOdaBs4Q?t=45)
ps -ef
pstree -p
# 시스템에 (마운트 된) disk free 디스크 여유 공간 확인
df -hT
# 네트워크 정보 확인 >> docker0 네트워크 인터페이스가 추가됨, 현재는 DOWN 상태
ip -br -c addr
ip -c addr
ip -c link
ip -br -c link
ip -c route
# 이더넷 브리지 정보 확인
brctl show
# iptables 정책 확인
iptables -t filter -S
iptables -t nat -S
## filter 에 FORWARD 가 기존 ACCEPT 에서 DROP 로 변경됨
## filter 에 FORWARD 에 docker0 에서 docker0 혹은 외부로 전달 허용 정책이 추가됨
iptables -t **filter** -S
-P INPUT ACCEPT
**-P FORWARD DROP**
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-N DOCKER-USER
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
## nat POSTROUTING 에 172.17.0.0/16 에서 외부로 전달 시 매스커레이딩(SNAT) 정책이 추가됨
iptables -t **nat** -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N DOCKER
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
**-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE**
-A DOCKER -i docker0 -j RETURN
자주 사용하는 명령어
ip -c addr: 인터페이스, 컬러로, 주소확인 하는 명령어
brctl show: 브릿지 인터페이스의 상태를 확인하는 명령어
iptable : ip테이블 보는거…
2.3 컨테이너 실행 및 확인
nginx 컨테이너 사용
- Ubuntu 호스트 VM 에서 동작하는 컨테이너의 네트워크 정보 샘플
- nginx 컨테이너를 백그라운드로 실행
- nginx (웹 서버/프록시 소프트웨어 - 링크 생코) 이미지로 컨테이너 실행 시 백그라운드로 동작 - Web Server Survey & Official Image
# nginx 이미지를 컨테이너 백그라운드로 실행
# -d 는 Detached 모드로 컨테이너를 실행. 컨테이너를 백그라운드에서 동작하는 애플리케이션으로써 실행하도록 설정.
# Detached 모드인 컨테이너는 반드시 컨테이너에서 프로그램이 실행돼야 하며 프로그램이 실행되지 않으면 컨테이너는 종료됩니다.
docker run -d nginx
docker ps
# 실행중인 컨테이너의 ID만 확인
docker ps -q
# 컨테이너 상세 정보 확인
# docker inspect '<NAME> 혹은 <ID>'
docker inspect $(docker ps -q)
# 컨테이너(=Instance)의 IP 정보 확인(JSON) - [링크](https://docs.docker.com/engine/reference/commandline/inspect/)
# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $INSTANCE_ID
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -q)
ping 172.17.0.2
# 호스트 네트워크 인터페이스 정보 확인
ip -c a
brctl show
# curl 로 http 접속 테스트 - [링크](https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_curl) [링크2](https://www.lesstif.com/software-architect/curl-http-get-post-rest-api-14745703.html)
curl `docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -q)` | grep -o '<title>.*</title>'
curl -s 172.17.0.2 | grep -o '<title>.*</title>'
2. 컨테이너 상세 정보 확인 - 링크
- 네트워크, 볼륨 등 컨테이너에 대한 모든 정보를 출력
docker inspect $(docker ps -q)
docker inspect $(docker ps -q) | more
# 컨테이너(=Instance)의 IP 정보 확인(JSON) - [링크](<https://docs.docker.com/engine/reference/commandline/inspect/>)
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -q)
3. 컨테이너 로깅
- 컨테이너에서 출력되는 로그 기록을 확인 - 링크
docker logs <CONTAINER_ID>
- 백그라운드로 실행된 컨테이너의 로그를 직접 확인할 수 있습니다
# 터미널1 : -f 는 follow output 옵션입니다(tail -f) ⇒ <CTRL> + <C> 로 로깅을 종료
docker logs -f $(docker ps -q)
172.17.0.1 - - [01/Jun/2021:09:00:07 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"
172.17.0.1 - - [01/Jun/2021:09:00:09 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"
...
# 터미널2
curl `docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -q)`
curl 172.17.0.2
4. 컨테이너 명령 전달
- 실행된 컨테이너에 새로운 패키지를 설치하거나 수정해야 하는 경우가 있습니다. 이런 경우에 exec 명령을 이용하여 컨테이너에 명령을 전달할 수 있습니다. - 링크
docker exec <CONTAINER_ID> <CMD>
- nginx 컨테이너의 index.html 내용을 변경하는 실행(exec)를 실습해보자
# nginx 컨테이너의 index.html 파일의 위치는 /usr/share/nginx/html/index.html 입니다
docker exec $(docker ps -q) ls /usr/share/nginx/html
docker exec $(docker ps -q) cat /usr/share/nginx/html/index.html
5. 컨테이너 삭제
docker rm -f $(docker ps -a -q)
Interactive(대화식, 인터렉티브) 컨테이너
이미지를 실행 시, -it 옵션을 통해 직접 컨테이너 안으로 접속하여 작업할 수도 있습니다.
-it 는 interactive (stdin, stdout 연결), tty (터미널 연결)의 약자입니다 → stdin stdout 소개 - 링크 & 표준 스트림
- ubuntu:16.04 이미지를 실행하며 bash 쉘을 실행합니다.
# 호스트 Ubuntu 버전 확인
lsb_release -a
# ubuntu 16.04 컨테이너 실행하면서 bash 쉘 실행 → 컨테이너 내부로 진입
docker run --rm **-it** ubuntu:16.04 bash
cat /etc/os-release
ps -ef
exit
-------------------------------------------------
root@ubuntu20:~# docker run -it ubuntu:16.04 bash
...
root@f37c3b8ea41c:/# cat /etc/os-release
*NAME="Ubuntu"
VERSION="**16.04.7 LTS** (Xenial Xerus)"*
...
root@f37c3b8ea41c:/# ps -ef
root@ubuntu20:~# exit
# 컨테이너 상태 확인
docker ps
2. 호스트 리눅스 배포판과 다른 centos 이미지를 실행하며 bash 쉘 실행!
# 호스트 Ubuntu 버전 확인
lsb_release -a
# ubuntu 16.04 컨테이너 실행하면서 bash 쉘 실행 → 컨테이너 내부로 진입
docker run --rm **-it** ubuntu:16.04 bash
cat /etc/os-release
ps -ef
exit
-------------------------------------------------
root@ubuntu20:~# docker run -it ubuntu:16.04 bash
...
root@f37c3b8ea41c:/# cat /etc/os-release
*NAME="Ubuntu"
VERSION="**16.04.7 LTS** (Xenial Xerus)"*
...
root@f37c3b8ea41c:/# ps -ef
root@ubuntu20:~# exit
# 컨테이너 상태 확인
docker ps
docker run --rm -it centos bash cat /etc/redhat-release exit ------------------------------------------------- root@ubuntu20:~# docker run -it centos bash ... [root@19c9d5b9a654 /]# cat /etc/redhat-release CentOS Linux release 8.3.2011 [root@19c9d5b9a654 /]# exit # 컨테이너 상태 확인 docker ps docker ps -a
CPU 아키텍쳐
- 아래 도커 허브에 ubuntu 이미지 경우에도 CPU 아키텍처 별 이미지를 제공(tag 확인) ⇒ 즉 호스트의 CPU 아키텍처가 다른 컨테이너 이미지는 동작 불가!
https://hub.docker.com/_/ubuntu
- Docker 이미지 작성 참고 - CPU 아키텍처 지원 - 링크
- Architectures officially supported by Docker, Inc. for running Docker: (see download.docker.com)
- ARMv6 32-bit (
arm32v6
): https://hub.docker.com/u/arm32v6/ - ARMv7 32-bit (
arm32v7
): https://hub.docker.com/u/arm32v7/ - ARMv8 64-bit (
arm64v8
): https://hub.docker.com/u/arm64v8/ - Linux x86-64 (
amd64
): https://hub.docker.com/u/amd64/ - Windows x86-64 (
windows-amd64
): https://hub.docker.com/u/winamd64/
- ARMv6 32-bit (
- Other architectures built by official images: (but not officially supported by Docker, Inc.)
- ARMv5 32-bit (
arm32v5
): https://hub.docker.com/u/arm32v5/ - IBM POWER8 (
ppc64le
): https://hub.docker.com/u/ppc64le/ - IBM z Systems (
s390x
): https://hub.docker.com/u/s390x/ - MIPS64 LE (
mips64le
): https://hub.docker.com/u/mips64le/ - RISC-V 64-bit (
riscv64
): https://hub.docker.com/u/riscv64/ - x86/i686 (
i386
): https://hub.docker.com/u/i386/
- ARMv5 32-bit (
- Architectures officially supported by Docker, Inc. for running Docker: (see download.docker.com)
# arm64v8 실행 실패!
docker run --rm -it **arm64v8**/ubuntu bash
WARNING: The requested image's platform (linux/arm64/v8) does not match the detected host platform (linux/amd64) and no specific platform was requested
standard_init_linux.go:228: exec user process caused: exec format error
# riscv64 실행 실패!
docker run --rm -it **riscv64**/ubuntu bash
WARNING: The requested image's platform (linux/arm64/v8) does not match the detected host platform (linux/amd64) and no specific platform was requested
standard_init_linux.go:228: exec user process caused: exec format error
⇒ 이 경우 해결방법: 이름에 해당하는 Docker image 를 Docker hub 에서 찾아서 Dockerfile 을 그대로 복사해온다 → 이후 buildx 쪽 확인하거나 multi platform build 로 진행
'외부활동' 카테고리의 다른 글
[KANS3] Kubernetes, kind (0) | 2024.09.07 |
---|---|
[KANS3] 도커 없이 컨테이너 만들기 (5) | 2024.09.01 |
[T101] 4기 스터디: OpenTofu (1) | 2024.08.03 |
[T101] 4기 스터디: AWS EKS Blueprints 로 ArgoCD 배포 (0) | 2024.07.28 |
Notion 서드파티 오픈소스에 기여한 썰 푼다 (0) | 2024.07.17 |