Buttercoco

반응형

안녕하세요 코코넛입니다.

이번에는 여러분들이 사용하는 docker image를 private하게 관리(image push, pull, docker auth 등)

할 수 있는 docker private registry를 Ubuntu linux에 설치하는 설치방법과

간단한 사용법을 다루겠습니다.


Ubuntu linux에 설치되어 있는 docker를 기준으로 설치를 진행하였습니다.

docker-compose를 사용하여 registry 설치를 진행하였으며,

아래의 docker-compose yaml파일 형식의 script를 이용하여 설치를 간단하고 빠르게 진행할 수 있습니다.

 

docker-compose.yml => 이 파일은 어느 위치에서 작성이 되어도 괜찮습니다


version: “3”
services:
  registry:
    restart: always      # 도커가 시작될 시에 컨테이너 또한 언제나 같이 시작
    image: registry:2     # docker registry image
    ports:
      – 5000:5000     # localhost port : container port – 포트포워딩
    environment:
       REGISTRY_AUTH: htpasswd      # authentication 방식을 htpasswd를 따름
       REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd      # authentication 암호화된 passwd 컨테이너 내에서 지정
       REGISTRY_AUTH_HTPASSWD_REALM: test_realm_name      # authentication 상에서 realm
    volumes:     # docker conainer와 volume 마운트
      – /data/docker_storage:/var/lib/registry
      – /data/auth:/auth

 

htpasswd => /auth 라는 디렉터리를 임의의 생성한 후에 auth 디렉터리 하위 경로에 위치합니다 예: /data/auth/htpasswd

docker 명령어를 통해 htpasswd 파일을 생성합니다.


docker run –entrypoint htpasswd registry:2.7.0  -Bbn test_realm_name test_passwd > /data/auth/htpasswd


위의 인증 파일까지 생성이 되었다면 아래의 명령어를 통해 생성한 docker-compose.yml 을 통해 docker registry를

컨테이너로 생성해 줍니다.


docker-compose.yml이 존재하는 경로 상에서 “docker-compose up -d” 라고 명령어를 실행해 줍니다.


그 다음 docker registry 컨테이너가 정상적으로 생성되었는지 컨테이너 리스트 명령어로 확인합니다.

docker ps | grep registry

컨테이너가 확인되었다면 registry 컨테이너가 생성이 된 것 입니다.

 


이제 생성된 docker private registry에 테스트할 겸 docker image를 push해 봅시다.

docker pull python:3.8

명령어로 python3.8 이미지를 docker hub에서 pull받아 줍니다.

그리고 생성한 docker private registry 에 login 아래의 명령어를 통해 로그인하여 줍니다.

docker login localhost:5000

위에서 생성한 realm과 passwd 를 입력하여 로그인합니다.

 

위에서 pull 받은 python3.8 이미지를 tag 명령어를 이용하여 생성한 registry에 push가 가능하도록 해줍니다.

 

docker tag python:3.8 localhost:5000/python:3.8

 

docker images 명령어를 통해 retag된 image와 tag하기 전의 이미지 2개를 확인할 수 있습니다.

생성한 registry에 아래의 명령어를 입력하여 push합니다.

 


docker push localhost:5000/python:3.8


 

위의 명령어로 성공적으로 docker private registry에 push가 되었다면

 


docker pull localhost:5000/python:3.8


 

명령어를 이용하여 image가 pull이 되는지 확인해 봅니다.

여기까지 간단한 docker private registry  설치 방법과 사용법이었습니다.

'Docker' 카테고리의 다른 글

Docker의 기본적인 명령어  (0) 2017.11.12

반응형

안녕하세요 coconut입니다.

이번에는 유명한 Pandas 외에 Dask라는 오픈소스를 소개합니다.

기존의 pandas는 읽어들이는 모든 데이터를 메모리에 적재하여, 연산하는 방식이어서 거대한 규모의 데이터를

pandas에 적재할 시에 메모리가 부족해 지는 이슈가 자주 발생하였습니다.


이러한 문제를 그나마 적은 메모리로 연산을 할 수 있는 오픈소스가 있으니 그것이 dask라는 오픈소스입니다.

dask는 거대한 데이터를 가상의 데이터프레임으로 형성합니다.

# 가상의 데이터프레임은 메모리에 모든 데이터를 적재하지 않습니다.

그렇다면 어떻게 데이터를 연산하느냐?

가상의 데이터프레임 파티션(구역)으로 나누어 메모리에 순차적으로 올리고 내리어 연산을 하게 됩니다.

그렇게 때문에 대용량 데이터라도 그에 비해 적은 메모리로 처리가 가능합니다.

# csv file read

import dask.dataframe as dd

ddf = dd.read_csv(“data.csv”, dtype=str)

 


# S3 bucket direct access

import dask.dataframe as dd

ddf = dd.read_csv(“s3://s3_bucket_url”)  # aws s3 버킷의 csv형식의 데이터를 다이렉트로 가져옵니다.
ddf = dd.read_json(“s3://s3_bucket_url”)  # aws s3 버킷의 json형식의 데이터를 다이렉트로 가져옵니다.

위의 코드는 dask를 통해서 기본적으로 컴퓨터에 있는 csv데이터를 가져오는 방법과 아래에는 많이 사용하는 aws의 s3 버킷의 데이터를 dask를 통해서 가져올 수 있는

코드입니다.

(단 s3 버킷의 데이터는 pip install s3fs를 통해서 추가로 package를 설치해 줘야 합니다.  aws의 credentials 도 셋팅되어 있어야 함.)

 

dask의 데이터프레임과 pandas의 데이터프레임은 같지 않습니다.

때문에 dask과 pandas간의 데이터프레임 전환을 할 수 있는 함수가 있습니다.

dask의 데이터프레임을 ddf, pandas의 데이터프레임을 df라 하겠습니다.

dask => pandas

df = ddf.compute()


pandas => dask

ddf = dd.from_pandas(df)

이러한 식으로 변환이 가능합니다.

dask의 여러가지 기능을 정확히 알고 사용하려면 문서를 참고할 수 있습니다. => https://dask.org/

제가 자주 이용하는 애트리뷰트 몇가지를 소개합니다.

dask.dataframe.read_csv => csv 형식 데이터를 읽어올 때

dask.dataframe.read_json => json 형식 데이터를 읽어올 때

dask.dataframe.assign => 기존의 데이터프레임을 함수를 통해 변형 후에 기존 데이터는 변형되지 않고 새로운 변수에 리턴함.

dask.dataframe.apply => 기존의 데이터프레임을 함수를 통해 변형 후에 기존 데이터가 변형되므로 기존의 데이터를 보증할 수 없음.

dask.dataframe.count => 유효한 데이터를 컬럼별로 count하여 표시하여 줍니다. count 후에 compute를 해야 연산이 실행됩니다.

dask.dataframe.dropna => nan인 데이터를 로우 혹은 컬럼별로 제거할 수 있습니다.

 


다른 개발자의 dask 설명글도 출처를 첨부합니다.  => https://devtimes.com/python-dask/

 

위의 설명글을 보고 샘플 코드를 작성하여 보았습니다.

위의 개발자분이 설명한 글의 데이터를 다운받기 위해서

wget -O crime.csv https://data.cityofchicago.org/api/views/ijzp-q8t2/rows.csv?accessType=DOWNLOAD

와 같은 명령어로 crime.csv 데이터셋을 다운받습니다.

 

아래의 코드는 이해를 돕기 위해 첨부합니다.

import dask.dataframe as dd
from datetime import datetime
import time
start_time = datetime.now()
st = time.time()
print(“start_time : {}”.format(start_time))
ddf = dd.read_csv(“crime.csv”, dtype=str, error_bad_lines=False)
print(ddf.head())
ddf = ddf.dropna()
ddf[‘Location’] = ddf[‘Location’].str.replace(‘(‘, ”).str.replace(‘)’, ”).str.split(r’,’)
ddf = ddf.assign(**{k: ddf.Location.map(lambda x, i=i: x[i]) for i, k in enumerate([‘lat’, ‘lon’])})
ddf[‘lat’] = ddf[‘lat’].astype(‘float64’)
ddf[‘lon’] = ddf[‘lon’].astype(‘float64’)
print(ddf.head(30))
agg_ddf = ddf.groupby([‘Date’]).agg({“lat”: [‘mean’, ‘sum’, ‘count’]})
print(agg_ddf.head(30))
print(ddf.count().compute())
end_time = datetime.now()
et = time.time()
print(“running time : {} seconds”.format(et – st))
print(“end_time : {}”.format(end_time))
위의 코드에 대한 간단한 설명을 하겠습니다.
crime.csv를 읽어서 Location 컬럼의 위경도를 split하여 float형태의 데이터 타입으로 변경한 뒤
데이터 전체를 Date 기준으로 위도의 (평균 / 합계 / 개수) 형태로 aggregation을 하여주는 코드입니다.
코드와 글을 통해 이해하여 즐거운 코딩되시길 바랍니다.

반응형

안녕하세요, 코코넛입니다~!

이번에는 제가 애용하고 있는 윈도우 OS의 WSL2(Windows Subsystem for Linux version 2)에 관해

  1. 포트포워딩
  2. vmmem 이슈 => wsl2 에 자원 할당
  3. 윈도우 시작 시에 wsl2 내에서 원하는 bashscript 실행

이렇게 세가지를 다뤄 보도록 하겠습니다.


우선 1번 포트포워딩인데요, wsl2 내에서 외부로 포트포워딩하고 싶은 경우 방화벽 설정을 건드려 줘야 합니다.

아래의 스크립트를 원하는 file 이름으로 확장자명은 .ps1 형식으로 원하는 경로에 저장을 합니다. (예: port_fowarding.ps1)

$remoteport = bash.exe -c “ifconfig eth0 | grep ‘inet ‘”
$found = $remoteport -match ‘\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}’;

if( $found ){
$remoteport = $matches[0];
} else{
echo “The Script Exited, the ip address of WSL 2 cannot be found”;
exit;
}

#[Ports]

#All the ports you want to forward separated by comma
$ports_tcp=@(22,80,443,3306);

#[Static ip] #You can change the addr to your ip config to listen to a specific address
$addr=’0.0.0.0′;
$ports_a_tcp = $ports_tcp -join “,”;

#Remove Firewall Exception Rules
iex “Remove-NetFireWallRule -DisplayName ‘WSL 2 Firewall Unlock_TCP’ “;

#adding Exception Rules for inbound and outbound Rules
iex “New-NetFireWallRule -DisplayName ‘WSL 2 Firewall Unlock_TCP’ -Direction Outbound -LocalPort $ports_a_tcp -Action Allow -Protocol TCP”;
iex “New-NetFireWallRule -DisplayName ‘WSL 2 Firewall Unlock_TCP’ -Direction Inbound -LocalPort $ports_a_tcp -Action Allow -Protocol TCP”;

for( $i = 0; $i -lt $ports_tcp.length; $i++ ){
$port = $ports_tcp[$i];
iex “netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr”;
iex “netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addr connectport=$port connectaddress=$remoteport”;
}

그리고 윈도우의 ‘작업 스케쥴러’ 라고 검색해서 작업 스케쥴러 상에서 작업 만들기를 통해서 이 파일을 윈도우가 시작할 때 실행되도록 할텐데요,

트리거 => 시스템 시작 시 로 설정을 해줍니다.

동작탭에서

프로그램 / 스크립트 => C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

시작 위치 => 위의 스크립트가 존재하는 폴더 Path (예: C:\Users\test\wsl2_config)

인수 추가 => -ExecutionPolicy Bypass -File .\port_fowarding.ps1

라고 설정해 줍니다.

그리고 저장을 해줍니다.

여기까지 하면 포트포워딩까지는 됩니다.


두번째는 윈도우 cpu, memory 등을 wsl2에 임의로 할당하는 설정입니다.

wsl2에 임의로 자원을 할당하지 않으면 윈도우에서 사용하는 메모리를

버퍼 상태로 할당하여 윈도우에서 필요할 때 메모리를 사용을 못할 수 있습니다.

그래서 자원을 임의로 할당해 주면 이런 불상사는 일어나지 않겠죠?

아래의 스크립트를 C:\Users\사용자명\.wslconfig 로 저장합니다.

꼭 사용자 홈 디렉터리에 .wslconfig 의 이름으로 저장이 되어야 윈도우에서 인식할 수 있습니다.

[wsl2] memory=4GB
processors=2
swap=2GB
localhostForwarding=true


 

memory는 4GB를 할당, cpu 프로세서는 2개, 스왑메모리는 2GB를 할당하는 옵션입니다.

memory를 할당하지 않을 경우 윈도우 메모리 자원을 wsl2가 점유하고 있을 수 있으니 주의바랍니다.


 

마지막으로 윈도우가 구동되면서 작업 스케쥴러를 통해서 wsl2내의 bashscript를 구동시켜 원하는 프로세스를 실행시킬 수 있는 설정입니다.

아래의 스크립트를 파일로 임의의 이름으로 확장자는 .bat 형식으로 원하는 경로에 저장을 해줍니다. (예: init_system.bat)

C:\Windows\System32\bash.exe -c “/home/wsl2유저명/init_system.sh”

 

그리고 저장한 파일을 또 ‘작업 스케쥴러’ 에 추가해 줍니다.

트리거 => 시스템 시작 시 로 설정을 해줍니다.

이번에는 동작탭에서

프로그램 / 스크립트 => C:\Users\test\wsl2_config\init_system.bat

정도로 설정을 해주면 됩니다. 이 설정은 /home/wsl2유저명/init_system.sh 를 윈도우 시작 시에 실행하게 됩니다.

용도의 예로는 crontab 이나 webserver 를 구동시키는 정도를 나열해 볼 수 있겠습니다.