[구름 k8s] TIL 2-4-5

Peppie·2022년 9월 30일
0

1. Docker Container 명령어

Docker container 생성 실습

docker run -it -rm --name ubuntu1804 ubuntu:18.04 /bin/bash

ubuntu 18.04 image로 container 생성

  • -it : 터미널 상태에서 사용자와 상호작용 가능한 container 실행
  • --rm : container가 종료할 대 자동으로 container 삭제
  • --name : container 이름 지정
  • /bin/bash : container 생성 후 /bin/bash 실행

docker run -dit -p 80:80 --name webserver nginx

nginx image로 webserver container 실행

  • -dit : 백그라운드로 터미널 상태에서 사용자 상호작용 가능
  • -p 80:80 : host port 80을 container port

docker exec -it webserver /bin/bash

webserver container에 /bin/bash 실행

docker run -dit --name linuxserver -e VAR1=Ubuntu18.04 -e VAR2=LinuxServer ubuntu:18.04

-e VAR1=Ubuntu18.04 : container 내 환경변수 설정

container 생성시 환경변수 등록이 필요하면 -e 옵션을 통해 개별적으로 환경변수 설정
또는 --env-file <파일명> 옵션을 통해 환경변수를 저장한 파일을 통해 설정 가능

docker run -dit -m 1g --rm --name linuxserver3 ubuntu:18.04

  • -m <메모리량> : 메모리 사용량을 제한하여 container 생성, 단위는 b,k,m,g 중 택 1

docker run -dit --cpu-shares 512 --rm --name linuxserver4 ubuntu:18.04

  • --cpu-shares <CPU 사용량> : CPU 사용 비율

docker rm -f <container ID/이름>

동작 중인 container도 강제 삭제

docker container pause <container ID/이름>
docker pause <container ID/이름>

container 일시 중지

docker container unpause <container ID/이름>
docker unpause <container ID/이름>

container 일시 중지 해제

docker container inspect <container ID/이름>

container 세부 정보 확인

docker container inspect webserver | grep Pid
: inspect 결과에 대하여 pipe와 grep을 활용하여 검색

docker container inspect webserver --format "{{.State.Pid}}"
: --format 옵션을 이용하여 원하는 내용 검색; Pid 검색

docker container inspect webserver --format "{{.NetworkSettings.IPAddress}}"
: --format 옵션을 이용하여 원하는 내용 검색; IP 주소 검색

docker container logs <container ID/이름>

container log 정보 출력

  • -t : 시간 흐름에 따른 log 정보

파이썬 어플리케이션을 container로 실행

파이썬 어플리케이션 작성

lotto.py

from random import shuffle
from time import sleep

gamenum = input('input lotto game number : ')
for i in range(int(gamenum)):
    balls = [x+1 for x in range(45)]
    ret = []
    for j in range(6):
        shuffle(balls)
        number = balls.pop()
        ret.append(number)
    ret.sort()

    print(f'lotto number {i+1:2} : ', end='')
    print(ret)
    sleep(1)

docker run -it -d --name python-run python

파이썬 인터프리터 환경의 container 실행

docker exec -it python-run bash

python-run container에 진입하여 shell 실행

docker cp lotto.py python-run:/

host에 있는 lotto.py 파일을 python-run container의 / 디렉토리에 복사

docker exec -it python-run python /lotto.py

python container에 진입하지 않고도 lotto.py 프로그램 실행

Javascript 프로그램을 Node.js container를 이용하여 실행

Node.js 어플리케이션 작성

app.js

var http = require('http');
var content = function(req, res) {
    res.writeHead(200);
    res.end('Docker Container - Node.js app');
};

var web = http.createServer(content);
web.listen(8080);

docker run -dit -p 80:8080 --name node-run node:16.17

Node.js 실행 환경의 container 실행

docker cp app.js node-run:/

app.js 파일을 node-run container의 / 디렉토리에 복사

docker exec -it node-run bash

node-run container에 bash를 실행하여 동작 확인

docker exec -it node-run node app

app.js 프로그램 실행

2. Docker Image 생성

Docker Image는 container 생성 목적으로 사용

Docker hub를 통해 미리 작성된 Docker Image를 다운로드하여 사용하는 것이 일반적,
Docker hub에서 제공하는 Docker Image는 기본이 되는 image 제공

사용자가 원하는 형태의 image를 별도로 생성 가능, 필요시 registry를 통해 배포 가능

Docker Image 생성 방법

docker commit 명령 이용

현재 동작중인 container를 활용하여 image 생성

docker commit <현재 동작중인 container ID/이름> <생성할 image 이름>

현재 동작중인 container를 이용하여 image 생성
명령이 성공하면 docker images 명령으로 image 확인

docker commit python-run lotto-python:0.1

python을 lotto.py 파일 실행하는 Docker Image 생성

docker run -it --rm lotto-python:0.1 python lotto.py

lotto.py 프로그램 실행 container 생성

Dockerfile을 통해 직접 생성

  • Dockerfile은 image 생성 내용을 기술한 텍스트 파일
  • Dockerfile을 이용하여 image 생성

Dockerfile

docker image 생성, 즉 필요로 하는 개발 환경을 제공하기 위한 여러 명령 집합

Dockerfile, dockerfile 모두 가능하나 통상 Dockerfile 많이 사용,
별도의 형상/버전 관리 툴을 이용하여 관리

Dockerfile 명령어는 대소문자 구분 X but 가독성 위해 대문자로 기술

Dockerfile 중요 명령어

FROM

생성하려는 image의 base image 지정

  • hub.docker.com에서 제공하는 공식 image 사용 권장
  • 크기가 적은 base image 사용
  • tag 지정 X이면 latest 버전으로 지정

RUN

설정된 기본 이미지에 패키지 업데이트, 각종 패키지 설치, 명령 실행 등 작성
1개 이상 작성 가능

CMD

생성된 Docker image를 container로 생성하여 실행할 때 실행되는 명령 기술

  • ENTRYPOINT 명령문으로 지정된 명령에 default로 넘길 파라미터 지정시 사용
  • 여러 개의 CMD 명령을 사용해도 마지막 한개의 CMD만 처리
  • 일반적으로 image의 container 실행 시 application daemon이 실행되도록 하는 경우 유용

ENTRYPOINT

생성된 Docker Image를 container로 실행할 때 실행되는 명령

  • CMD와의 차이점 : container 실행시 명령 및 인자값 전달하여 실행한다 (entrypoint가)
  • 여러 CMD를 사용하는 경우 ENTRYPOINT 명령과 함께 사용

COPY

Host에 있는 파일을 Docker image에 복사하는 명령

  • 통상 Dockerfile과 같은 디렉토리 내의 파일을 Docker image에 복사할 때 사용

EXPOSE

container가 host 네트워크를 통해 들어오는 트래픽을 listening하는 포트와 프로토콜 지정

WORKDIR

container 상에서 작업할 경로 전환을 위해 사용

  • WORKDIR를 지정하면 RUN, CMD, ENTRYPOINT, COPY 명령은 해당 디렉토리를 기준으로 실행

docker build <Dockerfile 위치> -t [<사용자 ID>/]<docker image 이름>

Dockerfile을 이용하여 Docker image 생성 명령

  • -t : docker image에 tag 추가 허용 옵션
  • <사용자 ID> : docker image를 docker registry에 upload할 때 해당 사용자 ID repository에 upload

Docker Image 생성 실습

ubuntu 배포판(base image)에 apache web server를 설치하고 계산기 web application을 실행하는 image 생성

  • image 생성을 위해 필요한 파일 저장 디렉토리 생성
    : mkdir calc-ubuntu
  • image 생성시 필요한 파일을 생성한 디렉토리에 복사
    : index.html과 calc.js
  • Dockerfile 작성
# base image 지정
FROM ubuntu:18.04
 
# Apache web server 설치
RUN apt-get update && apt-get install -y apache2
 
# web service를 위한 프로그램 복사
COPY ./index.html /var/www/html
COPY ./calc.js /var/www/html
 
# 사용 포트 지정
EXPOSE 80
 
# 명령 실행
CMD [ "/usr/sbin/apache2ctl", "-DFOREGROUND" ]
  • image 생성
    : docker build . -t calc-ubuntu:0.1
  • 만들어진 image로 container를 생성하여 실행 확인
    : docker run -dit -p 80:80 --name calc-web calc-ubuntu:0.1

3.TIF

Docker Image 생성 실습 마지막 단계에서

docker: Error response from daemon: 
driver failed programming external connectivity on endpoint calc-web 
(b88ccebb343ab6ebf5e421feec69d3619856323e38ace3841b0795f3e3fdde1c): 
Bind for 0.0.0.0:80 failed: port is already allocated.

라는 에러 메세지와 함께 정상적인 실행이 불가능 했었다. docker ps -a로 확인해보니 이미 node.js 컨테이너가 해당 80번 포트를 차지하고 있었기에 이미지 실행이 안되던 것이었다.

결국 node.js 컨테이너 중단 후 다시 명령어를 실행하니 다행히도 정상적으로 실행이 완료되었다.

늘 느끼지만 IT를 하다보면 에러 메세지는 꼼꼼히 확인해보는게 필수다.

0개의 댓글