본문 바로가기
🚀 부트캠프 - PLAYDATA/📒 수업 내용 정리

[Docker] 10/5 이미지파일 생성, 인증키 생성, 도커 볼륨 생성

by minhe2810 2023. 10. 9.

도커 이미지 파일 만들어보기 

도커컴포즈 : 여러가지 파일을 모아놓은 것 

 

minhee@DESKTOP-68EJ19D:/mnt/c/Users/Playdata$ sudo service docker status
[sudo] password for minhee:
 * Docker is running
docker run -d -p 10000:3306 --name encoredb2 -e MYSQL_ROOT_PASSWORD=encore -v
~/data:/var/lib/mysql -v ~/backup:/root mysql:5.7

pem : key를 관리하는 파일 / 인증에 관련된 파일들 

공개키, 기본키 : 서로 수학적으로 동일해야 인증이 가능함. -> 인증 방식 RSA 

암호화방식 : 중간에 패킷을 가로채도 열지 못함.  

 

인증키 만드는 방식 

minhee@DESKTOP-68EJ19D:~/data$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/minhee/.ssh/id_rsa):

 

minhee@DESKTOP-68EJ19D:~/data$ cd ~/.  
// . 숨김 폴더를 의미함.

 

내 키를 오른쪽으로 집에 넣음 

minhee@DESKTOP-68EJ19D:~/.ssh$ cat id_rsa.pub > authorized_keys

 

 나만 읽고 쓸 수 있도록 권한을 변경해줌. 600 

minhee@DESKTOP-68EJ19D:~/.ssh$ chmod 600 authorized_keys
minhee@DESKTOP-68EJ19D:~/.ssh$ ll
total 20
drwx------ 2 minhee minhee 4096 Oct  5 09:34 ./
drwxr-x--- 6 minhee minhee 4096 Oct  5 09:30 ../
-rw------- 1 minhee minhee  576 Oct  5 09:34 authorized_keys
-rw------- 1 minhee minhee 2610 Oct  5 09:30 id_rsa
-rw-r--r-- 1 minhee minhee  576 Oct  5 09:30 id_rsa.pub

authorized_keys에 공개키를 넣게 되면 바로 접속이 가능해짐. 

예 ) 클러스터를 만들게 되면 클러스터끼리 통신을 할때 파일을 주고 받을 때 서로 키를 공유 (인증을 공유) 그러면 authorized_keys에 공개키가 있는 계정은 인증 안거치고 파일 전송 가능 

 

 

퍼블릭 키의 저장 위치 

minhee@DESKTOP-68EJ19D:~/.ssh$ pwd
/home/minhee/.ssh

컨테이너 이름을 중복 허용을 하지 않음. 같은 이름으로 만들어지지 않음. 

 

파일 검색 

minhee@DESKTOP-68EJ19D:~/.ssh$ docker ps -a | grep volume_test

| : 실행한 결과를 오른쪽으로 보냄. 

grep 이라는 프로그램이 이를 받아서 패턴으로 찾음. 정규식도 사용가능 (운영체제) 

 

 

파일 개수 확인 

 

 

정규식 표현 

minhee@DESKTOP-68EJ19D:/etc$ ls -l | grep ^- | wc -l   // 일반 파일 개수 조회 
75
minhee@DESKTOP-68EJ19D:/etc$ ls -l | grep ^d | wc -l   // 폴더 개수 조회 
75

^ : 첫 글자 

^- : 첫 글자가 - 인 것들 파일 

^d : 첫 글자가 d인 것들  폴더  (디렉토리의 약자) 

-l : 라인 개수 

 

 

https://yurimkoo.github.io/analytics/2019/10/26/regular_expression.html

 

유림's Blog

베짱이가 되고 싶은 개미의 기술 블로그

yurimkoo.github.io

 

 

컨트롤,  p , q : 컨테이너가 살아있는 상태로 잠시 밖으로 나감 

EXIT : 컨테이터가 죽음

 

볼륨컨테이너 2 

root@73029c18f10e:/# minhee@DESKTOP-68EJ19D:/etc$ docker run -it --name vol_from_cont2 \
>  --volumes-from volume_overide ubuntu:14.04 

명령어를 연결해줌-> \ 
하나의 명령어라는 의미

  

 

docker run -it --name vol_from_cont1 --volumes-from volume_overide
ubuntu:14.04

vol_from_cont1 : volumn_overide 를 바라봄 

 

 

볼륨 컨테이너는 많이 사용 

저장소를 따로 만듬. 저장소 역할만 함. 

docker volume create --name myvolume

 

도커 볼륨 생성 

 

minhee@DESKTOP-68EJ19D:/etc$ docker volume ls
DRIVER    VOLUME NAME
local     98760ae510d32a6abcaf0c24fd169c316874cd6149250ca96a332c492c9c478f
local     e1d6a2ee4499d14955eefa12cd32f4cd952a75c6c6d7c6251c4d42c08c1a8943
local     myvolume

 

 

v옵션을 통해서 위에서 만든 볼륨을 공유할 예정 

docker run -it --name myvolume_1 -v myvolume:/root ubuntu:14.04

 

볼륨 컨테이너 공유 

minhee@DESKTOP-68EJ19D:/etc$ docker run -it --name myvolume_1 -v myvolume:/root ubuntu:14.04

 

 

다른 터미널 열어서 도커 실행 시키면 파일을 공유하고 있는 것을 볼 수 있음 / 두 컨테이너가 똑같은 내용을 바라보고 있음 

minhee@DESKTOP-68EJ19D:/mnt/c/Users/Playdata$ docker run -it --name myvolume_2 -v myvolume:/root ubuntu:14.04
root@246ef90f0406:/# ls

예시 ) 

여러개의 서버를 사용할 때 볼륨에 소스코드를 올려놓고 이를 공유하면 모두 한번에 공유가 가능하다. 

 

로드밸런싱 -> L4단계에서 동작 

사용자의 양에 따라서 컨테이너를 올리고 내리고 조절하는 역할 (자원의 양에 따라서)->  쿠버네티스가 함. (이를 오케스트레이션이라고 함) 

예시 ) 구글 서비스 컨테이너 20억개 사용 

 

운영체제 안에서 공간을 할당 받는 것 

운영체제의 파일 시스템에 저장해서 사용하는 것 -> 따라서 성능 저하가 없음.

minhee@DESKTOP-68EJ19D:/etc$ sudo su
[sudo] password for minhee:
root@DESKTOP-68EJ19D:/etc# whoami
root
root@DESKTOP-68EJ19D:/etc# cd /var/lib/docker/volumes/myvolume/_data/
root@DESKTOP-68EJ19D:/var/lib/docker/volumes/myvolume/_data# ls
a.txt  volume.txt
root@DESKTOP-68EJ19D:/var/lib/docker/volumes/myvolume/_data#

 

inspect : 상세보기  

minhee@DESKTOP-68EJ19D:/etc$ docker inspect myvolume
[
    {
        "CreatedAt": "2023-10-05T10:26:42+09:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/myvolume/_data",
        "Name": "myvolume",
        "Options": null,
        "Scope": "local"
    }
]

도커파일

minhee@DESKTOP-68EJ19D:/mnt/c/Users/Playdata/Downloads/code_1/exam_1$ cat Dockerfile
FROM openjdk:8
LABEL description="Echo IP Java Application"
EXPOSE 60431
COPY ./target/app-in-host.jar /opt/app-in-image.jar
WORKDIR /opt
ENTRYPOINT [ "java", "-jar", "app-in-image.jar" ]

 

빌드를 진행할 폴더를 비우고(clean) jar (package)를 생성

./mvnw clean package

 

docker build -t basic-img .

docker images | grep basic // images 파일이 있는지 확인

i : 수정 

esc 나옴 

:wq 쓰고 나가기 / 저장 

 

-t : 태그 , 이름 

. 은 현재 파일에 도커 파일이 있으니 그걸 사용하여 만들어라 

minhee@DESKTOP-68EJ19D:/mnt/c/Users/Playdata/Downloads/code_1/exam_1$ 
docker run -d -p 60000:80 --name basic-run --restart always basic-img

 

 

curl : cmd 에서 바로 내용을 볼 수 있는 명령어 

minhee@DESKTOP-68EJ19D:/mnt/c/Users/Playdata/Downloads/code_1/exam_1$ curl localhost:60000
src: 172.18.0.1 / dest: localhost

sh 확장자 : 쉘 스크립트 

#bash shell script 

 build-in-host.sh

 

target 파일 생김 -> 컨테이너 내부의 otp폴더로 복사 

minhee@DESKTOP-68EJ19D:~/exam_2$ cat Dockerfile
FROM gcr.io/distroless/java:8			// 가벼운 이미지 파일 
LABEL description="Echo IP Java Application"
EXPOSE 60432
COPY ./target/app-in-host.jar /opt/app-in-image.jar
WORKDIR /opt
ENTRYPOINT [ "java", "-jar", "app-in-image.jar" ]minhee@DESKTOP-68EJ19D:~/exam_2$

entrypoint -> 명령어 실행 부분 

실행이 되면 서버가 구동이 되는 것 

 

 

경량화된 이미지로 다운 받음. 용량이 훨씬 적음 

minhee@DESKTOP-68EJ19D:~/exam_2$ cat build-in-host.sh
#!/usr/bin/env bash
yum -y install java-1.8.0-openjdk-devel
./mvnw clean package
docker build -t optimal-img .minhee@DESKTOP-68EJ19D:~/exam_2$ ll
total 60
drwx------  5 minhee minhee  4096 Oct  5 12:12 ./
drwxr-x--- 10 minhee minhee  4096 Oct  5 12:04 ../
drwxr-xr-x  3 minhee minhee  4096 Oct  5 12:04 .mvn/
-rw-r--r--  1 minhee minhee   202 Oct  5 12:02 Dockerfile
-rw-r--r--  1 minhee minhee    91 Oct  5 12:02 Dockerfile:Zone.Identifier
-rw-r--r--  1 minhee minhee   110 Oct  5 12:02 build-in-host.sh
-rw-r--r--  1 minhee minhee    91 Oct  5 12:02 build-in-host.sh:Zone.Identifier-rwx------  1 minhee minhee 10070 Oct  5 12:02 mvnw*
-rw-r--r--  1 minhee minhee    91 Oct  5 12:02 mvnw:Zone.Identifier
-rw-r--r--  1 minhee minhee  1751 Oct  5 12:02 pom.xml
-rw-r--r--  1 minhee minhee    91 Oct  5 12:02 pom.xml:Zone.Identifier
drwxr-xr-x  3 minhee minhee  4096 Oct  5 12:04 src/
drwxr-xr-x  6 minhee minhee  4096 Oct  5 12:12 target/
minhee@DESKTOP-68EJ19D:~/exam_2$ cat Dockerfile
FROM gcr.io/distroless/java:8
LABEL description="Echo IP Java Application"
EXPOSE 60432
COPY ./target/app-in-host.jar /opt/app-in-image.jar
WORKDIR /opt
ENTRYPOINT [ "java", "-jar", "app-in-image.jar" ]minhee@DESKTOP-68EJ19D:~/exam_2$
minhee@DESKTOP-68EJ19D:~/exam_2$ docker images | grep optimal-img
optimal-img             latest    d1a0442415f9   3 minutes ago    148MB
minhee@DESKTOP-68EJ19D:~/exam_2$ docker images | grep basic-img
basic-img               latest    31b8f597dffa   38 minutes ago   672MB
minhee@DESKTOP-68EJ19D:~/exam_2$

 

 docker save -o myimage.tar optimal-img
minhee@DESKTOP-68EJ19D:~/exam_2$ ll
total 146444
drwx------  5 minhee minhee      4096 Oct  5 12:17 ./
drwxr-x--- 10 minhee minhee      4096 Oct  5 12:04 ../
drwxr-xr-x  3 minhee minhee      4096 Oct  5 12:04 .mvn/
-rw-r--r--  1 minhee minhee       202 Oct  5 12:02 Dockerfile
-rw-r--r--  1 minhee minhee        91 Oct  5 12:02 Dockerfile:Zone.Identifier
-rw-r--r--  1 minhee minhee       110 Oct  5 12:02 build-in-host.sh
-rw-r--r--  1 minhee minhee        91 Oct  5 12:02 build-in-host.sh:Zone.Identifier
-rwx------  1 minhee minhee     10070 Oct  5 12:02 mvnw*
-rw-r--r--  1 minhee minhee        91 Oct  5 12:02 mvnw:Zone.Identifier
-rw-------  1 minhee minhee 149895168 Oct  5 12:17 myimage.tar
-rw-r--r--  1 minhee minhee      1751 Oct  5 12:02 pom.xml
-rw-r--r--  1 minhee minhee        91 Oct  5 12:02 pom.xml:Zone.Identifier
drwxr-xr-x  3 minhee minhee      4096 Oct  5 12:04 src/

파일이 생김. 

 

복원 

minhee@DESKTOP-68EJ19D:~/exam_2$ docker load -i myimage.tar

 

지웠던 것이 복원되어있음 

minhee@DESKTOP-68EJ19D:~/exam_2$ docker rmi optimal-img
Untagged: optimal-img:latest
Deleted: sha256:d1a0442415f991ee2b3e1e0a23b6a0e0932eff7da54de7750a7858af945ec592
minhee@DESKTOP-68EJ19D:~/exam_2$ docker images | grep optimal-img
minhee@DESKTOP-68EJ19D:~/exam_2$ docker load -i myimage.tar
Loaded image: optimal-img:latest
minhee@DESKTOP-68EJ19D:~/exam_2$ docker images | grep optimal-img
optimal-img             latest    d1a0442415f9   12 minutes ago   148MB

 


C:\work_springboot\stock>cd target

C:\work_springboot\stock\target>dir
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: 622A-C008

 C:\work_springboot\stock\target 디렉터리

2023-10-05  오후 03:53    <DIR>          .
2023-10-05  오후 03:53    <DIR>          ..
2023-10-05  오후 03:53    <DIR>          classes
2023-10-05  오후 03:53    <DIR>          generated-sources
2023-10-05  오후 03:53    <DIR>          generated-test-sources
2023-10-05  오후 03:53    <DIR>          maven-archiver
2023-10-05  오후 03:53    <DIR>          maven-status
2023-10-05  오후 03:53        39,109,395 stock-0.0.1-SNAPSHOT.jar
2023-10-05  오후 03:53            15,472 stock-0.0.1-SNAPSHOT.jar.original
2023-10-05  오후 03:53    <DIR>          surefire-reports
2023-10-05  오후 03:53    <DIR>          test-classes
               2개 파일          39,124,867 바이트
               9개 디렉터리  143,632,416,768 바이트 남음

C:\work_springboot\stock\target>java -jar ./stock-0.0.1-SNAPSHOT.jar