2022년 2월 24일 목요일

[ Docker ] 명령어 ( container 관련 )


도커 컨테이너 생성 및 시작

# 컨테이너 생성 (이미지에 포함되는 디렉토리와 파일들의 스냅샷을 생성, 시작하진 않음)

$ docker create -name webserver nginx


# 컨테이너 생성 및 시작

$ docker run [-d:백그라운드 실행, -i:표준입력 열기, -t:tty 디바이스사용] webserver


# 컨테이너 생성 및 시작 후, 컨테이너에서 bash사용 가능한 대화모드

$ docker run -it --name "web" nginx /bin/bash


# 컨테이너 백그라운드로 실행 후 인수(ping명령어) 실행

$ docker run -d nginx -u root /bin/ping localhost (실행 후 컨테이너 종료)

$ docker run -d --rm nginx /bin/ping localhost (실행 후 컨테이너 삭제)


# 컨테이너 백그라운드 실행 인수 로그 확인

$ docker logs {container_id}


# 컨테이너 시작 

$ docker start webserver


# 컨테이너 중지

$ docker stop webserver


# 컨테이너 삭제

$ docker rm [-f:실행 중 컨테이너 강제 삭제] webserver


도커 컨테이너 네트워크

# 컨테이너 포트 맵핑

$ docker run -d -p 8080:80 nginx


# 컨테이너 dns 서버 지정

$ docker run -d --dns 192.168.1.100 nginx


# 컨테이너 호스트명 지정

$ docker run -h test.server --add-host test.client:192.168.1.2 nginx (/etc/hosts 를 확인)


# host os와 docker의 네트워크 연결을 bridge, --net 옵션 사용하여 변경사능

# 브릿지연결 | 네트워크x | 다른 컨테이너 네트워크 | 호스트OS 네트워크 | 사용자정의 네트워크

$ --net=[bridge | none | containser:<name | id> | host | NETWORK ]


도커 컨테이너 실행환경

# 자원을 지정하여 컨테이너 실행

# 옵션:  -c[cpu비율] -m[메모리] -v[호스트와 디렉토리공유]

$ docker run -c=512[기본비율 1024] -m=2g -v /user/home/:/usr/share/nginx/html nginx


# 환경변수 설정

$ docker run -it -e=env_list nginx /bin/bash


# 작업디렉토리 설정

# docker run -it -w=/my_home nginx /bin/bash


도커 컨테이너 조작

# 컨테이너 조회

$ docker ls [-a: 정지 중 인 컨테이너도 표시] [-f name:test : 이름으로 컨테이너 필터링]


# 컨테이너 상태 확인

$ docker stats webserver


# 실행 중인 컨테이너에 echo 실행

$ docker exec -it webserver /bin/echo "hello world"


# 실행 중 프로세스 확인

$ docker top webserver


# 컨테이너에서 프로세스가 전송되고 있는 포트 확인

$ docker port webserver
80/tcp -> 0.0.0.0:80


# 컨테이너 이름 변경

$ docker rename old_name new_name


# 컨테이너 안의 파일 복사

$ docker cp ./test.txt webserver:/tmp/test.txt


# 이미지 생성부터 컨테이너가 달라진 점(차분) 확인 [A:추가 D:삭제 C:수정]

$ docker diff webserver

C /run
A /run/nginx.pid
C /etc
C /etc/nginx
C /etc/nginx/conf.d


도커 컨테이너 추출

# 컨테이너로부터 이미지 작성

$ docker commit -a(작성자) "42Fire" -m(메세지) "nginx server" webserver 42Fire/nginx_web:v1

# 이미지 생성 확인

$ docker image inspect 42Fire/nginx_web:v1


# 컨테이너를 tar파일로 출력

$ docker export webserver > werb.tar

# tar파일로부터 이미지 작성

$ cat web.tar | docker import - 42Fire/webserver:v1


# 불필요 이미지/컨테이너 일괄 삭제

$ docker system prune -a(사용하지 않는 리소스 모두)


도커 볼륨과 마운트

참조 : https://www.daleseo.com/docker-volumes-bind-mounts/


[ AWS ] Python에서 Lambda 함수 실행 (with boto3)


boto3를 이용한 Lambda함수 실행  

import json

import sys

import boto3


params = {"username": username"info_list": [{"phone": phone, "age": age}]}

client = boto3.client(service_name='lambda', region_name="ap-northeast-2")

client.invoke(FunctionName="my_func", InvocationType='Event', Payload=json.dumps(params))


invoke 옵션

response = client.invoke(

    FunctionName='string',

    InvocationType='Event'|'RequestResponse'|'DryRun',

    LogType='None'|'Tail',

    ClientContext='string',

    Payload=b'bytes'|file,

    Qualifier='string'

)

Description

FunctionName : 람다 함수 이름

InvocationType : 

- Event : 비동기식으로 호출

- RequestResponse : 동기식으로 호출

- DryRun : 매개변수 값을 확인, 사용자or역할에 함수를 호출할 수 있는 권한 확인

LogType : AWS CloudTrail에 실행로그를 남짐. 동기식 호출에만 적용

Payload : 람다 함수에 Json으로 input 제공

Qualifier : 호출 할 함수 버전 또는 별칭을 지정



https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/lambda.html#Lambda.Client.invoke

2022년 2월 23일 수요일

[ Docker ] 명령어 ( image 관련 )

 

도커 실행환경의 상세설정 

$ docker system info

Client:

 Context:    default

 Debug Mode: false

 Plugins:

  buildx: Build with BuildKit (Docker Inc., v0.6.3)

  compose: Docker Compose (Docker Inc., v2.0.0)

  scan: Docker Scan (Docker Inc., v0.8.0)

Server:

 Containers: 0

  Running: 0

  Paused: 0

  Stopped: 0

 Images: 15 ...


도커 디스크 이용상황

$ docker system df

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE

Images          8         0         7.751GB   7.751GB (100%)

Containers      0         0         0B        0B

Local Volumes   29        0         785.6MB   785.6MB (100%)

Build Cache     6         0         0B        0B


웹 서버 실행 예제

# 이미지 다운로드

$ docker pull nginx


# 다운로드 이미지 확인

$ docker image ls  


# 컨테이너 실행 (웹에서 확인 localhost:80) 

$ docker run --name webserver -d -p 80:80 nginx


# 컨테이너 상태 확인

$ docker ps

CONTAINER    ID    IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES

c167    nginx    "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes   0.0.0.0:80->80/tcp   webserver


# 실시간 컨테이너 상태 확인

$ docker stats webserver

CONTAINER   ID   NAME   CPU %   MEM   USAGE / LIMIT   MEM %   NET I/O   BLOCK I/O   PIDS

c167   webserver   0.00%     6.707MiB / 3.83GiB   0.17%     4.03kB / 2.5kB   0B / 0B   9


# 컨테이너 정지 및 시작

$ docker stop webserver

$ docker start webserver


도커 이미지 조작

 실행 예제

# 특정 태그(버전)의 이미지 다운

$ docker pull centos:7


# 모든 태그 이미지 다운

$ docker pull -a centos


# 모든 이미지 목록 조회 (+중간파일 )

$ docker image ls -a


# 이미지 목록에 다이제스트 포함 조회

$ docker image ls --digests


# 이미지 검색

$ docker search --limit 5 airflow


$ 이미지 조건 검색

$ docker search --filter=stars=100 airflow


# 이미지 삭제

$ docker image rm


# 사용하지 않는 이미지 모두 삭제

$ docker image prune -a


# 이미지 docker hub에 업로드

$ docker login

$ docker image push 이미지명[:태그명]


# 이미지 생성 시 명령어 실행 히스토리

$ docker history image_name


2022년 2월 17일 목요일

[ AWS ] CloudWatch Event를 통해 Lambda Trigger 생성

 

Awsconsole -> Cloudwatch -> 좌측메뉴 -> 이벤트 -> 규칙 -> 규칙생성


1. 패턴을 이용한 Event 생성

예시는 특정 Glue job이 끝나면 Lambda함수 시작하는 Trigger Event 생성

a) 서비스 이름/ 이벤트 유형을 선택한다.



b) 이벤트 패턴을 작성

{

  "source": [

    "aws.glue"

  ],

  "detail-type":[

    "Glue Job State Change"

  ],

  "detail": {

    "state": [

      "SUCCEEDED"

    ],

    "jobName": [

        "GlueJobName"

    ]

  }

}

참조 : https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/events/EventTypes.html#glue-event-types


c) 우측의 대상추가에서 트리거로 실행할 Lambda함수 선택



2. 일정을 이용한 Event 생성

crontab 표현식 작성 부분만 다를 뿐 1번과 같다.



마지막으로 작성한 cloudwatch event role을 

lambda함수의 trigger로 등록하면 된다






2022년 2월 16일 수요일

[ Docker ] wsl을 통한 메모리 관리

 

windows에서 docker사용 시 .wslconfig file을 통해 docker메모리를 관리한다.


C:\Users\{Name} 경로에 .wslconfig 파일을 생성 후 내용 추가

[wsl2]

memory=4GB

swap=0

 

power shell에서 해당 서비스 재시작 후 

Restart-Service LxssManager


변경 사항 확인

ubuntu shell : free -h












2022년 2월 1일 화요일

[ Docker ] 이미지 다운로드시, 도커 기본 저장경로 변경

Windows Docker사용시 

default로 C:디스크의 C:\Users\My\AppData\Local\Docker\wsl에 

도커이미지가 저장된다. 

여러 이미지를 다운로드시 저장공간이 커지므로 

파티션된 다른 디스크로 docker path를 설정한다.


# 사용하는 docker app 확인

wsl --list -v

NAME STATE VERSION 

* docker-desktop Running 2 

  docker-desktop-data Running 2


# 종료

wsl --shutdown


# tar파일 export

wsl --export docker-desktop <export path>\docker-desktop.tar 

wsl --export docker-desktop-data <export path>\docker-desktop-data.tar


# wsl에 등록해제

wsl --unregister docker-desktop 

wsl --unregister docker-desktop-data


# 생성한 tar파일 새로 저장한 디렉토리에 import

wsl --import docker-desktop <new location, e.g another drive> <export path>\docker-desktop.tar 

wsl --import docker-desktop-data <new location, e.g another drive> <export path>\docker-desktop-data.tar


# docker 재시작


2022년 1월 27일 목요일

[ AWS ] Lambda함수에서 Athena Table Repartition

 

[ 1. Athena Table Create ] 

테이블 생성 후

-- 설정된 파티션 보기

show partitions test_db.table_name;


-- 해당 파티션의 S3 location 보기

describe formatted test_db.table_name partition (partition_column='123123');



[ 2. Lambda 함수 작성 ]

람다 아테나 쿼리 실행 참조 : 

https://medium.com/dataseries/automating-athena-queries-from-s3-with-python-and-save-it-as-csv-8917258b1045

S3 트리거를 이용하여 Lambda 함수 호출 :

https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/with-s3-example.html



[ 3. Lambda Role 설정 ]

람다함수 -> 구성 -> 권한 -> 실행역활의 Role 정책 추가

AmazonS3FullAccess

AmazonAthenaFullAccess

CloudWatchLambdaInsightsExecutionRolePolicy



[ 4. 실행 테스트 ]

로그는 CloudWatch, Athena log(S3에 저장하도록 설정) 에서 확인


Insufficient Lake Formation permission 에러가 나온다면

LakeFormation -> permissions -> data lake permissions에서 

쿼리적용할 테이블에 대한 iam user 권한 설정