728x90

처리량

처리량이란 링크를 통해 전달되는 단위 시간당 데이터 양입니다. 단위로는 bps이다. 초당 전송 또는 수신되는 비트 수라는 의미이다.

처리량은 사용자들이 많아 접속할 때마다 커지는 트래픽, 네트워크 장치 간의 대역폭, 네트워크 중간에 발생하는 에러, 장치의 하드웨어 스펙에 영향을 받는다.

 

대역폭

주어진 시간 동안 네트워크 연결을 통해 흐를 수 있는 최대 비트 수 이다.

 

지연시간

지연 시간이란 요청이 처리되는 시간을 말하며 어떤 메시지가 두 장치 사이를 왕복하는 데 걸린 시간입니다.

 

TCP/IP 4 계층 모델

이 계층 모델은 네트워크에서 사용되는 통신 프로토콜의 집합으로 계층들은 프로토콜의 네트워킹 범위에 따라 네 개의 추상화 계층으로 구성된다.

 

계층 구조

TCP/IP 계층과 달리 OSI 계층은 애플리케이션 개층을 세 개로 쪼개고 링크 계층을 데이터 링크 계층, 물리 계층으로 나눠서 표현하는 것이 다르고, 인터넷 계층을 네트워크 계층으로 부른다는 점이 다르다.

이 계층들은 특정 계층이 변경되었을 때 다른 계층이 영향을 받지 않도록 설계되었다.

 

애플리케이션 계층

애플리케이션 계층은 FTP, HTTP, SSH, SMTP, DNS 등 응용 프로그램이 사용되는 프로토콜 계층이며 웹 서비스, 이메일 등 서비스를 실질적으로 사람들에게 제공하는 계층이다.

 

FTP

장치와 장치 간의 파일을 전송하는 데 사용하는 표준 통신 프로토콜이다.

 

SSH

보안되지 않은 네트워크에서 네트워크 서비스를 안전하게 운영하기 위한 암호화 네트워크 프로토콜이다.

 

HTTP

World Wide Web을 위한 데이터 통신의 기초이자 웹 사이트를 이용하는데 쓰는 프로토콜이다.

 

SMTP

전자 메일 전송을 위한 인터넷 표준 통신 프로토콜이다.

 

DNS

도메인 이름과 IP 주소를 매핑해주는 서버, 예를 들어 www.naver.com에 DNS 쿼리가 오면 [Root DNS] -> [.com DNS] -> [.naver DNS] -> [.www DNS] 과정을 거쳐 완벽한 주소를 찾아 IP를 매핑한다. 이를 통해 IP 주소가 바뀌어도 사용자들에게 똑같은 도메인 주소로 서비스할 수 있다.

 

전송 계층

전송 계층은 송신자와 수신자를 연결하는 통신 서비스를 제공하며 연결 지향 데이터 스트림 지원, 신뢰성, 흐름 제어를 제공하며, 애플리케이션과 인터넷 계층 사이의 데이터가 전달될 때의 중계 역할을 한다. 예로는 TCP, UDP 등이 있다.

 

TCP

패킷 사이의 순서를 보장하고 연결 지향 프로토콜을 사용해서 연결을 하여 신뢰성을 구축해서 수신 여부를 확인하며 '가상 회선 패킷 교환 방식'을 사용한다.

 

UDP

순서를 보장하지 않고 수신 여부를 확인하지 않으며 단순히 데이터만 주는 '데이터그램 패킷 교환 방식'을 사용한다.

 

TCP 연결 성립 과정

TCP는 신뢰성을 확보할 때 '3-way handshake'라는 작업을 진행한다.

1.SYN 단계 : 클라이언트는 서버에 클라이언트의 ISN을 담아 SYN을 보낸다. ISN은 새로운 TCP 연결의 첫 번째 패킷에 할당된 임의의 시퀀스 번호이다. 이는 장치마다 다를 수 있다.

2. SYN + ACK 단계 : 서버는 클라이언트의 SYN을 수신하고 서버의 ISN을 보내며 승인번호로 클라이언트의 ISN + 1을 보낸다.

3. ACK 단계 : 클라이언트는 서버의 ISN + 1 한 값인 승인번호를 담아 ACK를 서버에 보낸다.

3-way-handshake 과정 이후 신뢰성이 구축되고 데이터 전송을 시작한다. TCP는 이 과정이 있기 때문에 신뢰성이 있는 계층이라고 하며 UDP는 이 과정이 없기 때문에 신뢰성이 없는 계층이라고 한다.

 

SYN

SYNchronization의 약자로 연결 요청 플래그이다.

 

ACK

ACKnowledgement의 약자로 응답 플래그이다.

 

ISN

Initial Sequence Numbers의 약자로 초기 네트워크 연결을 할 때 할당된 32비트 고유 시퀀스 번호이다.

 

TCP 연결 해제 과정

TCP가 연결을 해제할 때는 4-way-handshake 과정이 발생한다.

1. 클라이언트가 연결을 닫으려고 할 때 FIN으로 설정된 세그먼트를 보낸다. 그리고 클라이언트는 FIN_WAIT_1 상태로 들어가고 서버의 응답을 기다린다.

2. 서버는 클라이언트로 ACK라는 승인 세그먼트를 보낸다. 그리고 CLOSE_WAIT 상태에 들어간다. 클라이언트가 세그먼트를 받으면 FIN_WAIT_2 상태에 들어간다.

3. 서버는 ACK를 보내고 일정 시간 이후에 클라이언트에 FIN이라는 세그먼트를 보낸다.

4. 클라이언트는 TIME_WAIT 상태가 되고 다시 서버로 ACK를 보내서 서버는 CLOSED 상태가 된다. 이후 클라이언트는 어느 정도 시간을 대기한 후 연결이 닫히고 클라이언트와 서버의 모든 자원의 연결이 해제된다.

 

TIME_WAIT의 이유

1. 지연 패킷이 발생할 경우를 대비하기 위함이다. 패킷이 뒤늦게 도달하고 이를 처리하지 못하면 데이터 무결성 문제가 발생한다.

2. 두 장치가 연결이 닫혔는지 확인하기 위해서이다. 만약 LAST_ACK 상태에서 닫히게 되면 다시 새로운 연결을 하려고 할 때 장치는 LAST_ACK로 되어 있기 때문에 접속 오류가 발생한다.

 

인터넷 계층

인터넷 계층은 장치로부터 받은 네트워크 패킷을 IP 주소로 지정된 목적지로 전송하기 위해 사용되는 계층이다. IP, ARP, ICMP 등이 있으며 패킷을 수신해야 할 상대의 주소를 지정하여 데이터를 전달한다. 상대방이 제대로 받았는지에 대해 보장하지 않는 비연결형적인 특징을 가지고 있다.

 

링크 계층

링크 계층은 광섬유, 전선, 무선 등으로 실질적인 데이터를 전달하며 장치 간의 신호를 주고받는 규칙을 정하는 계층이다.

이를 물리 계층과 데이터 링크 계층으로 나누기도 하는데 물리 계층은 무선 LAN과 유선 LAN을 통해 0과 1로 이루어진 데이터를 보내는 계층이며, 데이터 링크 계층은 이더넷 프레임을 통해 에러 확인, 흐름 제어, 접근 제어를 담당하는 계층이다.

 

계층 간 데이터 송수신 과정

HTTP를 통해 웹 서버에 있는 데이터를 요청하면 애플리케이션 계층에서 전송 계층으로 보내는 요청 값들이 캡슐화 과정을 거쳐 전달되고, 다시 링크 계층을 통해 해당 서버와 통신을 하고, 해당 서버의 링크 계층으로부터 애플리케이션까지 비캡슐화 과정을 거쳐 데이터가 전송된다.

 

캡슐화 과정

캡슐화 과정은 상위 계층의 헤더와 데이터를 하위 계층의 데이터 부분에 포함시키고 해당 계층의 헤더를 삽입하는 과정이다. 애플리케이션 계층의 데이터가 전송 계층으로 전달되면서 세그먼트 또는 데이터그램화 되어 TCP헤더가 붙여지게 된다. 그리고 이후 인터넷 계층으로 가면서 IP 헤더가 붙여지게 되며 패킷화가 되고, 이후 링크 계층으로 전달되면서 프레임 헤더와 프레임 트레일러가 붙어 프레임화가 된다.

 

비캡슐화 과정

비캡슐화 과정은 하위 계층에서 상위 계층으로 가며 각 계층의 헤더 부분을 제거하는 과정이다. 캡슐화된 데이터를 받게 되면 링크 계층에서부터 타고 올라오면서 프레임화된 데이터는 다시 패킷화를 거쳐 세그먼트, 데이터그램화를 거쳐 메시지화가 되는 비캡슐화 과정이 일어난다. 그 이후 최종적으로 사용자에게 애플리케이션의 PDU인 메시지로 전달된다.

 

PDU

네트워크의 어떠한 계층에서 계층으로 데이터가 전달될 때 한 덩어리의 단위를 PDU라고 한다. PDU는 제어 관련 정보들이 포함된 '헤더', 데이터를 의미하는 '페이로드'로 구성되어 있으며 계층마다 부르는 이름이 다르다.

  • 애플리케이션 계층 : 메시지
  • 전송 계층 : 세그먼트, 데이터그램
  • 인터넷 계층 : 패킷
  • 링크 계층 : 프레임(데이터 링크 계층), 비트(물리 계층)

 

728x90

'개발 > CS' 카테고리의 다른 글

2 - 2. 운영체제 기초  (0) 2022.07.07
2 - 1. 운영체제 기초  (0) 2022.07.05
1 - 4. 네트워크 기초  (0) 2022.06.29
1 - 3. 네트워크 기초  (0) 2022.06.28
1 - 2. 네트워크 기초  (0) 2022.06.27
728x90

Docker 컨테이너가 사용하는 스토리지

1. 도커의 레이어 기술

도커의 컨테이너 이미지는 ReadOnly 상태입니다. 컨테이너에 추가되는 데이터들은 별도의 ReadWrite레이어에 저장됩니다. 도커 컨테이너를 실행시키면 ReadOnly와 ReadWrite를 만들어서 같이 실행되어 하나의 프로세스가 되어서 동작을 합니다. 어떻게 ReadOnly와 ReadWrite가 하나인 것처럼 보일까요? 이것은 도커가 가지고 있는 레이어의 기술입니다. 이 레이어 기술을 유니온 파일 시스템 또는 overlay라고 합니다. 기존에 가지고 있던 ReadOnly 레이어에서 ReadWrite 레이어에 변경사항이 마치 하나인 것처럼 보여주는 것입니다. 도커에서는 컨테이너를 실수로 삭제하면 그 안에 있던 데이터가 다 날아갑니다. 이를 보안하기 위해 -v volume 명령어를 사용합니다.

 

2. volume 명령어

volume 옵션
-v <host path>:<container mount path>

-v <host path>:<container mount path>:<read writer mode>

-v <container mount path>

$ docker run -d --name db -v /data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=pass mysql:latest
데이터를 실제 호스트에 기록되게 볼륨 마운트하면 보안 이슈가 있다. 
해커가 파일을 저장하게되면 호스트에도 저장된다.

$ docker run -d --name db -v /data:/var/www/html:ro httpd
위의 보안 문제를 해결하기 위해 둘째 라인처럼 ro :readonly을 써준다.

$ docker run -d --name db -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=pass mysql:latest
-v 뒤에 호스트 주소가 없으면 data 디렉토리 처럼 uuid로 된 디렉토리를 만들고 
그 밑에 data디렉토리를 만들어서 거기에 저장된다.

 

3. 컨테이너끼리 데이터 공유하기

컨테이너와 컨테이너끼리 데이터 마운트로 데이터 공유가 가능합니다.

이를 이용하면 리눅스 컨테이너가 /webdata와 마운트 되어있고 index.html을 만들었고 nginx 컨테이너가 같은 폴더를 마운트하고 있으면 유저에게 index.html을 보여줄 수 있습니다. 또한 리눅스에서 index.html 파일을 변경하여도 적용됩니다.

 

4. volume 실습

docker exec -it db /bin/bash

위에 명령어는 도커에서 mysql에 접속하는 명령어입니다.

 

성공적으로 mysql에 접속한 것을 확인하실 수 있습니다. hs 라는 이름으로 database를 만들었습니다.

 

동작중인 컨테이너를 삭제하여도 호스트의 dbdata 디렉터리에는 hs 가 남아있는 것을 확인하실 수 있습니다.

 

-v 옵션에 host 디렉토리의 이름을 지정해주지 않았습니다.

 

docker inspect 명령어로 host 디렉토리의 이름을 지정하지 않으면 어느 디렉터리로 Mount 되는지 확인하였습니다.

host 디렉토리를 지정하지 않으면 /var/lib/docker/volumes/에 uuid로 디렉터리가 만들어지고 그 밑에 _data라는 디렉터리가 만들어진 것을 확인하실 수 있습니다.

728x90
728x90

따배도 강의를 보고 실습을 하다가 발생하는 오류를 작성했습니다.

1. no matching manifest 오류

MySQL을 실행시키려고 명령어를 작성하였는데 no matching manifest 오류가 발생하였습니다.

해결 방법은 간단했습니다. 실행시킬 때 플랫폼 주소도 함께 작성해주면 해결됩니다.

docker run --platform linux/amd64 -d --name db -v /data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=pass mysql:latest

성공적으로 실행이 되는가 했는데 이번에는 Mounts denied 오류가 발생하였습니다.

 

2. Mounts denied 오류

우선 docker desktop 화면에서 오른쪽 상단에 보시면 Settings에 톱니바퀴의 이미지가 있습니다. 클릭합니다.

 

Settings를 클릭하시면 위와 같은 화면이 나오실 텐데 위에 화면에서 Resources에서 FILE SHARING을 클릭해 줍니다.

그 화면에서 마운트를 진행할 폴더를 설정해줍니다. 설정하시고 오른쪽 하단에 Apply&Restart 버튼을 눌러줍니다.

 

다시 MySQL을 Run하시면 정상적으로 동작하는 것을 확인하실 수 있습니다.

728x90
728x90

컨테이너 리소스 제한 명령어

docker command 를 통해 제한할 수 있는 리소스는 

  1. CPU
  2. Memory
  3. Disk I/O 가 있다.

1.  Memory 리소스 제한

Memory 리소스 제한
  제한 단위는 b, k, m, g로 할당
--memory, -m : 컨테이너가 사용할 최대 메모리 양을 지정

--memory-swap : 컨테이너가 사용할 스왑 메모리 영역에 대한 설정

--memory-reservation : --memory 값보다 적은 값으로 구성하는 소프트 제한 값 설정

--oom-kill-disable : OOM Killer가 프로세스 kill 하지 못하도록 보호

$ docker run -d -m 512m nginx

$ docker run -d -m 1g --memory-reservation 500m nginx
: --memory-reservation 1g 메모리를 지정하는데 최소 500메가까지 보장 받는다.

$ docker run -d -m 200m --memory-swap 300m nginx
: swap은 메모리가 200m swap이 300m일 때 swap은 300 - 200으로 swap의 용량은 100m이다.

$ docker run -d -m 200m --oom-kill-disable nginx
: oom-kill 실제 피지컬 메모리가 부족해도 nginx는 죽이지 마라

리눅스에서 부하테스트를 하기위해 dockerfile을 작성했다.

 

dockerfile을 build하는 모습이다.

 

부하 테스트를 진행하는 사진입니다.

메모리를 100m를 설정을하고 swap도 100m로 설정을해서 실제로 swap에는 메모리가 없습니다.

5초동안 90m 부하를 일으키는 테스트를 진행했습니다..

정상적으로 실행 되고 있습니다.

 

5초동안 150m를 진행하였는데 실패하는 화면입니다. 

 


2. CPU 리소스 제한

CPU 리소스 제한
--cpus : 컨테이너에 할당할 CPU core 수를 지정

--cpuset-cpus : 컨테이너가 사용할 수 있는 CPU나 코어를 할당. cpu index는 0부터

--cpu-share : 컨테이너가 사용하는 CPU 비중을 1024값을 기반으로 설정



$ docker run -d --cpus=".5" ubuntu
: .5는 예를 들어 cpu 4개중에 1개를 절반까지 쓸수 있다.

$ docker run -d --cpu-shares 2048 ubuntu
: 디폴트는 1024인데 2048로 설정하면 다른 cpu보다 더 많은 리소스를 할당한다.

$ docker run -d --cpuset-cpus 0-3 ubuntu

3. Block I/O 제한

Block I/O 제한
--blkio-weight : Block IO의 Quota를 설정할 수 있으며 100 ~ 1000까지 선택 default 500
--blkio-weight-device : weight-device는 weight값을 한 device에만 적용시킨다.

--device-read-bps : 특정 디바이스에 대한 읽기와 쓰기 작업의 초당 제한을 kb, mb, gb단위로 설정
--device-write-bps 

--device-read-iops : 컨테이너의 read/write 속도의 쿼터를 설정한다. 초당 quota를 제한해서 I/O를 발생시킴
--device-write-iops :  0이상의 정수로 표기 초당 데이터 전송량 = IOPS * 블럭크기

4. 모니터링

docker stat m4

실행중인 컨테이너의 런타임 통계를 확인하는 명령어이다.

docker events -f container=name
docker image -f container=name

도커 호스트의 실시간 event 정보를 수집해서 출력하는 명령어이다.


cAdvisor이라는 모니터링툴이 있는데 제 맥북 환경에서 실행이 안되어서 모니터링을 못했습니다.

https://github.com/google/cadvisor

728x90
728x90

도커 실행과 종료의 관련된 명령어

docker create --name webserver nginx

create 명령어는 기본 백그라운드에서 실행된다. nginx가 webserver라는 이름으로 컨테이너가 생성된다.

 

docker start webserver

컨테이너로 만든 webserver를 실행시켜주는 명령어이다.

 

docker run --name webserver -d nginx

docker pull, create, start를 한 번에 진행하는 명령어이다.

 

docker ps -a

docker ps 명령어와 docker ps -a 명령어의 차이는 docker ps는 실행 중인 컨테이너만 보인다.

docker ps -a 는 실행과 중단된 컨테이너 모두 보인다.

 

docker inspect webserver

컨테이너의 상세 내용을 볼 수 있다.

 

docker inspect --format '{{.NetworkSettings.IPAddress}}' web

컨테이너의 상세 NetworkSetting.IPAddress 의 설정만 볼 수 있는 --format 옵션이다.

 

1. docker logs web
2. docker logs -f web

1. web의 이름을 가진 컨테이너의 로그를 확인할 수 있다.

2. web의 이름을 가진 컨테이너의 실시간 로그를 확인할 수 있다.

 

docker exec -it webserver /bin/bash

-it 옵션을 사용해 컨테이너에 직접 접속해서 배쉬 쉘 사용할 수 있다.

728x90
728x90

따라 하며 배우는 도커 유튜브 영상을 보고 학습한 내용을 블로그에 정리하려고 합니다.

 

1. 도커 기본 명령어

docker

docker를 설치하셔서 docker를 치면 docker에 관련된 명령어들이 나온다.

 

docker search nginx

[nginx]의 이미지가 있는지 도커에서 확인하는 명령어

 

docker images

docker에서 다운로드하였던 이미지들 목록이 나온다.

 

docker pull centos

[name]의 이미지를 다운받을 때 사용하는 명령어

 

docker run centos

위에 명령어를 실행하면 실행되지 않습니다. 

 

docker run -i -t centos

실행시키기 위해서는 태그를 붙여줘야합니다.

-i 옵션과 -t 옵션은 같이 쓰는 경우가 흔하다.

컨테이너를 종료하지 않은 채 터미널에서 입력을 계속해서 컨테이너로 전달하기 위해 이 두 옵션을 사용합니다.

-it 옵션은 컨테이너의 쉘(shell)이나 CLI 도구로 사용할 때 유용하게 사용된다.

 

docker run --name web -d -p 80:80 nginx

--name 옵션을 사용해서 컨테이너에 이름을 만들고 해당 이름으로 컨테이너를 식별할 수 있다.

-d 옵션을 사용하면 컨테이너가 detached 모드에서 실행된다. 컨테이너를 백그라운드에서 실행하고 싶을 때 쓰는 명령어이다.

-p 옵션은 호스트와 컨테이너 간의 포트(Port) 배포(publish)/바인드(bind)를 위해 사용된다.

호스트(host) 컴퓨터에서 컨테이너에서 리스닝하고 있는 포트로 접속할 수 있도록 설정해준다.

 

2. 도커 파일을 만들고 도커 허브에 배포까지

 

도커 파일이란 도커 이미지를 만들기 위한 설정 파일입니다. 여러 가지 명령어를 사용하여 도커 파일을 작성하면 설정된 내용대로 도커 이미지를 만들 수 있습니다.

 

2-1. 도커 파일의 기본 문법

#
comment를 남길때 사용한다.

FROM
컨테이너의 베이스이미지(운영환경), 기반이 되는 이미지 레이어입니다.

MAINTAINER
이미지를 생성한 사람의 이름 및 정보

LABEL
컨테이너 이미지에 컨테이너의 정보를 저장

RUN
도커이미지가 생성되기 전에 수행할 쉘 명령어

COPY
컨테이너 빌드시 호스트의 파일을 컨테이너로 복사

ADD
컨테이너 빌드시 호스트의 파일을(tar, url포함) 컨테이너로 복사

WORKDIR
컨테이너 빌드시 명령이 실행될 작업 디렉토리 설정

ENV
환경변수 설정

USER
명령 및 컨테이너 실행시 적용할 유저 설정

VOLUME
파일 또는 디렉토리를 컨테이너의 디렉토리로 마운트
디렉터리의 내용을 컨테이너에 저장하지 않고 호스트에 저장하도록 설정합니다. 
데이터 볼륨을 호스트의 특정 디렉터리와 연결하려면 docker run 명령에서 -v 옵션을 사용해야 합니다. 
ex) -v /root/data:/data

EXPOSE
컨테이너 동작 시 외부에서 사용할 포트 지정

CMD
컨테이너 동작 시 자동으로 실행할 서비스나 스크립트 지정

ENTRYPOINT
CMD와 함께 사용하면서 command 지정 시 사용

 

2-2. 도커파일 만들고 배포까지

 

hellojs라는 폴더를 만들고 그 폴더 안에 들어가서 dockerfile을 만들려고 한다.

dockerfile을 만들고 위에 내용을 입력한다.

그리고 hello.js라는 파일을 만든다. 

 

hello.js라는 파일은 node.js파일이며 컨테이너의 os.hostname을 확인하는 파일입니다.

 

docker build -t hellojs .

dockerfile을 이미지로 만들기 위해 docker build 작업을 해야 된다.

마지막. 은 호스트의 작업 디렉터리 경로 → 컨테이너 이미지가 만들어진 것

 

빌드가 진행 중인 화면입니다.

다음으로 webserver라는 폴더를 만들고 그 폴더에 도커 파일을 만듭니다.

 

도커 파일은 우분트로 되어있으며 도커가 실행될 때 아파치를 설치하고

아파치를 설치하면 /var/www/html/index.html을 찾아서 클라이언트에게 서비스해주게 된다.

따라서 /var/www/html/index.html에 TEST WEB이라는 이름의 파일을 저장시켰다.

이 컨테이너가 서비스해주는 포트를 알려주는 EXPOSE에 80번으로 설정했다.

CMD에는 아파치를 설치하고 나면 그 컨테이너 안에는 /usr/sbin/apache2ctl이라는 바이너리가 생긴다.

아파치 웹서버를 동작시켜주는 데몬이 생긴다. 아파치를 실행할 때는 -DFOREGROUND라는 옵션을 써줘야 된다.

 

docker build 명령어로 webserver를 build 중인 화면이다.

 

webserver와 hellojs가 정상적으로 이미지로 만들어진 것을 확인하실 수 있습니다. 

 

webserver의 컨테이너를 실행하는 화면입니다. 정상적으로 실행되었습니다.

 

curl로 localhost:80을 하면 잘 동작하는 것을 확인하실 수 있습니다.

 

docker rm -f web web

실행 중인 컨테이너를 지울 때는 -f라는 옵션을 붙여줘야 한다.

 

docker run 명령어로 hellojs라는 컨테이너를 실행시켰습니다.

정상 작동되는 것을 확인하실 수 있습니다.

 

 

 

docker login

도커를 내 Repository에 올리기 위해서 로그인을 진행해야 합니다.

유저 이름과 패스워드를 입력합니다.

 

docker tag webserver:v1 lusida/webserver:v1

컨테이너를 내 Repository에 올리려면 내 이름의 태그가 붙어있어야 한다.

따라서 내 이름의 태그를 붙여주기 위해 이름을 변경하는 명령어이다.

 

도커 허브에 접속하셔서 로그인 후 도커 허브 홈페이지 상단에 Repositories을 클릭해 줍니다.

 

현재 내 Repository에는 비어 있는 것을 확인하실 수 있습니다.

 

docker push lusida/webserver:v1

내 컨테이너를 Repository에 올리기 위한 명령어입니다.

하지만 오류가 난 것을 확인하실 수 있는데 제 네임을 잘못 설정을 해서 denied 오류가 발생하는 것이었습니다.

이름을 잘 확인합시다.

 

정상적으로 push 명령어가 실행되었습니다.

 

제 Repository에서도 webserver라는 Repository가 올라간 것을 확인하실 수 있습니다.

728x90
728x90

1. UTM 설치

맥북 M1에서 VM(Virtual Machine)인 UTM에서 Ubuntu 설치를 진행해 보려고 합니다.

밑에 주소에서 다운로드할 수 있습니다.

UTM 다운로드 사이트 https://mac.getutm.app

 

UTM

Securely run operating systems on your Mac

mac.getutm.app

사이트에 접속하신 후 Download를 진행하시면 됩니다.

 

맥북 런치패드에 보시면 UTM이 잘 설치된 것을 확인하실 수 있습니다.

 

2. Ubuntu 설치

이제 밑에 사이트는 우분투를 설치하는 사이트입니다. 사이트에 들어가서 우분투를 다운로드합니다.

우분투 https://ubuntu.com/download/server/arm

 

Ubuntu for ARM | Download | Ubuntu

Download Ubuntu Server for ARM with support for the very latest ARM-based server systems powered by certified 64-bit processors.

ubuntu.com

Download Ubuntu 22.04 LTS를 다운로드합니다. 이제 다운로드는 다 끝났습니다.

이전에 다운로드했던 UTM을 실행시켜 줍니다.

 

UTM을 실행시키면 위와 같은 화면이 실행됩니다.

왼쪽에는 VM을 보여주는 공간입니다. 아직 VM을 만든 것이 없기 때문에 왼쪽 공간은 비어있습니다.

이제 새 가상머신 만들기 버튼을 클릭합니다.

 

Virtualize 버튼을 클릭해 줍니다.

 

저희는 Linux를 설치를 해야 되므로 Linux를 클릭해 줍니다.

 

리눅스를 클릭하면 위와 같은 창이 나오는데 Use Apple Virtualization을 체크하지 않고

Boot ISO Image에 있는 탐색 버튼을 클릭합니다. 

 

위에서 다운로드했던 Ubuntu 설치 파일을 클릭합니다. 

 

메모리를 설정합니다.

Ubuntu Server는 메모리 사용량이 크지 않으므로 저는 2GB와 CPU Core 2개를 설정했습니다.

 

저장소를 설정하는 화면입니다.

저장소의 크기는 20GB로 설정하였습니다.

 

공유 폴더를 선택하는 화면입니다.

저는 따로 공유 폴더를 만들지 않아 Continue 버튼을 눌렀습니다.

 

VM의 이름을 설정해 줍니다.

저는 docker-ubuntu라는 이름으로 설정하였습니다.

 

VM에서의 설정은 완료하였습니다.

이제 VM에 우분투를 설치하기 위해 재생 버튼을 클릭합니다.

 

재생 버튼을 눌렀을 때 나오는 화면입니다.

Try or Install Ubuntu Server에 엔터를 눌러줍니다.

 

한국어는 따로 없어서 English를 선택합니다.

 

업데이트를 진행하지 않고 실행하였습니다.

Continue without updating에서 엔터를 누릅니다.

 

English로 설정되어 있습니다.

한국어는 없으니 Done에서 엔터를 눌러줍니다.

 

Ubuntu Server를 선택하고 Done에서 엔터를 누릅니다.

 

네트워크 연결을 진행하는 화면입니다. 할당된 IP 주소와 맥 주소가 보입니다.

따로 설정할게 없어서 Done에서 엔터를 눌러줍니다.

 

프록시도 따로 설정해 줄게 없어서 그냥 넘어갔습니다.

Done에서 엔터를 눌러줍니다.

 

저는 미러를 기본 Default 값으로 설정하였습니다.

Done에서 엔터를 눌러줍니다.

 

저장소를 설정하는 화면입니다.

파티션 분배를 수동으로 하기 위해 Custom storage layout에 (x)로 표시하고 Done에서 엔터를 눌러줍니다.

 

위에 화면에서 free space에서 엔터를 누르면 옆에 창이 나오는데 Add GPT Partition에서 엔터를 눌러줍니다.

 

저는 총 3개의 파티션을 나눴는데 1개의 파티션은 13G를 사용하고 format은 ext4, Mount는 / 로 만들었습니다.

 

두 번째 파티션은 1G를 사용하고 Format은 swap으로 설정하였습니다. 

 

세 번째 파티션은 나머지 용량을 사용하고 Format은 ext4를 사용하고 Mount는 /boot 로 설정하였습니다.

 

파티션 분배가 완료된 화면입니다.

이제 Done에서 엔터를 눌러줍니다.

 

창이 하나가 나오는데 Continue에서 엔터를 눌러 진행합니다.

 

이제 우분투 사용자에 대한 정보를 적는 화면입니다.

유저 이름과 유저 서버 네임 등 기본 정보와 패스워드를 설정합니다.

 

openSSH server에 대한 화면입니다.

따로 설정은 해주지 않고 Done에서 엔터를 눌러줍니다.

 

우분투에 설치하고 싶은 패키지들을 보여주는 화면입니다.

따로 설치하고 싶은 것이 있으시면 체크하고 설치를 진행하시면 됩니다.

 

설치가 진행되고 있는 화면입니다.

조금만 기다리시면 설치가 완료됩니다.

 

화면 위에 Install complete라고 나왔습니다.

이제 Reboot Now에서 엔터를 눌러줍니다.

 

우분투가 꺼졌다가 다시 켜지는데 검정 화면에서 커서만 깜빡거리면서 멈춰있는 경우가 있습니다.

 

이때는 VM 화면 창 오른쪽 상단에서 Drive image options을 클릭하고 CD/DVD에 마우스를 가져가면 옆에 꺼내기 변경이 나옵니다.

꺼내기를 클릭합니다.

 

꺼내기를 완료하셨으면 이제 VM 화면의 왼쪽 상단에 Restarts the VM 을 클릭해 줍니다.

 

우분투가 재부팅이 진행되는 화면입니다.

 

성공적으로 나오는 것을 확인하실 수 있습니다.

우분트를 설치하면서 설정하셨던 유저 이름과 패스워드로 로그인을 진행하시면 됩니다.

 

로그인이 성공 후 우분투가 성공적으로 설치된 것을 확인하실 수 있습니다. 

728x90

+ Recent posts