본문 바로가기

IT 엔지니어/CLOUD

Docker yml

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

레지스트리 내 동일 이미지라면 변경 안 될 수도 있음

1.14에서 1.15로 업데이트

 

 

해당 이미지 워커 노드에 없을 시
셧 다운 가능하므로 이미지 저장 필요

 

'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