쿠버네티스 전문가 양성과정 8주차 4일(2/9)

최수환·2023년 2월 9일
0

Kubernetes

목록 보기
35/75
post-thumbnail

Docker

Docker 이미지 제작

<이미지 tag 및 push>

  • 이미지를 업로드 할 때 이름이 중요하다
  • 하지만 이미지의 이름을 변경하는 기능은 없으며,태그 기능을 사용하여 이미지를 가리키는 이름을 하나 추가하는 형태
  • 이미지를 업로드 하려는 목적이라면 태그를 지정할 때
    "허브ID/저장소이름:태그" 형태를 유지하는 것이 좋음
  1. docker hub에 접속한다
  2. create repository 클릭
  3. repository 생성
  4. docker login # 터미널에 입력 
  5. Docker hub의 계정명과 password입력
  6. docker tag 이미지명:태그명 이미지명:원하는 태그명

    -> 기존의 이미지의 태그명을 원하는 태그명으로 변경 가능
    -> 기존의 레이어에 태그를 하나 더 단것에 불과하다
    -> 만일 기존의 centos:7을 삭제해도 해당 이미지(레이어)의 다른 태그가 존재하기 때문에 레이어에서 untagged만 된다
  7. docker tag httpd:latest suhwan11/test:httpd-test
    📗 push하기위해서는 tag생성시 계정명:태그명의 형식으로 작성해야한다
  8. docker push suhwan11/test:httpd-test

    📗 push할때에는 docker hub의 계정명과 repository의 이름이 일치해야 한다

<이미지 제작>

  1. 컨테이너를 생성 후에 해당 컨테이너로 이미지를 생성.
    docker commit명령어를 사용해서 생성 가능

  2. 다른 이미지를 가지고 이미지를 생성.
    Dockerfile을 가지고 build를 구성해 생성 가능

Docker commit

docker commit [옵션] 컨테이너명 이미지명:태그

옵션 : --change (변경사항)

CMD : 컨테이너의 애플리케이션 지정
ENTRYPOINT : 컨테이너의 애플리케이션 지정(CMD에 비해서 우선)
LABEL : 이미지의 라벨 지정
VOLUME : 컨테이너의 볼륨 지정
USER : 컨테이너의 사용자 지정
WORKDIR : 컨테이너 작업 디렉토리 지정
ENV : 변수 지정
EXPOSE : 지정 포트 오픈

1 . docker commit 예시

# 기존의 이미지와 컨테이너 다 삭제한 상태에서 시작
docker run -d --name web1 httpd # 기존의 이미지로 컨테이너 생성 
docker exec -it web1 bash
cd htdocs
cat > index.html # hello world 입력 후 exit
curl 172.17.0.2 # hello world 출력

docker commit web1 n_web1:v1 # 컨테이너로 새로운 이미지 생성 
docker images # 새로운 이미지가 생성된 것을 확인 
docker run -d --name n_web1 n_web1:v1 # 새로운 이미지로 컨테이너 생성
curl 172.17.0.3 # 위와 마찬가지로 hello world 출력  

2 . change 옵션 사용

docker commit --change "VOLUME /usr/local/apache2/htdocs/" --change "WORKDIR /usr/local/apache2/htdocs/" web1 n_web:v2
# change 옵션으로 볼륨과 작업디렉터리 지정 후 컨테이너로 새로운 이미지 생성 

docker inspect n_web:v2 | less 
# 새로운 이미지 스펙확인해보면 볼륨과 디렉터리 생성되어있는 것을 확인 

docker run -d --name n_web2 n_web2:v2
# 새로운 이미지로 컨테이너 생성
curl 172.17.0.4 # 1번과 마찬가지로 helloworld 출력 

3 . 제작한 이미지로 간단한 web서버 생성 및 tag, push

# 모든 컨테이너 삭제한 상태에서 시작 
docker run -itd --name os1 centos:7 # 컨테이너 생성 
docker exec os1 yum -y install httpd # 웹 서버 패키지 설치

echo docker commit test > index.html
docker cp index.html os1:/var/www/html/
# index.html 구성 

docker commit -c 'CMD ["httpd","-D","FOREGROUND"]' -c "VOLUME /var/www/html/" -c "WORKDIR /var/www/html/" -c "EXPOSE 80/tcp" -c "EXPOSE 443/tcp" -c "EXPOSE 443/udp" os1 new_web:v1
# 새로운 이미지 생성 
# CMD를 입력할때에는 반드시 '' 따옴표를 사용해야 한다
# CMD를 제외하고는 다 " " 따옴표를 사용해야 한다

docker inspect new_web:v1 | less
# 변경사항들 확인


-> layer를 확인해보면 centos:7의 layer가 있는 것을 확인
즉, 기존의 centos:7 이미지의 layer가 있는 상태에서 해당 이미지로 컨테이너를 만들고, 컨테이너로 변경사항을 적용한 새로운 이미지를 만들었을때 기존의 layer에 새로운 layer를 추가한 것이다.

shell 방식 : yum -y install httpd
-> shell에서 명령어를 실행하듯이
exec 방식 : ['yum', '-y', 'install', 'httpd']
-> shell이 아니라 시스템에서 해당 명령어를 바로 실행
-> 개발자들이 더 선호하는 방식

docker run -itd --name os2 new_web:v1 # 새로운 이미지로 컨테이너 생성 
curl 172.17.0.2 # docker commit test문구 출력

docker tag new_web:v1 suhwan11/test:makeimage
# push하기 위해 계정명이 포함되는 태그 생성
docker push suhwan11/test:makeimage
# docker hub repository에 push


-> tag, push를 통해 새로만든 이미지를 레포지토리에 저장할 수 있다

Dockerfile

  • 도커는 Dockerfile을 사용하여 이미지를 제작할 수 있다.
  • Dockerfile은 코드 형태의 텍스트 문서이며, 여러 가지 지시어를 사용하여 이미지를 제작할 수 있다
  • 일반적으로 이미지를 생성할 때 commit이나 import보다는 Dockerfile을 사용한다.
  • 그 이유는 코드 형태로 되어 있어서 버전 관리도 용이하고, 이미지의 기능을 파악 하기도 쉽다
  • 그리고 가장 큰 이유는 컨테이너가 실행하는 CMD 또는 ENTRYPOINT는 commit이나 import로는 지정하기 어렵다
  • 따라서 개발자가 이미지를 만들어야한다면 Dockerfile을 사용해야 한다

1 . Dockerfile로 web서버 생성

vi Dockerfile # 반드시 앞에 대문자가 와야 한다

FROM centos:7
RUN ["yum","-y","install","httpd"]
COPY index.html /var/www/html/index.html
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]
VOLUME /var/www/html/
WORKDIR /var/www/html/
EXPOSE 80/tcp
EXPOSE 443/tcp
EXPOSE 443/udp
# Dockerfile 작성 

index.html파일 생성 및 테스트 문구 입력  

docker build -t my_web:v1 ./ 
# Dockerfile을 빌드해서 이미지를 생성 
# './'는 자동으로 Dockerfile을 지정 

docker inspect my_web:v1 | less # 변경사항이 적용되었는지 확인 
docker run -d --name web1 -p 8080:80 my_web:v1 # 새로만든 이미지로 컨테이너 생성 
curl 호스트ip:8080 # index.html의 텍스트가 보이는 것을 확인 

2 . go 언어를 이용한 Dockerfile만들기

vi hello.go

📗 golang 접속 후 Try GO에 있는 text복사 후 붙여넣기

yum -y install wget
wget https://go.dev/dl/go1.20.linux-amd64.tar.gz # 복사한 링크

📗 다운로드 사이트에 가서 linux운영체제 다운로드 링크 복사

ls # 압축파일 다운받아졌는지 확인 
tar xf go1.20.linux-amd64.tar.gz # 압축해제

rm -rf /usr/local/go && tar -C /usr/local -xzf go1.20.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
go version

📗 go 설치가이드 보고 한줄씩 입력

go build hello.go # hello 실행파일 생성
./hello # hello파일 실행


-> hello 실행파일의 실행결과

mkdir go_pro # 디렉터리 생성
mv hello go_pro/ 
cd go_pro

vi Dockerfile # Dockerfile 작성
FROM scratch
COPY hello /
CMD ["./hello"]

docker build -t go_hello:v1 ./ # Dockerfile 빌드해서 이미지 생성 


-> 해당 이미지로 컨테이너를 생성했더니 위의 결과와 동일한것을 확인

vi Dockerfile # Dockerfile 작성
FROM centos:7
RUN mkdir /start/
COPY hello /start/
CMD ["./hello"]
WORKDIR /start/

docker build -t hello:v2 ./ # Dockerfile 빌드해서 이미지 생성 


-> 해당 이미지로 컨테이너를 생성했더니 위의 결과와 동일한것을 확인

2 -1 . go언어를 이용한 docker commmit으로 image생성

docker run -itd --name os2 centos:7
docker exec os2 mkdir /go_dir 
# 생성한 컨테이너에 go언어 작업할 디렉터리 생성

docker cp hello os2:/go_dir 
# hello실행파일을 생성한 작업 디렉터리에 복사

docker commit -c 'CMD ["/go_dir/hello"]' os2 go_app:v1
# hello실행파일 실행하는 이미지를 생성 

docker run --name go_app go_app:v1
# 컨테이너를 실행하는 순간 hello실행파일의 코드를 실행시킨다  


-> 위 사진은 hello실행파일의 코드를 실행시킨 결과

3 . Python을 이용한 image생성

docker run -itd --name os1 centos:7 
docker exec -it os1 bash
mkdir /python_dir/ # python작업을 할 디렉터리 생성
cd /python_dir/

vi test.py # python실행 파일 생성 및 파이썬 코드 작성  
print("hello world")

python test.py 
# python실행 파일 실행 
# 이전에 입력한 hello world출력

docker commit -c 'CMD ["./test.py"]' -c 'ENTRYPOINT ["python"]' -c 'WORKDIR /python_dir' os1 python_app:v1
# python실행파일을 실행시킬 이미지 생성

docker inspect python_app:v1 | less
# 생성한 image의 변경사항이 적용되었는지 확인

docker run --name pyhon_app1 python_app:v1
# 생성한 이미지로 컨테이너 실행


-> 컨테이너를 생성하는 순간 실행파일이 실행되면서 입력했던 python 코드가 출력되는 것을 확인

4 . push한 이미지 다시 다운받아서 컨테이너 생성

docker image pull suhwan11/test1:dockerfiletest 
# docekr hub에 있는 나의 레포지토리에서 원하는 이미지를 다운받는다

docker images
# 이미지가 다운받아졌는지 확인

docker run -d --name web1 suhwan11/test1:dockerfiletest
# 다운로드 받은 이미지(이전에 내가 생성한 이미지)로 컨테이너 생성    

-> 다운로드 받은 이미지에는 웹 서버설치와 index.html이 수정되었었고, CMD,VOLUME등의 변경사항을 추가해주었었다.
그러한 이미지를 레포지토리에 저장해놨다가 다시 다운로드 받아서 해당 이미지로 컨테이너를 만들면 내가 추가한 변경사항들이 적용된 컨테이너가 생성된 것을 알 수 있다.

FROM centos:7
RUN ["yum","-y","install","python3"]
RUN mkdir /root/python_work
COPY python.py /root/python_work/
CMD ["python.py"]
WORKDIR /root/python_work/
ENTRYPOINT ["python3"]

print("input name")
name = input("")
age = input("")
print(name,age)
for i in range(5):
print(age)

docker run -it --name web11 image:v4

profile
성실하게 열심히!

0개의 댓글