-
도커 (10)도커컴포즈전, 하나에하나씩, 환경변수, 도커컴포즈, 단일노드, scaledocker 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/
!
!
'docker' 카테고리의 다른 글
도커 엘리 public/private shipping, layer system, -d, tag&untag (0) 2022.03.02 도커 (9)서브넷마스킹, network (0) 2022.02.26 도커 (8)컨테이너이름, rm, v, 요약, 리소스정리, cp, CMD & ENTRYPOINT (0) 2022.02.26 도커 (7)도커파일 예제 : 리액트, 자바, 스프링부트 (0) 2022.01.26 도커 (6)exec&Up&stop, RUN -y, ADD, EXPOSE, -DFOREGROUND, CMD [ ], &&, build -f (0) 2022.01.26