<1> 도커(Docker) 1 AWS 로그인 https://console.aws.amazon.com/console/home 2 새 기본 vpc 생성 vpc 작업 > 기본 VPC 생성 3 Ubuntu 24.04 생성 docker-ub2204-1 인터넷에서 HTTP 트래픽 허용 public ip 자동할당 활성화 인스턴스 시작 우분트 로그인 ubuntu 계정 aws-check-01-11-1 4 우분트에 도커 엔진 설치 필수 패키지 설치 및 업데이트: sudo apt-get update sudo apt-get install ca-certificates curl gnupg lsb-release Y 도커 공식 GPG 키 추가 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg 도커 저장소(Repository) 등록 echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null 도커 엔진 설치 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin Y 설치 확인 및 실행 sudo systemctl enable docker sudo systemctl start docker sudo docker run hello-world 4 clear ubuntu@ip-172-31-40-131:~$ docker info Client: Docker Engine - Community Version: 29.2.1 Context: default Debug Mode: false Plugins: buildx: Docker Buildx (Docker Inc.) Version: v0.31.1 Path: /usr/libexec/docker/cli-plugins/docker-buildx compose: Docker Compose (Docker Inc.) Version: v5.0.2 Path: /usr/libexec/docker/cli-plugins/docker-compose Server: permission denied while trying to connect to the docker API at unix:///var/run/docker.sock ubuntu@ip-172-31-40-131:~$ 5 ubuntu@ip-172-31-40-131:~$ sudo su - root@ip-172-31-40-131:~# docker -v Docker version 29.2.1, build a5c7197 6 도커에서 우분트로 이미지 만들고 , 도커 이미지로 로그온 해보기 root@ip-172-31-40-131:~# docker run -i -t ubuntu:24.04 Unable to find image 'ubuntu:24.04' locally 24.04: Pulling from library/ubuntu a3629ac5b9f4: Pull complete 1baf05536e37: Download complete Digest: sha256:cd1dba651b3080c3686ecf4e3c4220f02 Status: Downloaded newer image for ubuntu:24.04 root@32bf63e5b123:/# root@32bf63e5b123:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@32bf63e5b123:/# 7 컨테이너 나가기 root@32bf63e5b123:/# exit exit root@ip-172-31-40-131:~# 8 clear root@ip-172-31-40-131:~# docker pull centos:7 7: Pulling from library/centos 2d473b07cdd5: Pull complete Digest: sha256 Status: Downloaded newer image for centos:7 docker.io/library/centos:7 root@ip-172-31-40-131:~# docker images i Info → U In Use IMAGE ID DISK USAGE CONTENT SIZE EXTRA centos:7 be65f488b776 301MB 76.1MB ubuntu:24.04 cd1dba651b30 119MB 31.7MB U root@ip-172-31-40-131:~# 9 다운받은 centos:7 이미지로 컨테이너 생성해보자. root@ip-172-31-40-131:~# docker create -i -t --name seocentos centos:7 641ac0baa797c5726c2df27624aab98494dca956d6e8a501a29aa6a1bfd07f1e root@ip-172-31-40-131:~# root@ip-172-31-40-131:~# docker start seocentos seocentos root@ip-172-31-40-131:~# 10 컨테이너 목록 확인 root@ip-172-31-40-131:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 641ac0baa797 centos:7 "/bin/bash" 41 seconds ago Up 25 seconds seocentos root@ip-172-31-40-131:~# root@ip-172-31-40-131:~# 10 정치 컨테이너 포함 모두 all 확인 -a root@ip-172-31-40-131:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 641ac0baa797 centos:7 "/bin/bash" About a minute ago Up About a minute seocentos 32bf63e5b123 ubuntu:24.04 "/bin/bash" 7 minutes ago Exited (0) 6 minutes ago crazy_shockley root@ip-172-31-40-131:~# root@ip-172-31-40-131:~# 11 컨테이너 삭제 rm root@ip-172-31-40-131:~# docker rm crazy_shockley crazy_shockley root@ip-172-31-40-131:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 641ac0baa797 centos:7 "/bin/bash" 4 minutes ago Up 3 minutes seocentos root@ip-172-31-40-131:~# 12 운영중인 컨테이너는 삭제 불가 root@ip-172-31-40-131:~# docker rm seocentos Error response from daemon: cannot remove container "seocentos": container is running: stop the container before removing or force remove 13 강제 삭제 -f root@ip-172-31-40-131:~# docker rm -f seocentos seocentos root@ip-172-31-40-131:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES root@ip-172-31-40-131:~# 14 root@ip-172-31-40-131:~# docker run -i -t --name net-test ubuntu:24.04 root@1b764cf3b8a2:/# root@1b764cf3b8a2:/# ifconfig bash: ifconfig: command not found root@1b764cf3b8a2:/# root@1b764cf3b8a2:/# apt update && apt install net-tools root@1b764cf3b8a2:/# ifconfig eth0: flags=4163 mtu 1500 inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255 ether 86:6e:ff:8e:14:86 txqueuelen 0 (Ethernet) RX packets 4135 bytes 36364681 (36.3 MB) root@1b764cf3b8a2:/# exit exit 15 외부 노출 root@ip-172-31-40-131:~# docker run -i -t --name myweb -p 80:80 ubuntu:24.04 root@a08eca0660ee:/# apt-get update apt-get install apache2 -y service apache2 start root@a08eca0660ee:/# exit root@905bef8847c0:/# ps -ef |grep apache root 3444 1 0 22:58 ? 00:00:00 /usr/sbin/apache2 -k start www-data 3447 3444 0 22:58 ? 00:00:00 /usr/sbin/apache2 -k start www-data 3448 3444 0 22:58 ? 00:00:00 /usr/sbin/apache2 -k start root 3508 1 0 22:59 pts/0 00:00:00 grep --color=auto apache 17 aws 에서 80 허용 18 ubuntu@ip-172-31-40-131:~$ sudo su - root@ip-172-31-40-131:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 69ec2354dff7 ubuntu:24.04 "/bin/bash" About a minute ago Up About a minute 0.0.0.0:80->80/tcp, [::]:80->80/tcp myweb2 19 웹브라우저로 접속 http://3.35.233.8/ <2> 도커허브 저장소 1 Cloudformation으로 EC2 1대 생성 EC2 로그인 2 도커파일로 Nginx의 기본 웹 사이트 만들어보자. vi Dockerfile # 1. 가벼운 Nginx 알피니 리눅스 버전을 베이스로 사용합니다. FROM nginx:alpine # 2. 현재 폴더에 있는 모든 게임 파일들을 Nginx의 기본 웹 루트 폴더로 복사합니다. COPY . /usr/share/nginx/html # 3. 80번 포트를 개방합니다. EXPOSE 80 # 4. Nginx를 실행합니다. CMD ["nginx", "-g", "daemon off;"] 3 이미지 빌드: docker build -t myuser/2048-game:v1 . 4 docker run -d -p 8080:80 --name my-2048 myuser/2048-game:v1 5 http://3.235.2.118:8080 (AWS EC2 환경인 경우) @kops-ec2 ~]# curl ifconfig.me 3.235.2.118 EC2를 사용 중이시라면, AWS 보안 그룹(Security Group) 설정에서 8080번 포트가 열려 있는지 꼭 확인하셔야 화면이 보입니다! 보안 그룹 허용 6 우선 도커 허브 웹사이트 접속해서 Username 확인하자. https://hub.docker.com/ 로그인 계정 topasvga@naver.com goodman1002!AA Username 확인 masterseo11 7 명령서버에서 도커허브 로그인: docker login Username: 도커 허브 아이디 (이메일 주소가 아닙니다!) masterseo11 Password: 비밀번호 또는 생성한 액세스 토큰(Access Token)을 입력합니다. (입력할 때 화면에 글자가 보이지 않는 것이 정상이니 당황하지 마세요.) docker login -u masterseo11 dckr_pat_FDLc Access Token 사용 실무에서는 실제 암호 대신 **Access Token(액세스 토큰)**을 사용하는 것이 권장됩니다. 오른쪽 상단 프로필 클릭 -> Account Settings Personal Access Tokens 클릭 8 # tag 지정. 태그를 지정해야 올리기 가가능 # 형식: docker tag [기존이미지명] [본인아이디]/[이미지명]:[태그] docker tag myuser/2048-game:v1 본인아이디/2048-game:v1 docker tag myuser/2048-game:v1 masterseo11/2048-game:v1 9 업로드: docker push 본인아이디/2048-game:v1 docker push masterseo11/2048-game:v1 10 # 도커 레지스트리를 만들어야 한다. Create Repository] 2048-game Read,Write,Delte <- 쓰기 권한 필수 masterseo11/2048-game docker login -u masterseo11 11 # 배포 mkdir 2 cd 2 vi deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: game-2048 spec: replicas: 1 selector: matchLabels: app: "2048" # <--- 숫자를 따옴표("")로 감싸서 문자열로 만듭니다. template: metadata: labels: app: "2048" # <--- 여기도 똑같이 수정해야 합니다. spec: containers: - name: game-container image: masterseo11/2048-game:v1 ports: - containerPort: 80 kubectl apply -f deployment.yaml 12 vi service.yaml apiVersion: v1 kind: Service metadata: name: game-2048-service spec: # 이 부분을 ClusterIP에서 LoadBalancer로 변경하세요. type: LoadBalancer selector: app: "2048" ports: - protocol: TCP port: 80 # 외부에서 접속할 포트 targetPort: 80 # 컨테이너 내부 포트 kubectl apply -f Service.yaml 13 다른 터미널에서 .모니터링 watch -d kubectl get no,svc,pod,deploy,rs 14 ### 3. 주의사항 (Private 저장소인 경우) 만약 이미지를 **비공개(Private)**로 올리셨다면, 쿠버네티스가 도커허브에 접근할 수 있도록 별도의 Secret을 생성하고 YAML에 추가해야 합니다. Secret 생성: kubectl create secret docker-registry regcred --docker-username= --docker-password= --docker-email= YAML 추가: spec 하위에 imagePullSecrets: [{name: regcred}]를 추가해야 이미지를 정상적으로 가져올 수 있습니다. 15 # EKS가 없다면 생성. # EKS 생성할수 있는 권한 부여 [root@kops-ec2 environment]# aws configure AWS Access Key ID [None]: AKIA2ESLMQ AWS Secret Access Key [None]: JGgwvJFIQS2d35bM Default region name [None]: ap-northeast-2 Default output format [None]: < 엔터> [root@kops-ec2 environment]# aws s3 ls 2026-01-11 17:23:29 cf-templates-1m33dxyu90t4w-ap-northeast-2 2026-01-21 13:29:28 cf-templates-1m33dxyu90t4w-us-east-1 15 cd mkdir -p ~/environment/ cd ~/environment/ export AWS_REGION=ap-northeast-2 echo ${AWS_REGION} 7 # eks 생성하기1 - instanceType: m7i-flex.large # 클러스터 워커 노드의 인스턴스 타입 cat << EOF > eks-demo-cluster.yaml --- apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: eks-demo # 생성할 EKS 클러스터명 region: ${AWS_REGION} # 클러스터를 생성할 리젼 version: "1.34" vpc: cidr: "192.168.0.0/16" # 클러스터에서 사용할 VPC의 CIDR managedNodeGroups: - name: node-group # 클러스터의 노드 그룹명 instanceType: m7i-flex.large # 클러스터 워커 노드의 인스턴스 타입 desiredCapacity: 1 # 클러스터 워커 노드의 갯수 volumeSize: 20 # 클러스터 워커 노드의 EBS 용량 (단위: GiB) iam: withAddonPolicies: imageBuilder: true # AWS ECR에 대한 권한 추가 albIngress: true # albIngress에 대한 권한 추가 cloudWatch: true # cloudWatch에 대한 권한 추가 autoScaler: true # auto scaling에 대한 권한 추가 cloudWatch: clusterLogging: enableTypes: ["*"] EOF eksctl create cluster -f eks-demo-cluster.yaml (20분 소요 됨) # 무료 계정으로 가능한 서버 t3.micro t3.small c7i-flex.large 2/4 m7i-flex.large 2/8 # 참고 사항 eks 생성하기2 - m5.large로 생성시 무료 계정에서는 m5.large # 클러스터 워커 노드의 인스턴스 타입 생성 불가 cat << EOF > eks-demo-cluster.yaml --- apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: eks-demo # 생성할 EKS 클러스터명 region: ${AWS_REGION} # 클러스터를 생성할 리젼 version: "1.34" vpc: cidr: "192.168.0.0/16" # 클러스터에서 사용할 VPC의 CIDR managedNodeGroups: - name: node-group # 클러스터의 노드 그룹명 instanceType: m7i-flex.large # 클러스터 워커 노드의 인스턴스 타입 desiredCapacity: 3 # 클러스터 워커 노드의 갯수 volumeSize: 20 # 클러스터 워커 노드의 EBS 용량 (단위: GiB) iam: withAddonPolicies: imageBuilder: true # AWS ECR에 대한 권한 추가 albIngress: true # albIngress에 대한 권한 추가 cloudWatch: true # cloudWatch에 대한 권한 추가 autoScaler: true # auto scaling에 대한 권한 추가 cloudWatch: clusterLogging: enableTypes: ["*"] EOF eksctl create cluster -f eks-demo-cluster.yaml (20분 소요 됨) 8 타이머 수정 > 13분 지정 https://vclock.kr/timer/#countdown=00:10:00&enabled=0&seconds=0&sound=xylophone&loop=1 10 k get no