ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 도커 (10)도커컴포즈전, 하나에하나씩, 환경변수, 도커컴포즈, 단일노드, scale
    docker 2022. 3. 1. 05:07

    ============

    컨테이너가 중지되는 상황은 프로세스가 죽었을 때,

    여러개의 어플리케이션을 하나의 컨테이너에 넣어버리면 어떤 애를 기준으로 컨테이너가 죽었다고 판단하는지가 애매해, 이건 좋은게 아니야

    컨테이너는 하나의 프로세스를 동작시키고 그 컨테이너끼리 연동, 조합해서 운용하는게 좋은 방법

     

    ============

    wordpress와 mysql 컨테이너 이미지를 이용한 블로그 서비스를 개발

    워드프레스 라는 애가 db를 필요로 해

     

    ============

    mysql 이미지를 이용해서 데이터베이스 컨테이너를 생성

    이미지를 만들었어, 그 이미지가 동일한 형태로 동작하는건 맞겠지만

    실행하는 사람이나 환경에 따라 달라져야하는것도 있다

     

    mysql로 DB생성 = 동일해야

    root pwd = 달라져야

     

    이런 값들을 일반적으로 환경변수라는걸 이용해서 전달해서 실행함

     

    이미지를 만들 때 실행할 때 외부입력을 받아야되는, 필요한, 값이 있다

    내가 -e로 설정된 값들이 코드에 사용되게 된다

     

    mysql도커페이지에 보면 환경변수와 관련된 정보들이 나옴

    꼭 지정해야하는것

    옵셔널

     

    이 있음

     

    이런식으로 왼쪽걸 오른쪽처럼 -e옵션으로

     

    *mandatory : 의무

     

     

    PS C:\docker> docker container run -d --name wordpressdb -e MYSQL_ROOT_PASSWORD=p@ssw0rd -e MYSQL_DATABASE=wordpress mysql:5.7

     

     

    ============

    cms

    content management system

     

    웹사이트 같은것 구축할 때 내가 생짜로 만드는게 아니고 서비스를 이용하면 쉽게 만들어줌

     

    전세계적으로 제일 많이 팔리는게 wordpress

     

    -e로 방금 만든 mysql컨테이너 지정해주기

     

    PS C:\docker> docker container run -d --link wordpressdb:mysql -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=p@ssw0rd --name wordpress -p 80 wordpress

     

    *--link : 컨테이너이름:별칭

     

    컨테이너에 매핑된 포트번호 확인

     

    53689로 접속하면 설치화면이 나옴

     

    워드프레스 : 내가 웹 사이트를 만드는 것이다

     

    ============

    wordpressdb 컨테이너로 접속해서 데이터를 확인

    접속 : exec / attach

    PS C:\docker> docker container exec -it wordpressdb /bin/bash

    파워쉘에서 컨테이너내부로 한번 바뀌고

    root@c8e23556d583:/# mysql -u root -p

    mysql쉘로 한번 더 바뀜

    id비밀번호 치고

    mysql>

     

    보면 wordpress가 있다

    워드프레스에 입력했던 내용이 mysql db에 저장되고 있다

     

    mysql> show databases;

    +--------------------+

    | Database           |

    +--------------------+

    | information_schema |

    | mysql              |

    | performance_schema |

    | sys                |

    | wordpress          |

    +--------------------+

    5 rows in set (0.00 sec)

     

    mysql> use wordpress;

    Reading table information for completion of table and column names

    You can turn off this feature to get a quicker startup with -A

     

    Database changed

    mysql> show tables;

    +-----------------------+

    | Tables_in_wordpress   |

    +-----------------------+

    | wp_commentmeta        |

    | wp_comments           |

    | wp_links              |

    | wp_options            |

    | wp_postmeta           |

    | wp_posts              |

    | wp_term_relationships |

    | wp_term_taxonomy      |

    | wp_termmeta           |

    | wp_terms              |

    | wp_usermeta           |

    | wp_users              |

    +-----------------------+

    12 rows in set (0.00 sec)



    mysql> select * from wp_users;

    +----+------------+------------------------------------+---------------+--------------------+------------------------+---------------------+---------------------+-------------+--------------+

    | ID | user_login | user_pass                          | user_nicename | user_email         | user_url               | user_registered     | user_activation_key | user_status | display_name |

    +----+------------+------------------------------------+---------------+--------------------+------------------------+---------------------+---------------------+-------------+--------------+

    |  1 | CRPARK     | $P$BLUoRhBzNGYmLxOu92IFcybXzf9ioZ/ | crpark        | myanjini@gmail.com | http://localhost:53689 | 2022-01-26 03:11:41 |                     |           0 | CRPARK       |

    +----+------------+------------------------------------+---------------+--------------------+------------------------+---------------------+---------------------+-------------+--------------+

    1 row in set (0.00 sec)

     

    ============

    https://dololak.tistory.com/387

     

    [Docker] 도커로 워드프레스(WordPress) MySQL 간단 구축 및 설정

    참고글 [Docker] Linux 환경에 Docker 설치하기 (Ubuntu, REHL, CentOS) [Docker] 컨테이너 목록 확인하기 - docker ps 명령어 [Docker] Docker 컨테이너 확인, 생성, 접속, 빠져나오기 [Docker] 컨테이너 정지 및..

    dololak.tistory.com

    설명 잘하네~

     

    ============

    이력서에 https://www.frjgrrgkl:8080/ 로 가면 볼 수 있습니다 하면 됨

    책만 계속 보다보면 거기에 갇힌다

    어느사이트 보고 오 멋있다 따라도 해보고

    구구단도 어떤 답이 나오면 어떻게 입력해야 할까요? 이런 것

    웹에서 구름IDE돌아가는거 보고 이거 어떻게 한거야?? 이런 물음을 가지래 -> 도커컨테이너 띄우는거래

     

    그림이나 글로 쭉 써보다보면 막히기도 하고 물어도 보고

    안되면 아이디어 정리해놨다가 사람 사서 시켜

     

    ============

    컨테이너 두개를 띄워서 연결을 했다

    wordpress를 띄울 때 링크라는걸 줘서 db접속 정보를 안줬는데도 알아서 해 (▽준거아냐?)

    --link 를 안주면 아이디패스워드를 줘야해

     

    컨테이너 하나갖고 동작하는 프로그램이 잘 없다.

    대부분 연동

    웹서버는 DB가 있어야 하고...

    이럴 때 컨테이너와 컨테이너를 연결할 때 --link라는 옵션을 사용함

     

    별칭을 주면 거기 안에선 그 별칭으로 db연결을 한다

     

    ============

    wordpressdb 컨테이너를 중지했을 때 wordpress 컨테이너의 동작을 확인

    PS C:\docker> docker container stop wordpressdb

    wordpressdb

    웹페이지로 확인

     

    ============

    wordpressdb 컨테이너를 삭제하고 다시 시작했을 때 wordpress 컨테이너의 동작을 확인

    위와 마찬가지

     

    다시 컨테이너를 만들면 DB의 내용이 다 사라졌다 -> -v가 필요해

    stateless service : 상태가 필요없는 서비스, api호출, 구구단 같은것

    stateful service : 상태유지가 필요한 서비스, mysql, 껐다키면 데이터가 사라져

     

    ============

    컨테이너의 데이터를 영속적(persistent)인 데이터로 활용하는 방법

    여러가지 방법이 있다

     

    ============

    wordpressdb 컨테이너를 삭제

    docker container rm -f wordpressdb

     

    ============

    호스트에 볼륨 디렉터리를 생성 

    PS C:\docker> mkdir c:\docker\wordpressdb_data

     

    ============

    볼륨매핑할 때 특정 디렉토리를 선택 Settings > Resource > FILE SHARING > + APPLY & Restart

    버전업이 되면서 이렇게 해야함. 컨테이너가 쓸 수 있는 디렉토리를 제한하는 용도다. 보안 문제 때문에

     

    ============

    호스트의 c:\docker\wordpressdb_data 디렉터리를 컨테이너 내부의 /var/lib/mysql 디렉터리로 맵핑 (공유)

     

    PS C:\docker> docker container run -d --name wordpressdb -e MYSQL_ROOT_PASSWORD=p@ssw0rd -e MYSQL_DATABASE=wordpress -v c:\docker\wordpressdb_data:/var/lib/mysql mysql:5.7

     

    이렇게 하면 우리는 폴더만 만들어놨는데

    PS C:\docker> dir .\wordpressdb_data\

     

        디렉터리: C:\docker\wordpressdb_data

     

    Mode                 LastWriteTime         Length Name

    ----                 -------------         ------ ----

    d-----      2022-01-26   오후 2:26                mysql

    d-----      2022-01-26   오후 2:26                performance_schema

    d-----      2022-01-26   오후 2:26                sys

    d-----      2022-01-26   오후 2:26                wordpress

    -a----      2022-01-26   오후 2:26             56 auto.c

      :

      :

     

    mysql의 데이터 파일이 저장되는 곳임. mysql이 설치될 때 기본적으로 생기는 데이터들이 공유되고 있다

     

    ============

    PS C:\docker> docker container ls

    CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                   NAMES

    a5bcdc847736   wordpress   "docker-entrypoint.s…"   40 seconds ago   Up 40 seconds   0.0.0.0:49816->80/tcp   wordpress

    ff63b7d510be   mysql:5.7   "docker-entrypoint.s…"   4 minutes ago    Up 4 minutes    3306/tcp, 33060/tcp     wordpressdb

     

    두개가 실행되고 있다

     

    저거 보니 http://localhost:49816 여기로 접속하면 됨, 회원가입 마침

     

    ============

    삭제 하고 다시 컨테이너 만들고 접속하면? 데이터가 그대로야

    PS C:\docker> docker container rm -f wordpressdb

    wordpressdb

     

    PS C:\docker> docker container run -d --name wordpressdb -e MYSQL_ROOT_PASSWORD=p@ssw0rd -e MYSQL_DATABASE=wordpress -v c:\docker\wordpressdb_data:/var/lib/mysql mysql:5.7

    9a783c8c1edde8d6ef7b45628579a4a74e52b2b33bb237c74b468322bcba9fcc

     

    ============

    Docker Compose

    일반적인 환경은 하나의 셋트로 움직이는 게 있다

    같이 움직여야 하는것들을 따로따로 정의해서 실행하는 것 보단 하나로 뭉쳐서 정의하고 단위로 실행하고 죽이고 하는것들을 하면 더 편하다 실수로 적어지고

    그게 도커 컴포즈!!

    컨테이너 여러개 띄울 때 쓴다

    도커는 단일 컨테이너

    일반적인 서비스 환경은 컨테이너 하나갖고 안된다

     

    여러개의 컨테이너를 묶어서 올리고 내리고 공유하고 : 도커컴포즈

    일반적으로 단일 노드 환경

     

    노드 : 네트워크에 붙어있는 네트워킹이 가능한 하드웨어, 도커컨테이너가 그 하드웨어안에서만, 하나의 하드웨어안에서만 도는 것. 도커가 설치 실행되는 호스트 머신을 말함

     

    ---

    반대되는 개념, 멀티노드(이게쿠버네티스)

    컨테이너가 노드 하나에 여러개 돌 수도 있고

    이렇게 서로 다른 노드에서 하나씩 연결해서 돌 수도 있다

     

    자세한 건 쿠버네티스에서

     

    ============

    앞에서 만든 mysql하고 wordpress를 도커컴포즈로 정의해보자

    기존 리소스 정리부터

     

    PS C:\docker> docker container rm -f $(docker container ls -aq)

    PS C:\docker> docker image rm -f $(docker image ls -aq)

     

    ============

    도커 데스크탑 깔면 docker-compose --version이거 뜸

    안나오면 따로 다운받아야

     

    ============

    도커컴포즈를 정의하기 위해

    docker-compose.yaml 파일을 작성

    c:\docker\docker-compose.yaml

     

    yaml파일은 들여쓰기를 주의해야 한다

     

    c:\docker\docker-compose.yaml 

    version: '3.3'
    services:
      # docker container run -d 
      # (1) --name wordpressdb 
      # (2) -e MYSQL_ROOT_PASSWORD=p@ssw0rd 
      # (3) -e MYSQL_DATABASE=wordpress 
      # (4) -v c:\docker\wordpressdb_data:/var/lib/mysql 
      # (5) mysql:5.7
      wordpressdb:                      # (1)
        image: mysql:5.7                # (5)
        restart: always                 # https://docs.docker.com/compose/compose-file/compose-file-v3/#restart
        environment:
          MYSQL_ROOT_PASSWORD: p@ssw0rd # (2) 
          MYSQL_DATABASE: wp_db         # (3) 
          MYSQL_USER: wp_user
          MYSQL_PASSWORD: wp_pswd
        volumes:
          - db_data:/var/lib/mysql      # (4) 

      # docker container run -d 
      # [1] --link wordpressdb:mysql 
      # [2] -e WORDPRESS_DB_USER=root 
      # [3] -e WORDPRESS_DB_PASSWORD=p@ssw0rd 
      # [4] --name wordpress 
      # [5] -p 80 
      # [6] wordpress
      wordpress:                        # [4]
        depends_on:                     # https://docs.docker.com/compose/compose-file/compose-file-v3/#depends_on
          - wordpressdb
        image: wordpress                # [6]
        ports:
          - 80                          # [5]
        restart: always
        environment:
          WORDPRESS_DB_HOST: wordpressdb:3306 # [1]
          WORDPRESS_DB_NAME: wp_db
          WORDPRESS_DB_USER: wp_user          # [2]
          WORDPRESS_DB_PASSWORD: wp_pswd      # [3]
    volumes:
      db_data: {}

    restart: 해당하는 컨테이너가 죽었을 때 어떻게 할거냐

    재실행하는 경우를 설정

     

    volumes:

    - 이름을 줘 : 컨테이너 안의 경로 그건 저~ 밑에 volumes: db_data: {} 이렇게 있어

     

     

    밑에 

     

    depends_on: 여러개의 컨테이너를 함께 관리, 컨테이너마다 선후관계가 있을 수가 있다. wordpress는 db가 있어야하기 때문에 db가 먼저 떠야 한다. wordpress는 db에 의존해, 쓸데없이 나부터 띄우지마라

     

    ports: 호스트포트 지정 안해도 돼

     

    --link는 빠져있어, db가 어딨는지, environment에 WORDPRESS_DB_HOST로 한다.

     

    ============

    위에 yaml스크립트는 수정 후 고 수정전에 있었던 코드로 설명

    보니까 굳이 PASSWORD를 두번 입력하고있어

    상수처럼 해서 쓸 수 있지 않을까요?

    이렇게 ▽뭐 어떻게 한다는거지

     

    ============

    도커컴포즈 파일을 사용할 땐

    docker-compose up

    하면 끝

     

    PS C:\docker> docker container ls

    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

     

    PS C:\docker> docker-compose up

    Creating network "docker_default" with the default driver

    Creating volume "docker_db_data" with default driver

    Pulling wordpressdb (mysql:5.7)...

    :

    Pulling wordpress (wordpress:)...

    :



    그럼 그 명령프롬프트엔 로그가 뜸, docker-compose up을 attach 모드로 실행했기 때문에 모든 컨테이너가 실행되고 나면 컨테이너 로그가 화면에 출력됨, 안보고싶으면 detach모드, -d주면 됨

     

    다른 명령 프롬프트(또는 파워쉘)를 열어서 

    PS C:\docker> docker container ls

    CONTAINER ID   IMAGE       COMMAND                  CREATED              STATUS              PORTS                   NAMES

    88c8933744fa   wordpress   "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:55238->80/tcp   docker_wordpress_1

    f98b32fcb589   mysql:5.7   "docker-entrypoint.s…"   About a minute ago   Up About a minute   3306/tcp, 33060/tcp     docker_wordpressdb_1

     

    여기서 55238로 붙으면

     

    mysql도 뜨고, wordpress도 뜨고

     

    ============

    죽일 땐 전엔 다른 명령 프롬프트 열어서 stop했는데

    이건 다른 프롬프트 열어서 그 디렉토리로 가서 docker-compose down

    하면 중지 + 삭제 됨

     

    PS C:\docker> docker-compose down ⇐ attach 모드로 실행한 컨테이너를 중지 & 삭제

    Stopping docker_wordpress_1   ... done

    Stopping docker_wordpressdb_1 ... done

    Removing docker_wordpress_1   ... done

    Removing docker_wordpressdb_1 ... done

    Removing network docker_default

     

    PS C:\docker> docker container ls -a

    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

    없다~~~~~~~~~~~~

     

    ============

    도커컴포즈 : 컨테이너를 순서에 맞춰 한큐에 올릴 수 있다

    down하면 중지 + 삭제

     

    ============

    -d하면?

     

    프롬프트가 반환이 됨, detach모드

    PS C:\docker> docker-compose up -d ⇐ detach 모드로 컨테이너를 실행

    Creating network "docker_default" with the default driver

    Creating docker_wordpressdb_1 ... done

    Creating docker_wordpress_1   ... done

    PS C:\docker>

     

    얘는 다른 창 안 열고 여기서 down하면 됨

     

    ============

    docker-compose scale

    수평적 확장

     

    서비스에 과부하가 걸렸을 때 그 과부하를 극복하기 위한 방법 두가지

    1)수평적확장 : 동일한 사양의 하드웨어를 서버를 여러개 창설하는 방법

    2)수직적확장 : 하드웨어의 스펙 강화

     

    PS C:\docker> docker-compose scale wordpress=3

    WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.

    Creating docker_wordpress_2 ... done

    Creating docker_wordpress_3 ... done

    PS C:\docker> docker container ls

    CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                   NAMES

    357b3514ec4f   wordpress   "docker-entrypoint.s…"   11 seconds ago   Up 10 seconds   0.0.0.0:55305->80/tcp   docker_wordpress_3

    d3d0c1bf40dd   wordpress   "docker-entrypoint.s…"   11 seconds ago   Up 10 seconds   0.0.0.0:55306->80/tcp   docker_wordpress_2

    92ec7bc1563a   wordpress   "docker-entrypoint.s…"   2 minutes ago    Up 2 minutes    0.0.0.0:55290->80/tcp   docker_wordpress_1

    91abe949d979   mysql:5.7   "docker-entrypoint.s…"   2 minutes ago    Up 2 minutes    3306/tcp, 33060/tcp     docker_wordpressdb_1

     

    PS C:\docker> docker-compose scale wordpress=1

    WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.

    Stopping and removing docker_wordpress_2 ... done

    Stopping and removing docker_wordpress_3 ... done

     

    ============

    도커 이거 말고도 많지만 : 이재홍 아저씨 사이트 가면 샘플들이 많이 나온다, Django Dockerfile 작성하기, 명령어 들...

     

    docker sample로 검색하면 도커 사이트에서 제공해주는 것도 있다

    이런것도 있고..

     

    https://docs.docker.com/samples/

    https://github.com/docker/labs/tree/master/developer-tools/java/

    !

    !

Designed by Tistory.