Browsing Tag

docker

NCP

[NCP] Container Registry에서 이미지를 가져오기 & 로드밸런서 연결

안녕하세요. ManVSCloud 김수현입니다.

오늘은 Naver Cloud Platform에서 Container Registry에서 이미지를 가져오는 방법과 Load Balancer에 연결하는 방법을 알아보도록 하겠습니다.


CONTAINER REGISTRY에서 이미지를 가져오기

아직 Container Registry를 생성해본 적이 없으시다면 위 [NAVER CLOUD KUBERNETES – CONTAINER REGISTRY로 컨테이너 이미지를 관리]를 먼저 보고 오시기 바랍니다.

위 포스팅에서는 push를 해보았습니다. 오늘은 pull을 해볼 시간입니다.

우선 테스트용으로 하고 계시다면 이전에 했던 docker image를 전부 지우고 한 번 해보도록합시다.

[root@kubernetes-server-kr2 ~]# docker rm `docker ps -a -q`
[root@kubernetes-server-kr2 ~]# docker rmi -f `docker images -q`

docker login을 해줍시다.

[root@kubernetes-server-kr2 ~]# docker login <CONTAINER REGISTRY에 나와있는 엔드포인트>
Authenticating with existing credentials...
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

docker pull 엔드포인트/이미지:버전 명령어로 docker 이미지를 가져올 수 있습니다.

[root@kubernetes-server-kr2 ~]# docker pull manvscloud-k8s-cr.kr.ncr.ntruss.com/manvscloud-apache:1.0
1.0: Pulling from manvscloud-apache
2d473b07cdd5: Pull complete 
444a3233aeea: Pull complete 
Digest: sha256:b2e60515712f6c5d4f155e9d234299fa82640d8dc7766405fe997c1b80658c07
Status: Downloaded newer image for manvscloud-k8s-cr.kr.ncr.ntruss.com/manvscloud-apache:1.0
manvscloud-k8s-cr.kr.ncr.ntruss.com/manvscloud-apache:1.0

또한 k8s에서 secret을 이용한다면 패스워드, OAuth 토큰, ssh 키와 같은 정보를 저장 및 관리할 수 있는데 이를 이용하여 pod를 생성해보도록 합시다.

[root@kubernetes-server-kr2 ~]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-p5mq2   kubernetes.io/service-account-token   3      11d

kubectl create secret docker-registry “secret 이름” –docker-server=레지스트리-엔드포인트 –docker-username=Access-Key-ID –docker-password=Secret-Key –docker-email=계정으로 아래와 같이 secret을 만들 수 있습니다.

[root@kubernetes-server-kr2 ~]# kubectl create secret docker-registry manvscloud-sec --docker-server=레지스트리-엔드포인트 --docker-username=Access-Key-ID --docker-password=Secret-Key --docker-email=계정

[root@kubernetes-server-kr2 ~]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-p5mq2   kubernetes.io/service-account-token   3      11d
manvscloud-sec        kubernetes.io/dockerconfigjson        1      19s

이제 yaml 파일을 생성하여 위에서 생성한 secret을 이용하여 이미지를 pull 및 pod 생성을 해봅시다.

vi apache.yaml

apiVersion: v1
kind: Pod
metadata:
 name: manvscloud-apache
 namespace: default
spec:
 containers:
 - name: manvscloud-apache
   image: manvscloud-k8s-cr.kr.ncr.ntruss.com/manvscloud-apache:1.0
 imagePullSecrets:
 - name: manvscloud-sec
[root@kubernetes-server-kr2 ~]# kubectl create -f apache.yaml 
pod/manvscloud-apache created

[root@kubernetes-server-kr2 ~]# kubectl get pods
NAME                                 READY   STATUS    RESTARTS   AGE
manvscloud-apache                    1/1     Running   0          4s

CONTAINER REGISTRY에 있는 이미지를 잘 가져와 pod가 생성되었습니다.
이렇게 CONTAINER REGISTRY를 이용하여 이미지 배포 관리가 쉽게 가능합시다.

또한 CONTAINER REGISTRY에서 Configuration을 클릭하여 Public Endpoint를 활성화/비활성화 선택이 가능합니다. 네이버 클라우드 내부에서만 사용할 것이라면 비활성화 하는 것이 좋습니다.


로드밸런서 연결

네이버 클라우드 Kubernetes Service를 사용중이라면 서비스 생성 시에 type을 LoadBalancer로 지정할 경우 네이버 클라우드 콘솔 내에 로드밸런서 인스턴스가 자동으로 생성됩니다.

로드밸런서 설정의 경우 어노테이션으로 설정할 수 있습니다.

"metadata": {
  "annotations": {
    "key1" : "value1",
    "key2" : "value2"
  }
}
https://guide.ncloud-docs.com/docs/nks-nks-1-8

실습을 통해 직접 로드밸런서를 생성해봅시다.
이번 실습에서는 어노테이션을 이용하여 추가적인 설정은 하지 않았습니다.
간단하게 로드밸런서 연결만 따라할 수 있도록 해두었습니다.

vi manvscloud-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
 name: apache-deployment
spec:
 replicas: 3
 selector:
   matchLabels:
     app: apache
 template:
   metadata:
     labels:
       app: apache
   spec:
     containers:
     - name: apache
       image: manvscloud-k8s-cr.kr.ncr.ntruss.com/manvscloud-apache:1.0
       ports:
       - containerPort: 80
     imagePullSecrets:
     - name: manvscloud-sec

아래와 같이 kubectl get pods –show-labels 했을 때 LABELS이 붙어있을 것입니다.
replicas, label 등은 따로 쿠버네티스에 대한 공부가 필요하니 이러한 설정에 이해가 어려우신 분들은 우선 kubernetes에 대한 공부를 우선적으로 간단하게나마 하시는 것을 권장드립니다.

[root@kubernetes-server-kr2 ~]# kubectl get pods --show-labels
NAME                                 READY   STATUS    RESTARTS   AGE   LABELS
apache-deployment-75895cbcbb-6dlvz   1/1     Running   0          14s   app=apache,pod-template-hash=75895cbcbb
apache-deployment-75895cbcbb-l7q4d   1/1     Running   0          14s   app=apache,pod-template-hash=75895cbcbb
apache-deployment-75895cbcbb-vcvpq   1/1     Running   0          14s   app=apache,pod-template-hash=75895cbcbb

[root@kubernetes-server-kr2 ~]# for pod in $(kubectl get pod -l app=apache |awk 'NR>1 {print $1}'); do kubectl exec $pod -- /bin/sh -c "hostname > /var/www/html/index.html; echo '안녕하세요. ManVSCloud입니다.' >> /var/www/html/index.html"; done

각 pod 내 index.html 파일을 수정해주었습니다.
로드밸런서를 연결하여 접속하기 위해 LoadBalancer를 생성해봅시다.

아래와 같이 Serivces yaml을 생성합니다.

vi lb.yaml

kind: Service
apiVersion: v1
metadata:
 name: lb-service
spec:
 ports:
   - port: 80
     targetPort: 80
 selector:
   app: apache
 type: LoadBalancer
[root@kubernetes-server-kr2 ~]# kubectl create -f lb.yaml 
service/lb-service created

kubectl get services 명령어로 확인해보면 EXTERNAL-IP가 NCP 내 LB로 되어있는 것을 확인할 수 있습니다.

[root@kubernetes-server-kr2 ~]# kubectl get services
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP                                                        PORT(S)        AGE
kubernetes   ClusterIP      198.19.128.1    <none>                                                             443/TCP        11d
lb-service   LoadBalancer   198.19.208.51   default-lb-service-821a9-7191539-4b535e410da7.kr.lb.naverncp.com   80:31033/TCP   5m33s

콘솔을 보면 따로 Load Balancer를 생성해주지 않았는데 따로 콘솔상에서 생성되어 있는 것을 확인할 수 있습니다. 삭제도 마찬가지입니다.
kubectl delete svc lb-service를 해주면 콘솔상에서도 자동 제거가 됩니다.

생성된 LB의 접속 정보를 이용하여 웹에서 접속해보면 위에서 추가해준 index.html의 값이 나오고 있습니다.

로드밸런싱 알고리즘은 기본값인 Round Robin으로 설정되어 있으며 Least Connection과 Source IP Hash로도 변경이 가능합니다.


Personal Comments

오늘은 CONTAINER REGISTRY에서 이미지를 가져오는 방법과 로드밸런싱 연동 방법을 알아보았습니다.

참고로 실습 과정을 따라해보실 경우 .yaml 파일을 그대로 복사하지 마시고 엔드포인트를 잘 수정하여 사용하시기 바랍니다.

긴 글 읽어주셔서 감사합니다.

함께 보며 공부하기 좋은 자료

NCP

[NCP] Naver CLoud Kubernetes – Container Registry로 컨테이너 이미지를 관리하자

안녕하세요. ManVSCloud 김수현입니다.

오늘은 이전 포스팅인 “[NCP] NAVER CLOUD에서 KUBERNETES를 사용해보자 – NKS“에 이어 컨테이너로 이미지를 관리하는 방법을 알아보도록 하겠습니다.


Object Storage 생성

Container Registry를 생성하기 전에 Object Storage가 먼저 생성되어야합니다.
Container Registry에 저장될 컨테이너 이미지는 Object Storage에 저장되기 때문입니다.

이후 Container Registry에 이미지를 저장하고 오브젝트 스토리지에 어떻게 저장되는지도 함께 보도록합시다.

Object Storage 생성은 어렵지 않습니다.
우선 버킷 이름을 적어주고 [다음]을 누릅시다. 참고로 버킷 이름은 유니크한 값으로 이름이 중복될 수 없습니다.

권한은 공개하지 않도록 해두고 계정 설정은 추가적으로 하지 않겠습니다.

버킷 하나가 쉽게 생성이 되었습니다.
Object Storage에 대해 자세히 알고 싶으시다면 아래 사용 가이드도 참고해보시기 바랍니다.


Container Registry 생성

Container Registry를 생성해보겠습니다.
Container Registry 를 이용하면 컨테이너 이미지를 쉽게 업로드 및 배포할 수 있습니다.

[이용 가이드]가 있어 사용하기 쉬운 편입니다.
아래에서 생성한 Container Registry로 이미지 업로드를 해볼 것입니다.


컨테이너 이미지(Dockerfile) 만들기

간단하게 Dockerfile을 만들어보도록 하겠습니다.

vi Dockerfile

FROM centos:7

RUN yum -y update && yum install -y httpd*
CMD ["systemctl","restart","httpd"]
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]

위에서 생성한 이미지를 아래와 같이 빌드해줍시다.

[root@kubernetes-server-kr2 ~]# docker build -t manvscloud-apache .
Sending build context to Docker daemon  179.7kB
Step 1/4 : FROM centos:7
7: Pulling from library/centos
2d473b07cdd5: Pull complete 
Digest: sha256:0f4ec88e21daf75124b8a9e5ca03c37a5e937e0e108a255d890492430789b60e
Status: Downloaded newer image for centos:7
.
.
.
Complete!
Removing intermediate container 47ec6561ff67
 ---> 70b6f6999f0d
Step 3/4 : CMD ["systemctl","restart","httpd"]
 ---> Running in fa442e0e6f10
Removing intermediate container fa442e0e6f10
 ---> 8196868e79b0
Step 4/4 : CMD ["/usr/sbin/httpd","-D","FOREGROUND"]
 ---> Running in 0a08c642dcc6
Removing intermediate container 0a08c642dcc6
 ---> 2171dc304b08
Successfully built 2171dc304b08
Successfully tagged manvscloud-apache:latest

docker images 명령어로 확인해보면 빌드한 이미지를 확인하실 수 있습니다.
이제 빌드된 이미지를 run 해보도록합시다.

[root@kubernetes-server-kr2 ~]# docker images
REPOSITORY          TAG       IMAGE ID       CREATED          SIZE
manvscloud-apache   latest    2171dc304b08   17 seconds ago   517MB
centos              7         8652b9f0cb4c   7 months ago     204MB

[root@kubernetes-server-kr2 ~]# docker run -tid -p 8080:80 --name manvscloud-apache01 manvscloud-apache
0edc715160a959582dd085f54ec7c384d278648f5377c2cad15816f83a252c7d

[root@kubernetes-server-kr2 ~]# docker ps
CONTAINER ID   IMAGE               COMMAND                  CREATED         STATUS         PORTS                  NAMES
0edc715160a9   manvscloud-apache   "/usr/sbin/httpd -D …"   7 seconds ago   Up 6 seconds   0.0.0.0:8080->80/tcp   manvscloud-apache01

IP : 8080 또는 서버 내부에서는 curl localhost:8080 로 확인할 수 있습니다.

[root@kubernetes-server-kr2 ~]# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      929/sshd            
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      593/rpcbind         
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      40020/docker-proxy  
tcp6       0      0 :::22                   :::*                    LISTEN      929/sshd            
tcp6       0      0 :::111                  :::*                    LISTEN      593/rpcbind  

이미지 업로드

이제 위에서 생성한 이미지를 Container Registry로 업로드 해보겠습니다.
Container Registry에 업로드 하기위해서 [마이페이지]-[인증키 관리]에서 미리 API 인증키를 생성 해놓으시기 바랍니다.

위에서 생성한 API 키를 이용하여 업로드를 해볼텐데
1) docker login -u [생성한 API Key ID] [생성한 Container Registry의 엔드포인트]를 입력한 후 API Key의 패스워드를 입력하여 로그인을 해줍니다.
2) 이후 docker image tag로 태그를 정해줍시다.
3) 마지막으로 docker push 명령어를 이용하여 아래와 같이 push 해줍니다.

[root@kubernetes-server-kr2 ~]# docker login -u [Access Key ID] manvscloud-k8s-cr.kr.ncr.ntruss.com
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

[root@kubernetes-server-kr2 ~]# docker image tag manvscloud-apache manvscloud-k8s-cr.kr.ncr.ntruss.com/manvscloud-apache:1.0

[root@kubernetes-server-kr2 ~]# docker push manvscloud-k8s-cr.kr.ncr.ntruss.com/manvscloud-apache:1.0
The push refers to repository [manvscloud-k8s-cr.kr.ncr.ntruss.com/manvscloud-apache]
d4208dd0734c: Pushed 
174f56854903: Pushed 
1.0: digest: sha256:b2e60515712f6c5d4f155e9d234299fa82640d8dc7766405fe997c1b80658c07 size: 742

아래 Container Registry가 보이시나요?
push했던 manvscloud-apache 이미지가 업로드 되었습니다.

Object Storage에 들어가서 해당 버킷으로 들어가보면 해당 이미지 파일이 저장되고 있는 것도 확인해볼 수 있습니다.


Personal Comments

요즘 컨테이너 환경을 사용하는 유저가 많이 늘었습니다.
저희 고객님들도 점점 컨테이너화된 어플리케이션 서비스를 구성하는 모습이 자주 보이기 시작합니다.

특히 다수의 컨테이너 사용자들은 퍼블릭 클라우드 환경에서 컨테이너 서비스를 운영중이며 요즘은 하이브리드 클라우드를 상당히 많이 보았습니다.
네이버 클라우드에서는 한국인이 쉽게 접근할 수 있도록 가이드들이 한글로 자세히 안내되고 있어 서비스들을 사용할 때 다른 플랫폼 보다 크게 부담이 느껴지지 않는 점이 가장 좋은 것같습니다.

긴 글 읽어주셔서 감사합니다.

IT/Linux/Kubernetes

Docker Kubernetes Online Study 스터디 시작! (Docker의 장점과 Network)

안녕하세요. ManVSCloud 김수현입니다.

CloudNet@에서 진행하는 DOCKER KUBERNETES ONLINE STUDY가 시작되었습니다.
1주차 Docker의 기초를 시작으로 Kubernetes를 제대로 배우게 되어 흥미롭습니다.

지금까지 Docker는 Docker-compose를 이용하여 임의적으로만 사용하거나 kubernetes도 wordpress 사이트를 올려본 것이 전부라 아직 미숙했는데 이번 기회에 깊이있게 공부하고 다양한 테스트를 시작할 수 있게 되었습니다.

오늘 스터디 이전에 정리해두었던 내용 중 몇가지를 포스팅하려 합니다.
Docker의 장점과 네트워크 관련 내용입니다.


Advantages of Docker

한국어 자막 지원합니다.

위 영상은 컨테이너가 무엇인지 알려주는 영상입니다.
한국어 자막도 지원하고 설명이 잘 되어있어 1분 30초만 투자하면 컨테이너가 무엇인지 알 수 있습니다.

도커의 장점 TOP 5
  • 신속한 애플리케이션 배포 – 컨테이너에는 애플리케이션 의 최소 런타임 요구 사항이 포함되어 크기를 줄이고 신속하게 배포 할 수 있습니다.
  • 머신 간 이식성 – 애플리케이션 및 모든 종속 항목을 Linux 커널, 플랫폼 배포 또는 배포 모델의 호스트 버전과 독립적인 단일 컨테이너로 번들링 할 수 있습니다. 또한 이 컨테이너는 Docker를 실행하는 다른 머신으로 전송할 수 있으며 호환성 문제없이 실행할 수 있습니다.
  • 버전 제어 및 구성 요소 재사용 – 컨테이너의 연속 버전을 추적하고 차이점을 검사하거나 이전 버전으로 롤백 할 수 있습니다. 또 컨테이너는 이전 레이어의 구성 요소를 재사용하므로 매우 가볍습니다.
  • 공유 – 원격 저장소를 사용하여 다른 사람과 컨테이너를 공유 할 수 있습니다. 
  • 가벼운 설치 공간 및 최소한의 오버 헤드 – Docker 이미지는 일반적으로 매우 작기 때문에 신속한 제공이 가능하고 새로운 애플리케이션 컨테이너를 배포하는 시간이 단축됩니다.
  • 단순화 된 유지 관리 – Docker는 애플리케이션 종속성으로 인한 노력과 문제의 위험을 줄여줍니다.

Network

root@dkos-master:~# ip route show
default via 192.168.0.1 dev enp0s3 proto static
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.0.0/24 dev enp0s3 proto kernel scope link src 192.168.0.30

제가 docker를 처음 사용했을 때 생겼던 궁금증이었는데 이제는 많은 블로그에 포스팅된 내용이기도 합니다.
docker 설치 및 실행 후 ip route show 또는 ip a 명령어로 확인 시 docker 0의 bridge 네트워크 IP 대역이 default 설정으로 172.17.0.0/16 대역으로 설정되어 있을 것입니다.
이 ip대역 변경이 가능합니다.

/etc/docker 디렉토리 아래 daemon.json라는 .json 파일이 없는데 이걸 만들어주면 됩니다.

root@dkos-master:~# vi /etc/docker/daemon.json

예를 들어 아래와 같은 대역대로 설정해주고 저장합니다.

{
"bip": "10.3.0.1/16"
}
root@dkos-master:~# systemctl restart docker

root@dkos-master:~# ip route show
default via 192.168.0.1 dev enp0s3 proto static
10.3.0.0/16 dev docker0 proto kernel scope link src 10.3.0.1 linkdown
192.168.0.0/24 dev enp0s3 proto kernel scope link src 192.168.0.30

root@dkos-master:~# iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N DOCKER
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 10.3.0.0/16 ! -o docker0 -j MASQUERADE
-A DOCKER -i docker0 -j RETURN

docker를 재시작해주면 설정해줬던 10.3.0.0/16 대역으로 변경된 것을 알 수 있습니다.

3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:2a:78:b0:a3 brd ff:ff:ff:ff:ff:ff
    inet 10.3.0.1/16 brd 10.3.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:2aff:fe78:b0a3/64 scope link
       valid_lft forever preferred_lft forever

브리지 네트워크 구성 방법에 대해 자세하게 알고싶으신 경우 아래 링크를 참고하시기 바랍니다.

또한 Docker에서는 다양한 네트워크 작동 방식이 존재합니다.
bridge, host, overlay, macvlan, none 등이 있는데 기본 네트워크 드라이브는 bridge로 설정되어 있으며 각 네트워크 작동 방식에 대해 설명하기에는 내용이 너무 방대하여 간단한 요약만 작성하겠습니다. 더 자세히 알고싶으신 경우 링크를 남겨두었으니 확인해보시기 바랍니다.

  • bridge : 동일한 Docker 호스트에서 통신하기 위해 여러 컨테이너가 필요할 때 사용
  • host : 네트워크 스택이 Docker 호스트에서 격리되어서는 안되지만 컨테이너의 다른 측면을 격리하려는 경우 사용
  • overlay : 통신을 위해 서로 다른 Docker 호스트에서 실행되는 컨테이너가 필요하거나 여러 애플리케이션이 스웜(swarm) 서비스를 사용하여 함께 작동 할 때 사용
  • macvlan : VM 설정에서 마이그레이션하거나 컨테이너가 각각 고유 한 MAC 주소를 가진 네트워크의 물리적 호스트처럼 보이도록해야 할 때 사용
  • ipvlan : ipvlan은 macvlan과 유사하지만 엔드포인트의 MAC 주소가 동일하며 L2 및 L3 모드를 지원합니다.
  • none : 모든 네트워킹을 비활성화, 스웜(swarm) 서비스 사용 불가

아래 링크는 Macvlan과 IPvlan의 차이점을 알 수 있습니다.


TIP

Docker는 단일 컨테이너 관리에 적합하도록 만들어져 있습니다.
컨테이너가 세분화되어 다수의 컨테이너화 된 앱을 사용하게 되면 관리와 오케스트레이션이 어려워집니다. 그렇다면 여기서 오케스트레이션은 무엇입니까?
오케스트라(orchestra)라는 말은 많이 들어보셨으리라 생각합니다.

오케스트레이션은 컴퓨팅, 네트워킹, 리소스 배포, 관리, 배치, 정렬을 자동화합니다.
위 컨테이너를 지휘하고 있는 이미지와 함께 보면 어떤 느낌인지 이해가 가시나요?
다수의 컨테이너가 네트워킹, 보안, 텔레메트리와 같은 서비스를 쉽게 제공하려면 이 컨테이너들을 그룹화해야 할 필요가 있습니다. 그렇기 때문에 Kubernetes, Docker Swarm, Apache Mesos, Nomad 와 같은 툴을 사용합니다.
Kubernetes는 무엇입니까? 컨테이너 오케스트레이션 툴입니다.


Personal Comments

이번 주 일요일부터는 Kubernetes에 대한 내용이 시작됩니다.
아직 화요일인데 벌써 일요일이 기다려지네요.
DKOS 스터디 진행 및 운영 해주시는 모든 운영진 분들에게 감사의 인사 올립니다.

마지막으로 컨테이너는 chroot와 namespace, cgroups과 같은 커널 기반 기술이 사용되는데 이에 대해 잘 설명이 되어있는 사이트가 있어 아래 링크로 공유합니다.

긴 글 읽어주셔서 감사합니다.

Dev

[Dev] 도커를 이용한 jupyter notebook Install & pandas test

안녕하세요. ManVSCloud 김수현입니다.

최근에 슬슬 개발 언어를 배워볼 필요성을 느끼게 되었습니다.
제가 배워보기로 한 언어는 Python입니다.

Python이 배우기 쉬운 언어라 선택하기보다 제가 만들고 싶은 것도 있고 해보고 싶은 작업에 Python이 필요로 하기때문에 선택하게 되었습니다.


Python을 배워 데이터 분석과 Python용 AWS SDK인 boto3에 활용할 예정이며
언어를 배우기 앞서 웹 브라우저를 통해 코드 작성 후 실행을 해볼 수 있도록
“JUPYTER NOTEBOOK”을 설치할 것입니다.


ENV & BASE INSTALL

우선 고정적인 Python 버전과 변경된 Python 버전으로 인해 다른 시스템에 영향이 가는 것을 원하지 않아 독립된 가상 환경이 필요했습니다.

# OS : CentOS7
# Virtualization approach : Docker
# Python : 3.8.6
# Jupyter : 6.2.0

pyenv, virtualenv, anaconda, docker, kubernetes 등 다양한 선택지가 있었으나
저는 제가 조금 더 익숙한 docker를 이용하여 설치를 하였습니다.

아래 기본적인 설정과 docker 설치를 남겨놓았으나 이 포스팅은 Jupyter 설치가 메인이라 docker 설치 방법에 대한 설명을 따로 하지않도록 하겠습니다.

setenforce 0

sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

[root@localhost jupyter]# sestatus | grep config
Mode from config file: disabled

yum update -y && yum install -y yum-utils

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

yum install -y docker-ce

curl -L https://github.com/docker/compose/releases/download/1.25.0-rc2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

cd /usr/local/bin

chmod +x docker-compose

base=https://github.com/docker/machine/releases/download/v0.16.0 && curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine && sudo install /tmp/docker-machine /usr/local/bin/docker-machine

systemctl enable docker
systemctl start docker

Jupyter NoteBook Install

docker와 docker-compose 설치 및 실행을 끝마치고
vi docker-compose.yaml 를 하여 아래와 같은 .yaml 파일을 생성합니다.

version:                "3"
services:
  datascience-notebook:
      image:            jupyter/datascience-notebook
      volumes:
        - /docker/jupyter:/home/jovyan/work
      ports:
        - 8888:8888
      container_name:   jupyter-container

위 사이트에서 처럼 원하시는 옵션에 맞게 사용자 지정하여 파일을 생성하셔도 좋습니다.

이후 docker-compose up -d 명령어를 이용하여 실행할 수 있습니다.
-d 옵션을 줘야 백그라운드로 실행이 됩니다.

jupyter의 경우 실행 시 토큰 값을 알아야 접속이 가능합니다.
(옵션에서 토큰or패스워드 값을 제거할 수도 있습니다.)

백그라운드로 실행했을 때는 docker-compose logs 명령어를 이용하여 확인이 가능합니다.

정상적으로 접근이 되지않고 302 에러가 발생할 경우 방화벽 문제가 있을 수 있습니다.
방화벽을 확인해보시기 바랍니다.

[root@localhost jupyter]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f1ccb4d9ba04 jupyter/datascience-notebook “tini -g — start-no…” About an hour ago Up 56 minutes 0.0.0.0:8888->8888/tcp jupyter-container

docker ps 명령어로 실행된 docker 컨테이너를 확인 할 수 있으며
docker exec -it f1ccb4d9ba04 /bin/bash (docker exec -it CONTAINER ID /bin/bash) 를 이용할 경우
컨테이너 내부로 접속이 가능합니다.

  • docker-compose 재시작 시 자동 실행 등록

vi /etc/systemd/system/docker-compose.service

[Unit]
Description=Docker Compose Application Service
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/develop/docker
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target

systemctl daemon-reload
systemctl enable docker-compose


pandas 라이브러리 테스트

마지막으로 생성한 jupyter notebook을 이용하여 python의 pandas 라이브러리를 테스트 해보겠습니다.

[New]에서 Python3을 선택합니다.
import pandas as pd

df = pd.DataFrame(
[[30, 173, 61],
[27, 181, 79],
[26, 158, 45]],
index=[1, 2, 3],
columns=['Age', 'Height', 'Weight'])

df

코드는 간단하게 테스트용으로 사용하였습니다.

pandas 라이브러리 테스트까지 정상적으로 마무리되었습니다.
지금부터라도 Python 공부를 해봐야겠습니다.


참고 사이트

긴 글 읽어주셔서 감사합니다.