DB 환경 변수
- MonggoDB와 mongo-express 웹 UI를 Docker로 연결 후 실행
- Container 간 통신, 환경 변수 사용, 포트 매핑 실습
웹 접속이 안 돼서 수십 번 삭제했다가 재실행하고 성공했다. 아직 그냥 줄바꿈 하지 말고 한 줄로 쓰는 게 안전하다..
[ DOCKER NETWORK 생성 ]
Container끼리 통신할 수 있도록 하나의 가상 Network(daminet) 생성
이후 --network=daminet으로 두 Container가 같은 Network에 들어가게 됨
# docker network create [Network명]
|
# docker network create daminet

[ MONGODB CONTAINER 실행 ]
백그라운드 실행, 시스템 재시작 시 자동 재실행, 위에서 만든 Network(daminet)에 연결, 환경 변수 설정(MongoDB 기본 유저:root, 비밀번호(password), 공식 MongoDB Image 사용
# docker run -d --name mongo --restart=always --network=daminet -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=pass1234 mongo

[ MONGODB-EXPRESS 실행 (WEB UI) ]
웹브라우저로 localhost:8081 접속, 같은 Network로 mongo Container와 연결, mongo Container 이름을 hostname처럼 사용, MongoDB 연결 RUL 입력
# docker run -d --name mongo-express --restart=always --network=daminet -p 8081:8081 -e ME_CONFIG_MONGODB_ADMINUSERNAME=root -e ME_CONFIG_MONGODB_ADMINPASSWORD=pass1234 -e ME_CONFIG_MONGODB_URL="mongodb://root:pass1234@mongo:27017/" -e ME_CONFIG_BASICAUTH_USERNAME=admin -e ME_CONFIG_BASICAUTH_PASSWORD=pass mongo-express

[docker 명령어]
docker run --name test -v /path/:/usr/share/nginx/html:ro nginx
[docker-compose.yml]
version: 3.3
services:
webserver:
image: nginx
volumes:
- "/path/:/usr/share/nginx/html:ro"
[docker-compose.yml]
version: 3.3
services:
***something:***
container_nmae: something
image: nginx
volumes:
- ["/path/:/usr/share/nginx/html:ro"]
[port]
docker run --name nginx -d -p 8080:80 nginx
version: 3.3
services;
***nginx(webserver):***
container_name: nginx
image: nginx
ports:
- "8080:80"
version: 3.3
services:
webserver:
volumes:
- "/var/www/html:/usr/share/nginx/html:ro"
[DB 환경 변수]
네트워크
docker network create -d bridge mynet
docker run -d \\
--name mongo \\
--network mongo-net \\
-e MONGO_INITDB_ROOT_USERNAME=root \\
-e MONGO_INITDB_ROOT_PASSWORD=1234 \\
mongo
docker run -d \\
--name mongo-express \\
--network mynet \\
-e ME_CONFIG_MONGODB_ADMINUSERNAME=root \\
-e ME_CONFIG_MONGODB_ADMINPASSWORD=1234 \\
-e ME_CONFIG_MONGODB_SERVER=mongo \\
-e ME_CONFIG_MONGODB_URL="mongodb://root:1234@mongo:27017/" \\
-e ME_CONFIG_MONGODB_ENABLE_ADMIN=true
-p 8081:8081 \\
mongo-express
--------------------------------------------------------
[docker-compose]
version: '3.3'
services:
mongo:
image: mongo
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: 1234
mongoexpress:
image: mongo-express
restart: always
ports:
- "8081:8081"
environment:
ME_CONFIG_MONGODB_ADMINUSERNAME: root
ME_CONFIG_MONGODB_ADMINPASSWORD: 1234
ME_CONFIG_MONGODB_URL: "mongodb://root:1234@mongo:27017/"
docker-compose up --build
[ WEB 접속 ]
docker logs mongo-express

http://192.168.10.100:8081

MONGODB - MONGO-EXPRESS 함께 실행
- docker-compose.yml 파일을 사용해서 MongoDB와 mongo-express를 함께 실행
- 한 줄 명령어로 두 개 Container를 동시에 구성할 수 있게 해주는 도구
[ docker-compose.yml 파일 생성 ]
# vi /dami/docker-compose.yml

8081 사용 중이라 8888로 설정함
[ docker-compose 실행 ]
# docker-compose up -d
|


http://192.168.10.100:8888

POSTGRESQL + ADMINET CONTAINER 실행
[ 사용자 정의 DOCKER NETWORK 생성 ]
- 같은 Network 안에 있는 Container들은 Container 이름으로 통신 가능
- DB와 WEB 툴을 연결할 때 반드시 같은 Network에 있어야 이름으로 접근 가능
# docker network create baenet

[ PostgreSQL CONTAINER 실행 ]
- Container 이름 : 'mynet', 시스템 재부팅 후 자동 재시작, 위에서 만든 Network(baenet)에 연결, PostgreSQL 기본 passwd, Image 설정
# docker run -d --name mydb --restart=always --network=baenet -e POSTGRES_PASSWORD=example postgres

[ ADMINER 설치 및 CONTAINER 구동 (WEB으로 DB 관리) ]
- 호스트 포트 8080을 Container의 8080과 연결, 같은 Network(baenet) PostgreSQL과 연결
# docker run -d --name adminer --restart=always -p 8080:8080 --network=baenet adminer

[PostgreSQL]
docker run -d --name post // 서버이름 -p 5432:5432 --restart always --network mynet -e POSTGRES_PASSWORD=1234 postgres
[adminer]
docker run -d --name adminer1 --restart always --network mynet -p 8082:***8080*** adminer // 8080 고정
version: '3.3'
services:
postgres: // 서버이름
image: postgres
restart: always
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: 1234
POSTGRES_DB: post
ports:
- 5432:5432
network:
- mynet
adminer:
image: adminer
restart: always
ports:
- "8081:***8080***" // 8080 고정
network:
- mynet
network:
mynet:
driver: bridge
--------------------------------------------------------
[기존 네트워크에 설정]
networks:
mynet:
external: true
[ WEB 접속 ]

✅ Adminer 접속 정보
항목 입력값데이터베이스 형식 | PostgreSQL |
서버 | postgres |
컨테이너 이름 / yml 서비스 이름 | |
사용자이름 | user |
비밀번호 | 1234 |
데이터베이스 | post / postgres(기본) |
version: '3.3'
services:
server_a:
image: nginx
restart: always
ports:
- "8080:80"
server_b:
image: redis
restart: always
ports:
- "8081:80"
동일 이미지로 여러 컨테이너 생성
docker-compose up -d --scale server_a=5 --scale server_b=10
[자동매핑]
ports:
- "0:8080" or "8080"
[특정 고정 매핑 후 나머지 자동 매핑]
services:
server_a:
image: your-image
deploy:
replicas: 5
ports:
- target: 8080
published: 8080
protocol: tcp
mode: host



DOCKER SWARM
[ hosts 파일 추가 ]
192.168.10.50/100/150 모두 추가해 준다.

[ DOCKER SWARM 초기화 : MASTER 노드 만들기 ]
- Token
- Docker Swarm에서 Cluster 보안을 위해 생성되는 일회용 인증 키
- 새로운 Worker 또는 Manager 노드를 기존 Cluster에 join 시킬 때 사용
- 이 Token 없이는 Cluster에 참여할 수 없음
- Token 포트 : Swarm 내부 통신용
# docker swarm init --advertise-addr [IPaddress]
|
< Docker1 >
# docker swarm init --advertise-addr 192.168.10.50
현재 시스템을 Swarm의 관리자로 지정해 준다.
docker swarn join --token = SWMTKN-12prr988i6ss7o6zrj3zasyz405w7xllnt7gilrbrmwenm1qvtw-f3oc30fks79skjw6jzynglq33 192.168.10.50:2377


내 Token 확인
[ 다른 노드에서 SWARM CLUSTER에 JOIN ]
다른 노드에서 위 Token으로 Worker 노드로 등록
# docker swarm join --token [복사한 토큰] [IPaddress:포트번호]
|
< Docker2,3 >
모든 Docker 방화벽 끄고 Worker 등록을 해준다.
# docker swarm join --token SWMTKN-1-2prr988i6ss7o6zrj3zasyz405w7xllnt7gilrbrmwenm1qvtw-f3oc30fks79skjw6jzynglq33 192.168.10.50:2377


[ 현재 SWARM CLUSTER 상태 확인 ]
# docker node ls
|
< Docker1 >
Master 노드에서 현재 Swarm에 포함된 모든 노드 상태를 출력했다. 역할(Manager/Worker)과 상태 확인이 가능하다.

[ 시각화 도구(Visualizer) IMAGE 다운로드 ]
- Visualizer
- Swarm Cluster 상태를 WEB으로 확인하기 위한 도구 실행
- Visualizer는 Manager에서만 실행 가능
# docker image pull dockersamples/visualizer
|
< Docker1 >
Swarm의 Cluster 상태를 WEB에서 확인 가능한 Image이다. dockersamples 계정에서 제공한다.
# docker image pull dockersamples/visualizer

[ VISUALIZER 서비스 실행 ]
< Docker1 >
# docker service create \
--name swarm_tools \
--publish 8080:8080/tcp \
--constraint=node.role==manager \
--mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
dockersamples/visualizer

[ WEB 접속 ]
이제 WEB 접속 시 Visualizer에서 Cluster 구성 상태와 노드별 Container 분포를 그래픽으로 확인할 수 있다.

[ NGINX 서비스 배포 ]
이제 Test를 위해 NGINX 서비스를 여러 WORKER 노드에 분산 배포하고 확장한 결과를 시각화해볼 것이다.
< Docker1 >
# docker service create --name myweb -d -p 80:80 --replicas 2 \
--update-delay 30s \
--constraint=node.role!=manager \
nginx:1.14

[ 실제 CONTAINER 배포 결과 ]
생성한 myweb Container가 work1/2에 자동으로 분산되어 배포되었다. Manager는 배포하지 않으며 Visualizer 도구로 확인도 가능하다.

myweb이 worker에는 배포되었지만, Manager에게는 배포되지 않았다.
[ DOCKER SWRAM에서 SERVICE 확장(SCALE) ]
# docker service scale [Service=n]
|
myweb 서비스를 총 5개의 Container 인스턴트로 확장시켜봤다.
# docker service scale myweb=5



5개로 확장된 myweb 서비스
[ 각 CONTAINER에 접속해서 INDEX.HTML 수정 ]
Docker Swarm에 배포한 myweb 서비스가 여러 Container로 분산되었고, 각 Container가 Load Balancing 되며 동작하는지를 Test 해볼 것이다. 192.168.10.100에 여러 번 접속하면, 각기 다른 myweb Container가 번갈아 응답하는지 확인할 것이다.
< Docker2 >


# docker exec -it myweb.2.rn9js6bcir9i34jvqwa4ez4yi /bin/sh
# echo "It's_myweb2" > /usr/share/nginx/html/index.html
# docker exec -it myweb.4.t6y2s4nh7fegoebike2ldp4pe /bin/sh
# echo "It's_myweb4" > /usr/share/nginx/html/index.html
[ CURL로 LOAD BALANCING TEST ]
현재까지 Swarm Cluster를 구성하고, myweb 서비스를 배포, 각 Container에 접속해서 index.html을 수정했다. 이제 로드 밸런싱이 실제로 되는지 Test 해볼 것이다. Server 뒤에 있는 여러 개의 Container가 번갈아 응답하는지 Test 한다.
[부하 분산]
docker exec -it myweb.2.i7skfvjk49h7x5w6anljcuj17 bash
root@a88d958c6341:/# echo "WEB SITE 1" > /usr/share/nginx/html/index.html
각각의 컨테이너 쉘 index.html 생성 후 확인
docker service ps myweb -f desired-state=running
[컨테이너 이미지 업데이트]
docker service update --image nginx:1.15 myweb
[업데이트 시 자동 롤백]
docker service update
--rollback-condition on-failure \\
--rollback-delay 10s \\
--update-failure-action rollback \\
docker service roolback -f myweb
docker service inspect myweb --pretty
레지스트리 내 동일 이미지라면 변경 안 될 수도 있음
해당 이미지 워커 노드에 없을 시
셧 다운 가능하므로 이미지 저장 필요
'IT 엔지니어 > CLOUD' 카테고리의 다른 글
Docker Kubespray -1 (0) | 2025.05.19 |
---|---|
K8S -kubespray (0) | 2025.05.19 |
Docker Registry (0) | 2025.05.17 |
Docker image build (0) | 2025.05.16 |
Docker (1) | 2025.05.15 |