kakao Cloud school 2기 D+27

LEE EUI JOO·2022년 12월 7일
0

Docker

목록 보기
4/8

1. Docker 사설 저장소 구축


root@ubuntu:/docker# docker run -dp 5000:5000 --name pregistry registry
registry 라는 이름의 이미지로 pregistry 라는 컨테이너 생성 

root@ubuntu:/docker# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
d73436b0e9ec registry "/entrypoint.sh /etc…" 10 seconds ago Up 9 seconds
0.0.0.0:5000->5000/tcp, :::5000->5000/tcp pregistry

root@ubuntu:/docker# mkdir regi/
로컬 저장 디렉토리 생성
root@ubuntu:/docker# cd regi/

root@ubuntu:/docker/regi# vi Dockerfile
간단한 도커파일 작성

root@ubuntu:/docker/regi# docker build -t localhost:5000/my_nginx:1.0 .
빌드 진행

<docker file>
**************************************************************************************************
FROM nginx
**************************************************************************************************
  • 로컬에 저장소를 만든 상태!
root@ubuntu:/docker/regi# docker image ls


  • docker Push 해보자!
root@ubuntu:/docker/regi# docker push localhost:5000/my_nginx:1.0

***
The push refers to repository [localhost:5000/my_nginx]
7b72d5d921cb: Pushed
aa3739f310f5: Pushed
6906edffc609: Pushed
f88642d922a1: Pushed
2842e5d66803: Pushed
b5ebffba54d3: Pushed
1.0: digest: sha256:d5e4095bb4bcd2c40d6aba552f9ea66aacb1d0a5137a521dc6b0503b40b08921
size: 1570
***
  • 정상적으로 푸시가 완료 됐는지 확인하기 위해 이미지 삭제
root@ubuntu:/docker/regi# docker image rm -f localhost:5000/my_nginx:1.0
Untagged: localhost:5000/my_nginx:1.0
Untagged:
localhost:5000/my_nginx@sha256:d5e4095bb4bcd2c40d6aba552f9ea66aacb1d0a5137a521dc6b05
03b40b08921
  • 이미지를 삭제한 상태로 로컬의 저장소에 푸쉬한 이미지를 토대로 컨테이너를 생성해보자!
root@ubuntu:/docker/regi# docker run -dp 777:80 --name my_nginx localhost:5000/my_nginx:1.0

Unable to find image 'localhost:5000/my_nginx:1.0' locally
1.0: Pulling from my_nginx
Digest: sha256:d5e4095bb4bcd2c40d6aba552f9ea66aacb1d0a5137a521dc6b0503b40b08921
Status: Downloaded newer image for localhost:5000/my_nginx:1.0
51e5e81a7e8bf5a2c5c2c60bbce262be99614e0d755f7e99d60e8550b0e858d3

  • 정상적으로 컨테이너가 생성됐는지 docker ps 로 확인

2. 실습 문제

clone Ubuntu를 하나 생성해서 docker 를 설치하고 주소는 211.183.3.110 으로 하여 현재 구성된 사설 저장소에 간단한 my_httpd:1.0 이미지를 push 해보자!


<Ubuntu clone> - curl 명령어를 사용해 Docker 엔진 설치

root@ubuntu:/docker# vi Dockerfile
<docker file>
**************************************************************************************************
FROM httpd:latest
*************************************************************************************************

root@ubuntu:/docker# docker build -t 211.183.3.100:5000/httpd:1.0 .
빌드 진행

<http 에러가 발생할 경우에 json 파일 작성>
root@ubuntu:/docker# vi /etc/docker/daemon.json
*************************************************************************************************
{
 "insecure-registries": ["211.183.3.100:5000"]
}
*************************************************************************************************

root@ubuntu:/docker# systemctl restart docker
json 파일 작성후 docker 재시작

root@ubuntu:/docker# docker push 211.183.3.100:5000/httpd:1.0
  • 사설 저장소에 이미지 파일이 정상적으로 push 된 것을 확인 할 수 있음

3. Docker compose

  • 하나의 파일에 여러개의 컨테이너를 정리해놓고 명령어를 실행하여 여러개의 컨테이너를 한꺼번에 띄울 수 있다 Compose 를 정의하는 'docker-compose.yml' 파일에 환경 정보를 모아서 설정 할 수 있다.

<이미지, 컨테이너 삭제>
*************************************************************************************************
root@ubuntu:/docker/regi# docker rm -f $(docker ps -qa)
root@ubuntu:/docker/regi# docker image rm -f $(docker image ls -q)
*************************************************************************************************
  • yaml 파일
  1. Key - value 의 값으로 구성되어 있음
  2. 파이썬의 리스트, 딕셔너리
  3. 같은 열에 있으면 동등한 형태임!
  4. services 는 컨테이너들을 의미함!

  • 실습
root@ubuntu:/docker# cd /compose/

root@ubuntu:/compose# vi docker-compose.yml
yaml 파일 작성 파일명은 docker-compose.yml 이어야 한다
*************************************************************************************************
version: "3"

services:
 my_nginx: #컨테이너 이름
 image: nginx  # 베이스 이미지
 ports:   
 - "7676:80" # 포트지정
*************************************************************************************************

root@ubuntu:/compose# docker-compose up -d
docker compose 명령어를 실행 시키기 위한 명령어 

root@ubuntu:/compose# curl localhost:7676
테스트

root@ubuntu:/compose# docker-compose ps
compose 가 실행되고 있는지 확인하는 명령어 docker ps -a 와 비슷한 의미를 가진다

root@ubuntu:/compose# docker-compose down
docker compose를 지우는 명령어 

  • nginx 가 잘 작동되는 것을 확인 할 수 있음

  • 다시 yaml 파일 수정
<docker-compose.yml>
*************************************************************************************************
version: "3"

services:
 my_nginx:
 image: nginx
 ports:
 - "7777:80" # 포트번호만 변경해줬음 
 volumes:
 - "/data:/usr/share/nginx/html"  
*************************************************************************************************

root@ubuntu:/compose# docker-compose up -d

<echo  이용한 테스트>
root@ubuntu:/compose# mkdir data
root@ubuntu:/compose# touch index.html
root@ubuntu:/compose# echo hello > index.html
root@ubuntu:/compose# mv index.html /data
root@ubuntu:/compose# ls
data docker-compose.yml
root@ubuntu:/compose# docker-compose up -d
Recreating compose_my_nginx_1 ... done
root@ubuntu:/compose# curl localhost:7575
hello
root@ubuntu:/compose# vi docker-compose.yml
root@ubuntu:/compose# docker-compose up -d
Recreating compose_my_nginx_1 ... done
root@ubuntu:/compose# curl localhost:7777
hello

  • Docker file 을 빌드 할 수 도 있다!
<docker-compose.yml>
*************************************************************************************************
version: "3"

services:
 my_nginx:
 image: nginx
 ports:
 - "7777:80"
 volumes:
 - "/data:/usr/share/nginx/html"
 build: .
*************************************************************************************************

root@ubuntu:/compose# vi db_Dockerfile
<docker 파일 생성>
*************************************************************************************************
FROM nginx
*************************************************************************************************
root@ubuntu:/compose# docker-compose down
Stopping compose_my_nginx_1 ... done
Removing compose_my_nginx_1 ... done
Removing network compose_default

root@ubuntu:/compose# docker-compose up -d
Creating network "compose_default" with the default driver
Creating compose_my_nginx_1 ... done
  • 파일명이 Dockerfile 이 아닐 경우에는 디렉토리의 경로나 Git 저장소의 URL 을 context로 지정하여 설정도 가능하다!


  • expose(Dockerfile 의 EXPOSE) 설명
    +) -P 옵션 : 호스트의 포트를 랜덤하게 매핑 한다

  • 외부포트를 80번으로 개방하겠다!
    expose:
    - "80"


  • db 컨테이너와 nginx 와 링크 맺기

    아직 db 컨테이너가 생성 안된 상태이기 때문에 up 을 하면 오류를 뿜을 것이다.
    up 명령어는 yml 파일을 위에서 아래 방향으로 실행시키기 때문이다.
    따라서, '의존성'을 db 컨테이너와 맺어줘야 한다.

<docker-compose.yml 파일>

version: "3"

services:
 my_nginx:
 image: nginx
 ports:
 - "7777:80"
 volumes:
 - "/data:/usr/share/nginx/html"
 build:
 context: .
 dockerfile: db-Dockerfile
 expose:
 - "80"
 links:		# db와 연결
 - "db"
 depends_on: 	# 의존성 옵션
 - "db"
 db:		# 새로운 db 컨테이너
 image: mariadb
 
  • 의존성이 걸려있기 때문에 먼저 db 컨테이너를 띄우고 동작시킨다
root@ubuntu:/compose# docker-compose up -d
Creating compose_db_1 ... done	#의존성 걸려있어 먼저 생성 
Recreating compose_my_nginx_1 ... done

  • 환경변수 설정하기
<docker-compose.yml 파일>

version: "3"
  
services:
  my_nginx:
    image: nginx
    ports:
      - "7575:80"
    volumes:
      - "/data:/usr/share/nginx/html"
    build:
      context: .
      dockerfile: Dockerfile
    expose:
      - "80"
    links:
      - "db"
    depends_on:
      - "db"
  db:
    image: mariadb
    environment:
      MYSQL_ROOT_PASSWORD: "1234"

4. docker-compose 실습문제

wordpress를 docker-compose 파일로 구성해보세요.
211.183.3.100:7777로 접속했을 때 접속이 되도록
워드프레스 컨테이너 이름 : wp
mariadb 컨테이너 이름 : db
호스트의 /mdb에 mariadb 컨테이너의 DB 정보가 보존되어야 한다.


< docker-compose.yml>

version: "3"
  
services:
  wp:
    image: wordpress
    ports:
      - "7777:80"
    expose:
      - "80"
    links:
      - "db"
    depends_on:
      - "db"
    environment:
      WORDPRESS_DB_HOST: "db"
      WORDPRESS_DB_USER: "wpuser"
      WORDPRESS_DB_PASSWORD: "1234"
      WORDPRESS_DB_NAME: "wordpress"
  db:
    image: mariadb
    volumes:
      - "/mdb:/var/lib/mysql"
    environment:
      MYSQL_ROOT_PASSWORD: "1234"
      MYSQL_DATABASE: "wordpress"
      MYSQL_USER: "wpuser"
      MYSQL_PASSWORD: "1234"
      
root@ubuntu:/compose# docker-compose up -d
      

5. Auto - scale

  • DB 의 스케일은 늘릴순 있지만 사전에 동기화해야하는 복잡한 작입 있기에 DB는 스케일을 늘리지 않는다

root@ubuntu:/docker# mkdir scale
root@ubuntu:/docker# cd scale/
root@ubuntu:/docker/scale# vi docker-compose.yml

<docker-compose.yml>
*************************************************************************************************
version: "3"

services:
 srv_a:
 image: nginx
 srv_b:
 image: redis
*************************************************************************************************
root@ubuntu:/docker/scale# docker-compose up -d

root@ubuntu:/docker/scale# docker-compose ps
 Name Command State Ports
-----------------------------------------------------------------
scale_srv_a_1 /docker-entrypoint.sh ngin ... Up 80/tcp
scale_srv_b_1 docker-entrypoint.sh redis ... Up 6379/tcp
  • 스케일 늘려보기
root@ubuntu:/docker/scale# docker-compose up --scale srv_a=3 -d
Starting scale_srv_a_1 ...
Starting scale_srv_a_1 ... done
Creating scale_srv_a_2 ... done
Creating scale_srv_a_3 ... done
root@ubuntu:/docker/scale# docker-compose ps
 Name Command State Ports
-----------------------------------------------------------------
scale_srv_a_1 /docker-entrypoint.sh ngin ... Up 80/tcp
scale_srv_a_2 /docker-entrypoint.sh ngin ... Up 80/tcp
scale_srv_a_3 /docker-entrypoint.sh ngin ... Up 80/tcp
scale_srv_b_1 docker-entrypoint.sh redis ... Up 6379/tcp
  • 스케일 줄여보기
root@ubuntu:/docker/scale# docker-compose up --scale srv_a=1 -d
scale_srv_b_1 is up-to-date
Stopping and removing scale_srv_a_2 ... done
Stopping and removing scale_srv_a_3 ... done
Starting scale_srv_a_1 ... done
root@ubuntu:/docker/scale# docker-compose ps
 Name Command State Ports
-----------------------------------------------------------------
scale_srv_a_1 /docker-entrypoint.sh ngin ... Up 80/tcp
scale_srv_b_1 docker-entrypoint.sh redis ... Up 6379/tcp

6. Docker Swarm

  • 컨테이너 오케스트레이션 tool
  • "고래(엔진) 많고 , 컨테이너도 많다"

  • “worker1”에 문제가 발생 시 worker1에서 동작하던 컨테이너가 worker2로 자동 이동
  • HA (High Availabilty) , LB (Load Balancing) 을 가능하게 한다

  • Ubuntu 템플릿 3개 엔진 클론(clone)
  manager
  ip 211.183.3.200 hostname manager

  worker1
  ip 211.183.3.210 hostname worker1

  worker2
  ip 211.183.3.220 hostname worker2

  • 호스트 네임 설정 법
  hostnamectl set-hostname <호스트네임>
  hostname 명령어 적용 후 적용됐는지 확인
  IP 바꾸는 법
  sudo vi/etc/netplan/00-installer-config.yaml

  • 모든 엔진에 Docker 설치할것

<Go to manager>

root@manager:~# docker swarm init
Swarm initialized: current node (smqycb25imit8o0hia9lzebpj) is now a manager.
To add a worker to this swarm, run the following command:
 docker swarm join --token
SWMTKN-1-2hsluzdd6wrbfq88dulyduanz99f36w4cafdts2zl72hc5lgf3-7ll4snbtlfnfg37t16fkl8pb7
211.183.3.200:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

<도커 포트는 2377>
<복사해두기>

복사해둔 토큰을 worker1 , woker2 에 붙여넣으면 docker swarm 에 접속가능 하다.
*************************************************************************************************
root@worker1:~# docker swarm join --token
SWMTKN-1-2hsluzdd6wrbfq88dulyduanz99f36w4cafdts2zl72hc5lgf3-7ll4snbtlfnfg37t16fkl8pb7
211.183.3.200:2377
This node joined a swarm as a worker.
*************************************************************************************************

root@manager:~# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
smqycb25imit8o0hia9lzebpj * manager Ready Active Leader 20.10.21
u9k58es6qj07b3f8kkkmaejk1 worker1 Ready Active 20.10.21
b282nqvoqjeqgmwr4gkm0habd worker2 Ready Active 20.10.21

<만약 클러스터(worker)에서 문제 발생시>
*************************************************************************************************
docker swarm leave 명령어를 쳐주면 된다.
*************************************************************************************************

  • Docker Swarm 의 Network 체계

  • 각 노드들은 하나의 네트워크를 공유하고 있다.
root@manager:~# docker network ls

NETWORK ID NAME DRIVER SCOPE
4438cb97b781 bridge bridge local
f793a6095a77 docker_gwbridge bridge local
e9cd4f802b87 host host local
vcpomu66cbhg ingress overlay swarm # <overlay> 라는 드라이버가 생겨있음 지금 오버레이된 상태라고 볼 수 있음
1071e4483249 none null local

<자세히 들여다 보는 명령어>
root@manager:~# docker node inspect worker1

<노드를 swarm 에서 제외시키고 싶다>
root@manager:~# docker node rm

<매니저 승격시키기>
root@manager:~# docker node promote

  • 테스트를 위해 컨테이너 만들기 (service = run) - 2개 만들기
root@manager:~# docker service create --replicas 2 -p 5555:80 --name web nginx
overall progress: 2 out of 2 tasks
1/2: running
2/2: running
verify: Service converged 

root@manager:~# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
ptx20t3914qi web replicated 2/2 nginx:latest *:5555->80/tcp

# 서비스 목록 2개 만들어진 것을 확인할 수 있음 (REPLICAS)

<도커 서비스(web)의 상태를 보고싶다면>

root@manager:~# docker service ps web
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
vnl1hdzfez0m web.1 nginx:latest worker1 Running Running about a minute ago
8zhz84i0mnjo web.2 nginx:latest manager Running Running about a minute ago

# DESIRED STATE : 원하는 상태
# CURRENT STATE : 현재 상태

<도커 서비스(web) 삭제>
root@manager:~# docker service rm web
web
root@manager:~# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS

profile
무럭무럭 자라볼까

0개의 댓글