<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>hong_tae.log</title>
        <link>https://velog.io/</link>
        <description>나의 에고를 인정하고 사랑하자 </description>
        <lastBuildDate>Mon, 07 Jun 2021 08:50:32 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>hong_tae.log</title>
            <url>https://images.velog.io/images/hong_tae/profile/e254ea07-ee43-414d-b8f3-d3f8c5a53632/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. hong_tae.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hong_tae" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[kubectl pod ]]></title>
            <link>https://velog.io/@hong_tae/kubectl-pod</link>
            <guid>https://velog.io/@hong_tae/kubectl-pod</guid>
            <pubDate>Mon, 07 Jun 2021 08:50:32 GMT</pubDate>
            <description><![CDATA[<h1 id="pod-생성">pod 생성</h1>
<h2 id="echo-라는-이름의-팟-생성">echo 라는 이름의 팟 생성</h2>
<p>컨테이너 실행</p>
<p>docker run
kubectl run </p>
<p>(base) hongtae@user:~$ <strong>kubectl run echo --image ghcr.io/subicura/echo:v1</strong>
Unable to connect to the server: dial tcp 192.168.49.2:8443: connect: no route to host</p>
<p><img src="https://images.velog.io/images/hong_tae/post/5f7bbf2c-0cf4-4ac0-9573-7aaabe4c5116/image.png" alt=""></p>
<p>minikube start</p>
<p><strong>kubectl run echo --image ghcr.io/subicura/echo:v1</strong>
pod/echo created  &lt; echo 라는 이름의 팟이 생성되었다</p>
<p>(base) hongtae@user:~$ <strong>kubectl get pod</strong>
NAME   READY   STATUS    RESTARTS   AGE
echo   1/1     Running   0          2m28s</p>
<p>name : echo</p>
<p>READY    : 컨테이너 준비상태 0/1  컨테이너 준비완료 1/1</p>
<p>STATUS   : </p>
<p>RESTARTS :</p>
<p>AGE      :  2분 전에 만들어짐 </p>
<h2 id="팟-정보-상세-정보">팟 정보 상세 정보</h2>
<p><strong>kubectl describe po/echo</strong></p>
<h2 id="pot-삭제">pot 삭제</h2>
<p>(base) hongtae@user:~$ kubectl delete po/echo
pod &quot;echo&quot; deleted</p>
<p>YAML로 설정파일Spec 작성하기</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[쿠버네티스 시작하기]]></title>
            <link>https://velog.io/@hong_tae/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@hong_tae/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 28 May 2021 12:18:18 GMT</pubDate>
            <description><![CDATA[<p>미니쿠베와 미니컨트롤이 설치되어 있어야 한다 </p>
<p>start 후 반드시 사용안할 때는 stop 을 시켜줘야 한다 어딘가에서 cpu를 잡아먹고 있을것이다. </p>
<pre><code>(base) hongtae@user:~$ **minikube status**
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

(base) hongtae@user:~$ **minicube stop**

Command &#39;minicube&#39; not found, did you mean:

command &#39;minitube&#39; from deb minitube (3.1-1build1)

Try: sudo apt install &lt;deb name&gt;

(base) hongtae@user:~$ minikube stop
✋  Stopping node &quot;minikube&quot;  ...
🛑  Powering off &quot;minikube&quot; via SSH ...
🛑  1개의 노드가 중지되었습니다.
(base) hongtae@user:~$ minikube status
minikube
type: Control Plane
host: Stopped
kubelet: Stopped
apiserver: Stopped
kubeconfig: Stopped

(base) hongtae@user:~$ **minikube start**
😄  Ubuntu 20.04 위의 minikube v1.20.0
🆕  이제 1.20.2 버전의 쿠버네티스를 사용할 수 있습니다. 업그레이드를 원하신다면 다음과 같이 지정하세요: --kubernetes-version=v1.20.2
✨  기존 프로필에 기반하여 docker 드라이버를 사용하는 중
👍  minikube 클러스터의 minikube 컨트롤 플레인 노드를 시작하는 중
🚜  Pulling base image ...
🔄  Restarting existing docker container for &quot;minikube&quot; ...
🐳  쿠버네티스 v1.20.0 을 Docker 20.10.6 런타임으로 설치하는 중
🔎  Verifying Kubernetes components...
▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟  Enabled addons: storage-provisioner, default-storageclass
🏄  Done! kubectl is now configured to use &quot;minikube&quot; cluster and &quot;default&quot; namespace by default</code></pre><pre><code>(base) hongtae@user:~$ **minikube ip**
192.168.49.2</code></pre><p><img src="https://images.velog.io/images/hong_tae/post/07a05821-2b40-4a74-b580-61ea3fd5ef85/image.png" alt=""></p>
<p>워드 프레스를 띄어보자</p>
<pre><code>version: &quot;3&quot;

services:
  wordpress:
    image: wordpress:5.5.3-apache
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_PASSWORD: password
    ports:
      - &quot;30000:80&quot;

  mysql:
    image: mysql:5.6
    environment:
      MYSQL_ROOT_PASSWORD: password</code></pre><p>(base) hongtae@user:<del>$ mkdir guide
(base) hongtae@user:</del>$ cd guide/
(base) hongtae@user:<del>/guide$ mkdir index
(base) hongtae@user:</del>/guide$ cd index/
(base) hongtae@user:~/guide/index$ vi docker-compose.yml</p>
<p>(base) hongtae@user:~/guide/index$ docker-compose up </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[쿠버네티스 개발환경에서 설치 및 테스트 정리는 나중에.. ]]></title>
            <link>https://velog.io/@hong_tae/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%A0%95%EB%A6%AC%EB%8A%94-%EB%82%98%EC%A4%91%EC%97%90</link>
            <guid>https://velog.io/@hong_tae/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%A0%95%EB%A6%AC%EB%8A%94-%EB%82%98%EC%A4%91%EC%97%90</guid>
            <pubDate>Fri, 28 May 2021 12:11:50 GMT</pubDate>
            <description><![CDATA[<p>개발환경은 마스터와 노드가 둘 다 들어갈 수 있고 
운영환경에서는 최소한 4개의 서버가 필요하다.</p>
<h2 id="운영환경-서버가-6대-정도-필요하다-서버3대-노드3대">운영환경 서버가 6대 정도 필요하다 (서버3대 노드3대)</h2>
<p><img src="https://images.velog.io/images/hong_tae/post/ea69d972-02d4-45a8-8ae1-aa2beffc116d/image.png" alt=""></p>
<h2 id="개발-환경">개발 환경</h2>
<h2 id="aws-환경에서">aws 환경에서</h2>
<p>피시 성능을 고려하여 좋지 못하다면 aws 를 이용하는것도 좋은 방법이다.
<img src="https://images.velog.io/images/hong_tae/post/5b909c4a-4dc8-4317-a930-106ebd20ccfe/image.png" alt=""></p>
<p>lightsail 서비스 클릭
<img src="https://images.velog.io/images/hong_tae/post/8aabad2e-097f-4bd1-b562-f32ca4112706/image.png" alt=""></p>
<p>os &gt; ubuntu 20.04 
<img src="https://images.velog.io/images/hong_tae/post/8f61fc0b-2608-4555-a81a-28a09a3942b6/image.png" alt=""></p>
<p>wetty라고 웹브라우저에서 터미널을 이용할 수 있는 것을 스크립트에 추가한다</p>
<p>사양은 20 달라! 
create instance 
<img src="https://images.velog.io/images/hong_tae/post/f591815b-173c-4032-83a5-36e94ad44bc5/image.png" alt=""></p>
<pre><code>sed -i &#39;s/PasswordAuthentication no/PasswordAuthentication yes/&#39; /etc/ssh/sshd_config
echo &quot;ubuntu:1q2w3e4r!!&quot; | chpasswd
service sshd reload
curl -sL https://deb.nodesource.com/setup_14.x | bash -
apt-get -y update
DEBIAN_FRONTEND=noninteractive apt-get -y install nodejs build-essential
npm install -g wetty --unsafe
ln -s /usr/bin/wetty /usr/local/bin/wetty
curl https://gist.githubusercontent.com/subicura/9058671c16e2abd36533fea2798886b0/raw/e5d249612711b14c9c8f44798dea1368395e86a9/wetty.service -o /lib/systemd/system/wetty.service
systemctl start wetty
systemctl enable wetty</code></pre><p>ubuntu가 펜딩상태에서 Running 상태로 변한다 
<img src="https://images.velog.io/images/hong_tae/post/63ef1521-18cd-4ac1-a261-d5bbdda69b86/image.png" alt=""></p>
<p>클릭 후 네트워크에서 Firewall 부분에 20port,80port를 지우고 
3000 ~65000까지 모두 오픈해준다 3천번에서 모든 포트로 접속 할 수 있다는 의미 </p>
<p><img src="https://images.velog.io/images/hong_tae/post/02020510-ac12-48e5-a12a-e68e3eff0848/image.png" alt=""></p>
<p>웹 브라우저에:4200을 하면 설치를 한다 
<img src="https://images.velog.io/images/hong_tae/post/1503ecfb-8000-4dc5-ba12-fd4147729033/image.png" alt=""></p>
<p>Public IP 주소와 4200 port로 접속 (아이디/패스워드 - ubuntu/1q2w3e4r!!)</p>
<p><img src="https://images.velog.io/images/hong_tae/post/4f4821a6-273d-43de-9507-6071166dc641/image.png" alt=""></p>
<p>쿠버네티스 배포를 설치 </p>
<pre><code>curl -sfL https://get.k3s.io | sh -

sudo chown ubuntu:ubuntu /etc/rancher/k3s/k3s.yaml

# 확인
kubectl get nodes

# 설정 복사
cp /etc/rancher/k3s/k3s.yaml ~/.kube/config</code></pre><h1 id="쿠버네티스트-클러스터-설치">쿠버네티스트 클러스터 설치</h1>
<p>우분투 환경이라면 도커 환경에서 다운 받을 수 있다.
이미 설치 되어있어도 모르면 기다려라.. ㅠ 애먹는다.. 그렇지 않으면start --driver가 되지 않는다.. </p>
<ol>
<li>curl -fsSL <a href="https://get.docker.com/">https://get.docker.com/</a> | sudo sh</li>
</ol>
<p><img src="https://images.velog.io/images/hong_tae/post/6748368c-5e8c-4f02-98ec-4f6ac28d2cd8/image.png" alt=""></p>
<ol start="2">
<li>sudo usermod -aG docker $USER :ubuntu를 도커그룹에 포함
docker ps : 퍼미션이 아직 없다 나옴 
su - ubuntu ( 유저계정 passwd 부터 해야한다 아래 참조)
password :</li>
</ol>
<pre><code>(passwd: user &#39;ubuntu&#39; does not exist
root@user:~# pwd
/root
root@user:~# cd /home/hongtae/
root@user:/home/hongtae# 
root@user:/home/hongtae# 
root@user:/home/hongtae# passwd hongtae
New password: 
Retype new password: 
passwd: password updated successfully
root@user:/home/hongtae# su hongtae
</code></pre><ol start="3">
<li><p>미니쿠베를 설치 : curl -Lo minikube <a href="https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64">https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64</a> <br>&amp;&amp; chmod +x minikube</p>
</li>
<li><p>어디에서 사용가능하게 user/bin으로 넣는다 
sudo mkdir -p /usr/local/bin/ </p>
</li>
<li><p>다운 받은 파일을 bin 안에 넣는다 
sudo install minikube /usr/local/bin/</p>
</li>
<li><p>이제 실행 minikube version</p>
</li>
<li><p>1 확인 
minikube version: v1.20.0
commit: c61663e942ec43b20e8e70839dcca52e44cd85ae
or 도커를 사용할 수 없다면 가상머신으로 해야한다 </p>
<pre><code></code></pre></li>
</ol>
<h1 id="docker-사용시-설치-필요-docker를-사용하지-않는-경우-virtual-box-설치">docker 사용시 설치 필요, docker를 사용하지 않는 경우 virtual box 설치</h1>
<p>curl -fsSL <a href="https://get.docker.com/">https://get.docker.com/</a> | sudo sh
sudo usermod -aG docker $USER </p>
<h1 id="docker-대신-virtual-box-설치">docker 대신 virtual box 설치</h1>
<p>sudo apt-get install virtualbox</p>
<h1 id="install-minikube">install minikube</h1>
<p>curl -Lo minikube <a href="https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64">https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64</a> <br>  &amp;&amp; chmod +x minikube
sudo mkdir -p /usr/local/bin/
sudo install minikube /usr/local/bin/
minikube version</p>
<pre><code>
기본 명령어
</code></pre><h1 id="버전확인">버전확인</h1>
<p>minikube version</p>
<h1 id="가상머신-시작">가상머신 시작</h1>
<p>minikube start --driver=docker</p>
<h1 id="driver-에러가-발생한다면-virtual-box를-사용">driver 에러가 발생한다면 virtual box를 사용</h1>
<p>minikube start --driver=virtualbox</p>
<h1 id="특정-k8s-버전-실행">특정 k8s 버전 실행</h1>
<p>minikube start --kubernetes-version=v1.20.0</p>
<h1 id="상태확인">상태확인</h1>
<p>minikube status</p>
<h1 id="정지">정지</h1>
<p>minikube stop</p>
<h1 id="삭제">삭제</h1>
<p>minikube delete</p>
<h1 id="ssh-접속">ssh 접속</h1>
<p>minikube ssh</p>
<h1 id="ip-확인">ip 확인</h1>
<p>minikube ip</p>
<pre><code>
# minikube start --driver=docker
(base) hongtae@user:~$ **minikube start** --driver=docker
😄  Ubuntu 20.04 위의 minikube v1.20.0
✨  유저 환경 설정 정보에 기반하여 docker 드라이버를 사용하는 중
👍  minikube 클러스터의 minikube 컨트롤 플레인 노드를 시작하는 중
🚜  Pulling base image ...
💾  Downloading Kubernetes v1.20.2 preload ...
    &gt; preloaded-images-k8s-v10-v1...: 491.71 MiB / 491.71 MiB  100.00% 25.15 Mi
    &gt; gcr.io/k8s-minikube/kicbase...: 358.10 MiB / 358.10 MiB  100.00% 9.14 MiB
    &gt; gcr.io/k8s-minikube/kicbase...: 358.10 MiB / 358.10 MiB  100.00% 9.05 MiB
🔥  Creating docker container (CPUs=2, Memory=3900MB) ...
🐳  쿠버네티스 v1.20.2 을 Docker 20.10.6 런타임으로 설치하는 중
    ▪ Generating certificates and keys ...
    ▪ Booting up control plane ...
    ▪ Configuring RBAC rules ...
🔎  Verifying Kubernetes components...
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟  Enabled addons: storage-provisioner, default-storageclass
💡  kubectl not found. If you need it, try: &#39;minikube kubectl -- get pods -A&#39;
🏄  Done! kubectl is now configured to use &quot;minikube&quot; cluster and &quot;default&quot; namespace by default

(base) hongtae@user:~$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured


쿠버네티스 버전을 다른걸 하여 다시설치해보자


(base) hongtae@user:~$ minikube stop
✋  Stopping node &quot;minikube&quot;  ...
🛑  Powering off &quot;minikube&quot; via SSH ...

🛑  1개의 노드가 중지되었습니다.
(base) hongtae@user:~$ 
(base) hongtae@user:~$ minikube delete
🔥  docker 의 &quot;minikube&quot; 를 삭제하는 중 ...
🔥  Deleting container &quot;minikube&quot; ...
🔥  /home/hongtae/.minikube/machines/minikube 제거 중...
💀  &quot;minikube&quot; 클러스터 관련 정보가 모두 삭제되었습니다
(base) hongtae@user:~$ minikube start --kubernetes-version=v1.20.2
😄  Ubuntu 20.04 위의 minikube v1.20.0
✨  자동적으로 docker 드라이버가 선택되었습니다. 다른 드라이버 목록: none, ssh
👍  minikube 클러스터의 minikube 컨트롤 플레인 노드를 시작하는 중
🚜  Pulling base image ...
🔥  Creating docker container (CPUs=2, Memory=3900MB) ...
🐳  쿠버네티스 v1.20.2 을 Docker 20.10.6 런타임으로 설치하는 중
    ▪ Generating certificates and keys ...
    ▪ Booting up control plane ...
    ▪ Configuring RBAC rules ...
🔎  Verifying Kubernetes components...
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟  Enabled addons: storage-provisioner, default-storageclass
💡  kubectl not found. If you need it, try: &#39;minikube kubectl -- get pods -A&#39;
🏄  Done! kubectl is now configured to use &quot;minikube&quot; cluster and &quot;default&quot; namespace by default

(base) hongtae@user:~$ minikube start --kubernetes-version=v1.20.0
😄  Ubuntu 20.04 위의 minikube v1.20.0

🙈  Exiting due to K8S_DOWNGRADE_UNSUPPORTED: Unable to safely downgrade existing Kubernetes v1.20.2 cluster to v1.20.0
💡  권장: 

    1) Recreate the cluster with Kubernetes 1.20.0, by running:

    minikube delete
    minikube start --kubernetes-version=v1.20.0

    2) Create a second cluster with Kubernetes 1.20.0, by running:

    minikube start -p minikube2 --kubernetes-version=v1.20.0

    3) Use the existing cluster at version Kubernetes 1.20.2, by running:

    minikube start --kubernetes-version=v1.20.2


(base) hongtae@user:~$ minikube delete
🔥  docker 의 &quot;minikube&quot; 를 삭제하는 중 ...
🔥  Deleting container &quot;minikube&quot; ...
🔥  /home/hongtae/.minikube/machines/minikube 제거 중...
💀  &quot;minikube&quot; 클러스터 관련 정보가 모두 삭제되었습니다
(base) hongtae@user:~$ minikube start --kubernetes-version=v1.20.0
😄  Ubuntu 20.04 위의 minikube v1.20.0
✨  자동적으로 docker 드라이버가 선택되었습니다. 다른 드라이버 목록: ssh, none
👍  minikube 클러스터의 minikube 컨트롤 플레인 노드를 시작하는 중
🚜  Pulling base image ...
💾  Downloading Kubernetes v1.20.0 preload ...
    &gt; preloaded-images-k8s-v10-v1...: 491.68 MiB / 491.68 MiB  100.00% 28.45 Mi
🔥  Creating docker container (CPUs=2, Memory=3900MB) ...
🐳  쿠버네티스 v1.20.0 을 Docker 20.10.6 런타임으로 설치하는 중
    ▪ Generating certificates and keys ...
    ▪ Booting up control plane ...
    ▪ Configuring RBAC rules ...
🔎  Verifying Kubernetes components...
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟  Enabled addons: storage-provisioner, default-storageclass
💡  kubectl not found. If you need it, try: &#39;minikube kubectl -- get pods -A&#39;
🏄  Done! kubectl is now configured to use &quot;minikube&quot; cluster and &quot;default&quot; namespace by default


(base) hongtae@user:~$ minikube ssh
docker@minikube:~$ docker ps 
CONTAINER ID   IMAGE                  COMMAND                  CREATED              STATUS              PORTS     NAMES
43bce5bacaf1   6e38f40d628d           &quot;/storage-provisioner&quot;   7 seconds ago        Up 6 seconds                  k8s_storage-provisioner_storage-provisioner_kube-system_89667175-f87f-4b87-8f4d-e283e605e902_1
7a535884f1ed   bfe3a36ebd25           &quot;/coredns -conf /etc…&quot;   35 seconds ago       Up 34 seconds                 k8s_coredns_coredns-74ff55c5b-chrdh_kube-system_54b6af28-de0f-466e-8537-01ccce0b8bed_0
864c02d3b303   k8s.gcr.io/pause:3.2   &quot;/pause&quot;                 35 seconds ago       Up 34 seconds                 k8s_POD_coredns-74ff55c5b-chrdh_kube-system_54b6af28-de0f-466e-8537-01ccce0b8bed_0
585e52d68f1c   10cc881966cf           &quot;/usr/local/bin/kube…&quot;   38 seconds ago       Up 37 seconds                 k8s_kube-proxy_kube-proxy-zlctt_kube-system_37940faf-d1c6-4318-a389-65a5bc1ddde7_0
dc82a44c84ff   k8s.gcr.io/pause:3.2   &quot;/pause&quot;                 38 seconds ago       Up 37 seconds                 k8s_POD_storage-provisioner_kube-system_89667175-f87f-4b87-8f4d-e283e605e902_0
c9754f66d923   k8s.gcr.io/pause:3.2   &quot;/pause&quot;                 38 seconds ago       Up 37 seconds                 k8s_POD_kube-proxy-zlctt_kube-system_37940faf-d1c6-4318-a389-65a5bc1ddde7_0
b13438ecc682   3138b6e3d471           &quot;kube-scheduler --au…&quot;   About a minute ago   Up About a minute             k8s_kube-scheduler_kube-scheduler-minikube_kube-system_3478da2c440ba32fb6c087b3f3b99813_0
073cfc861916   ca9843d3b545           &quot;kube-apiserver --ad…&quot;   About a minute ago   Up About a minute             k8s_kube-apiserver_kube-apiserver-minikube_kube-system_524cecac593a7ad14f29307cb61f56b8_0
cb1ffca44ce2   b9fa1895dcaa           &quot;kube-controller-man…&quot;   About a minute ago   Up About a minute             k8s_kube-controller-manager_kube-controller-manager-minikube_kube-system_a3e7be694ef7cf952503c5d331abc0ac_0
1faa1ef70918   0369cf4303ff           &quot;etcd --advertise-cl…&quot;   About a minute ago   Up About a minute             k8s_etcd_etcd-minikube_kube-system_c31fe6a5afdd142cf3450ac972274b36_0
d049fcea31b1   k8s.gcr.io/pause:3.2   &quot;/pause&quot;                 About a minute ago   Up About a minute             k8s_POD_kube-controller-manager-minikube_kube-system_a3e7be694ef7cf952503c5d331abc0ac_0
49e31924c3c2   k8s.gcr.io/pause:3.2   &quot;/pause&quot;                 About a minute ago   Up About a minute             k8s_POD_kube-apiserver-minikube_kube-system_524cecac593a7ad14f29307cb61f56b8_0
63d318c71b91   k8s.gcr.io/pause:3.2   &quot;/pause&quot;                 About a minute ago   Up About a minute             k8s_POD_kube-scheduler-minikube_kube-system_3478da2c440ba32fb6c087b3f3b99813_0
014b522ba1cc   k8s.gcr.io/pause:3.2   &quot;/pause&quot;                 About a minute ago   Up About a minute             k8s_POD_etcd-minikube_kube-system_c31fe6a5afdd142cf3450ac972274b36_0


docker@minikube:~$ minikube ip
-bash: minikube: command not found
docker@minikube:~$ ^C
docker@minikube:~$ logout
ssh: Process exited with status 130
(base) hongtae@user:~$ minikube ip
192.168.49.2


**도커말고 버츄얼 박스로 설치하자**

sudo apt-get install virtualbox

기존에 만든 미니쿠베를 삭제하자 

(base) hongtae@user:~$ minikube delete

(base) minikube start --driver=virtualbox --kubernetes-version=v1.20.0



😄  Ubuntu 20.04 위의 minikube v1.20.0
✨  유저 환경 설정 정보에 기반하여 virtualbox 드라이버를 사용하는 중
👍  minikube 클러스터의 minikube 컨트롤 플레인 노드를 시작하는 중
🔥  virtualbox VM (CPUs=2, Memory=3900MB, Disk=20000MB) 를 생성하는 중 ...
🤦  StartHost failed, but will try again: creating host: create: precreate: We support Virtualbox starting with version 5. Your VirtualBox install is &quot;WARNING: The character device /dev/vboxdrv does not exist.\n\t Please install the virtualbox-dkms package and the appropriate\n\t headers, most likely linux-headers-oem.\n\n\t You will not be able to start VMs until this problem is fixed.\n6.1.16_Ubuntur140961&quot;. Please upgrade at https://www.virtualbox.org
🔥  virtualbox VM (CPUs=2, Memory=3900MB, Disk=20000MB) 를 생성하는 중 ...
😿  Failed to start virtualbox VM. Running &quot;minikube delete&quot; may fix it: creating host: create: precreate: We support Virtualbox starting with version 5. Your VirtualBox install is &quot;WARNING: The character device /dev/vboxdrv does not exist.\n\t Please install the virtualbox-dkms package and the appropriate\n\t headers, most likely linux-headers-oem.\n\n\t You will not be able to start VMs until this problem is fixed.\n6.1.16_Ubuntur140961&quot;. Please upgrade at https://www.virtualbox.org

❌  Exiting due to PR_VBOX_DEVICE_MISSING: Failed to start host: creating host: create: precreate: We support Virtualbox starting with version 5. Your VirtualBox install is &quot;WARNING: The character device /dev/vboxdrv does not exist.\n\t Please install the virtualbox-dkms package and the appropriate\n\t headers, most likely linux-headers-oem.\n\n\t You will not be able to start VMs until this problem is fixed.\n6.1.16_Ubuntur140961&quot;. Please upgrade at https://www.virtualbox.org
💡  권장: Reinstall VirtualBox and reboot. Alternatively, try the kvm2 driver: https://minikube.sigs.k8s.io/docs/reference/drivers/kvm2/
🍿  관련 이슈: https://github.com/kubernetes/minikube/issues/

에러가 났다.. 원인을 찾아보니 
VT -x 나 버츄얼 이 설치가 안되어 있으면 이런 에러가 난다 걍 도커로 하자 

# 쿠버네티스트 클러스터를 실제 배포하기 위해서는 실제 kubectl(큐브컨트롤)을 주로 이용한다 

## kubectl 설치

1. curl -LO &quot;https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl&quot;


2. chmod +x ./kubectl

3. sudo mv ./kubectl /usr/local/bin/kubectl


### 4. 테스트 kubectl version

미니쿠베를 띄어놨으므로 보이는것이라 했다..
대체 이게 뭔 소리들인지.. 서버 버전이 보이지 않는다면 미니쿠베를 실행 후 다시 해봐라 

**Client Version: version.Info{Major:&quot;1&quot;, Minor:&quot;21&quot;, GitVersion:&quot;v1.21.1**&quot;, GitCommit:&quot;5e58841cce77d4bc13713ad2b91fa0d961e69192&quot;, GitTreeState:&quot;clean&quot;, BuildDate:&quot;2021-05-12T14:18:45Z&quot;, GoVersion:&quot;go1.16.4&quot;, Compiler:&quot;gc&quot;, Platform:&quot;linux/amd64&quot;}
**Server Version: version.Info{Major:&quot;1&quot;, Minor:&quot;20&quot;, GitVersion:&quot;v1.20.0&quot;**, GitCommit:&quot;af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38&quot;, GitTreeState:&quot;clean&quot;, BuildDate:&quot;2020-12-08T17:51:19Z&quot;, GoVersion:&quot;go1.15.5&quot;, Compiler:&quot;gc&quot;, Platform:&quot;linux/amd64&quot;}

# 쿠버네티스 설치 

</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[도커로 만든 테스트 파일 travis-ci 로 테스트 시키기 .travis.yml ,Dockerfile.dev .
]]></title>
            <link>https://velog.io/@hong_tae/%EB%8F%84%EC%BB%A4%EB%A1%9C-%EB%A7%8C%EB%93%A0-%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%8C%8C%EC%9D%BC-travis-ci-%EB%A1%9C-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%8B%9C%ED%82%A4%EA%B8%B0-.travis.yml-Dockerfile.dev-</link>
            <guid>https://velog.io/@hong_tae/%EB%8F%84%EC%BB%A4%EB%A1%9C-%EB%A7%8C%EB%93%A0-%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%8C%8C%EC%9D%BC-travis-ci-%EB%A1%9C-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%8B%9C%ED%82%A4%EA%B8%B0-.travis.yml-Dockerfile.dev-</guid>
            <pubDate>Fri, 28 May 2021 02:43:35 GMT</pubDate>
            <description><![CDATA[<p>도커환경에서 만든 이미지를 travis.yml파일로 테스트 하고배포하기</p>
<p>sudo: required</p>
<p>language: generic</p>
<p>services:
    - docker</p>
<p>before_install:
    -echo &quot;I will start.&quot;
    -docker build -t gusxoqkqh1/docker-react -f Dockerfile.dev .</p>
<p>script:
    - docker run -e CI=true gusxoqkqh1/docker-react npm run test -- --coverage</p>
<p>after_success:
    -echo &quot;Test Success&quot;</p>
<p><img src="https://images.velog.io/images/hong_tae/post/448c7756-db3d-4dab-82b1-a4ae564dba11/image.png" alt=""></p>
<ul>
<li>실습</li>
</ul>
<ol>
<li>docker-react 디렉토리에 
.travis.yml 파일생성
<img src="https://images.velog.io/images/hong_tae/post/703adcd7-18ef-4021-9e9b-08cd02c46af4/image.png" alt=""></li>
</ol>
<p>.travis.yml</p>
<pre><code>sudo: required

language: generic

services:
  - docker

before_install:
  - echo &quot;start creating an image with dockerfile&quot;
  - docker build -t gusxoqkqh1/docker-react -f Dockerfile.dev .

script:
  - docker run -e CI=true gusxoqkqh1/docker-react npm run test -- --coverage

after_success:
  - echo &quot;Test success&quot;
</code></pre><p>(base) hongtae@user:<del>/바탕화면/docker-react$ <strong>git add .</strong>
(base) hongtae@user:</del>/바탕화면/docker-react$ <strong>git commit -m &quot;travis.yml file added&quot;</strong>
[master 88dd728] travis.yml file added
 1 file changed, 17 insertions(+)
 create mode 100644 .travis.yml
(base) hongtae@user:~/바탕화면/docker-react$ <strong>git push origin master</strong>
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 469 bytes | 469.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To <a href="https://github.com/gusxoqkqh1/docker1.git">https://github.com/gusxoqkqh1/docker1.git</a>
cb35ca4..88dd728  master -&gt; master</p>
<p>travis ci 에서 귀신같이 받아와서 자동으로 뭔가를 진행하고 있따 </p>
<p><img src="https://images.velog.io/images/hong_tae/post/b1bf3475-1c24-46e3-9e4a-12e3745e63ea/image.png" alt=""></p>
<h2 id="검사-중-노랭이">검사 중 노랭이</h2>
<p><img src="https://images.velog.io/images/hong_tae/post/56abcf5b-507b-4137-809e-7c31488f6b25/image.png" alt=""></p>
<h2 id="에러-검출-빨갱이">에러 검출 빨갱이</h2>
<p><img src="https://images.velog.io/images/hong_tae/post/52318b20-eece-44c0-8912-9de9d4ddc278/image.png" alt=""></p>
<p>친절하게도 찍어준다 
<img src="https://images.velog.io/images/hong_tae/post/99259114-fa2b-45e8-8e1b-7aafc8120eff/image.png" alt=""></p>
<p>다시 수정 후 git add , commit, push 을 하면 </p>
<p>travis에서 다시 .travis.yml 코드를 가져와 테스트를 진행한다</p>
<h2 id="성공-초록이">성공! 초록이</h2>
<p><img src="https://images.velog.io/images/hong_tae/post/d847a3f7-21ec-4ca0-ac9d-488acffa706d/image.png" alt=""></p>
<p>-- --coverage 덕분에 255 라인 밑부터 자세하게 검사를 해주는것이다.</p>
<p><img src="https://images.velog.io/images/hong_tae/post/98d05ed6-95f1-4958-8a27-249ad3620925/image.png" alt=""></p>
<p>테스트 성공했으니 AWS 배포할 차례! </p>
<p><img src="https://images.velog.io/images/hong_tae/post/c9d0522f-432f-44b5-9e97-c595ac54d7b3/image.png" alt=""></p>
<p>Elaxtic BeanStalk</p>
<p>엘라스틴 빈스탁 환경안에 EC2 나 디비나 많은것을 넣어두고 컨트롤 해준다 </p>
<p>장고를 ec2에 해두 되지만 우리는 빈스탁에 넣고 배포 할 예정 </p>
<p><img src="https://images.velog.io/images/hong_tae/post/eddbbba0-c647-45bd-9116-d68e6d0d0ffd/image.png" alt=""></p>
<p>create Application 
리눅스 2는 에러가 발생한덴다 </p>
<p>docker 
<img src="https://images.velog.io/images/hong_tae/post/4353aea3-12ce-4785-ac4c-5c4d1f44c08c/image.png" alt=""></p>
<p>어플리케이션 생성
<img src="https://images.velog.io/images/hong_tae/post/bd3965d0-7e12-4daf-81e2-42d642b2fc25/image.png" alt=""></p>
<p>완성</p>
<p><img src="https://images.velog.io/images/hong_tae/post/064d5f88-3c2e-454d-8a30-4213f837a876/image.png" alt=""></p>
<p>브라우저에서 요청을 보낼 때 로드밸런스로 가는데 
빈스탁 안에 들어가 
<img src="https://images.velog.io/images/hong_tae/post/7832d2f9-0de2-4ef9-9689-9fd90568a7fe/image.png" alt=""></p>
<p>트래픽이 많아 EC2 하나로 요청을 못 처리하는 상황이라면
<img src="https://images.velog.io/images/hong_tae/post/346ac33f-ed91-4767-a466-9844727f6f76/image.png" alt=""></p>
<p>배포부분이 추가된 travis 설정 코드</p>
<p>.travis.yml</p>
<pre><code>sudo: required

language: generic

services:
    - docker

before_install:
    -echo &quot;start Creating an image with dockerfile&quot;
    - docker build -t gusxoqkqh1/docker-react -f Dockerfile.dev .

script:
    - docker run -e CI=true gusxoqkqh1/docker-react npm run test -- --coverage

deploy:
    provider: elasticbeanstalk
    region: &quot;ap-northeast-2&quot;
    app: &quot;docker-react&quot;
    env: &quot;Dockerreact-env&quot;
    bucket_name: elasticbeanstalk-ap-northeast-2-160156176918
    bucket_path: &quot;docker-react&quot;
    on:
        branch: master </code></pre><p>s3 가 버킷이 자동으로 생성됨 ci로 검증이 끝난것을 압축하여 S3 버켓에 보내게 된다 
 <img src="https://images.velog.io/images/hong_tae/post/fda1fa99-7b7f-4862-9873-edf290c018ae/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[도커 운영환경을 위한 Nginx Dockerfile 작성하기.
]]></title>
            <link>https://velog.io/@hong_tae/%EB%8F%84%EC%BB%A4-%EC%9A%B4%EC%98%81%ED%99%98%EA%B2%BD%EC%9D%84-%EC%9C%84%ED%95%9C-Nginx-Dockerfile-%EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@hong_tae/%EB%8F%84%EC%BB%A4-%EC%9A%B4%EC%98%81%ED%99%98%EA%B2%BD%EC%9D%84-%EC%9C%84%ED%95%9C-Nginx-Dockerfile-%EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 28 May 2021 01:10:38 GMT</pubDate>
            <description><![CDATA[<p>운영 서버 컨테이너 
<img src="https://images.velog.io/images/hong_tae/post/194f8435-30ee-4564-a0d6-55191cf0e35a/image.png" alt=""></p>
<p>nginx는 개발서버에서 사용할 수 없는 이유?</p>
<p>개발서버와 nginx 운영서버의 차이점</p>
<ol>
<li><p>개발서버는 소스변경 후 리엑트 개발 서버에서 전체 앱을 다시 빌드 해서 변경해서 자동 반영 엔진엑스는 그런 부분이 없다 . 소스가 변경되도 바로 빌드및 반영 할 수 없다.</p>
</li>
<li><p>개발서버에는 쓸대없는 많은 기능들이 들어가있다
그에 반에 NGINX 는 가벼워 속도가 더 빠르다 </p>
</li>
</ol>
<p>이러한 장단점이 있다.</p>
<h1 id="도커-운영환경에서-nginx-dockerfile-작성하기">도커 운영환경에서 Nginx Dockerfile 작성하기.</h1>
<p><img src="https://images.velog.io/images/hong_tae/post/bb341bc4-8ec5-490a-b774-a6f4a208bcaa/image.png" alt=""></p>
<p>개발 서버는 리엑트에 public 폴더이고 빌드파일을 생성 할 필요가없다
운영 서버는 리엑트에 build 폴더이다.</p>
<p><img src="https://images.velog.io/images/hong_tae/post/113be386-da3d-442c-9f72-cbf8bc5b8a12/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/hong_tae/post/379835b8-d8ab-4ca4-bc10-3ff8fd14d770/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/hong_tae/post/ea4f5729-ac2b-4699-92d8-efc279e555a6/image.png" alt=""></p>
<p>빌드 파일을 생성</p>
<p>Dockerfile 생성 </p>
<pre><code>(Builder Stage)

두번째는 Nginx가 가동하고 첫번째 단계에서 생성된 빌드폴더의 파일들을 웹 브라우저의 요청에 따라 제공해준다
run Stage
# builder stage 1단계 
FROM node:alpine as builder
WORKDIR &#39;/usr/src/app&#39;
COPY packaage.json .
RUN npm install
COPY ./ ./

# 밑이 운영 서버 빌드 run stage 
FROM nginx
COPY --from=builder /usr/src/app/build /usr/share/nginx/htmp</code></pre><p>이미지 생성 후 80번으로 컨테이너 실행 
sudo docker build -t gusxoqkqh1/docker-react-app .
sudo docker run -p 8080:80  gusxoqkqh1/docker-react-app</p>
<p>크롬 localhost:8080</p>
<p><img src="https://images.velog.io/images/hong_tae/post/d56f87b2-e141-49fa-acc7-8ceae54fd058/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[도커를 이용하여 리엑트 어플리케이션 배포
run test ]]></title>
            <link>https://velog.io/@hong_tae/%EB%8F%84%EC%BB%A4%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EB%B0%B0%ED%8F%AC</link>
            <guid>https://velog.io/@hong_tae/%EB%8F%84%EC%BB%A4%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EB%B0%B0%ED%8F%AC</guid>
            <pubDate>Thu, 27 May 2021 09:56:38 GMT</pubDate>
            <description><![CDATA[<p>사용 라이브러리 : 리액트(프론트)</p>
<p>리액트를 설치하려면 노드js가 설치 되어 있어야 한다.</p>
<p>(base) hongtae@user:~/바탕화면/nodejs-docker-compose-app$ <strong>node -v</strong>
<strong>v10.19.0</strong></p>
<p>docker-react-app 이라는 디렉토리 생성 후 그 경로에서 </p>
<p>npx create-react-app react-app</p>
<p>or</p>
<p><strong>npx create-react-app ./</strong>  # 지금 경로에다 설치 하고싶다. </p>
<p>한 1분 소유된다.
<img src="https://images.velog.io/images/hong_tae/post/7abdad0e-3023-4925-a7c6-a525f61f0549/image.png" alt="">
npm run start</p>
<p><img src="https://images.velog.io/images/hong_tae/post/2b44249c-c558-40dc-a27f-e1fe24d08cd5/image.png" alt=""></p>
<p><a href="http://localhost:3000">http://localhost:3000</a></p>
<p><img src="https://images.velog.io/images/hong_tae/post/c92e59d8-2657-4fb2-9613-2a449163f352/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/hong_tae/post/7f3fd0e3-7496-4617-a724-de0260133910/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/hong_tae/post/d0ee2519-cf17-4d84-88f6-09be476068b5/image.png" alt=""></p>
<p>운영환경에 배포 </p>
<p>sudo npm run build </p>
<p>빌드 디렉토리가 생겼으며 많은것이 들어갔다? 그런 이유로 운영환경에서 build 드 안에 파일들을 이용해서 리엑트 앱을 사용할 수 있다.</p>
<p><img src="https://images.velog.io/images/hong_tae/post/35506964-97a1-4a08-a184-262e44a3a391/image.png" alt=""></p>
<h1 id="도커를-이용하여-개발-단계-리엑트-실행하기">도커를 이용하여 개발 단계 리엑트 실행하기.</h1>
<p><img src="https://images.velog.io/images/hong_tae/post/5ed6df81-b5d9-42d9-9838-5f7061f85aaa/image.png" alt=""></p>
<h2 id="dockerfile-생성하기">Dockerfile 생성하기</h2>
<p>간단한 코드 수정시, npm install 
<strong>WORKDIR</strong> : root 파일과 혼선을 피하기 위해 
<strong>COPY</strong> package.json : 소스만 바꿔도 npm install이 계속 종속성에 들어있는 부분만 npm install 을 하고 종속성이 불필요한 간단한 코드 수정은 npm install을 거치지 말기 위해 COPY를 2개 사용</p>
<p><strong>RUN</strong> npm install
<strong>COPY</strong> ./ ./ 
CMD &quot;npm&quot;,&quot;run&quot;,&quot;start&quot;</p>
<p><img src="https://images.velog.io/images/hong_tae/post/df587238-8bee-4787-a29a-414b998c57c4/image.png" alt=""></p>
<h2 id="dockerfiledev-생성">Dockerfile.dev 생성</h2>
<p>FROM node:alpine</p>
<p>WORKDIR /usr/src/app</p>
<p>COPY package.json ./</p>
<p>RUN npm install</p>
<p>COPY ./ ./ </p>
<p>CMD [&quot;npm&quot;,&quot;run&quot;,&quot;start&quot;]</p>
<p>sudo docker build ./
[sudo] password for hongtae: 
<strong>unable to prepare context: unable to evaluate symlinks in Dockerfile path</strong>: lstat /home/hongtae/바탕화면/docker-react/Dockerfile: no such file or directory</p>
<p>dockerfile이 없고 dockerfile.dev로 빌드하였기에 이런 도커파일을 찾지 못한다 나오는것이다. </p>
<h3 id="sudo-docker-build--f-dockerfiledev--t-gusxoqkqh1react-app-">sudo docker build -f Dockerfile.dev -t gusxoqkqh1/react-app ./</h3>
<p>강제로 도커파일.dev 를 봐라라고 정의해 주어야 한다. </p>
<p>sudo docker run -p 3000:3000 gusxoqkqh1/react-app</p>
<p><img src="https://images.velog.io/images/hong_tae/post/80a17b4c-e466-418b-9b57-4d9d1074feda/image.png" alt=""></p>
<p>서버 접속 후 바로 빠져 나온다면 </p>
<p>sudo docker run -it -p 3000:3000 gusxoqkqh1/react-app</p>
<p>-i : 상호 입출력
-t : tty를 활성화 하여 bash쉘 사용 </p>
<h1 id="볼륨을-이용한-소스코드-변경">볼륨을 이용한 소스코드 변경</h1>
<p>copy 대신 volume 을 사용할 것이다 </p>
<p>바로 소스가 변경하기 위해 Volume을 사용한다.</p>
<p>src -&gt; App.js</p>
<p>18번행에 안녕하세요 라고 바꾸고 리엑트를 실행해도 변경사항이 없다.
<img src="https://images.velog.io/images/hong_tae/post/0000dff0-129b-4861-bdf1-40471c175c3f/image.png" alt=""></p>
<p>sudo docker run -it -p 3000:3000 -v /usr/src/app/node_modules -v ${pwd}:/usr/src/app gusxoqkqh1/docker-react</p>
<p><strong>Unable to find image &#39;gusxoqkqh1/docker-react:latest&#39;</strong> locally
docker: Error response from daemon: manifest for gusxoqkqh1/docker-react:latest not found: manifest unknown: manifest unknown.</p>
<p>바로 도커 이미지의 이름을 확인해보자 역시 나의 오타였다. 콤퓨타는 아무 잘못없다.. 
<img src="https://images.velog.io/images/hong_tae/post/440901d1-f3a8-472f-a927-45f299c02ff1/image.png" alt=""></p>
<p>sudo docker run -it -p 3000:3000 -v /usr/src/app/node_modules -v ${pwd}:/usr/src/app gusxoqkqh1/react-app</p>
<p><img src="https://images.velog.io/images/hong_tae/post/4ff04fd1-2784-4bdd-bbb4-5902b40ab335/image.png" alt=""></p>
<p>근데 수정이 되지 않았다.?</p>
<p><img src="https://images.velog.io/images/hong_tae/post/9bb2937c-5c73-4ea0-94cf-a4a2a9ca0cad/image.png" alt=""></p>
<p>너무나도 고마우신 분이 이미 적어놓아 주셧다.</p>
<p><img src="https://images.velog.io/images/hong_tae/post/ee1e8cc2-115e-4949-a7f8-035716d3cf33/image.png" alt=""></p>
<p>Dockerfile.dev 에 ENV CHOKIDAR_USEPOLLING=true
를 넣어주면 핫로딩이 작동 한다고 한다</p>
<p><img src="https://images.velog.io/images/hong_tae/post/383cce0f-f943-4954-8308-3cac7c280e71/image.png" alt=""></p>
<h1 id="docker-compose">docker-compose</h1>
<p>sudo docker run -it -p 3000:3000 -v /usr/src/app/node_modules -v ${pwd}:/usr/src/app gusxoqkqh1/react-app</p>
<p>도커 볼륨을 사용하면 장점이 많지만 너무너무 길다 </p>
<p>줄여야한다! -&gt; compose를 작성하여 사용하자!
<img src="https://images.velog.io/images/hong_tae/post/c11853b4-96cf-44f5-9830-c324df11c471/image.png" alt=""></p>
<ol>
<li>Docker-compose.yml 파일 생성</li>
<li>docker-compose.yml 파일 작성하기. </li>
</ol>
<p><img src="https://images.velog.io/images/hong_tae/post/bfe5b6c4-bf10-4308-b67c-c0da5723a167/image.png" alt=""></p>
<pre><code>version: &quot;3&quot;  # 도커 컴포즈 버전

services:     # 이 곳에 실행하려는 컨테이너들을 정의

    react:    # 컨테이너 이름

        build:         

            context: .

            dockerfile: Dockerfile.dev

        ports: 

            - &quot;3000:3000&quot;

        volumes: 

            - /usr/src/app/node_modules

            - ./:/usr/src/app

        environment:

            # 소스 수정 즉시 반영되는

            # 핫로딩 활성화하는 부분

            - CHOKIDAR_USEPOLLING=true          

        stdin_open: true


</code></pre><p>Starting docker-react_react_1 ... done
Attaching to docker-react_react_1
react_1  | 
react_1  | &gt; <a href="mailto:docker-react@0.1.0">docker-react@0.1.0</a> start
react_1  | &gt; react-scripts start
react_1  | 
react_1  | ℹ ｢wds｣: Project is running at <a href="http://172.19.0.2/">http://172.19.0.2/</a>
react_1  | ℹ ｢wds｣: webpack output is served from 
react_1  | ℹ ｢wds｣: Content not from webpack is served from /usr/src/app/public
react_1  | ℹ ｢wds｣: 404s will fallback to /
react_1  | Starting the development server...
react_1  | 
react_1  | Failed to compile.
react_1  | 
react_1  | <strong>EACCES: permission denied, mkdir &#39;/usr/src/app/node_modules/.cache&#39;</strong></p>
<p>도커 환경에서 테스트 하기
도커 컨테이너 안에는 도커 모듈스 파일이 존재한다 그래서 test할 수 있는 모듈이 들어가있다 
sudo docker run -it gusxoqkqh1/react-app npm run test</p>
<pre><code>version: &quot;3&quot;  # 도커 컴포즈 버전

services:     # 이 곳에 실행하려는 컨테이너들을 정의

    react:    # 컨테이너 이름

        build:         

            context: .

            dockerfile: Dockerfile.dev
# 
        ports: 

            - &quot;3000:3000&quot;

        volumes: 

            - /usr/src/app/node_modules

            - ./:/usr/src/app

        environment:

            # 소스 수정 즉시 반영되는

            # 핫로딩 활성화하는 부분

            - CHOKIDAR_USEPOLLING=true          

        stdin_open: true

    tests:
        build:
            context: .
            dockerfile: Dockerfile.dev
        volumes:
            - /usr/src/app/node_modules
            - ./:/usr/src/app
        command: [&quot;npm&quot;,&quot;run&quot;,&quot;test&quot;]
</code></pre><p><img src="https://images.velog.io/images/hong_tae/post/b6fa534f-51b9-4447-85a2-8c8f45f40e02/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Docker Compose란 무엇인가?
]]></title>
            <link>https://velog.io/@hong_tae/Docker-Compose%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80</link>
            <guid>https://velog.io/@hong_tae/Docker-Compose%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80</guid>
            <pubDate>Thu, 27 May 2021 08:03:06 GMT</pubDate>
            <description><![CDATA[<p>server.js 에서 설정한 것들이 잘 실행 되려면 선행적으로 redis-server가 잘 실행되어야 한다. </p>
<h1 id="1-레디스-서버를-먼저-실행">1. 레디스 서버를 먼저 실행</h1>
<h1 id="2-도커파일-이미지를-생성하여-이-이-어플리케이션에-관련된-컨테이너-생성">2. 도커파일 이미지를 생성하여 이 이 어플리케이션에 관련된 컨테이너 생성</h1>
<p><img src="https://images.velog.io/images/hong_tae/post/eb5f7927-2bbd-4e75-82fe-af3e9b61289f/image.png" alt=""></p>
<p>nodejs-docker-compose-app 디렉토리 생성 후 </p>
<p>npm init 하여 엔터다발로 package.json을 만든다</p>
<h1 id="packagejson">package.json</h1>
<pre><code>{
  &quot;name&quot;: &quot;nodejs-docker-compose-app&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;main&quot;: &quot;index.js&quot;,
  &quot;scripts&quot;: {
    &quot;start&quot;:&quot;node server.js&quot;,
    &quot;test&quot;: &quot;echo \&quot;Error: no test specified\&quot; &amp;&amp; exit 1&quot;
  },
  &quot;dependencies&quot;:{
    &quot;express&quot;:&quot;4.17.1&quot;,
    &quot;redis&quot;:&quot;3.0.2&quot;
  },
  &quot;author&quot;: &quot;&quot;,
  &quot;license&quot;: &quot;ISC&quot;,
  &quot;description&quot;: &quot;&quot;
}
</code></pre><p><strong>server.js</strong></p>
<pre><code>const express = require(&quot;express&quot;);
const redis = require(&quot;redis&quot;);
//레디스 클라이언트 생성
const client = redis.createClient({

    host:&quot;redis-server&quot;,
    port: 6379
})

const app = express();

//숫자는 0부터 시작합니다.
client.set(&quot;number&quot;,0);
app.get(&#39;/&#39;, (req,res) =&gt; {
    client.get(&quot;number&quot;, (err,number) =&gt; {
        // 현재 숫자를 가져온 후에 1씩 올려줍니다.
        client.set(&quot;number&quot;,parseInt(number) + 1)
        res.send(&quot;숫자가 1씩 올라갑니다. 숫자:&quot; + number)
    })
})
app.listen(8080)
console.log(&#39;server is running&#39;);
</code></pre><h1 id="도커-파일-작성">도커 파일 작성</h1>
<pre><code>
FROM node:10

WORKDIR /usr/src/app

# ./ = package.json ./ =server.js
COPY ./ ./

# npm install = 종속성 다운 
RUN npm install

# 컨테이너가 시작될 때 실행할 커멘드
CMD [&quot;node&quot;,&quot;server.js&quot;]
</code></pre><ol>
<li><p>레디스 서버를 먼저 실행 
(base) hongtae@user:~/바탕화면/nodejs-docker-compose-app$ <strong>sudo docker run redis</strong></p>
</li>
<li><p>이미지 생성후 컨테이너 실행 </p>
</li>
</ol>
<p><strong>sudo docker run gusxoqkqh1/docker-compose-app</strong>
server is running
events.js:174
throw er; // Unhandled &#39;error&#39; event
      ^</p>
<p>레디스가 레디스 서버와 연결이 실패했다.</p>
<p>Error: <strong>Redis connection to redis-server:6379 failed</strong> - getaddrinfo ENOTFOUND redis-server redis-server:6379
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:56:26)
Emitted &#39;error&#39; event at:
    at RedisClient.on_error (/usr/src/app/node_modules/redis/index.js:341:14)
    at Socket.<anonymous> (/usr/src/app/node_modules/redis/index.js:222:14)
    at Socket.emit (events.js:198:13)
    at emitErrorNT (internal/streams/destroy.js:91:8)
    at emitErrorAndCloseNT (internal/streams/destroy.js:59:3)
    at process._tickCallback (internal/process/next_tick.js:63:19)
에러 이유는 무엇일까?</p>
<p>*<em>컨테이너 간에 접근을 가능하게 해주는 무언가가 필요하다 *</em>
노트 앱+ 레디스 클라이언트가 레디스 서버로 접근을 시도해야 한다.</p>
<h1 id="이떄-사용하는것이-docker-compose이다">이떄 사용하는것이 docker compose이다</h1>
<p><img src="https://images.velog.io/images/hong_tae/post/eb6d03db-ee3c-4844-b95a-af612a473b6c/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/hong_tae/post/3bf99977-5c7f-4551-8fc5-929d715170f0/image.png" alt=""></p>
<p>  <img src="https://images.velog.io/images/hong_tae/post/5255d88d-6537-4232-9b0f-220108d92677/image.png" alt=""></p>
<h1 id="docker-compose-yml">docker-compose-yml</h1>
<pre><code>version:&quot;3&quot;
services:
    redis-server:
        image: &quot;redis&quot;
    node-app:
        build: .
        ports:
            -&quot;5000:8000&quot;
</code></pre><p>도커가 설치 되어있는데 또 설치를 하라 한다.. </p>
<p>  (base) hongtae@user:~/바탕화면/nodejs-docker-compose-app$ docker-compose up</p>
<p>Command &#39;docker-compose&#39; not found, but can be installed with:</p>
<p>sudo snap install docker          # version 19.03.13, or
sudo apt  install docker-compose  # version 1.25.0-1</p>
<p>See &#39;snap info docker&#39; for additional versions.
<strong>docker -v</strong>
Docker version 20.10.6, build 370c289</p>
<p><strong>sudo apt  install docker-compose</strong></p>
<p><strong>sudo docker-compose up</strong>
<strong>ERROR: yaml.scanner.ScannerError: mapping values are not allowed here</strong>
 in &quot;./docker-compose.yml&quot;, line 2, column 9</p>
<p>간격 잘 맞춰라 </p>
<p><img src="https://images.velog.io/images/hong_tae/post/380c8ff3-af46-49b0-9123-656bcfdeab3e/image.png" alt=""></p>
<pre><code>version: &quot;3&quot;
services:
  redis-server:
        image: &quot;redis&quot;
  node-app:
        build: .
        ports:
            - &quot;5000:8080&quot;</code></pre><p><strong>sudo docker-compose up</strong>
Starting nodejs-docker-compose-app_redis-server_1 ... done
Starting nodejs-docker-compose-app_node-app_1     ... done
Attaching to nodejs-docker-compose-app_node-app_1, nodejs-docker-compose-app_redis-server_1
redis-server_1  | 1:C 27 May 2021 07:47:51.513 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis-server_1  | 1:C 27 May 2021 07:47:51.513 # Redis version=6.2.3, bits=64, commit=00000000, modified=0, pid=1, just started
redis-server_1  | 1:C 27 May 2021 07:47:51.513 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis-server_1  | 1:M 27 May 2021 07:47:51.513 * monotonic clock: POSIX clock_gettime
redis-server_1  | 1:M 27 May 2021 07:47:51.514 * Running mode=standalone, port=6379.
redis-server_1  | 1:M 27 May 2021 07:47:51.514 # Server initialized
redis-server_1  | 1:M 27 May 2021 07:47:51.514 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add &#39;vm.overcommit_memory = 1&#39; to /etc/sysctl.conf and then reboot or run the command &#39;sysctl vm.overcommit_memory=1&#39; for this to take effect.
redis-server_1  | 1:M 27 May 2021 07:47:51.514 * Loading RDB produced by version 6.2.3
redis-server_1  | 1:M 27 May 2021 07:47:51.514 * RDB age 17 seconds
redis-server_1  | 1:M 27 May 2021 07:47:51.514 * RDB memory usage when created 0.79 Mb
redis-server_1  | 1:M 27 May 2021 07:47:51.514 * DB loaded from disk: 0.000 seconds
redis-server_1  | 1:M 27 May 2021 07:47:51.514 * Ready to accept connections
<strong>node-app_1      | server is running</strong></p>
<h1 id="결과는--오타-ㅠ">결과는 ... 오타 ㅠ</h1>
<p><img src="https://images.velog.io/images/hong_tae/post/fd7d5faf-2ef6-4d02-ba58-9167f77b29fd/image.png" alt=""></p>
<p>server.js 에서 13 줄 client &gt; client.get 으로 수정<br><img src="https://images.velog.io/images/hong_tae/post/e54938ff-5b66-4d6e-bcd7-6a4c0ee4fb19/image.png" alt=""></p>
<h1 id="두번째-부터는---build를-한다">두번째 부터는 --build를 한다</h1>
<p>다시 sudo docker-compose up --build </p>
<p>  <img src="https://images.velog.io/images/hong_tae/post/567d43e3-ad2b-4ee5-b7fc-80ae9dd3b3fd/image.png" alt=""></p>
<p>docker compose로 컨테이너 한꺼번에 멈추기</p>
<h1 id="docker-compose-down--반드시-yml파일이-있는-곳에서-해야한다">docker compose down ( 반드시 yml파일이 있는 곳에서 해야한다.)</h1>
<p>sudo docker-compose up -d  (백그라운드 실행)
sudo docker-compose up -d --build </p>
<p><img src="https://images.velog.io/images/hong_tae/post/771a0a31-f440-472d-8724-666578a50066/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/hong_tae/post/d1862d24-b9bc-4373-9369-4d6a2f221935/image.png" alt=""></p>
<p>(base) hongtae@user:<del>/바탕화면/nodejs-docker-compose-app$ <strong>sudo docker-compose down</strong>
Stopping nodejs-docker-compose-app_node-app_1     ... done
Stopping nodejs-docker-compose-app_redis-server_1 ... done
Removing nodejs-docker-compose-app_node-app_1     ... done
Removing nodejs-docker-compose-app_redis-server_1 ... done
Removing network nodejs-docker-compose-app_default
(base) hongtae@user:</del>/바탕화면/nodejs-docker-compose-app$ <strong>sudo docker ps</strong>
CONTAINER ID   IMAGE               COMMAND                  CREATED          STATUS          PORTS                                       NAMES
f5917a9f29c3   redis               &quot;docker-entrypoint.s…&quot;   51 minutes ago   Up 51 minutes   6379/tcp                                    elastic_diffie
df9c2edfb81c   gusxoqkqh1/nodejs   &quot;docker-entrypoint.s…&quot;   3 hours ago      Up 3 hours      0.0.0.0:4000-&gt;8080/tcp, :::4000-&gt;8080/tcp   frosty_shannon
1fe58523dd97   f1e8d1c19a48        &quot;docker-entrypoint.s…&quot;   5 hours ago      Up 5 hours                                                  clever_davinci
374a124e4202   f1e8d1c19a48        &quot;docker-entrypoint.s…&quot;   5 hours ago      Up 5 hours                                                  relaxed_wiles
(base) hongtae@user:~/바탕화면/nodejs-docker-compose-app$ </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[nodejs 도커 연습 2탄]]></title>
            <link>https://velog.io/@hong_tae/nodejs-%EB%8F%84%EC%BB%A4-%EC%97%B0%EC%8A%B5-2%ED%83%84</link>
            <guid>https://velog.io/@hong_tae/nodejs-%EB%8F%84%EC%BB%A4-%EC%97%B0%EC%8A%B5-2%ED%83%84</guid>
            <pubDate>Thu, 27 May 2021 04:49:52 GMT</pubDate>
            <description><![CDATA[<h1 id="생성한-이미지로-어플리케이션-실행시-접근이-안되는-이유">생성한 이미지로 어플리케이션 실행시 접근이 안되는 이유</h1>
<p><img src="https://images.velog.io/images/hong_tae/post/11e0393d-9909-40a8-9742-0bbd7de99c6a/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/hong_tae/post/86eda5a7-1a13-4f01-96f6-7d6466e804d5/image.png" alt=""></p>
<h1 id="컨테이너와-브라우저와의-포트를-매핑시켜줘야한다">컨테이너와 브라우저와의 포트를 매핑시켜줘야한다.</h1>
<p>49160 포트로 가면 컨테이너에서 8080으로 매핑된다. </p>
<p>출발지 포트를 랜덤으로 넣어도 상관없다. </p>
<p>5000: 출발지 임의 포트 뭐든 상관없음 
8080: 컨테이너 안 포트 </p>
<p>docker run -p <strong>5000</strong> : <strong>8080</strong> gusxoqkqh1/nodejs</p>
<p>[sudo] password for hongtae: 
Server is running</p>
<h1 id="httplocalhost5000"><a href="http://localhost:5000/">http://localhost:5000/</a></h1>
<p><img src="https://images.velog.io/images/hong_tae/post/22d5596c-432a-481d-9d60-627cad203854/image.png" alt=""></p>
<h1 id="working-directory-명시해주기">WORKING DIRECTORY 명시해주기</h1>
<h2 id="명시를-해주면-이미지를-접근할-때-원래는-루트에서-찾아오지만workdir-usrsrcapp에서-정보를-찾아온다">명시를 해주면 이미지를 접근할 때 원래는 루트에서 찾아오지만WORKDIR /usr/src/app에서 정보를 찾아온다.</h2>
<p>sudo docker run -it gusxoqkqh1/nodejs ls
[sudo] password for hongtae: </p>
<p>Dockerfile  dev   lib     mnt           package-lock.json  root    server.js  tmp
bin        etc   lib64  node_modules  package.json      run    srv       usr
boot        home  media  opt           proc          sbin    sys       var</p>
<p>FROM node:10 </p>
<p>COPY ./ ./
RUN npm install express
<strong>WORKDIR /usr/src/app</strong>
CMD [&quot;node&quot;,&quot;server.js&quot;]</p>
<p>(base) hongtae@user:~/바탕화면/nodejs-docker-app$ sudo docker build -t 0gusxoqkqh1/nodejs ./</p>
<p>sudo docker run -it gusxoqkqh1/nodejs sh</p>
<p><img src="https://images.velog.io/images/hong_tae/post/e94fd530-3596-45c2-b94e-656d79e31bcc/image.png" alt=""></p>
<p>app 디렉토리에 없다면 자동으로 생성되고 기존에 있다면 거기서 실행 된다? </p>
<pre><code>
sudo docker run -it gusxoqkqh1/nodejs sh
# ls
Dockerfile  node_modules  package-lock.json  package.json  server.js
# cd /
# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
# cd /usr/src/app
# pwd
/usr/src/app
# ls
Dockerfile  node_modules  package-lock.json  package.json  server.js</code></pre><p><img src="https://images.velog.io/images/hong_tae/post/0a5d4079-f630-49f3-957c-db5aa9fba5ea/image.png" alt=""></p>
<h1 id="어플리케이션-소스-변경으로-다시-빌드하는-고충-해결">어플리케이션 소스 변경으로 다시 빌드하는 고충 해결</h1>
<p><img src="https://images.velog.io/images/hong_tae/post/83592431-2a4e-44d8-abe6-39e24ed8c698/image.png" alt=""></p>
<p>-d 데몬 백그라운드로 돌려서 실행 돌리고 바로 빠져나오게 해라 </p>
<p>sudo dockr run -d -p 5000:8000 gusxoqkqh1/nodejs </p>
<p>sudo docker ps </p>
<p><img src="https://images.velog.io/images/hong_tae/post/db22741e-e59b-4607-ab16-74badbf2aa16/image.png" alt=""></p>
<p>(base) hongtae@user:~/바탕화면/nodejs-docker-app$ sudo docker stop 5704a5b8b0d4</p>
<p>5704a5b8b0d4
(base) hongtae@user:~/바탕화면/nodejs-docker-app$</p>
<h1 id="안녕하세요-에서-방가워요라고-수정-귀찮게-다시-build-하고-run-해야-한다">안녕하세요 에서 방가워요라고 수정 귀찮게 다시 build 하고 run 해야 한다</h1>
<p><img src="https://images.velog.io/images/hong_tae/post/40dcc6c7-2d38-4da3-89ac-6e0315edcb2a/image.png" alt=""></p>
<p>sudo docker build -t 0gusxoqkqh1/nodejs ./</p>
<p>*<em>sudo docker run -d -p 4000:8080 gusxoqkqh1/nodejs *</em>
d477feebdce0fdd1074b61dc9652bbc195aafb7a12e9bc385a27364ee0ac2940</p>
<p><img src="https://images.velog.io/images/hong_tae/post/a5fb4303-773d-4fff-82a9-a046350563c1/image.png" alt=""></p>
<p>copy ././ </p>
<p>그 이유는 현재 server.js , package.json 등 모든 파일을 copy를 이용하여 컨테이너 안에 넣는데 소스가 수정되면 일단 npm install 을 계속 설치 해줘야 했다</p>
<h1 id="어플리케이션-소스-변경-시-효율적으로-빌드-하는-방법">어플리케이션 소스 변경 시 효율적으로 빌드 하는 방법</h1>
<p><img src="https://images.velog.io/images/hong_tae/post/f4813fcc-9a25-4c7a-88d8-3871fb82e1f4/image.png" alt=""></p>
<p>이처럼 package.json을 copy 해준다면 소스가 바뀌어도 package.json 이 수정되지 않기 때문에 npm install을 진행하지 않는다.</p>
<p>FROM node:10 
WORKDIR /usr/src/app</p>
<p>COPY package.json ./
RUN npm install express
COPY ./ ./
CMD [&quot;node&quot;,&quot;server.js&quot;]</p>
<h1 id="serverjs-부분-다시-수정">server.js 부분 다시 수정</h1>
<p><img src="https://images.velog.io/images/hong_tae/post/7812989a-d860-4523-81bd-a93452cfc228/image.png" alt=""></p>
<p><strong>sudo docker build ./</strong>
Sending build context to Docker daemon  4.096kB
Step 1/6 : FROM node:10
 ---&gt; 28dca6642db8
Step 2/6 : WORKDIR /usr/src/app
 ---&gt; Using cache
 ---&gt; 501a39617129
Step 3/6 : COPY package.json ./
 ---&gt; Using cache
 ---&gt; 083e78cc68a3</p>
<p>Step 4/6 : <strong>RUN npm install express
 ---&gt; Using cache</strong>
 ---&gt; 433d5a846ac1
Step 5/6 : COPY ./ ./
 ---&gt; e4bdb662d7ba
Step 6/6 : CMD [&quot;node&quot;,&quot;server.js&quot;]
 ---&gt; Running in 2dd44668ecf2
Removing intermediate container 2dd44668ecf2
 ---&gt; 7b3e105b1583
Successfully built 7b3e105b1583</p>
<p>이 귀찮은 작업들은 도커 볼륨이라는것이 해결해줄 수 있다.</p>
<p>도커 컨테이너에서 도커 볼륨을 이용해서 로컬에 있는것을 계속 바라보면서 수정사항이 생기면 변경해준다 
<img src="https://images.velog.io/images/hong_tae/post/31a888a8-abd6-4e79-bb07-815965d63598/image.png" alt=""></p>
<blockquote>
<p>/usr/src/app = workdir 수정시 변경가능 </p>
</blockquote>
<pre><code>sudo docker run -d -p 4000:8080 -v /usr/src/app/node_modules -v ${pwd}:/usr/src/app gusxoqkqh1/nodejs

df9c2edfb81c6e5f163628557c04b530d243fbb8f947721d8c564b007f767342
</code></pre><p><img src="https://images.velog.io/images/hong_tae/post/bcbd1ac9-fdb3-4436-af1a-95a59e59208c/image.png" alt=""></p>
<p><strong>안되는데..?..</strong></p>
<p>운영체제 별 pwd or cd 에러 참조</p>
<p>Windows</p>
<ul>
<li>CMD 커맨드 환경 -</li>
</ul>
<p>docker run -d -p 4000:8080 -v /usr/src/app/node_modules -v %cd%:/usr/src/app gusxoqkqh1/nodejs</p>
<ul>
<li>PowerShell 환경(VSCode) -</li>
</ul>
<p>docker run -d -p 4000:8080 -v /usr/src/app/node_modules -v ${pwd}:/usr/src/app gusxoqkqh1/nodejs</p>
<p>Linux = ubuntu 
(sudo) docker run -d -p 4000:8080 -v /usr/src/app/node_modules -v $<strong>{pwd}</strong>:/usr/src/app gusxoqkqh1/nodejs</p>
<p>기타(맥 포함)
docker run -d -p 4000:8080 -v /usr/src/app/node_modules -v $(pwd):/usr/src/app gusxoqkqh1/nodejs</p>
<p>docker run -d -p 4000:8080 -v /usr/src/app/node_modules -v ${PWD}:/usr/src/app gusxoqkqh1/nodejs</p>
<p><img src="https://images.velog.io/images/hong_tae/post/fc6af2ae-8bb0-4207-afb8-3f8214458f8d/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[nodejs 도커 연습 1탄  ]]></title>
            <link>https://velog.io/@hong_tae/nodejs-%EB%8F%84%EC%BB%A4-%EC%97%B0%EC%8A%B5</link>
            <guid>https://velog.io/@hong_tae/nodejs-%EB%8F%84%EC%BB%A4-%EC%97%B0%EC%8A%B5</guid>
            <pubDate>Thu, 27 May 2021 02:15:39 GMT</pubDate>
            <description><![CDATA[<p>바탕화면에 nodejs-docker 디렉토리 생성</p>
<p>패키지.js를 직접 파일을 만들 수도 있지만 명령어 하나로 
생성 해줄 수 있다.</p>
<p>(base) hongtae@user:~/바탕화면/nodejs-docker-app$
<strong>npm init</strong>
package name: (enter)(nodejs-docker-app) 
version: (1.0.0) (enter)
description: (enter)
entry point: (index.js) server.js 
test command: (enter)
git repository: (enter)
keywords: (enter)
author: (enter)
license: (ISC)(enter)</p>
<p>(base) hongtae@user:~/바탕화면/nodejs-docker-app$ <strong>npm init</strong>
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.</p>
<p>See <code>npm help json</code> for definitive documentation on these fields
and exactly what they do.</p>
<p>Use <code>npm install &lt;pkg&gt;</code> afterwards to install a package and
save it as a dependency in the package.json file.</p>
<p>Press ^C at any time to quit.
package name: (nodejs-docker-app) 
version: (1.0.0) 
description: 
entry point: (index.js) server.js
test command: 
git repository: 
keywords: 
author: 
license: (ISC) 
About to write to /home/hongtae/바탕화면/nodejs-docker-app/package.json:</p>
<p>{
  &quot;name&quot;: &quot;nodejs-docker-app&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;description&quot;: &quot;&quot;,
  &quot;main&quot;: &quot;server.js&quot;,
  &quot;scripts&quot;: {
    &quot;test&quot;: &quot;echo &quot;Error: no test specified&quot; &amp;&amp; exit 1&quot;
  },
  &quot;author&quot;: &quot;&quot;,
  &quot;license&quot;: &quot;ISC&quot;
}</p>
<p>Is this OK? (yes)</p>
<p>package.json파일이 생성되었다. 
<img src="https://images.velog.io/images/hong_tae/post/ab7edf58-3427-4ff3-bc5c-165aad3f92e7/image.png" alt=""></p>
<pre><code>
dependencies : express는 추가해줘라 .
express : nodejs를 간편히 사용하기 위해 사용.

{
  &quot;name&quot;: &quot;nodejs-docker-app&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;description&quot;: &quot;&quot;,
  &quot;main&quot;: &quot;server.js&quot;,
  &quot;scripts&quot;: {
    &quot;test&quot;: &quot;echo \&quot;Error: no test specified\&quot; &amp;&amp; exit 1&quot;
  },
  &quot;dependencies&quot;:{
    &quot;express&quot;:&quot;4.17.1&quot;
  },
  &quot;author&quot;: &quot;&quot;,
  &quot;license&quot;: &quot;ISC&quot;
</code></pre><p>server.js 파일 생성 후 간단한 앱 생성 
<img src="https://images.velog.io/images/hong_tae/post/1ccb83bc-ee76-4a2f-a15e-40df75307305/image.png" alt=""></p>
<pre><code>const express = require(&#39;express&#39;);

const PORT = 8080;

//APP

const app = express();
app.get(&#39;/&#39;,(req,res) =&gt; {
    res.send(&quot;Hello World&quot;)
});

app.listen(PORT);
console.log(&quot;Server is running&quot;)</code></pre><p>도커 환경에서 해보자. </p>
<p><img src="https://images.velog.io/images/hong_tae/post/272687bb-5b9d-47eb-a534-85d609f84f70/image.png" alt=""></p>
<p>도커 파일을 만들어 도커 이미지를 생성 하고 </p>
<p>도커 컨테이너 생성 후 그 안에 node.js APP 을 넣는다</p>
<p><img src="https://images.velog.io/images/hong_tae/post/4f732adf-d769-42e3-9d23-e568cee67ae7/image.png" alt=""></p>
<ul>
<li><p>Dockerfile-</p>
</li>
<li><p>npm 이 들어있는 베이스 이미지중에 선택 해야 한다. 알파인 이미지는 npm이 없다.</p>
</li>
</ul>
<p>FROM node:10 </p>
<ul>
<li><p>npm 이란 노드 js에서 모듈을 관리하는 프로그램? 
package.json에 이 부분에 찾아가 express 버전에 맞춰 설치해줌? 뭔소리? 
= npm 레지스토리 에서 모듈을 다운 받아 설치한다 </p>
<p>&quot;dependencies&quot;:{
  &quot;express&quot;:&quot;4.17.1&quot;</p>
</li>
</ul>
<p>RUN npm install</p>
<p>CMD [&quot;node&quot;,&quot;server.js&quot;]</p>
<p>노드 서버를 작동 시키는 명령어 [node , entry 파일]</p>
<p><img src="https://images.velog.io/images/hong_tae/post/95b1f3a8-3f1d-4768-80a1-30c1a428e431/image.png" alt=""></p>
<h1 id="도커-빌드">도커 빌드</h1>
<p>도커 빌드를 하면 도커 서버에 전달하여 이미지를 생성해온다. </p>
<p>도커 서버에 node:10 이 없다면 받아오는데 시간이 좀 오래 걸릴것이다. </p>
<p>(base) hongtae@user:~/바탕화면/nodejs-docker-app$ sudo docker build ./
Sending build context to Docker daemon  3.584kB
Step 1/3 : FROM node:10
10: Pulling from library/node
76b8ef87096f: Pull complete 
2e2bafe8a0f4: Pull complete 
b53ce1fd2746: Pull complete 
84a8c1bd5887: Pull complete 
7a803dc0b40f: Downloading  84.74MB/214.3MB
b800e94e7303: Download complete 
0da9fbf60d48: Downloading  17.05MB/21.42MB
04dccde934cf: Waiting 
73269890f6fd: Waiting </p>
<p><strong>package.json 파일이 없다고 에러가 나왔다</strong></p>
<p>npm WARN saveError ENOENT: <strong>no such file</strong> or directory, open &#39;/package.json&#39;
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN enoent ENOENT: no such file or directory, open &#39;/package.json&#39;
npm WARN !invalid#2 No description
npm WARN !invalid#2 No repository field.
npm WARN !invalid#2 No README data
npm WARN !invalid#2 No license field.</p>
<h1 id="copy">COPY</h1>
<p>npm install을 하려면 임시컨테이너 안에 패키지.json 파일이 있어야 하는데 밖으로 나가있다 ? 그래서 copy 로 해서 npm install 을 할 package.json을 바라보게 해줘야 한다. </p>
<p>FROM node:10 </p>
<p><strong>COPY package.json ./</strong></p>
<p>RUN npm install</p>
<p>CMD [&quot;node&quot;,&quot;server.js&quot;]</p>
<h1 id="sudo-docker-build--t-gusxoqkqh1nodejs-">sudo docker build -t gusxoqkqh1/nodejs ./</h1>
<p>Sending build context to Docker daemon  3.584kB
Step 1/4 : FROM node:10
 ---&gt; 28dca6642db8
Step 2/4 : COPY package.json ./
 ---&gt; 8faac95b973a
Step 3/4 : RUN npm install
 ---&gt; Running in 9e5e0d6df6d0
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN <a href="mailto:nodejs-docker-app@1.0.0">nodejs-docker-app@1.0.0</a> No description
npm WARN <a href="mailto:nodejs-docker-app@1.0.0">nodejs-docker-app@1.0.0</a> No repository field.</p>
<p>up to date in 0.912s
found 0 vulnerabilities</p>
<p>Removing intermediate container 9e5e0d6df6d0
 ---&gt; 35a33df6ce04
Step 4/4 : CMD [&quot;node&quot;,&quot;server.js&quot;]
 ---&gt; Running in 9d34a8f3099e
Removing intermediate container 9d34a8f3099e
 ---&gt; 075868c76d43
Successfully built 075868c76d43
Successfully tagged gusxoqkqh1/nodejs:latest</p>
<h1 id="이미지로-컨테이너-실행-sudo-docker-images">이미지로 컨테이너 실행 sudo docker images;</h1>
<p>REPOSITORY                TAG       IMAGE ID       CREATED              SIZE
<strong>gusxoqkqh1/nodejs         latest</strong>    075868c76d43   About a minute ago   910MB</p>
<p><strong>sudo docker run gusxoqkqh1/nodejs:latest</strong>
internal/modules/cjs/loader.js:638
    throw err;
    ^</p>
<h1 id="또-파일이-없다고-나온다">또 파일이 없다고 나온다</h1>
<ul>
<li>이 이유 역시 비슷하다 server.json이 컨테이너 밖에 있기 때문에 컨테이너 안에서 찾으려 하니 없다고 한다 . 
Error: <strong>Cannot find module &#39;/server.js&#39;</strong>
  at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
  at Function.Module._load (internal/modules/cjs/loader.js:562:25)
  at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
  at startup (internal/bootstrap/node.js:283:19)
  at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)</li>
</ul>
<p><img src="https://images.velog.io/images/hong_tae/post/1b765025-fe32-4442-91bd-d2469eb8ced8/image.png" alt=""></p>
<p>FROM node:10 </p>
<p><strong>COPY ./ ./</strong>  #디렉토리 부분 전체로 수정 후 컨테이너 안으로 넣는다 
RUN npm install</p>
<p>CMD [&quot;node&quot;,&quot;server.js&quot;]</p>
<p>sudo docker run gusxoqkqh1/nodejs:latest
internal/modules/cjs/loader.js:638
    throw err;
    ^</p>
<p>Error: <strong>Cannot find module &#39;express&#39;</strong>
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
    at Function.Module._load (internal/modules/cjs/loader.js:562:25)
    at Module.require (internal/modules/cjs/loader.js:692:17)
    at require (internal/modules/cjs/helpers.js:25:18)
    at Object.<anonymous> (/server.js:1:17)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)</p>
<pre><code>RUN 에 express 를 넣고 이미지 생성 후 다시 Run 하니 된다?
  왜? 

FROM node:10 

COPY ./ ./
RUN npm install express

CMD [&quot;node&quot;,&quot;server.js&quot;]

sudo docker run gusxoqkqh1/nodejs:latest
**Server is running**</code></pre><h1 id="동작을-하지-않는다">동작을 하지 않는다</h1>
<p><a href="http://localhost:8080/">http://localhost:8080/</a></p>
<p><img src="https://images.velog.io/images/hong_tae/post/87c6ba8d-1699-4950-8e69-3907d35f3030/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ec2 centos code-deploy-agent파일 설치 커맨드  및 실습 ]]></title>
            <link>https://velog.io/@hong_tae/ec2-centos-code-deploy-agent%ED%8C%8C%EC%9D%BC-%EC%84%A4%EC%B9%98-%EC%BB%A4%EB%A7%A8%EB%93%9C-%EB%B0%8F-%EC%8B%A4%EC%8A%B5</link>
            <guid>https://velog.io/@hong_tae/ec2-centos-code-deploy-agent%ED%8C%8C%EC%9D%BC-%EC%84%A4%EC%B9%98-%EC%BB%A4%EB%A7%A8%EB%93%9C-%EB%B0%8F-%EC%8B%A4%EC%8A%B5</guid>
            <pubDate>Tue, 25 May 2021 10:51:32 GMT</pubDate>
            <description><![CDATA[<p>sudo yum update
sudo yum install ruby 
sudo yum install wget
wget <a href="https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install">https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install</a></p>
<p>pwd</p>
<p>[ec2-user@ip-172-31-10-59 ~]$ ll
합계 20
-rwxrwxr-x 1 ec2-user ec2-user 17482  5월 14 17:07 </p>
<p><strong>install</strong>
chmod +x install</p>
<p>sudo ./install auto</p>
<p>sudo service codedeploy-agent status # 설치된 것 확인.
The AWS CodeDeploy agent is running as PID 3498</p>
<p>Iam &gt; 사용자 만들기 </p>
<p><img src="https://images.velog.io/images/hong_tae/post/b21c9309-73ef-4988-835a-85aa7d0cc9aa/image.png" alt=""></p>
<p>권한 &gt;
<img src="https://images.velog.io/images/hong_tae/post/c4e5683b-7567-46e6-b31f-4136bc37c3a0/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/hong_tae/post/a6e84fec-b3a6-4e9a-8668-0c7ba5887571/image.png" alt="">
<strong>기존 정책 직접 연결</strong></p>
<ul>
<li>AWSCodeDeployFullAccess</li>
<li>S3FullAccess</li>
</ul>
<p><img src="https://images.velog.io/images/hong_tae/post/dadc7e34-f793-4b1c-af14-56fb69c95ffa/image.png" alt=""></p>
<p>엑세스 키 아이디와 비밀 키가 발급 되었다. 
<img src="https://images.velog.io/images/hong_tae/post/07b22e9c-801f-4177-a766-eee23e1ca1f7/image.png" alt=""></p>
<p>임의로 만든 유저 계정으로 접속한다 .  <strong>( aws 가 아닌 내 로컬에서 접속하기 위해 )</strong>
터미널을 킨다 
[ec2-user@ip-172-31-10-59 ~]$ aws configure</p>
<p>AWS Access Key ID [None]: 
AKIASKSQNKILN7WJNxxxxxx # iam &gt; 사용자 &gt; 보안자격그룹 확인
Secret Access Key [None]: xxxxxx
Default region 
name [None]: ap-northeast-2
Default output format [None]: </p>
<ul>
<li>코드 디플로이를 이용해서 이름을 하나 만들건데 이름은 mywebapp이다</li>
</ul>
<p>vim ~/.aws/credentials 로 잘 들어갔나 확인</p>
<p>[ec2-user@ip-172-31-10-59 ~]$ *<em>aws deploy create-application --application-name mywebapp
*</em></p>
<p>혹시 이런 에러가 나온다면 aws configre 계정 잘못 누른것이다.
An error occurred (UnrecognizedClientException) when calling the CreateApplication operation: The security token included in the request is invalid.</p>
<p>다시 쳐봐라 </p>
<p>[ec2-user@ip-172-31-10-59 ~]$ aws deploy create-application --application-name mywebapp
{
    &quot;applicationId&quot;: &quot;4a43a0e8-aaa4-43d9-8712-7cb6ab17c0c3&quot;
}</p>
<h1 id="이-파일을-s3-버킷에-올려라이미-올라가있는데">이 파일을 s3 버킷에 올려라?이미 올라가있는데..?</h1>
<p>aws deploy push --application-name mywebapp --s3-location s3://aws-learner-code-deploy-bucket123/mywebapp.zip --ignore-hidden-files</p>
<p>잘 나왔을 떄, </p>
<pre><code>(base) hongtae@user:~/다운로드/mywebapp$ aws deploy push --application-name mywebapp --s3-location s3://aws-learner-code-deploy-bucket123/mywebapp.zip --ignore-hidden-files
To deploy with this revision, run:
aws deploy create-deployment --application-name mywebapp --s3-location bucket=aws-learner-code-deploy-bucket123,key=mywebapp.zip,bundleType=zip,eTag=547d5094adf0b83387cfc0655f6d489d --deployment-group-name &lt;deployment-group-name&gt; --deployment-config-name &lt;deployment-config-name&gt; --description &lt;description&gt;</code></pre><p>s3 프라이빗 환경에서 버킷 생성 
<img src="https://images.velog.io/images/hong_tae/post/39a1c870-8cd4-43b4-b7bf-d9034dce3492/image.png" alt=""></p>
<p><strong>에서 생성 날짜 시간이 바뀌었다?.</strong></p>
<p><img src="https://images.velog.io/images/hong_tae/post/c8cef4e0-6d64-464e-bfe5-3a1c8f6099a9/image.png" alt=""></p>
<p>aws-learner-code-deploy-bucket123</p>
<p>s3 버킷에 mywebapp.zip이라는 압축파일을 업로드 해놨다
<img src="https://images.velog.io/images/hong_tae/post/a6b4ac18-c12d-4893-bc4d-66233b7be90a/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/hong_tae/post/366080d5-8a1a-47c7-a168-c8684af99e3a/image.png" alt="">
s3://aws-learner-code-deploy-bucket123/mywebapp.zip
/home/ec2-user/appspec.yml was not found</p>
<p><img src="https://images.velog.io/images/hong_tae/post/4b29942d-445a-40e3-ab34-02621ef14fa8/image.png" alt=""></p>
<p>code deploy에 어플리케이션이 생성된 것을 확인할 수 있다. </p>
<p><img src="https://images.velog.io/images/hong_tae/post/1557dcc1-0cca-49ad-a9ff-add23465fcf1/image.png" alt=""></p>
<p>이제 코드 디플로이와 s3 버켓를 연동시켜</p>
<p>s3에 업로드 되는 파일을 따라 배포할 수 있는 기능을 구현했다.</p>
<p>이제 배포를 시작해보자</p>
<h1 id="배포-그룹을-생성">배포 그룹을 생성</h1>
<p>호스트를 생성?  </p>
<p>배포그룹 생성 필수!</p>
<p><img src="https://images.velog.io/images/hong_tae/post/aeb063f1-1ad4-40f9-b132-5e284c9b27ea/image.png" alt=""></p>
<p><strong>배포 그룹 이름</strong>
aws_learner_deploy_group</p>
<p><strong>서비스 역할</strong>
자동으로 뜸 
<img src="https://images.velog.io/images/hong_tae/post/fc83804a-b1ca-4cad-a9e0-2a2ee5572c9a/image.png" alt=""></p>
<p>배포 유형은</p>
<p>롤형과 블루/그린이 있다</p>
<p>롤형은 배포가 되면 기존에 시스템이 멈추므로 시스템에 영향이 있지만
블루/그린은 새로운 ec2를 추가해 따로 진행 하고 배포가 완료되면 지워지는 것으로 블루/그린이 안정적이다 </p>
<p>하지만 인스턴스를 과하게 쓰는 단점이 있다 
처음 배포 할 때는 롤링이 좋고 그 다음부터는 안전하게 블루/그린으로 </p>
<p>환경 구성은 아직 Ec2 인스턴스 밖에 해놓은게 없다 클릭! </p>
<p>태그는 기존에 있던거 누르면 된다 .
<img src="https://images.velog.io/images/hong_tae/post/adc7fecd-d203-4bf0-b940-a6738aeb3444/image.png" alt=""></p>
<p>에이전트는 원래 필수로 해야 하지만 이미 Ec2에 다운 받았고 하나밖에 없기에 안함을 설정한다 . 혹시 여러개 인스턴스를 사용한다면 지금 업데이트 및 업데이트 일정 예약
<img src="https://images.velog.io/images/hong_tae/post/329efbdb-0925-4e73-8878-4e01e023d96e/image.png" alt=""></p>
<p>배포 설정을 한번에 할꺼냐 , 반만 할거냐, 한번씩 할거냐를 선택하며 우린 처음이니까 AllAtOnce를 누르고</p>
<p>프러덕트에서는 롤백을 신경써 HalfAtATime을 권장한다</p>
<p>로드 밸런서는 배포 프로세스 중 수신 트래픽을 관리할 로드밸런스를 선택 하지만 우린 만들지 않았으니 패스한다!
<img src="https://images.velog.io/images/hong_tae/post/af8fb66d-a4e2-411c-9d84-ff5bfd61ea9b/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[도커 그 이후 컨테이너 오케스트레이션
]]></title>
            <link>https://velog.io/@hong_tae/%EB%8F%84%EC%BB%A4-%EA%B7%B8-%EC%9D%B4%ED%9B%84-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EC%98%A4%EC%BC%80%EC%8A%A4%ED%8A%B8%EB%A0%88%EC%9D%B4%EC%85%98</link>
            <guid>https://velog.io/@hong_tae/%EB%8F%84%EC%BB%A4-%EA%B7%B8-%EC%9D%B4%ED%9B%84-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EC%98%A4%EC%BC%80%EC%8A%A4%ED%8A%B8%EB%A0%88%EC%9D%B4%EC%85%98</guid>
            <pubDate>Tue, 25 May 2021 04:39:03 GMT</pubDate>
            <description><![CDATA[<p>도커가 나온 후 도커는 운영쪽을 상당히 편하게 해주었다.</p>
<p>운영단에서는 개발자가 보내준 이미지만 컨테이너화 시키면 되었으니 그치만 </p>
<h1 id="도커의-한계">도커의 한계</h1>
<ul>
<li>수가 적었을 떄는 하나하나 관리하기가 쉬웠지만 도커가 수십 수백개가 쌓이면서 이것을 관리 해야 하는 일이 생겼다.</li>
</ul>
<p>동시에 여러개를 관리 해야 할 일이 생기고 말았다 </p>
<p><img src="https://images.velog.io/images/hong_tae/post/07499d37-4489-4311-bcde-91185e28e264/image.png" alt=""></p>
<p>또, </p>
<ul>
<li><p>컨테이너를 추가할 때 컨테이너 중 실행중이지 않은 곳에 넣어야 하는데 여유있는 서버도 찾기도 무척 힘이 들었다</p>
</li>
<li><p>버전 1을 사용중에서 배포를 하게되어 버전2로 바꿔야 한다면 일일히 하나씩 업데이트 해줘야 한다 그 과정 중 롤백 등 손이 너무 많이 갔다</p>
</li>
</ul>
<h2 id="2-서비스-검색">2. 서비스 검색</h2>
<p>도커 웹서버가 많아져 프록시 서버에서 관리를 해야 한다면 소수는 alb로 관리가 가능하지만 
도커가 많아질수록 너무 복잡해진다.
<img src="https://images.velog.io/images/hong_tae/post/72b498c3-508e-4f2a-9d0a-a18697222bfd/image.png" alt=""></p>
<h2 id="3-서비스-부화문제">3. 서비스 부화문제</h2>
<h1 id="이래서-나온게-나온게-오케스트레이션이다">이래서 나온게 나온게 오케스트레이션이다</h1>
<p><img src="https://images.velog.io/images/hong_tae/post/1b286908-4b22-4214-9007-1c96a0570d9d/image.png" alt=""></p>
<p>컨테이너 마스터 서버를 두고 관리자는 마스터 서버에만 관리하자 </p>
<p>클러스트끼리는 내부 통신이 잘 되어야 한다 .</p>
<h2 id="2-상태관리">2. 상태관리</h2>
<p>제가 원하는 상태는 맞춰주길 원하는데 컨테이너 하나가 문제가 생기면
다른것을 알아서 띄어주는 것이다.</p>
<h2 id="3-배포관리">3. 배포관리</h2>
<p>어떤 서버들에서 app 을 추가 하고 싶을 때 기존 서버에 리소스 여유가 있는것이 무엇인지를 알아야 하고 그것을 자동으로 배치시켜준다.</p>
<h2 id="4-버전관리">4. 버전관리</h2>
<p>관리하는 컨테이너들을 모두 올리거나 모두 롤백 하거나 하는것들을 할 수 있다 . </p>
<h2 id="5-서비스-디스커버리">5. 서비스 디스커버리</h2>
<p>컨테이너가 추가되면 자동으로 마스터에서 아이피를 등록 해줘야 한다
저 과정들을 프록시 서버은 계속 주시하고 있으며 수정사항이 생길 떄마다 설정 변경, 프로세스 재시작을 해준다 .</p>
<p><img src="https://images.velog.io/images/hong_tae/post/bbf95619-a192-4625-9475-a9d2ef52113d/image.png" alt=""></p>
<h2 id="6-볼륨-스테이지">6 볼륨 스테이지</h2>
<p><img src="https://images.velog.io/images/hong_tae/post/7ae76f3b-c886-4eec-9447-f57c7b8b30f1/image.png" alt=""></p>
<p>컨테이너 오케스트레이션은 </p>
<p>DEIS, RANCHER, MESOS, MARATHON, NOMAD 도커 swarm 등 여러개가 있다</p>
<h1 id="쿠버네티스의-장점">쿠버네티스의 장점</h1>
<ul>
<li><p>오픈소스</p>
</li>
<li><p>엄청난 인기</p>
</li>
<li><p>무한한 확장성</p>
</li>
<li><p>사실상의 표준 </p>
</li>
<li><p>오픈소스 : 커뮤니티가 상당히 발달되어있다.</p>
</li>
<li><p>엄청난 인기 : 운영에서 사용중인 퍼센트가 80%
국내 큰 기업도 사용한다</p>
</li>
</ul>
<p>-무한한 확장성: 머신러닝, ci/cd(tenton) , 서비스메시,서버리스</p>
<ul>
<li>사실상 표준 : 데팍토(사실상)</li>
</ul>
<p>쿠버네티스의 커스터마이징
쿠버네티스 위에서 자기들끼리 커스터마이징을 한다 
rancher , Red Hat OpenShift Tanzu </p>
<p>EKS   AKS     GKE 
아마존  에덥    구글</p>
<p>클라우드 네이티브 
클라우드 환경에 적합한 컴퓨팅 기술을 호스팅 </p>
<p><img src="https://images.velog.io/images/hong_tae/post/0368e9fe-bf71-42a7-b69c-009b0849fa9a/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Nginx 를 위한 도커 파일 생성  
]]></title>
            <link>https://velog.io/@hong_tae/Nginx-%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%8F%84%EC%BB%A4-%ED%8C%8C%EC%9D%BC-%EC%83%9D%EC%84%B1</link>
            <guid>https://velog.io/@hong_tae/Nginx-%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%8F%84%EC%BB%A4-%ED%8C%8C%EC%9D%BC-%EC%83%9D%EC%84%B1</guid>
            <pubDate>Tue, 25 May 2021 03:57:50 GMT</pubDate>
            <description><![CDATA[<p>클라이언트가 서버로 들어가기 전 </p>
<p>Nginx(Proxy)를 이용하여 Front와 Backend서버로 나눠 주는 역할을 한다 </p>
<p><img src="https://images.velog.io/images/hong_tae/post/3fa09555-06c4-4333-ad1c-2b50b7015bcf/image.png" alt=""></p>
<p>의문점) 그럼 Nginx는 레스트플한 api 역할을 하는건가?.. alb..와 같이?</p>
<p><img src="https://images.velog.io/images/hong_tae/post/06a1aeff-3460-4940-8e0e-3f2afaf5cade/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/hong_tae/post/7e824185-4db1-4845-8465-9f402b8078ff/image.png" alt=""></p>
<p>nginx &gt;
default.conf : 환경설정 
Dockerfile : 운영환경 
Dockerfile.dev의 개발환경과 운영서버가 동일 하므로 dev는 뺸다.</p>
<pre><code># 3000번 포트에서 frontend가 돌아가고 있다는 것을 명시
upstream frontend{
    server frontend:3000;
    }
# 5000번 포트에서 backend서버가 돌아가고 있다는 것을 명시
upstream backend {
    server backend:5000;
}
# nginx 서버 80번으로 열기
server {
    listen 80;
}

&#39;&#39;&#39; 로케이션에는 우선 순위가 있는데 / 되는것만 우선순위가 가장 낮다. 그래서 여기서는 /api 로 시작하는 것을 먼저 찾고
그게 없다면 / 이렇게 시작되는 것이니 요청을 http://frontend로 보자
&#39;&#39;&#39;
    location / {
        proxy_pass httpL//frontend;

    }
&#39;&#39;&#39;
/api로 들어오는 요청을 http://backend로 보내줍니다.
&#39;&#39;&#39;
    location /api {
        proxy_pass http//backend;
        }

# 이 부분이 없다면 sockjs-node failed: Error가 나온다 
location /sockjs-node {
    proxy_pass http://frontend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection &quot;Upgrade&quot;;
</code></pre><p>}</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[mysql 도커 ]]></title>
            <link>https://velog.io/@hong_tae/mysql-%EB%8F%84%EC%BB%A4</link>
            <guid>https://velog.io/@hong_tae/mysql-%EB%8F%84%EC%BB%A4</guid>
            <pubDate>Mon, 24 May 2021 16:11:06 GMT</pubDate>
            <description><![CDATA[<h1 id="mysql-역시-개발환경과-운영환경으로-나눌-수-있다">mysql 역시 개발환경과 운영환경으로 나눌 수 있다.</h1>
<ul>
<li><p>개발 환경에서 도커 환경 이용 </p>
</li>
<li><p>운영 환경에서는 AWS RES 서비스 이용 </p>
</li>
</ul>
<p>나누는 이유는 DB 작업은 중요한 데이터를 보관하고 이용하기에 조그마난 실수도 안좋은 결과를 얻을 수 있다 그래서 실제 중요한 데이터들을 다루는 운영 환경에서는 더욱 안정적인 aws rds를 이용하여 디비를 구성하는것이 더 좋다.</p>
<p>개발 환경 </p>
<p>개발 환경에서는 Elastic Beanstalk 엘라스틱 빈스탁?</p>
<p><img src="https://images.velog.io/images/hong_tae/post/75bdfdb4-53d5-4ff2-a6fa-4bf842881c15/image.png" alt=""></p>
<p>운영 환경
<img src="https://images.velog.io/images/hong_tae/post/ab1bf186-15aa-4e8e-b951-060e43846637/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/hong_tae/post/574af34c-2063-4bd1-b450-20714fc026fa/image.png" alt=""></p>
<p>순서는 개발환경 db 구성 후 도커 환경 mysql을 실행 할 수 있는
mysql를 위한 도커 파일을 작성 </p>
<p><img src="https://images.velog.io/images/hong_tae/post/120b15a8-2e80-4e17-9519-bf47085cc18e/image.png" alt=""></p>
<p>mysql 폴더 성성 후 
그 안에 sqls 폴더 생성 initalize.sql 파일 생성</p>
<p>Dockerfile 파일 생성 </p>
<ol start="2">
<li>FROM mysql:5.7</li>
</ol>
<p><strong>ADD ./my.cnf /etc/mysql/conf.d/mycnf</strong> # 뭘 덮어씌여?</p>
<ol start="4">
<li>initalize.sql 파일에 <img src="https://images.velog.io/images/hong_tae/post/2db87498-4039-40f9-9d56-c4a3deb800c6/image.png" alt=""></li>
</ol>
<p>DROP DATABASE IF EXISTS myspp;
create database myapp;
use myapp;
create table lists(
    id integet AUTO_INCREMENT,
    valie TEXT,
    PRIMARY KEY (id)
    );</p>
<p><img src="https://images.velog.io/images/hong_tae/post/1e30af1a-9dbd-43b5-938b-3ffe1affa797/image.png" alt="">
<img src="https://images.velog.io/images/hong_tae/post/3711a8c3-6075-457e-8ff9-f924f36ce130/image.png" alt="">
한글도 저장 해야 한다는 뜻
<img src="https://images.velog.io/images/hong_tae/post/b1c43e8e-e3cb-456c-b00b-d6e2701ec06a/image.png" alt=""></p>
<p>my.conf 라는 파일을 생성 후 </p>
<p>그 안에 </p>
<p>*<em>utf8로 인코딩 할 수 있게 해줌
*</em></p>
<pre><code>[mysqld]
character-set-server=utf8

[mysql]
default-character-set=utf8

[client]
default-character-set=utf8</code></pre><p>utg8로 수정된다.
<img src="https://images.velog.io/images/hong_tae/post/b14fe663-6797-4a8f-b20a-5ca08dcfdc80/image.png" alt=""></p>
<p>도커 파일과 Dockerfile.dev를 굳이 같이 쓸 필요가 없다 .</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[travis ci ]]></title>
            <link>https://velog.io/@hong_tae/travis-ci</link>
            <guid>https://velog.io/@hong_tae/travis-ci</guid>
            <pubDate>Mon, 24 May 2021 15:45:03 GMT</pubDate>
            <description><![CDATA[<p>탐킨스 vs travis ci 는 </p>
<p>배포를 하기 전 자체적으로 점검을 해준 후 
완료 되면 넘겨주는 것이다.</p>
<ol>
<li>github에서 new repository 에서 생성</li>
</ol>
<p>public </p>
<ol start="2">
<li>로컬 저장소를 만들기 </li>
</ol>
<p>프로젝트에서 git init</p>
<ol start="3">
<li>현재 소스 로컬 git에 올리기</li>
</ol>
<p><img src="https://images.velog.io/images/hong_tae/post/d41a8e95-fb7f-4210-ae4e-97050c540ab7/image.png" alt="">
git add .
gitcommit -m &#39;first commit&#39;
git remote add origin <a href="http://git">http://git</a>~ 
git remote -v </p>
<p>git push origin main or master</p>
<p>Travis CI 흐름 
로컬 깃 &gt; github &gt; Travis CI AWS</p>
<p><a href="https://travis-ci.org/">https://travis-ci.org/</a> </p>
<p>회원가입 할 때, 깃허브 아이디로 꼭 해야 한다 
<img src="https://images.velog.io/images/hong_tae/post/7452c4ae-43d5-449f-af4f-1b3f4de09968/image.png" alt=""></p>
<p> <a href="https://github.com/settings/security-log">https://github.com/settings/security-log</a> 클릭 
<img src="https://images.velog.io/images/hong_tae/post/4c037b16-3db6-4906-b5e8-f5921277f6cc/image.png" alt=""></p>
<p>이런 메일이 오면 된다 
<img src="https://images.velog.io/images/hong_tae/post/17906f2c-57c5-419f-9e00-523d6a8a286b/image.png" alt=""></p>
<p>우측 상단에 settings
<img src="https://images.velog.io/images/hong_tae/post/46821491-2f03-4c76-aab9-e1ef2bdcccba/image.png" alt=""></p>
<p>방금 깃허브 레포지토리에 올린 것을 찾아야 한다
<img src="https://images.velog.io/images/hong_tae/post/635cbcc0-d2cc-4fae-bd8b-5da769cd4ff1/image.png" alt=""></p>
<p>바로 보이지 않을 것이다 좌측에 sync account를 누른 후 검색창에 올린 것을 다시 쳐보자</p>
<p>혹시 안나오면 travis ci에서 싱크를 못받아 올 수 있다 좀만 기다렸다 싱크 누르면 된다.</p>
<p>settings 옆에있는 바를 클릭해서 체크가 되게 한다 ( 리파지토리가 travis ci와 활성화시켜주는것이다. 이것의 의미는</p>
<p>github에 푸쉬를 하면 트레비스가 자동으로 땡겨와서 테스트를 하든 배포를 할 수 있는 기능이 생긴다 그 후 대쉬보드를 가면 활성화된 git이 보이는데 </p>
<p>No builds for this repository 
read the Docks on Getting Started를 눌러줘야 한다 </p>
<p>*<em>이 행위는 Travis CI에 가입하고 어떠한 프로젝트를 Travis CI에서 관리 할 것인지를 설정해 주었다 *</em></p>
<p>이제는 가져와서 어찌 테스트하고 배포 할건지를 설정 해줘야 한다 </p>
<p>그곳은 travis.yml 이라는 파일이다 </p>
<p>만약 활성화 버튼이 보이지 않는다면 자동으로 활성화가 되어있는 경우도 있다 
확인하고 싶으면 대쉬보드에 들어가 쳐보면 된다 </p>
<p><img src="https://images.velog.io/images/hong_tae/post/49c89f8e-1c9c-410b-a8eb-9c335b68c966/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/hong_tae/post/95991f38-914d-46f6-b2c3-f5e25e5e7e6b/image.png" alt=""></p>
<p>이렇게 No builds for this repository라고 뜬다면 github에서 ci로 어찌 전달할거며 전달 받은것을 어찌 테스트 할것이며, 그 것이 성공했을 때, 어떻게 AWS에 전달해서 배포할 것인지를 설정해주어야 한다. 
<img src="https://images.velog.io/images/hong_tae/post/d41a8e95-fb7f-4210-ae4e-97050c540ab7/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/hong_tae/post/815d0514-10e2-4f23-907e-abd4a4bbb4ed/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[aws 배포 연습. 1 docker ]]></title>
            <link>https://velog.io/@hong_tae/aws-%EB%B0%B0%ED%8F%AC-%EC%97%B0%EC%8A%B5.-1-docker</link>
            <guid>https://velog.io/@hong_tae/aws-%EB%B0%B0%ED%8F%AC-%EC%97%B0%EC%8A%B5.-1-docker</guid>
            <pubDate>Sun, 23 May 2021 07:12:57 GMT</pubDate>
            <description><![CDATA[<ol>
<li>도커 </li>
</ol>
<ul>
<li>ubuntu docker를 설치 후 가지고 놀아보자.</li>
</ul>
<p>Server: gunicorn/20.0.4
Vary: Origin
X-Content-Type-Options: nosniff
X-Frame-Options: DENY</p>
<h2 id="update-와-upgrade-차이">update 와 upgrade 차이</h2>
<p><strong>sudo apt-get update</strong>: 업데이트할 패키지들을 파악합니다. </p>
<p><strong>sudo apt-get upgrade</strong>: 업데이트할 패키지들과 현재 보유하고 있는 패키지들을 비교하며 업데이트를 수행합니다.</p>
<p> sudo apt-get dist-upgrade: 의존성 검사를 하면서 위의 upgrade에서 수행하지 못한 업데이트를 수행합니다. (잘 사용하지는 않습니다.)</p>
<p>sudo apt update
sudo apt upgrade </p>
<h2 id="ubuntu-docker-다운로드">ubuntu docker 다운로드</h2>
<p>sudo apt update</p>
<p>sudo apt install apt-transport-https ca-certificates curl software-properties-common</p>
<p>curl -fsSL <a href="https://download.docker.com/linux/ubuntu/gpg">https://download.docker.com/linux/ubuntu/gpg</a> | sudo apt-key add -</p>
<p>sudo add-apt-repository &quot;deb [arch=amd64] <a href="https://download.docker.com/linux/ubuntu">https://download.docker.com/linux/ubuntu</a> bionic stable&quot;</p>
<p>sudo apt update
apt-cache policy docker-ce
sudo apt install docker-ce</p>
<h1 id="3-ec2-서버-및-rds-생성-해오기">3. EC2 서버 및 RDS 생성 해오기</h1>
<ul>
<li>기존에 생성하신분은 DATABASE의 <code>호스트 주소</code> , <code>사용자명</code>, <code>비밀번호</code> 를 확인해오세요. 실습에 필요합니다.</li>
<li>기존에 미생성하신분은 RDS를 생성해주세요.</li>
<li>EC2에 도커설치는 미리 해놓으셔도 안해놓으셔도 상관없습니다. 실습때 진행예정. =======================================================================================================================</li>
</ul>
<p>파라미터 그룹을 먼저 생성</p>
<h1 id="파라미터-그룹-생성-">파라미터 그룹 생성 =</h1>
<p><img src="https://images.velog.io/images/hong_tae/post/0664c9c6-5f07-44f2-85fa-af27788d074c/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/hong_tae/post/3de3d488-f5e8-4203-958f-e14e4a1f1f14/image.png" alt=""></p>
<p>데이터베이스에 한글뿐만 아닌 , (이모티콘) 도 넣고 싶다 </p>
<p><img src="https://images.velog.io/images/hong_tae/post/963e154f-06b4-4bed-93f5-29b4ad9e9a1d/image.png" alt=""></p>
<p>character_set 모두 utf8mb로 수정 </p>
<p>utf8 도 이모티콘이 들어가지만 mysql에서 바이트를? 잘못 설정하여 개량판으로 utf8mb로 나왔다 한다 패스.</p>
<p>다시 검색어에 colla 이라 검색 후 </p>
<p>collation_connection   utf8mb4  general_ci 
collation_server       utf8mb4  unicode_ci</p>
<p>rds 생성</p>
<p>버전은 mysql 5.7.26 </p>
<p>db 이름 wecode
root
dkagh1234.
dkagh1234.
<img src="https://images.velog.io/images/hong_tae/post/bba879ff-12f7-44db-9ef8-bba26eee9b45/image.png" alt=""></p>
<h1 id="도커-이미지를-생성">도커 이미지를 생성</h1>
<p>도커 이미지를 생성 하면 임시 컨테이너가 생성되며 그것으로 도커 이미지가 나온다</p>
<p><img src="https://images.velog.io/images/hong_tae/post/8d459a88-0b50-4783-9685-df804a016336/image.png" alt=""></p>
<p>형식은 이렇다 </p>
<p>바탕화면에 도커 폴더 생성 후 dockerfile 이라는 파일을 생성한다.</p>
<p>그 안에 </p>
<pre><code>FROM 

RUN

cmd </code></pre><p>로 넣는데 일단 이해는 되지 않는다. </p>
<p>이제 터미널을 가서 *<em>해당 디렉토리로 이동 후 *</em></p>
<p>sudo docker build ./을 하면 </p>
<p>Step에 따라 임시 컨테이너가 생성 되고 그것을 바탕으로 Step 2
<strong>1c28eed96a5f</strong> 라는 이미지가 생성 된 것을 확인 할 수 있다</p>
<p>(base) hongtae@user:~/바탕화면/<strong>dockerfile-folder</strong>$ <strong>sudo docker build ./</strong>
Sending build context to Docker daemon  2.048kB
<strong>Step 1/2</strong> : FROM alpine
 ---&gt; 6dbb9cc54074
<strong>Step 2/2</strong> : CMD [ &quot;echo&quot;,&quot;hello&quot; ]
 ---&gt; Running in 9332375a52d9
Removing intermediate container 9332375a52d9
 ---&gt; 1c28eed96a5f
Successfully built <strong>1c28eed96a5f</strong></p>
<h1 id="생성-된-이미지-컨테이너-생성-후-실행">생성 된 이미지 컨테이너 생성 후 실행</h1>
<p>sudo docker run <strong>1c28eed96a5f</strong>
<strong>hello</strong></p>
<p>(base) hongtae@user:~/바탕화면/dockerfile-folder$ <strong>sudo docker ps -a</strong>
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS                          PORTS     NAMES
93f7b1afd424   <strong>1c28eed96a5f</strong>   &quot;echo hello&quot;             About a minute ago   Exited (0) About a minute ago             pensive_moore</p>
<h1 id="도커-컨테이너-이름-정해주기">도커 컨테이너 이름 정해주기.</h1>
<p>컨테이너를 생성 후 나오는 긴 이름을 항상 ps 를 통해서 봐야할까? 내가 지정한 이름으로 수정 할 수 없을까? </p>
<p>(base) hongtae@user:~/바탕화면/dockerfile-folder$ <strong>sudo docker build -t gusxoqkqh1/hello:latest ./</strong>
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM alpine
 ---&gt; 6dbb9cc54074
Step 2/2 : CMD [ &quot;echo&quot;,&quot;hello&quot; ]
 ---&gt; Using cache
 ---&gt; 1c28eed96a5f
Successfully built 1c28eed96a5f
Successfully tagged gusxoqkqh1/hello:latest</p>
<p>(base) hongtae@user:~/바탕화면/<strong>dockerfile-folder$ sudo docker run -it gusxoqkqh1/hello</strong>
hello</p>
<h1 id="로컬에서-도커-이미지-생성">로컬에서 도커 이미지 생성</h1>
<h2 id="이미지를-만들어라">이미지를 만들어라</h2>
<p>sudo docker build -t gusxoqkqh1/docker_train:0.1 .
sudo docker run python:3
sudo docker ps -a 
sudo docker images</p>
<h1 id="컨테이너를-생성해라">컨테이너를 생성해라.</h1>
<p>status 값을 보면 알 수 있다. 
도커 == 프로세스
시작과 끝이 있다.</p>
<p><strong>sudo docker run -d -p 8000:8000 --name docker_train gusxoqkqh1/docker_train:0.1</strong></p>
<p>-d 데몬(백그라운드)로 돌리면서 실행 되는것이 안꺼지게 하는것.
-p 포트포워딩 :  외부에서 8000번으로 내 공인망으로 들어올 시 
내 피시에 있는 도커 런서버 8000번이랑 매치 시켜 접속 시켜줘라.
-- name or -n : 명을 지워줘라.
실행할 이미지 명 </p>
<p><strong>4aea6299b5187de144c39ceea46d162c6bec31449785085ba91fd9c089919640</strong></p>
<p>*<em>(docker_train) hongtae@user:~/dev/docker-training$ sudo docker ps *</em> ( 실행중인 컨테이너 확인)</p>
<p>CONTAINER ID   IMAGE                         COMMAND                  CREATED          <strong>STATUS</strong>         PORTS                                       NAMES
4aea6299b518   gusxoqkqh1/docker_train:0.1   &quot;gunicorn --bind 0.0…&quot;   10 seconds ago   Up 9 seconds   0.0.0.0:8000-&gt;8000/tcp, :::8000-&gt;8000/tcp   docker_train</p>
<p>실행되고 있는 도커이미지에 접속 하려면 </p>
<p><strong>sudo docker exec -it docker_train /bin/bash</strong></p>
<p>지훈멘토님이 만들어놓으신 엔드포인트가 있으셔서 테스트</p>
<p>(docker_train) hongtae@user:~/dev/docker-training$ http -v localhost:8000/basic</p>
<pre><code>GET /basic HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: localhost:8000
User-Agent: HTTPie/2.3.0



HTTP/1.1 200 OK
Connection: close
Content-Length: 333
Content-Type: application/json
Date: Mon, 24 May 2021 11:04:17 GMT
Referrer-Policy: same-origin
Server: gunicorn/20.0.4
Vary: Origin
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

[
    {
        &quot;created_at&quot;: &quot;2021-05-24T10:28:08.805&quot;,
        &quot;id&quot;: 1,
        &quot;name&quot;: &quot;??? ??? ?? ??? ??&quot;
    },
    {
        &quot;created_at&quot;: &quot;2021-05-24T10:28:08.817&quot;,
        &quot;id&quot;: 2,
        &quot;name&quot;: &quot;??? ??? ?? ????.&quot;
    },
    {
        &quot;created_at&quot;: &quot;2021-05-24T10:28:08.823&quot;,
        &quot;id&quot;: 3,
        &quot;name&quot;: &quot;?? ?? ???? ??? http://docker.com ??&quot;
    },
    {
        &quot;created_at&quot;: &quot;2021-05-24T10:28:08.833&quot;,
        &quot;id&quot;: 4,
        &quot;name&quot;: &quot;??? ???!!&quot;
    }
]
</code></pre><p>name에 ? 나오는것은 Rds 파라메타에 utf-8mb4를 안해줘서 그렇다 </p>
<h1 id="나의-rds-에-있는-디비-확인">나의 rds 에 있는 디비 확인</h1>
<p>mysql -h wecode-docker.c5e5d6grvspp.ap-northeast-2.rds.amazonaws.com -u root -p</p>
<p>mysql&gt; show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| docker             |
| innodb             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.01 sec)</p>
<p>mysql&gt; use docker;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A</p>
<p>Database changed
mysql&gt; show tables;
+---------------------+
| Tables_in_docker    |
+---------------------+
| basics              |
| django_content_type |
| django_migrations   |
| django_session      |
+---------------------+
4 rows in set (0.00 sec)</p>
<p>mysql&gt; desc basics;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| name       | varchar(100) | NO   |     | NULL    |                |
| created_at | datetime(6)  | NO   |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)</p>
<p>mysql&gt; select * from basics
    -&gt; ;
+----+-------------------------------------+----------------------------+
| id | name                                | created_at                 |
+----+-------------------------------------+----------------------------+
|  1 | ??? ??? ?? ??? ??                   | 2021-05-24 10:28:08.805974 |
|  2 | ??? ??? ?? ????.                    | 2021-05-24 10:28:08.817140 |
|  3 | ?? ?? ???? ??? <a href="http://docker.com">http://docker.com</a> ?? | 2021-05-24 10:28:08.823729 |
|  4 | ??? ???!!                           | 2021-05-24 10:28:08.833574 |
+----+-------------------------------------+----------------------------+
4 rows in set (0.01 sec)</p>
<h1 id="aws-에-배포하기">aws 에 배포하기</h1>
<p>도커 허브에 내 이미지를 올려보기. </p>
<p>(docker_train) hongtae@user:~/dev/docker-training$ <strong>sudo docker login</strong></p>
<p>Login with your Docker ID to push and pull images from Docker Hub. If you don&#39;t have a Docker ID, head over to <a href="https://hub.docker.com">https://hub.docker.com</a> to create one.
도커 허브에 받는 아이디 
Username: <strong>gusxoqkqh1</strong>
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
<a href="https://docs.docker.com/engine/reference/commandline/login/#credentials-store">https://docs.docker.com/engine/reference/commandline/login/#credentials-store</a></p>
<p><strong>Login Succeeded</strong></p>
<p>(docker_train) hongtae@user:~/dev/docker-training$ <strong>sudo docker ps</strong> 
CONTAINER ID   IMAGE                         COMMAND                  CREATED          STATUS          PORTS                                       NAMES
4aea6299b518   <strong>gusxoqkqh1/docker_train:0.1</strong>   &quot;gunicorn --bind 0.0…&quot;   15 minutes ago   Up 15 minutes   0.0.0.0:8000-&gt;8000/tcp, :::8000-&gt;8000/tcp   docker_train</p>
<p>(docker_train) hongtae@user:~/dev/docker-training$ <strong>sudo docker push gusxoqkqh1/docker_train:0.1</strong>
The push refers to repository [docker.io/gusxoqkqh1/docker_train]
5f8652461892: Pushed 
8e70624f3762: Pushed 
0c0e8da8b4a7: Pushed 
0c8d2e0c0785: Pushed 
88ac49c4037d: Mounted from library/python 
001ade22e15c: Mounted from library/python 
97e852d9107e: Mounted from library/python 
1591bf7ec708: Mounted from library/python 
dd3097cd7909: Mounted from library/python 
685934357c89: Mounted from library/python 
ccb9b68523fd: Mounted from library/python 
00bcea93703b: Mounted from library/python 
688e187d6c79: Mounted from library/python 
0.1: digest: sha256:6a235ac8cc60e130b83dc9a42ca8ac3f6d07514846e82e37cbb5f6452cc004c2 size: 3052</p>
<p>푸쉬가 잘 되었나 도커 허브 확인 </p>
<p>*<em>도커 푸시 전 도커 허브 *</em> 
<img src="https://images.velog.io/images/hong_tae/post/6d9a5f4c-cc47-43fe-a926-226acfcfbb4c/image.png" alt=""></p>
<p><strong>도커 푸쉬 후 도커 허브</strong> 
<img src="https://images.velog.io/images/hong_tae/post/8c7f4dd9-531f-4a89-9db2-4bdd9d742c2e/image.png" alt=""></p>
<h1 id="rds-에서-해보려면">rds 에서 해보려면</h1>
<p>ec2 접근해서 도커 install 하고 도커 이미지 pull 이미지명 </p>
<p>잘 되면 run 하면 된다. </p>
<p>*<em>ubuntu..는 한줄한줄 넣어줘야 한다 하아.. *</em></p>
<p>ssh -i x.pem ubuntu@ip</p>
<ul>
<li><p>sudo apt update</p>
</li>
<li><p>sudo apt install apt-transport-https ca-certificates curl software-properties-common</p>
</li>
</ul>
<p>-curl -fsSL <a href="https://download.docker.com/linux/ubuntu/gpg">https://download.docker.com/linux/ubuntu/gpg</a> | sudo apt-key add -</p>
<ul>
<li><p>sudo add-apt-repository &quot;deb [arch=amd64] <a href="https://download.docker.com/linux/ubuntu">https://download.docker.com/linux/ubuntu</a> bionic stable&quot;</p>
</li>
<li><p>sudo apt update</p>
</li>
<li><p>apt-cache policy docker-ce</p>
</li>
<li><p>sudo apt install docker-ce</p>
</li>
</ul>
<h1 id="aws-ec2에-도커-설치-완료">aws ec2에 도커 설치 완료</h1>
<p>ubuntu@ip-172-31-1-69:~$ <strong>docker</strong></p>
<p>Usage:  docker [OPTIONS] COMMAND</p>
<p>A self-sufficient runtime for containers</p>
<p>Options:
      --config string      Location of client config files (default &quot;/home/ubuntu/.docker&quot;)
  -c, --context string     Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default context
                           set with &quot;docker context use&quot;)
  -D, --debug              Enable debug mode
  -H, --host list          Daemon socket(s) to connect to
  -l, --log-level string   Set the logging level (&quot;debug&quot;|&quot;info&quot;|&quot;warn&quot;|&quot;error&quot;|&quot;fatal&quot;) (default &quot;info&quot;)
      --tls                Use TLS; implied by --tlsverify
      --tlscacert string   Trust certs signed only by this CA (default &quot;/home/ubuntu/.docker/ca.pem&quot;)
      --tlscert string     Path to TLS certificate file (default &quot;/home/ubuntu/.docker/cert.pem&quot;)
      --tlskey string      Path to TLS key file (default &quot;/home/ubuntu/.docker/key.pem&quot;)
      --tlsverify          Use TLS and verify the remote
  -v, --version            Print version information and quit</p>
<p>Management Commands:
  app*        Docker App (Docker Inc., v0.9.1-beta3)
  builder     Manage builds
  buildx*     Build with BuildKit (Docker Inc., v0.5.1-docker)
  config      Manage Docker configs
  container   Manage containers
  context     Manage contexts
  image       Manage images
  manifest    Manage Docker image manifests and manifest lists
  network     Manage networks
  node        Manage Swarm nodes
  plugin      Manage plugins
  scan*       Docker Scan (Docker Inc., v0.7.0)
  secret      Manage Docker secrets
  service     Manage services
  stack       Manage Docker stacks
  swarm       Manage Swarm
  system      Manage Docker
  trust       Manage trust on Docker images
  volume      Manage volumes</p>
<p>Commands:
  attach      Attach local standard input, output, and error streams to a running container
  build       Build an image from a Dockerfile
  commit      Create a new image from a container&#39;s changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container&#39;s filesystem
  events      Get real time events from the server
  exec        Run a command in a running container
  export      Export a container&#39;s filesystem as a tar archive
  history     Show the history of an image
  images      List images
  import      Import the contents from a tarball to create a filesystem image
  info        Display system-wide information
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  login       Log in to a Docker registry
  logout      Log out from a Docker registry
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  run         Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  search      Search the Docker Hub for images
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes</p>
<h1 id="도커-로그인">도커 로그인</h1>
<p>ubuntu@ip-172-31-1-69:~$ <strong>sudo docker login</strong>
Login with your Docker ID to push and pull images from Docker Hub. If you don&#39;t have a Docker ID, head over to <a href="https://hub.docker.com">https://hub.docker.com</a> to create one.
Username: <strong>gusxoqkqh1</strong>
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
<a href="https://docs.docker.com/engine/reference/commandline/login/#credentials-store">https://docs.docker.com/engine/reference/commandline/login/#credentials-store</a></p>
<p><strong>Login Succeeded</strong></p>
<h1 id="받아온-이미지-확인-후-컨테이너-만들기">받아온 이미지 확인 후 컨테이너 만들기</h1>
<p>ubuntu@ip-172-31-1-69:<del>$ sudo docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
ubuntu@ip-172-31-1-69:</del>$ sudo docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
ubuntu@ip-172-31-1-69:~$ <strong>sudo docker pull gusxoqkqh1/docker_train:0.1</strong></p>
<p>0.1: Pulling from gusxoqkqh1/docker_train
d960726af2be: Pull complete 
e8d62473a22d: Pull complete 
8962bc0fad55: Pull complete 
65d943ee54c1: Pull complete 
532f6f723709: Pull complete 
1334e0fe2851: Pull complete 
062ada600c9e: Pull complete 
aec2e3a89371: Pull complete 
5c6566073cac: Pull complete 
e66ef42cfce5: Pull complete 
c005c15c4283: Pull complete 
43faf29b599a: Pull complete 
65dc0390a9a1: Pull complete 
Digest: sha256:6a235ac8cc60e130b83dc9a42ca8ac3f6d07514846e82e37cbb5f6452cc004c2
Status: Downloaded newer image for gusxoqkqh1/docker_train:0.1
docker.io/gusxoqkqh1/docker_train:0.1
ubuntu@ip-172-31-1-69:~$ *<em>sudo docker ps *</em>
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES</p>
<p>ubuntu@ip-172-31-1-69:~$ sudo docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES</p>
<p>ubuntu@ip-172-31-1-69:~$ <strong>sudo docker images</strong>
REPOSITORY                TAG       IMAGE ID       CREATED          SIZE
<strong>gusxoqkqh1/docker_train   0.1       1d33d794499f   49 minutes ago   933MB</strong></p>
<p>aws 서버에서 런 서버 
sudo docker run -d -p 8000:8000 --name docker_train gusxoqkqh1/docker_train:0.1</p>
<p>이미 데몬으로 돌아가는 컨테이너는 찾기가 너무 힘들다 걍 remove로 강제 제거 시킬 수 있다.</p>
<p><strong>sudo docker run -d -p 8000:8000 --name docker_train gusxoqkqh1/docker_train:0.1</strong>
docker: Error response from daemon: Conflict. The container name &quot;/docker_train&quot; <strong>is already in use by container</strong> &quot;313f36525d86e0a2e01f0997b8b704bb6684b8f8bd89211c38ec4e630d269c90&quot;. You have to remove (or rename) that container to be able to reuse that name.
See &#39;docker run --help&#39;.
ubuntu@ip-172-31-1-69:<del>$ sudo docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
ubuntu@ip-172-31-1-69:</del>$ <strong>sudo docker remove 313f36525d86e0a2e01f0997b8b704bb6684b8f8bd89211c38ec4e630d269c90</strong>
docker: &#39;remove&#39; is not a docker command.
See &#39;docker --help&#39;
ubuntu@ip-172-31-1-69:<del>$ docker rm 313f36525d86e0a2e01f0997b8b704bb6684b8f8bd89211c38ec4e630d269c90
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Delete http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/313f36525d86e0a2e01f0997b8b704bb6684b8f8bd89211c38ec4e630d269c90: dial unix /var/run/docker.sock: connect: permission denied
ubuntu@ip-172-31-1-69:</del>$ sudo docker rm 313f36525d86e0a2e01f0997b8b704bb6684b8f8bd89211c38ec4e630d269c90
313f36525d86e0a2e01f0997b8b704bb6684b8f8bd89211c38ec4e630d269c90</p>
<p>ubuntu@ip-172-31-1-69:~$ <strong>sudo docker run -d -p 8000:8000 --name docker_train gusxoqkqh1/docker_train:0.1</strong>
b0b58bfcc5ad47a22bff783adac0fe09c848a2d817bdccab7731f4e88077722b</p>
<p>udo docker ps</p>
<p>CONTAINER ID   IMAGE                         COMMAND                  CREATED          STATUS          PORTS                                       NAMES
b0b58bfcc5ad   gusxoqkqh1/docker_train:0.1   &quot;gunicorn --bind 0.0…&quot;   22 seconds ago   Up 21 seconds   0.0.0.0:8000-&gt;8000/tcp, :::8000-&gt;8000/tcp   docker_train</p>
<p>aws 에서 돌고 있는 것은 받아오지 못한다..왜지..?</p>
<p>(base) hongtae@user:~$ <strong>http -v 3.36.26.98:8000/basic</strong>
GET /basic HTTP/1.1
Accept: <em>/</em>
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: 3.36.26.98:8000
User-Agent: HTTPie/2.3.0</p>
<p>http: error: ConnectionError: HTTPConnectionPool(host=&#39;3.36.26.98&#39;, port=8000): Max retries exceeded with url: /basic (Caused by NewConnectionError(&#39;&lt;urllib3.connection.HTTPConnection object at 0x7f0eea1564a8&gt;: Failed to establish a new connection: [Errno 110] Connection timed out&#39;,)) while doing a GET request to URL: <a href="http://3.36.26.98:8000/basic">http://3.36.26.98:8000/basic</a></p>
<p>HTTPConnectionPool(host=&#39;3.36.26.98&#39;, port=8000): Max retries exceeded with url: /basic (Caused by NewConnectionError(&#39;&lt;urllib3.connection.HTTPConnection object at 0x7f0eea1564a8&gt;: Failed to establish a new connection: [Errno 110] Connection timed out&#39;,))</p>
<p>ec2 보안그룹 8000 설정 </p>
<p><img src="https://images.velog.io/images/hong_tae/post/c9a19fc0-1db5-49c4-aab1-de84396271d7/image.png" alt=""></p>
<p>(base) hongtae@user:~$ http -v 3.36.26.98:8000/basic
GET /basic HTTP/1.1
Accept: <em>/</em>
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: 3.36.26.98:8000
User-Agent: HTTPie/2.3.0</p>
<p>HTTP/1.1 200 OK
Connection: close
Content-Length: 333
Content-Type: application/json
Date: Mon, 24 May 2021 12:49:37 GMT
Referrer-Policy: same-origin
Server: gunicorn/20.0.4
Vary: Origin
X-Content-Type-Options: nosniff
X-Frame-Options: DENY</p>
<p>[
    {
        &quot;created_at&quot;: &quot;2021-05-24T10:28:08.805&quot;,
        &quot;id&quot;: 1,
        &quot;name&quot;: &quot;??? ??? ?? ??? ??&quot;
    },
    {
        &quot;created_at&quot;: &quot;2021-05-24T10:28:08.817&quot;,
        &quot;id&quot;: 2,
        &quot;name&quot;: &quot;??? ??? ?? ????.&quot;
    },
    {
        &quot;created_at&quot;: &quot;2021-05-24T10:28:08.823&quot;,
        &quot;id&quot;: 3,
        &quot;name&quot;: &quot;?? ?? ???? ??? <a href="http://docker.com">http://docker.com</a> ??&quot;
    },
    {
        &quot;created_at&quot;: &quot;2021-05-24T10:28:08.833&quot;,
        &quot;id&quot;: 4,
        &quot;name&quot;: &quot;??? ???!!&quot;
    }
]</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ubuntu datagrip(sql idc) 선택 (임시 기록용) ]]></title>
            <link>https://velog.io/@hong_tae/sql-idc-%EC%84%A0%ED%83%9D-%EC%9E%84%EC%8B%9C-%EC%A0%80%EC%9E%A5%EC%9A%A9</link>
            <guid>https://velog.io/@hong_tae/sql-idc-%EC%84%A0%ED%83%9D-%EC%9E%84%EC%8B%9C-%EC%A0%80%EC%9E%A5%EC%9A%A9</guid>
            <pubDate>Thu, 20 May 2021 02:14:01 GMT</pubDate>
            <description><![CDATA[<p>프로젝트 때 사용할 mysql idc dategrip</p>
<p>사용할 os ubuntu </p>
<blockquote>
<p>sudo snap install datagrip --classic
  sudo snap refresh datagrip</p>
</blockquote>
<p>file &gt; new project </p>
<p>좌측 중앙에 + 버튼 &gt; data source &gt; mysql </p>
<p>name = @localhost
HOST = localhost
User = root
Password = ubuntu </p>
<p>apply &gt; ok</p>
<p>show databases;</p>
<p>[2021-05-20 11:12:10] Server returns invalid timezone. Need to set &#39;serverTimezone&#39; property.</p>
<p>(base) hongtae@user:<del>$ date
2021. 05. 20. (목) 11:14:42 KST
(base) hongtae@user:</del>$ *<em>sudo ln -sf /usr/share/zoneinfo/Asia/Seoul *</em>/etc/localtime
[sudo] password for hongtae: 
(base) hongtae@user:~$ date
2021. 05. 20. (목) 11:15:07 KST</p>
<p>mysql&gt; <strong>SELECT @@GLOBAL.time_zone, @@SESSION.time_zone;</strong>
+--------------------+---------------------+
| @@GLOBAL.time_zone | @@SESSION.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+
1 row in set (0.00 sec)</p>
<p>set global time_zone = &#39;Asia/Seoul&#39;;
set time_zone = &#39;Asia/Seoul&#39;;</p>
<p>mysql&gt; set global time_zone = &#39;Asia/Seoul&#39;;
<strong>ERROR 1298 (HY000): Unknown or incorrect time zone: &#39;Asia/Seoul&#39;</strong>
mysql&gt; set time_zone = &#39;Asia/Seoul&#39;;
<strong>ERROR 1298 (HY000): Unknown or incorrect time zone: &#39;Asia/Seoul&#39;</strong></p>
<p>dev.mysql.com/downloads/timezones.html 에서 버전에 맞는 timezone 정보파일을 받는다.</p>
<h2 id="mysql-버전-확인">mysql 버전 확인</h2>
<h2 id="terminal-에서-확인">terminal 에서 확인</h2>
<p>(base) hongtae@user:~$ mysql --version
mysql  Ver 8.0.25 for Linux on x86_64 (MySQL Community Server - GPL)</p>
<h2 id="mysql-서버에서-확인">mysql 서버에서 확인</h2>
<p>mysql&gt; select version();
+-----------+
| version() |
+-----------+
| 8.0.25    |
+-----------+
1 row in set (0.00 sec)</p>
<p>mysql&gt; SHOW VARIABLES LIKE &#39;version&#39;;
+---------------+------------+
| Variable_name | Value      |
+---------------+------------+
| version       | 5.6.23-log |
+---------------+------------+
1 row in set (0.00 sec)</p>
<p><a href="https://dev.mysql.com/doc/refman/8.0/en/">https://dev.mysql.com/doc/refman/8.0/en/</a></p>
<p>8.0 대를 확인 후 mysql 홈피에 들어가 설치한다 </p>
<p>mysql 5.8 이상 </p>
<p>timezone_2021a_leaps_sql.zip - Non POSIX with leap seconds</p>
<p>을 다운</p>
<p>*<em>timezone 디렉토리 압축 해제 후 *</em></p>
<p>sudo mysql -u root -p mysql &lt; ~/다운로드/timezone_2021a_leaps_sql.zip</p>
<p>(base) hongtae@user:~/다운로드$ ll
<strong>d</strong>rwxr-xr-x  2 hongtae hongtae      4096  1월 29 22:48  <strong>timezone_2021a_leaps_sql/</strong></p>
<p>(base) hongtae@user:<del>/다운로드$ cd <strong>timezone_2021a_leaps_sql/</strong>
(base) hongtae@user:</del>/다운로드/timezone_2021a_leaps_sql$ ll
(base) hongtae@user:~/다운로드/timezone_2021a_leaps_sql$ ll
total 1392
drwxr-xr-x 2 hongtae hongtae    4096  1월 29 22:48 ./
drwxr-xr-x 6 hongtae hongtae    4096  5월 20 13:05 ../
-rw-r--r-- 1 hongtae hongtae 1414895  1월 29 22:48 timezone_leaps.sql</p>
<p><strong>파일 밀어넣기 **
(base) hongtae@user:~/다운로드/timezone_2021a_leaps_sql$ **mysql -u root -p mysql &lt; timezone_leaps.sql</strong> </p>
<p>Enter password: 
(base) hongtae@user:~/다운로드/timezone_2021a_leaps_sql$ cd</p>
<p>vi /etc/mysql/mysql.conf.d/mysqld.cnf</p>
<p>default-time-zone=Asia/Seoul 을 맨 아래에 적어넣음</p>
<p>**추가내용</p>
<p>우분투 리눅스 tomcat 서버 시간 + 한국으로 설정하기**</p>
<p>cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime</p>
<p>mysql&gt; select @@global.time_zone
    -&gt; ;
+--------------------+
| @@global.time_zone |
+--------------------+
| *<em>Asia/Seoul *</em>        |
+--------------------+
1 row in set (0.00 sec)</p>
<p>mysql&gt; select @@session.time_zone;
+---------------------+
| @@session.time_zone |
+---------------------+
| <strong>Asia/Seoul</strong>          |
+---------------------+
1 row in set (0.00 sec)</p>
<p>다시 데이터 그립 </p>
<p>File &gt; now &gt; project </p>
<p>좌측 중앙에 + 버튼 &gt; data source &gt; mysql </p>
<p>name = @localhost
HOST = localhost
User = root
Password = ubuntu </p>
<p>database = brandi_test1 
apply &gt; ok </p>
<p>하면 connect 라는 명령어가 뜬다 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[sql 쿼리 ]]></title>
            <link>https://velog.io/@hong_tae/sql-%EC%BF%BC%EB%A6%AC</link>
            <guid>https://velog.io/@hong_tae/sql-%EC%BF%BC%EB%A6%AC</guid>
            <pubDate>Mon, 17 May 2021 00:09:17 GMT</pubDate>
            <description><![CDATA[<h1 id="sql-script">sql script</h1>
<p>create table account_typesql script 
(
    Id           int auto_increment
        primary key,
    account_type varchar(45) not null comment &#39;계정 타입&#39;
)
    comment &#39;계정 분류&#39;;</p>
<p>create table accounts
(
    Id              int auto_increment
        primary key,
    nickname        varchar(20) not null comment &#39;u,a,m 계정 관리&#39;,
    created_at      datetime    not null comment &#39;계정 생성 날짜&#39;,
    account_type_id int         not null comment &#39;계정 타입&#39;,
    constraint FK_accounts_account_type_id_account_type_Id
        foreign key (account_type_id) references account_type (Id)
)
    comment &#39;계정&#39;;</p>
<p>create table action_status
(
    Id     int auto_increment
        primary key,
    status varchar(10) not null comment &#39;상태&#39;
)
    comment &#39;셀러 상품 판매상태&#39;;</p>
<p>create table colors
(
    Id    int auto_increment
        primary key,
    color varchar(10) not null comment &#39;색상&#39;
)
    comment &#39;상품색상&#39;;</p>
<p>create table masters
(
    Id int not null
        primary key,
    constraint FK_masters_Id_accounts_Id
        foreign key (Id) references accounts (Id)
)
    comment &#39;마스터계정&#39;;</p>
<p>create table master_histories
(
    Id         int auto_increment
        primary key,
    master_id  int         not null comment &#39;마스터&#39;,
    is_deleted tinyint     not null comment &#39;삭제 여부&#39;,
    start_time datetime    not null comment &#39;변경 시작일&#39;,
    end_time   datetime    not null comment &#39;변경 종료일&#39;,
    password   varchar(60) not null comment &#39;비밀번호&#39;,
    constraint FK_master_histories_master_id_masters_Id
        foreign key (master_id) references masters (Id)
)
    comment &#39;마스터 히스토리&#39;;</p>
<p>create table order_status
(
    Id           int auto_increment
        primary key,
    order_status varchar(10) not null comment &#39;주문 상태&#39;
)
    comment &#39;주문 상태&#39;;</p>
<p>create table payment_status
(
    Id             int auto_increment
        primary key,
    payment_status varchar(45) not null comment &#39;결제 상태&#39;
)
    comment &#39;결제 상태&#39;;</p>
<p>create table question_categories
(
    Id   int auto_increment
        primary key,
    name varchar(10) null comment &#39;분류 이름&#39;
)
    comment &#39;Q&amp;A 분류&#39;;</p>
<p>create table seller_categories
(
    Id   int auto_increment
        primary key,
    name varchar(8) not null comment &#39;1차 카테고리 명&#39;
)
    comment &#39;셀러_1차분류&#39;;</p>
<p>create table seller_subcategories
(
    Id                 int auto_increment
        primary key,
    seller_category_id int        not null comment &#39;1차 카테고리&#39;,
    name               varchar(8) not null comment &#39;2차 카테고리 명&#39;,
    constraint FK_seller_subcategories_seller_category_id_seller_categories_Id
        foreign key (seller_category_id) references seller_categories (Id)
)
    comment &#39;셀러_2차분류&#39;;</p>
<p>create table sellers
(
    Id                    int not null
        primary key,
    seller_subcategory_id int not null comment &#39;셀러정보&#39;,
    constraint FK_sellers_Id_accounts_Id
        foreign key (Id) references accounts (Id),
    constraint FK_sellers_seller_subcategory_id_seller_subcategories_Id
        foreign key (seller_subcategory_id) references seller_subcategories (Id)
)
    comment &#39;셀러계정&#39;;</p>
<p>create table products
(
    Id         int auto_increment
        primary key,
    account_id int      not null comment &#39;최초 등록자&#39;,
    seller_id  int      not null comment &#39;셀러&#39;,
    created_at datetime not null comment &#39;최초 등록일&#39;,
    constraint FK_products_account_id_accounts_Id
        foreign key (account_id) references accounts (Id),
    constraint FK_products_seller_id_sellers_Id
        foreign key (seller_id) references sellers (Id)
)
    comment &#39;상품&#39;;</p>
<p>create table product_histories
(
    Id                    int auto_increment
        primary key,
    account_id            int            not null comment &#39;수정자&#39;,
    product_id            int            not null comment &#39;상품&#39;,
    name                  varchar(40)    not null comment &#39;상품 이름&#39;,
    shipment_information  varchar(10)    not null comment &#39;배송정보&#39;,
    price                 decimal(10, 2) not null comment &#39;가격&#39;,
    detail_page_html      text           not null comment &#39;상품상세페이지 HTML&#39;,
    discount_rate         decimal(5, 2)  null comment &#39;할인률&#39;,
    discount_start_time   datetime       null comment &#39;할인 시작일&#39;,
    discount_end_time     datetime       null comment &#39;할인 종료일&#39;,
    is_sold               tinyint        not null comment &#39;판매 여부&#39;,
    is_displayed          tinyint        not null comment &#39;진열 여부&#39;,
    minimum_sell_quantity int            null comment &#39;최소 판매수량&#39;,
    maximum_sell_quantity int            null comment &#39;최대 판매수량&#39;,
    comment               varchar(50)    null comment &#39;한줄 상품 설명&#39;,
    start_time            datetime       not null comment &#39;변경 시작일&#39;,
    end_time              datetime       not null comment &#39;변경 종료일&#39;,
    is_deleted            tinyint        not null comment &#39;삭제 여부&#39;,
    constraint FK_product_histories_account_id_accounts_Id
        foreign key (account_id) references accounts (Id),
    constraint FK_product_histories_product_id_products_Id
        foreign key (product_id) references products (Id)
)
    comment &#39;상품 히스토리&#39;;</p>
<p>create table product_images
(
    Id         int auto_increment
        primary key,
    product_id int           not null comment &#39;상품&#39;,
    image_url  varchar(2000) not null comment &#39;이미지 URL&#39;,
    is_main    tinyint       not null comment &#39;대표이미지 여부&#39;,
    constraint FK_product_images_product_id_products_Id
        foreign key (product_id) references products (Id)
)
    comment &#39;상품이미지&#39;;</p>
<p>create table seller_histories
(
    Id                   int auto_increment
        primary key,
    account_id           int           not null comment &#39;수정자&#39;,
    action_status_id     int           not null comment &#39;셀러 상태&#39;,
    seller_id            int           not null comment &#39;셀러&#39;,
    start_time           datetime      not null comment &#39;변경 시작일&#39;,
    end_time             datetime      not null comment &#39;변경 종료일&#39;,
    password             varchar(60)   not null comment &#39;비밀번호&#39;,
    seller_phone_number  varchar(11)   not null comment &#39;셀러 전화번호&#39;,
    korean_name          varchar(23)   not null comment &#39;상호 한글 이름&#39;,
    english_name         varchar(39)   not null comment &#39;상호 영문 이름&#39;,
    header_office_number varchar(11)   not null comment &#39;고객센터 전화번호&#39;,
    cs_office_hour       varchar(11)   not null comment &#39;고객센터 운영시간&#39;,
    refund_information   text          not null comment &#39;교환 환불 정보&#39;,
    is_deleted           tinyint       not null comment &#39;삭제 여부&#39;,
    profile_image_url    varchar(2000) not null comment &#39;셀러 프로필 사진 URL&#39;,
    shipment_information text          not null comment &#39;배송정보&#39;,
    background_image_url varchar(2000) not null comment &#39;셀러 배경 이미지 URL&#39;,
    comment              text          null comment &#39;셀러 한줄 소개&#39;,
    detail_comment       text          not null comment &#39;셀러 상세 소개&#39;,
    cs_nickname          varchar(20)   not null comment &#39;고객센터 카카오톡 아이디&#39;,
    address              varchar(34)   not null comment &#39;상호 택배 주소&#39;,
    constraint FK_seller_histories_account_id_accounts_Id
        foreign key (account_id) references accounts (Id),
    constraint FK_seller_histories_action_status_id_action_status_Id
        foreign key (action_status_id) references action_status (Id),
    constraint FK_seller_histories_seller_id_sellers_Id
        foreign key (seller_id) references sellers (Id)
)
    comment &#39;셀러 히스토리&#39;;</p>
<p>create table seller_clerks
(
    Id                int auto_increment
        primary key,
    seller_id         int          not null comment &#39;셀러&#39;,
    seller_history_id int          not null comment &#39;셀러 히스토리&#39;,
    name              varchar(20)  not null comment &#39;담당자 이름&#39;,
    email             varchar(320) not null comment &#39;담당자 이메일&#39;,
    phone_number      varchar(11)  not null comment &#39;담당자 핸드폰 번호&#39;,
    is_deleted        tinyint      not null comment &#39;삭제 여부&#39;,
    constraint FK_seller_clerks_seller_history_id_seller_histories_Id
        foreign key (seller_history_id) references seller_histories (Id),
    constraint FK_seller_clerks_seller_id_sellers_Id
        foreign key (seller_id) references sellers (Id)
)
    comment &#39;담당자 정보&#39;;</p>
<p>create table shipment_memo
(
    Id      int auto_increment
        primary key,
    content varchar(20) not null comment &#39;내용&#39;
)
    comment &#39;배송 메세지&#39;;</p>
<p>create table shipment_status
(
    Id              int auto_increment
        primary key,
    shipment_status varchar(45) not null comment &#39;배송 상태&#39;
)
    comment &#39;배송 상태&#39;;</p>
<p>create table sizes
(
    Id   int auto_increment
        primary key,
    size varchar(5) not null comment &#39;크기&#39;
)
    comment &#39;상품사이즈&#39;;</p>
<p>create table product_options
(
    Id          int auto_increment
        primary key,
    product_id  int     not null comment &#39;상품&#39;,
    size_id     int     not null comment &#39;크기&#39;,
    color_id    int     not null comment &#39;색상&#39;,
    is_sold_out tinyint not null comment &#39;품절 여부&#39;,
    stock       int     null comment &#39;재고량&#39;,
    constraint FK_product_options_color_id_colors_Id
        foreign key (color_id) references colors (Id),
    constraint FK_product_options_product_id_products_Id
        foreign key (product_id) references products (Id),
    constraint FK_product_options_size_id_sizes_Id
        foreign key (size_id) references sizes (Id)
)
    comment &#39;상품옵션&#39;;</p>
<p>create table users
(
    Id    int          not null
        primary key,
    email varchar(320) not null comment &#39;이메일&#39;,
    constraint FK_users_Id_accounts_Id
        foreign key (Id) references accounts (Id)
)
    comment &#39;일반유저계정&#39;;</p>
<p>create table addresses
(
    Id      int auto_increment
        primary key,
    user_id int not null comment &#39;유저&#39;,
    constraint FK_addresses_user_id_users_Id
        foreign key (user_id) references users (Id)
)
    comment &#39;배송주소&#39;;</p>
<p>create table address_histories
(
    Id           int auto_increment
        primary key,
    address_id   int         not null comment &#39;주소&#39;,
    start_time   datetime    not null comment &#39;변경 시작일&#39;,
    end_time     datetime    not null comment &#39;변경 종료일&#39;,
    name         varchar(20) not null comment &#39;수령인&#39;,
    phone_number varchar(11) not null comment &#39;수령인 전화번호&#39;,
    is_deleted   tinyint     not null comment &#39;삭제 여부&#39;,
    is_defaulted tinyint     not null comment &#39;기본 배송지 여부&#39;,
    address      varchar(34) not null comment &#39;배송지 주소&#39;,
    constraint FK_address_histories_address_id_addresses_Id
        foreign key (address_id) references addresses (Id)
)
    comment &#39;배송지 히스토리&#39;;</p>
<p>create table carts
(
    Id                int auto_increment
        primary key,
    user_id           int not null comment &#39;유저&#39;,
    product_id        int not null comment &#39;상품&#39;,
    product_option_id int not null comment &#39;상품 옵션&#39;,
    constraint FK_carts_product_id_products_Id
        foreign key (product_id) references products (Id),
    constraint FK_carts_product_option_id_product_options_Id
        foreign key (product_option_id) references product_options (Id),
    constraint FK_carts_user_id_users_Id
        foreign key (user_id) references users (Id)
)
    comment &#39;카트에 담긴 상품&#39;;</p>
<p>create table cart_histories
(
    Id         int auto_increment
        primary key,
    cart_id    int      not null comment &#39;카트&#39;,
    start_time datetime not null comment &#39;변경 시작일&#39;,
    end_time   datetime not null comment &#39;변경 종료일&#39;,
    quantity   int      not null comment &#39;수량&#39;,
    is_deleted tinyint  not null comment &#39;삭제 여부&#39;,
    constraint FK_cart_histories_cart_id_carts_Id
        foreign key (cart_id) references carts (Id)
)
    comment &#39;카트 히스토리&#39;;</p>
<p>create table orders
(
    Id         int auto_increment
        primary key,
    user_id    int      not null comment &#39;유저&#39;,
    created_at datetime not null comment &#39;주문 날짜&#39;,
    constraint FK_orders_user_id_users_Id
        foreign key (user_id) references users (Id)
)
    comment &#39;주문&#39;;</p>
<p>create table order_histories
(
    Id                int auto_increment
        primary key,
    payment_status_id int            not null comment &#39;결제 상태&#39;,
    order_id          int            not null comment &#39;주문 번호&#39;,
    start_time        datetime       not null comment &#39;변경 시작일&#39;,
    end_time          datetime       not null comment &#39;변경 종료일&#39;,
    total_price       decimal(10, 2) not null comment &#39;최종 금액&#39;,
    is_canceled       tinyint        not null comment &#39;취소 여부&#39;,
    constraint FK_order_histories_order_id_orders_Id
        foreign key (order_id) references orders (Id),
    constraint FK_order_histories_payment_status_id_payment_status_Id
        foreign key (payment_status_id) references payment_status (Id)
)
    comment &#39;주문 히스토리&#39;;</p>
<p>create table order_products
(
    Id                int auto_increment
        primary key,
    order_id          int not null comment &#39;주문 번호&#39;,
    product_option_id int not null comment &#39;상품 옵션&#39;,
    product_id        int not null comment &#39;상품&#39;,
    constraint FK_order_products_order_id_orders_Id
        foreign key (order_id) references orders (Id),
    constraint FK_order_products_product_id_products_Id
        foreign key (product_id) references products (Id),
    constraint FK_order_products_product_option_id_product_options_Id
        foreign key (product_option_id) references product_options (Id)
)
    comment &#39;주문 상품&#39;;</p>
<p>create table order_product_histories
(
    Id               int auto_increment
        primary key,
    order_status_id  int            not null comment &#39;주문 상태&#39;,
    order_product_id int            not null comment &#39;주문 상품&#39;,
    start_time       datetime       not null comment &#39;변경 시작일&#39;,
    end_time         datetime       not null comment &#39;변경 종료일&#39;,
    is_canceled      tinyint        not null comment &#39;취소 여부&#39;,
    price            decimal(10, 2) not null comment &#39;가격&#39;,
    quantity         int            not null comment &#39;수량&#39;,
    constraint FK_order_product_histories_order_product_id_order_products_Id
        foreign key (order_product_id) references order_products (Id),
    constraint FK_order_product_histories_order_status_id_order_status_Id
        foreign key (order_status_id) references order_status (Id)
)
    comment &#39;주문 상품 히스토리&#39;;</p>
<p>create table questions
(
    Id         int auto_increment
        primary key,
    product_id int      not null comment &#39;상품&#39;,
    user_id    int      not null comment &#39;유저&#39;,
    created_at datetime not null comment &#39;최초 작성 날짜&#39;,
    constraint FK_questions_product_id_products_Id
        foreign key (product_id) references products (Id),
    constraint FK_questions_user_id_users_Id
        foreign key (user_id) references users (Id)
)
    comment &#39;Q&amp;A 질문&#39;;</p>
<p>create table question_answers
(
    Id          int auto_increment
        primary key,
    question_id int      not null comment &#39;Q&amp;A 질문&#39;,
    account_id  int      not null comment &#39;최초 답변자&#39;,
    created_at  datetime not null comment &#39;최초 작성 날짜&#39;,
    constraint FK_question_answers_account_id_accounts_Id
        foreign key (account_id) references accounts (Id),
    constraint FK_question_answers_question_id_questions_Id
        foreign key (question_id) references questions (Id)
)
    comment &#39;Q&amp;A 답변&#39;;</p>
<p>create table question_answer_histories
(
    Id                 int auto_increment
        primary key,
    account_id         int      not null comment &#39;답변 수정자&#39;,
    question_answer_id int      not null comment &#39;Q&amp;A 답변&#39;,
    comment            text     not null comment &#39;답변&#39;,
    start_time         datetime not null comment &#39;변경 시작일&#39;,
    end_time           datetime not null comment &#39;변경 종료일&#39;,
    is_deleted         tinyint  not null comment &#39;삭제여부&#39;,
    constraint FK_question_answer_histories_account_id_accounts_Id
        foreign key (account_id) references accounts (Id),
    constraint FK_question_answer_histories_question_answer_id_question_answers
        foreign key (question_answer_id) references question_answers (Id)
)
    comment &#39;답변 히스토리&#39;;</p>
<p>create table question_histories
(
    Id                   int auto_increment
        primary key,
    question_category_id int      not null comment &#39;Q&amp;A 분류&#39;,
    question_id          int      not null comment &#39;Q&amp;A 질문&#39;,
    start_time           datetime not null comment &#39;변경 시작일&#39;,
    end_time             datetime not null comment &#39;변경 종료일&#39;,
    content              text     not null comment &#39;내용&#39;,
    is_answered          tinyint  not null comment &#39;처리 상태&#39;,
    is_deleted           tinyint  not null comment &#39;삭제 여부&#39;,
    constraint FK_question_histories_question_category_id_question_categories_I
        foreign key (question_category_id) references question_categories (Id),
    constraint FK_question_histories_question_id_questions_Id
        foreign key (question_id) references questions (Id)
)
    comment &#39;Q&amp;A 히스토리&#39;;</p>
<p>create table shipments
(
    Id                 int auto_increment
        primary key,
    order_id           int         not null comment &#39;주문 번호&#39;,
    order_product_id   int         not null comment &#39;주문 상품&#39;,
    address_id         int         not null comment &#39;배송지 주소&#39;,
    shipment_status_id int         not null comment &#39;배송 상태&#39;,
    shipment_memo_id   int         not null comment &#39;배송 메세지&#39;,
    message            varchar(20) null comment &#39;배송메세지 직접입력&#39;,
    start_time         datetime    null comment &#39;배송 시작&#39;,
    end_time           datetime    null comment &#39;배송 종료&#39;,
    constraint FK_shipments_address_id_addresses_Id
        foreign key (address_id) references addresses (Id),
    constraint FK_shipments_order_id_orders_Id
        foreign key (order_id) references orders (Id),
    constraint FK_shipments_order_product_id_order_products_Id
        foreign key (order_product_id) references order_products (Id),
    constraint FK_shipments_shipment_memo_id_shipment_memo_Id
        foreign key (shipment_memo_id) references shipment_memo (Id),
    constraint FK_shipments_shipment_status_id_shipment_status_Id
        foreign key (shipment_status_id) references shipment_status (Id)
)
    comment &#39;배송 정보&#39;;</p>
<p>create table social_user
(
    Id            int auto_increment
        primary key,
    user_id       int         not null comment &#39;유저&#39;,
    name          varchar(10) not null comment &#39;소셜 이름&#39;,
    social_number int         not null comment &#39;소셜 회원번호&#39;,
    constraint FK_social_user_user_id_users_Id
        foreign key (user_id) references users (Id)
)
    comment &#39;소셜 유저&#39;;</p>
<p>create table social_user_histories
(
    Id             int auto_increment
        primary key,
    social_user_id int         not null comment &#39;소셜 유저&#39;,
    start_time     datetime    not null comment &#39;변경 시작일&#39;,
    end_time       datetime    not null comment &#39;변경 종료일&#39;,
    is_deleted     tinyint     not null comment &#39;삭제 여부&#39;,
    phone_number   varchar(11) not null comment &#39;핸드폰 번호&#39;,
    constraint FK_social_user_histories_social_user_id_social_user_Id
        foreign key (social_user_id) references social_user (Id)
)
    comment &#39;소셜 유저 히스토리&#39;;</p>
<p>create table user_histories
(
    Id         int auto_increment
        primary key,
    user_id    int         not null comment &#39;유저&#39;,
    start_time datetime    not null comment &#39;변경 시작일&#39;,
    end_time   datetime    not null comment &#39;변경 종료일&#39;,
    is_deleted tinyint     not null comment &#39;삭제 여부&#39;,
    password   varchar(60) not null comment &#39;비밀번호&#39;,
    constraint FK_user_histories_user_id_users_Id
        foreign key (user_id) references users (Id)
)
    comment &#39;일반 유저 히스토리&#39;;</p>
<h1 id="test-create-script">test create script</h1>
<p>-- 계정 타입 테스트 데이터
INSERT INTO account_type (account_type)
VALUES (&#39;master&#39;), (&#39;seller&#39;), (&#39;user&#39;);</p>
<p>-- 셀러 상태 테스트 데이터
INSERT INTO action_status (status)
VALUES (&#39;입점&#39;), (&#39;입점대기&#39;), (&#39;퇴점&#39;), (&#39;퇴점대기&#39;), (&#39;휴점&#39;);</p>
<p>-- 셀러 카테고리 테스트 데이터
INSERT INTO seller_categories (name)
VALUES (&#39;카테고리1&#39;), (&#39;카테고리2&#39;);</p>
<p>-- 셀러 서브카테고리 테스트 데이터
INSERT INTO seller_subcategories (seller_category_id, name)
VALUES (1, &#39;쇼핑몰&#39;), (1, &#39;로드샵&#39;), (1, &#39;핸드메이드&#39;);</p>
<p>-- 질문 카테고리 테스트 데이터
INSERT INTO question_categories (name)
VALUES (&#39;배송&#39;), (&#39;결제&#39;), (&#39;환불&#39;);</p>
<p>-- 결제 상태 테스트 데이터
INSERT INTO payment_status (payment_status)
VALUES (&#39;결제대기&#39;), (&#39;결제완료&#39;);</p>
<p>-- 주문 상태 테스트 데이터
INSERT INTO order_status (order_status)
VALUES (&#39;주문완료&#39;), (&#39;환불&#39;), (&#39;교환&#39;), (&#39;구매확정&#39;);</p>
<p>-- 배송 상태 테스트 데이터
INSERT INTO shipment_status (shipment_status)
VALUES (&#39;배송준비중&#39;), (&#39;배송중&#39;), (&#39;배송완료&#39;);</p>
<p>-- 배송 메세지 테스트 데이터
INSERT INTO shipment_memo (content)
VALUES (&#39;문 앞&#39;), (&#39;경비실&#39;), (&#39;올 때 전화&#39;), (&#39;직접입력&#39;);</p>
<p>-- 계정 테스트 데이터
INSERT INTO accounts (nickname, created_at, account_type_id)
VALUES (&#39;TEST_MASTER&#39;, NOW(), 1), (&#39;TEST_SELLER_1&#39;, NOW(), 2), (&#39;TEST_SELLER_2&#39;, NOW(), 2), (&#39;TEST_USER_1&#39;, NOW(), 3), (&#39;TEST_USER_2&#39;, NOW(), 3);</p>
<p>-- 마스터 계정 테스트 데이터
INSERT INTO masters (Id)
VALUES (1);</p>
<p>-- 셀러 계정 테스트 데이터
insert into sellers (Id, seller_subcategory_id)
values (2, 1), (3, 2);</p>
<p>-- 셀러 계정 히스토리 테스트 데이터
insert into seller_histories (account_id, action_status_id, seller_id, start_time, end_time, password, seller_phone_number, korean_name, english_name, header_office_number, cs_office_hour, refund_information, is_deleted, profile_image_url, shipment_information, background_image_url, comment, detail_comment, cs_nickname, address)
values (1, 1, 2, now(), &#39;9999-12-31 23:59:59&#39;, &#39;test_password&#39;, &#39;01011112222&#39;, &#39;테스트샵&#39;, &#39;testshop&#39;, &#39;021113333&#39;, &#39;09001800&#39;, &#39;교환/환불 불가&#39;, 0, &#39;<a href="http://test.com/image&#39;">http://test.com/image&#39;</a>, &#39;당일배송&#39;, &#39;<a href="http://test.com/bgimage&#39;">http://test.com/bgimage&#39;</a>, &#39;test comment&#39;, &#39;test detail comment&#39;, &#39;kakao test&#39;, &#39;강남구 테헤란로&#39;);
insert into seller_histories (account_id, action_status_id, seller_id, start_time, end_time, password, seller_phone_number, korean_name, english_name, header_office_number, cs_office_hour, refund_information, is_deleted, profile_image_url, shipment_information, background_image_url, comment, detail_comment, cs_nickname, address)
values (1, 1, 3, now(), &#39;9999-12-31 23:59:59&#39;, &#39;test_password_2&#39;, &#39;01011113333&#39;, &#39;브랜디&#39;, &#39;brandi&#39;, &#39;0312223333&#39;, &#39;09001800&#39;, &#39;교환/환불 불가&#39;, 0, &#39;<a href="http://brandi.com/image&#39;">http://brandi.com/image&#39;</a>, &#39;당일배송&#39;, &#39;<a href="http://brandi.com/bgimage&#39;">http://brandi.com/bgimage&#39;</a>, &#39;test comment2&#39;, &#39;test detail comment2&#39;, &#39;cacao test&#39;, &#39;강남구 언주로&#39;);</p>
<p>-- 유저 계정 테스트 데이터
INSERT INTO users(Id, email)
VALUES (4, &#39;aaa123@naver.com&#39;), (5, &#39;bbb234@gmail.com&#39;);</p>
<p>-- 유저 계정 히스토리 테스트 데이터
INSERT INTO user_histories(user_id, start_time, end_time, is_deleted, password)
VALUES (4, NOW(), &#39;9999-12-31 23:59:59&#39;, 0, &#39;user123&#39;), (5, NOW(), &#39;9999-12-31 23:59:59&#39;, 0, &#39;user456&#39;);</p>
<p>-- 상품 테스트 데이터
INSERT INTO products(account_id, seller_id, created_at)
VALUES (1, 2, NOW()), (2, 2, NOW()),(2, 2, NOW()), (3, 3, NOW());</p>
<p>-- 상품 히스토리 테스트 데이터
INSERT INTO product_histories(account_id, product_id, name, shipment_information, price, detail_page_html, discount_rate, discount_start_time, discount_end_time, is_sold, is_displayed, minimum_sell_quantity, maximum_sell_quantity, comment, start_time, end_time, is_deleted)
VALUES (1, 1, &#39;롱슬리브&#39;, &#39;브랜디 배송&#39;, 30000, &#39;test_html&#39;, 10, &#39;2021-04-01 23:59:59&#39;, &#39;2021-05-31 23:59:59&#39;, 1, 1, 1, 5, &#39;여름에 입기 좋은 긴팔티&#39;, now(), &#39;9999-12-31 23:59:59&#39;, 0);
INSERT INTO product_histories(account_id, product_id, name, shipment_information, price, detail_page_html, discount_rate, discount_start_time, discount_end_time, is_sold, is_displayed, minimum_sell_quantity, maximum_sell_quantity, comment, start_time, end_time, is_deleted)
VALUES (2, 2, &#39;숏슬리브&#39;, &#39;직접 배송&#39;, 20000, &#39;test_html2&#39;,  null, null, null, 1, 1, 1, 10, &#39;시원한 반팔티&#39;, now(), &#39;9999-12-31 23:59:59&#39;, 0);</p>
<p>-- 상품 이미지 테스트 데이터
INSERT INTO product_images(product_id, image_url, is_main)
VALUES (1, &#39;test_url_1&#39;, TRUE), (1, &#39;test_url_2&#39;, FALSE), (2, &#39;test_url_3&#39;, TRUE);</p>
<p>-- 상품 사이즈 테스트 데이터
INSERT INTO sizes(size)
VALUES (&#39;XS&#39;), (&#39;S&#39;), (&#39;M&#39;), (&#39;L&#39;), (&#39;XL&#39;);</p>
<p>-- 상품 색상 테스트 데이터
INSERT INTO colors(color)
VALUES (&#39;red&#39;), (&#39;green&#39;), (&#39;blue&#39;), (&#39;black&#39;), (&#39;white&#39;);</p>
<p>-- 상품 옵션 테스트 데이터
INSERT INTO product_options(product_id, size_id, color_id, is_sold_out, stock)
VALUES (1, 1, 1, FALSE, 10), (1, 2, 1, FALSE, 10), (1, 3, 1, FALSE, 10), (1, 4, 1, FALSE, 10), (1, 5, 1, FALSE, 10);</p>
<p>-- 상품 질문 테스트 데이터
INSERT INTO questions(product_id, user_id, created_at)
VALUES (1, 4, NOW()), (1, 5, NOW()), (2, 4, NOW());</p>
<p>-- 상품 질문 히스토리 테스트 데이터
INSERT INTO question_histories(question_category_id, question_id, start_time, end_time, content, is_answered, is_deleted)
VALUES (1, 3, NOW(), &#39;9999-12-31 23:59:59&#39;, &#39;짊문 내용입니다.&#39;, FALSE, FALSE);</p>
<p>-- 상품 질문 답변 테스트 데이터
INSERT INTO question_answers(question_id, account_id, created_at)
VALUES (3, 1, NOW());</p>
<p>-- 상품 질문 답변 히스토리 테스트 데이터
INSERT INTO question_answer_histories(account_id, question_answer_id, comment, start_time, end_time, is_deleted)
VALUES (1, 1, &#39;답변 내용입니다.&#39;, NOW(), &#39;9999-12-31 23:59:59&#39;, FALSE);</p>
<h1 id="사용-방법">사용 방법</h1>
<pre><code>create database [DB이름];</code></pre><ol start="2">
<li>생성한 데이터베이스를 선택하고 sql파일을 순서대로 실행. 순서대로 테이블 생성, 테스트 데이터 Insert하는 SQL 파일.</li>
</ol>
<pre><code>&gt; use [DB이름];

&gt; source brandi_script.sql;

&gt; source brandi_test_create_data.sql;</code></pre><p>sql파일이 있는 위치에서 mysql 접속을 하고 위와 같이 실행하면 sql파일이 실행된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[위코드 브랜디 협업 프로젝트 ]]></title>
            <link>https://velog.io/@hong_tae/%EC%9C%84%EC%BD%94%EB%93%9C-%EB%B8%8C%EB%9E%9C%EB%94%94-%ED%98%91%EC%97%85-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</link>
            <guid>https://velog.io/@hong_tae/%EC%9C%84%EC%BD%94%EB%93%9C-%EB%B8%8C%EB%9E%9C%EB%94%94-%ED%98%91%EC%97%85-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</guid>
            <pubDate>Mon, 10 May 2021 14:58:50 GMT</pubDate>
            <description><![CDATA[<p>오늘은 위코드 마지막달로서 1달 기업 협업을 나가는 날이다</p>
<p>나는 브랜디라는 여성들에게 꽤나 알려져있는 곳으로 배정이 되었다 .</p>
<p>오전에는 1달동안 프로젝트를 진행할 사이트 일부분과 진행 스케쥴등을 담당자님께서 설명 해주셧다</p>
<p><strong>이번주는 크게 3개의 역할</strong>이 맡아졌다 </p>
<ul>
<li><p>1명 : 플라스크 초기셋팅 </p>
</li>
<li><p>1명 : 레스트풀 api 설정하기 ( url 경로지정, 동작에 맞는 메소드 설정) </p>
</li>
<li><p>3명 : aquerytool을 이용한 논리적 모델링 ! </p>
</li>
</ul>
<p>난 모델링을 자원했다 .</p>
<p>일단 오늘은 세세한 컬럼보다 크게 틀만 잡았다.</p>
<h1 id="논리적-모델링">논리적 모델링.</h1>
<ul>
<li>일단 유저 부분은 유저, 셀러,마스터 크게 3개로 나눠진다 </li>
</ul>
<p>유저는 제품을 구매하는 소비자
셀러는 제품을 판매하는 판매자
마스터는 셀러의 제품을 관리 해주는 담당자</p>
<p>나는 처음에 이 3개의 테이블을 각각 따로 빼서 관리 하려 했으나 
실무에서는 계정관리의 번거로움을 막기위해 Account 테이블을 따로 두어 계정에 따른 권한을 따로 준다했다 </p>
<p><img src="https://images.velog.io/images/hong_tae/post/60837565-d00c-4e3b-985e-0317376c1aa7/image.png" alt=""></p>
<h1 id="판매자-테이블">판매자 테이블</h1>
<p>한명의 판매자는 브랜디에 입점할 떄 </p>
<p>입점 신청, 입점, 휴점,휴점대기, 휴점 등 여러개의 상태값을 가지고있다. 
<img src="https://images.velog.io/images/hong_tae/post/8ea9d36e-16a8-4bf5-83cc-562897db0c51/image.png" alt=""></p>
<p>판매자는 1차 카테고리로 btob,btoc등 쇼핑몰, 마켓,로드샵,홈데크등 이있고 2차에는 
의류, 신발 등 하위 제품이 있다 아직은 잘 모르지만 일단
<img src="https://images.velog.io/images/hong_tae/post/96775bef-c462-4404-a58f-0aeef5ac9f60/image.png" alt=""></p>
<p>판매자는는  여러개의 2차 카테고리를 선택 할 수 있고 
1차 카테고리는 여러개의 2차 카테고리를 가질 수 있고 </p>
<p><img src="https://images.velog.io/images/hong_tae/post/73f4be73-eab3-4dbd-95f3-fa542d7b8324/image.png" alt=""></p>
<h1 id="유저-테이블">유저 테이블</h1>
<p>일단 한명의 유저는 카트에 여러개의 물건을 담을 수 있고 주문 또 한, 여러개 할 수 있다.</p>
<p><img src="https://images.velog.io/images/hong_tae/post/9d72d73b-fdf0-45b4-907e-e6efbb366883/image.png" alt=""></p>
<p>한 유저는 구매 전 , 상품에 대한 여러개의 Q&amp;A를 달 수 있으며 Q&amp;A는 여러개의 항목이 있다.</p>
<p>구매 하기 전 3개의 주소를 등록 할 수 있다 .</p>
<p><img src="https://images.velog.io/images/hong_tae/post/6fb965f0-cd32-449a-939c-23339644320b/image.png" alt=""></p>
<h1 id="제품-테이블">제품 테이블</h1>
<p>하나의 제품에는 여러개 칼라,사이즈,stock이 있고 또 이들도 제품마다 들어간다 </p>
<p>그래서 product_options를 중앙테이블로 놓았다. ( 아직 manytomany는 안해놓았다)
<img src="https://images.velog.io/images/hong_tae/post/b387a5f5-e1ce-4e13-9df2-0f4744d556c1/image.png" alt=""></p>
<p>상품과 주문 사이에 order_products가 대신 하였다. </p>
<p><img src="https://images.velog.io/images/hong_tae/post/0ea76173-ce47-4123-94ce-16777ecc2d26/image.png" alt=""></p>
<h1 id="이번주-프로젝트를-위해-준비-해야-할-일-">이번주 프로젝트를 위해 준비 해야 할 일 ,</h1>
<ul>
<li>sql 쿼리문 </li>
<li>플라스크 프레임워크 </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로젝트 장고 쉘을 이용하여 OEM 사용하기. ]]></title>
            <link>https://velog.io/@hong_tae/%EC%9E%A5%EA%B3%A0-%EC%89%98%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-OEM-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@hong_tae/%EC%9E%A5%EA%B3%A0-%EC%89%98%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-OEM-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 08 May 2021 11:54:44 GMT</pubDate>
            <description><![CDATA[<p>쉘 데이터 조회</p>
<p> 처음에 장고를 할 때 shell을 피하고 Views 로 먼저 갔던 적이 있었다 정말 안좋은 습관이다 무조건 shell로 먼저 확인 후 적용시켜라 멘토님한테 정말  많이 혼났다 .. 힝..ㅠ 나두 쓰고 싶지만 어려븐디 어쪄ㅠ 안 혼나기 위해.. 연습했다 </p>
<h2 id="쉘-데이터-조회-할-때마다-제대로-이해-하지-못하고-대강-쓰는-경우가-많았다-차근차근-제대로-이해하고-가보자-일단-쉽게-눈에-익는것도-중요하지만-이건-손에-먼저-익는게-중요한거-같다-반복작업">쉘 데이터 조회 할 때마다 제대로 이해 하지 못하고 대강 쓰는 경우가 많았다. 차근차근 제대로 이해하고 가보자 일단 쉽게 눈에 익는것도 중요하지만 이건 손에 먼저 익는게 중요한거 같다 반복작업!</h2>
<p>핵심. 프론트엔드 요청에 따라 다르겠지만 json형식으로 들어온 요청을 전달하려면 파이썬에서 비슷한 딕셔너리 형식으로 전달 해주어야 한다.</p>
<p><img src="https://images.velog.io/images/hong_tae/post/304b529c-2550-47b2-a3f5-64cbf777a915/image.png" alt=""></p>
<p>all이나 filter로 조회해 나오는 
QuerySet은 장고에서 지원하는 객체이며 
다수의 데이터를 가져오는 것이라 한다 </p>
<p>( 나도 손에는 익었지만 제대로된 설명을 할 정도의 실력은 되지 못한다 쩝..)</p>
<p><img src="https://images.velog.io/images/hong_tae/post/5843cd91-a93e-4df7-99ef-a3c48fa7e08f/image.png" alt=""></p>
<ol>
<li>다수 말고 하나의 로우의 컬럼만 출력하기는 쉽다.
현재 products에는 많은 컬럼이 존재한다 <blockquote>
</blockquote>
</li>
</ol>
<p><strong>Product.objects.all()</strong>
In [117]: Product.objects.all()
Out[117]: <strong>&lt;QuerySet</strong> [&lt;Product: Product object (1)&gt;, &lt;Product: Product object (2)&gt;, &lt;Product: Product object (3)&gt;, &lt;Product: Product object (4)&gt;, &lt;Product: Product object (5)&gt;, &lt;Product: Product object (6)&gt;, &lt;Product: Product object (7)&gt;, &lt;Product: Product object (8)&gt;, &lt;Product: Product object (9)&gt;, &lt;Product: Product object (10)&gt;, &lt;Product: Product object (11)&gt;, &lt;Product: Product object (12)&gt;, &lt;Product: Product object (13)&gt;, &lt;Product: Product object (14)&gt;, &lt;Product: Product object (15)&gt;, &lt;Product: Product object (16)&gt;, &lt;Product: Product object (17)&gt;, &lt;Product: Product object (18)&gt;, &lt;Product: Product object (19)&gt;, &lt;Product: Product object (20)&gt;, &#39;...(remaining elements truncated)...&#39;]&gt;</p>
<h1 id="1-정참조-역참조로-하나의-컬럼만-출력">1. 정참조 역참조로 하나의 컬럼만 출력</h1>
<p>정참조란 밑에 product 테이블 기준으로 보이는? 참조하고 있는 ? 컬럼을 말한다 
즉 product는 city의 정로를 알 수 있다 .</p>
<pre><code>class Product(models.Model):

    city        = models.ForeignKey(&#39;City&#39;, on_delete=models.SET_NULL, null=True)</code></pre><p>정참조 조회는 뒤에 &quot;.&quot; 을 넣어주면 된다 .</p>
<blockquote>
<p>In [118]: Product.objects.get(id=1).name
Out[118]: &#39;파라다이스 호텔 부산&#39;</p>
</blockquote>
<blockquote>
<p>In [119]: Product.objects.get(id=1).city.name
Out[119]: &#39;부산&#39;</p>
</blockquote>
<p>역참조 조회
역참조 조회는 </p>
<p>product 테이블은 city를 가지고 있지만 반대로 city에서는 product 컬럼을 알지 못한다.
그래서 &#39;_set&#39; 이라는 것을 사용 해야 한다.</p>
<pre><code>class City(models.Model):
    name = models.CharField(max_length=45, null=True)
</code></pre><p><img src="https://images.velog.io/images/hong_tae/post/3db85ba8-cce7-4cf0-9301-527f907e1f9b/image.png" alt=""></p>
<p>city 입장에서는 product을 조회하려면 뒤에_set을 넣어줘야 한다.</p>
<blockquote>
<p>In [123]: city.product_set.name
&lt;아무것도 안나옴&gt;
In [125]: city.product_set.get(id=1).name
Out[125]: &#39;파라다이스 호텔 부산&#39;</p>
</blockquote>
<h1 id="2-정참조-역참조를-이용하여-여러개-로우-출력">2. 정참조 역참조를 이용하여 여러개 로우 출력</h1>
<p>아까처럼 get을 이용하여 테이블의 하나의 컬럼만 출력하기는 어렵지 않지만 다수의 컬럼을 출력하기에는 
많이 복잡하다 아니 내가 못해서 그렇다.</p>
<p>일단 정참조로 해보자 이때 쿼리셋인 all,filter를 사용해야 하며 우리는 쿼리셋을 <strong>리스트로 벗기는 작업</strong>을 같이 해야한다 </p>
<p>목적지의 정보를 출력하기 위해 카테고리에서 시작해보자</p>
<blockquote>
<p>In [128]: Category.objects.get(id=1).destination.all()
Out[128]: &lt;QuerySet [&lt;Destination: Destination object (1)&gt;, &lt;Destination: Destination object (2)&gt;, &lt;Destination: Destination object (3)&gt;]&gt;</p>
</blockquote>
<ul>
<li><p>for문 가지고 놀기 
all, values,filter </p>
</li>
<li><p>all()</p>
<blockquote>
<p>In [139]: for destination in Category.objects.get(id=1).destination.<strong>all()</strong> :
   ...:     destination
   ...: 
In [140]: destination
Out[140]: &lt;Destination: Destination object (3)&gt;
In [145]: destination.name
Out[145]: &#39;서울&#39;</p>
</blockquote>
</li>
<li><p>values</p>
<blockquote>
<p>In [146]: for destination in Category.objects.get(id=1).destination.<strong>values()</strong> :
   ...:     destination
   ...: 
In [147]: destination
Out[147]: 
{&#39;id&#39;: 3,
&#39;name&#39;: &#39;서울&#39;,
&#39;image_url&#39;: &#39;&quot;<a href="https://d2mgzmtdeipcjp.cloudfront.net/files/main/2016/10/14768018488168.png&quot;&#39;%7D">https://d2mgzmtdeipcjp.cloudfront.net/files/main/2016/10/14768018488168.png&quot;&#39;}</a>
In [148]: type(destination)
Out[148]: dict</p>
</blockquote>
</li>
<li><p>filter</p>
<blockquote>
<p>for destination in Category.objects.get(id=1).destination.<strong>filter(name=&#39;서울&#39;)</strong> :
   ...:     destination
   ...: 
In [150]: 
In [150]: destination
Out[150]: &lt;Destination: Destination object (3)&gt;</p>
</blockquote>
</li>
<li><p>list()를 사용하여 쿼리셋 벗기기 </p>
<blockquote>
<p>In [152]: list(Category.objects.all())
   ...: 
Out[152]: 
[&lt;Category: Category object (1)&gt;,
&lt;Category: Category object (2)&gt;,
&lt;Category: Category object (3)&gt;]</p>
</blockquote>
<ul>
<li><strong>리스트 컴프리헨션을 이용( 내가 자주 사용하는것)</strong></li>
</ul>
</li>
</ul>
<blockquote>
<p> In [154]: [ destination.name for destination in Category.objects.get(id=1).destination.all()]
     ...: 
     ...: 
     ...: 
Out[154]: [&#39;부산 &#39;, &#39;강원도&#39;, &#39;서울&#39;]</p>
</blockquote>
<p>출력 해야 할 리스트가 많을 때, 하나의 컬럼을 출력하는 리스트 컴프리헨션보다 훨씬 가독성이 좋다.</p>
<blockquote>
<p>In [159]: destination_list = [
     ...:     {
     ...:     &#39;name&#39;  : destination.name,
     ...:     &#39;image&#39; : destination.image_url,
     ...:     } for destination  in Category.objects.all()]
     ...:<br>In [160]: destination_list
Out[160]: 
[{&#39;name&#39;: &#39;투어&amp;티켓&#39;,
  &#39;image&#39;: &#39;&quot;<a href="https://d2mgzmtdeipcjp.cloudfront.net/files/upload/15785505026708.png&quot;&#39;%7D">https://d2mgzmtdeipcjp.cloudfront.net/files/upload/15785505026708.png&quot;&#39;}</a>,
 {&#39;name&#39;: &#39;숙소&#39;,
  &#39;image&#39;: &#39;&quot;<a href="https://d2mgzmtdeipcjp.cloudfront.net/files/upload/15930630727169.png&quot;&#39;%7D">https://d2mgzmtdeipcjp.cloudfront.net/files/upload/15930630727169.png&quot;&#39;}</a>,
 {&#39;name&#39;: &#39;레스토랑&#39;,
  &#39;image&#39;: &#39;&quot;<a href="https://d2mgzmtdeipcjp.cloudfront.net/files/categories/15785570317076.png&quot;&#39;%7D%5D">https://d2mgzmtdeipcjp.cloudfront.net/files/categories/15785570317076.png&quot;&#39;}]</a></p>
</blockquote>
<p>In [161]: type(destination_list)
Out[161]: list</p>
<p>이제 역참조를 가져와보자.
category테이블에서 역참조를 이용하여 product 컬럼을 조회해보자</p>
<blockquote>
<p>In [164]: Category.objects.get(id=2).product_set.all().name</p>
</blockquote>
<hr>
<p>AttributeError                            Traceback (most recent call last)
<ipython-input-164-fa106810f122> in <module>
----&gt; 1 Category.objects.get(id=2).product_set.all().name
AttributeError: <strong>&#39;QuerySet&#39; object has no attribute &#39;name&#39;</strong></p>
<blockquote>
<p>In [171]: Category.objects.get(id=2).product_set.all()[0].name
Out[171]: &#39;파라다이스 호텔 부산&#39;</p>
</blockquote>
<p>  막상 해보니 간단한거 같기도..? </p>
<blockquote>
<p>  In [178]: [category.name for category in Category.objects.get(id=2).product_set.all()]
Out[178]: 
[&#39;파라다이스 호텔 부산&#39;,
 &#39;시그니엘 부산&#39;,
 &#39;신라스테이 해운대&#39;,
 &#39;라마다 앙코르 해운대&#39;,
 &#39;힐튼 부산&#39;,
 &#39;호텔 아마레 부산&#39;,
 &#39;넘버25 호텔&#39;,
 &#39;구포역 아몬드 호텔&#39;,
 &#39;호텔 아몬드 부산역&#39;,
 &#39;인 호텔&#39;,
 &#39;일로이리조트&#39;,
 &#39;GB 골든베이&#39;,
 &#39;부산 넛지567펜션&#39;,
 &#39;부산 비치하임 펜션&#39;,
 &#39;부산 해오름펜션&#39;,
 &#39;동백섬 게스트하우스&#39;,
 &#39;놀\xa0게스트하우스&#39;,
 &#39;이코노미 게스트하우스&#39;,
 &#39;휴 플러스 게스트하우스&#39;,
 &#39;캘리 호스텔&#39;,
 &#39;TGI 프라이데이 (TGIF) - 부산동래점&#39;,
 &#39;부산 파라다이스호텔 온더플레이트 뷔페&#39;,
 &#39;부산 파라다이스호텔 닉스그릴 - 브런치&#39;,
 &#39;부산 수영구 오후의 홍차 - 온라인 독점&#39;,
 &#39;롯데호텔부산 무궁화 레스토랑&#39;,
 &#39;부산 켄트호텔 by  켄싱턴 스카이라운지 브런치&#39;,
 &#39;스페인클럽 해운대점&#39;,
 &#39;온더보더 부산 서면점&#39;,
 &#39;롯데호텔 부산 더 라운지 애프터눈 티 이용권&#39;,
 &#39;롯데호텔 부산 더 라운지 뷔페&#39;]
  In [179]: type([category.name for category in Category.objects.get(id=2).product_set.all()])
Out[179]: list</p>
</blockquote>
<p><strong>_set.first().(컬럼명)</strong></p>
<ul>
<li>first() : 데이타들 중 처음에 있는 <strong>row만을 리턴</strong>한다. 아래는 name필드로 정렬했을 때 처음 row를 리턴한다.</li>
</ul>
<blockquote>
<p>in [197]:  best_product_list=[{
     ...: &#39;name&#39;  : destination.category_set.first().name,
     ...: &#39;image&#39; : destination.category_set.first().image_url,
     ...: }for destination in Destination.objects.all()]
In [198]: best_product_list
Out[198]: 
[{&#39;name&#39;: &#39;투어&amp;티켓&#39;,
  &#39;image&#39;: &#39;&quot;<a href="https://d2mgzmtdeipcjp.cloudfront.net/files/upload/15785505026708.png&quot;&#39;%7D">https://d2mgzmtdeipcjp.cloudfront.net/files/upload/15785505026708.png&quot;&#39;}</a>,
 {&#39;name&#39;: &#39;투어&amp;티켓&#39;,
  &#39;image&#39;: &#39;&quot;<a href="https://d2mgzmtdeipcjp.cloudfront.net/files/upload/15785505026708.png&quot;&#39;%7D">https://d2mgzmtdeipcjp.cloudfront.net/files/upload/15785505026708.png&quot;&#39;}</a>,
 {&#39;name&#39;: &#39;투어&amp;티켓&#39;,
  &#39;image&#39;: &#39;&quot;<a href="https://d2mgzmtdeipcjp.cloudfront.net/files/upload/15785505026708.png&quot;&#39;%7D%5D">https://d2mgzmtdeipcjp.cloudfront.net/files/upload/15785505026708.png&quot;&#39;}]</a></p>
</blockquote>
<p>In [199]: type(best_product_list)
Out[199]: list</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로젝트 테이블 csv 파일을 이용하여 로우에 데이터 입력하기]]></title>
            <link>https://velog.io/@hong_tae/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%85%8C%EC%9D%B4%EB%B8%94-%EB%A1%9C%EC%9A%B0%EC%97%90-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%9E%85%EB%A0%A5%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@hong_tae/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%85%8C%EC%9D%B4%EB%B8%94-%EB%A1%9C%EC%9A%B0%EC%97%90-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%9E%85%EB%A0%A5%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 08 May 2021 08:28:34 GMT</pubDate>
            <description><![CDATA[<p>일단 이것의 용도에 대해 이야기 해보자</p>
<ol>
<li>실수로 테이블 or 데이터베이스가 손실 되었을 때, 일일히 이걸 채우기에는 너무 많은 시간이 소유된다 그래서 따로 csv 파일로 백업 용도로 만들어 주는것이 좋다.</li>
</ol>
<p>그래서 우리는 google 엑셀을 이용하기로 하였다 .</p>
<p><img src="https://images.velog.io/images/hong_tae/post/4f816d37-7d8b-4ece-85b5-5f0fbf22a6b6/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/hong_tae/post/cf312e5a-9350-4d62-b6ad-4319614c9dea/image.png" alt=""></p>
<p>프로젝트 최상위 경로에서 db_upload 를 만들어 거기에 google 엑셀에서 다운받은 
csv 파일을 넣는다.</p>
<pre><code>
cd ~/(프로젝트 파일명)
mkdir db_upload 
cd db_upload 
❯ ll
total 44K
-rw-rw-r-- 1 ubuntu ubuntu  186  4월 29 17:20 Category.csv
-rw-rw-r-- 1 ubuntu ubuntu   64  4월 29 17:21 CategoryDestination.csv
-rw-rw-r-- 1 ubuntu ubuntu   50  4월 29 17:21 City.csv
-rw-rw-r-- 1 ubuntu ubuntu 1.9K  4월 29 18:53 Convenience.csv
-rw-rw-r-- 1 ubuntu ubuntu 3.6K  5월  1 21:15 db.py
-rw-rw-r-- 1 ubuntu ubuntu  417  4월 29 17:21 Destination.csv
-rw-rw-r-- 1 ubuntu ubuntu   90  4월 29 17:21 District.csv
-rw-rw-r-- 1 ubuntu ubuntu 3.4K  4월 29 17:21 ProductConvenience.csv
-rw-rw-r-- 1 ubuntu ubuntu 3.3K  5월  1 21:34 Product.csv
-rw-rw-r-- 1 ubuntu ubuntu 3.4K  4월 29 17:22 ProductImage.csv
-rw-rw-r-- 1 ubuntu ubuntu  106  4월 29 17:22 ServiceCategory.csv

하나의 csv 파일을 열어보자 
vim city.csv
id,name                                                          1,서울
2,부산
3,대구
4,강원도

이제 이것을 돌릴 파일을 만들자

vim db.py

import os
import django
import sys
import csv

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

sys.path.append(BASE_DIR)

os.chdir(&quot;..&quot;)
os.environ.setdefault(&quot;DJANGO_SETTINGS_MODULE&quot;, &quot;wagrano.settings&quot;) # wagrano 부분만 나의 디비 이름과 맞춰주면 된다.
django.setup()

from products.models import *

with open(&#39;./db_upload/Category.csv&#39;, newline=&#39;&#39;) as csvfile:
    csv_reader = csv.DictReader(csvfile)
    for data in csv_reader:
        Category.objects.create(
                name      = data[&#39;name&#39;],
                image_url = data[&#39;image_url&#39;]
                )
with open(&#39;./db_upload/Destination.csv&#39;, newline=&#39;&#39;) as csvfile:
    csv_reader = csv.DictReader(csvfile)
    for data in csv_reader:
        Destination.objects.create(
                name = data[&#39;name&#39;]
                )

with open(&#39;./db_upload/CategoryDestination.csv&#39;, newline=&#39;&#39;) as csvfile:
    csv_reader = csv.DictReader(csvfile)
    for data in csv_reader:
        CategoryDestination.objects.create(
                category_id    = data[&#39;category_id&#39;],
                destination_id = data[&#39;destination_id&#39;],
                )

with open(&#39;./db_upload/City.csv&#39;, newline=&#39;&#39;) as csvfile:
    csv_reader = csv.DictReader(csvfile)
    for data in csv_reader:
        City.objects.create(
                name =data[&#39;name&#39;],
                )

with open(&#39;./db_upload/District.csv&#39;, newline=&#39;&#39;) as csvfile:
    csv_reader = csv.DictReader(csvfile)
    for data in csv_reader:
        District.objects.create(
                name    = data[&#39;name&#39;],
                city_id = data[&#39;city_id&#39;],
                )

with open(&#39;./db_upload/Product.csv&#39;, newline=&#39;&#39;) as csvfile:
    csv_reader = csv.DictReader(csvfile)
    for data in csv_reader:
        Product.objects.create(
                name           = data[&#39;name&#39;],
                star_rating    = data[&#39;star_rating&#39;],
                rating         = data[&#39;rating&#39;],
                description    = data[&#39;description&#39;],
                address        = data[&#39;address&#39;],
                latitude       = data[&#39;latitude&#39;],
                longitude      = data[&#39;longitude&#39;],
                price          = data[&#39;price&#39;],
                category_id    = data[&#39;category_id&#39;],
                destination_id = data[&#39;destination_id&#39;],
                city_id        = data[&#39;city_id&#39;],
                district_id    = data[&#39;district_id&#39;],
                )

with open(&#39;./db_upload/ProductImage.csv&#39;, newline=&#39;&#39;) as csvfile:                        
    csv_reader = csv.DictReader(csvfile)                                       
    for data in csv_reader:
        ProductImage.objects.create(
                image_url = data[&#39;image_url&#39;],
                product_id = data[&#39;product_id&#39;],
                )

with open(&#39;./db_upload/ServiceCategory.csv&#39;, newline=&#39;&#39;) as csvfile:                   
    csv_reader = csv.DictReader(csvfile)                                           
    for data in csv_reader:
        ServiceCategory.objects.create(
                name = data[&#39;name&#39;],
                    )

with open(&#39;./db_upload/Convenience.csv&#39;, newline=&#39;&#39;) as csvfile:
    csv_reader = csv.DictReader(csvfile)
    for data in csv_reader:
        Convenience.objects.create(
                name = data[&#39;name&#39;],
                service_category_id = data[&#39;service_category_id&#39;],
                )

with open(&#39;./db_upload/ProductConvenience.csv&#39;, newline=&#39;&#39;) as csvfile:
    csv_reader = csv.DictReader(csvfile)
    for data in csv_reader:
        ProductConvenience.objects.create(
                product_id  = data[&#39;product_id&#39;],
                convenience_id = data[&#39;convenience_id&#39;],
                )



print(&quot;SUCCESS&quot;)

</code></pre><p>python db.py 로 파일 실행 </p>
<p>제대로 되었다면 SUCCESS가 뜨며 db 테이블을 확인해보자</p>
<p>mysql -u root -p</p>
<p>password</p>
<p>show databases;
use wagrano;
show tables;
show select * from products;</p>
<p><img src="https://images.velog.io/images/hong_tae/post/a7ccd877-3071-4fa3-834a-798af520875c/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>