[클라우드/Docker 기본(9) - Docker-compose(1) : 기본 정리]

SooYeon Yeon·2022년 8월 30일
1

클라우드 Docker

목록 보기
10/24

docker-compose

일반적으로 웹서비스는 3tier 구조를 가짐

WEB SERVER → WAS SERVER → DB

위와 같은 구조를 docker container run을 이용해 구성하면

  1. 복잡하다
  2. 동일 구조를 다시 만드는데 오랜 시간이 걸린다
  3. 변경이 용이하지 않다
  • 위와 같은 구조를 하나의 명세서에 작성하는 방법을 도커에서 제공하는데 이를 docker-compose라고 함
  • docker compose는 docker에서 제공하는 기본 서비스가 아니므로 추가 설치가 필요
  • 단, docker-compose는 클러스터 환경에서의 사용이 아니라 1대의 도커 서버에서 동작한다.
  • 실제 클러스터 환경에서는 docker-compose + 클러스터 환경(docker swarm) = docker stack
  • 명세 파일에 아래의 오브젝트를 구성하게 된다. (yaml파일에)
  1. service
    • 컨테이너
  2. volume
  3. 네트워크

도커 네트워크

docker network’s driver

  1. Bridge
    • KVM의 NAT 스위치와 같은 역할을 수행한다.
    • 독립적인 사설 주소 대역을 갖는다.
    • 기본적으로 도커는 bridge type의 docker0을 생성하여 모든 컨테이너를 연결한다.
  2. host
    • 호스트 PC의 IP주소를 그대로 사용한다.
  3. none
    • 네트워크에 연결되지 않음
  • 가상의 네트워크 만들기 (create)
rapa@rapa:~/0819/board$ docker network create private1
c0238bf90be3e069ec40bbe856e674bb0df991583c7ad2a0040f678956e5b098
  • 네트워크 확인
rapa@rapa:~/0819/board$ docker network ls
NETWORK ID     NAME       DRIVER    SCOPE
b2eebdca1c3a   bridge     bridge    local
3ead376f089f   host       host      local
39430d1f4412   none       null      local
c0238bf90be3   private1   bridge    local
  • 만든 네트워크 정보 보기
apa@rapa:~/0819/board$ docker network inspect private1
[
    {
        "Name": "private1",
        "Id": "c0238bf90be3e069ec40bbe856e674bb0df991583c7ad2a0040f678956e5b098",
        "Created": "2022-08-19T16:27:43.436491774+09:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
  ...
]

임의의 IP 주소 할당되어 있음

rapa@rapa:~/0819/board$ docker container run -d --net=private1 centos:7
420bc14e755fb5b241e797b67b5282354c1b868980656ad7937079bfe93b8712
  • 컨테이너 생성되었는 지 확인
apa@rapa:~/0819/board$ docker container ls -a
CONTAINER ID   IMAGE                       COMMAND                  CREATED              STATUS                      PORTS                                       NAMES
420bc14e755f   centos:7                    "/bin/bash"              53 seconds ago       Exited (0) 51 seconds ago                                               awesome_cori
3aa051c75f11   centos:7                    "/bin/bash"              About a minute ago   Created                                                                 eloquent_stonebraker
0dd8f9536071   hyper/docker-registry-web   "start.sh"               About an hour ago    Up About an hour            0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   registry-web
dc0b26f3dcde   registry                    "/entrypoint.sh /etc…"   About an hour ago    Up About an hour            0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   registry
  • 생성한 컨테이너 inspect
  • IP가 들어간 것 알 수 있음
rapa@rapa:~/0819/board$ docker inspect 3aa051c75f11
[
    {
        "Id": "3aa051c75f11c853445083b6bc3907a16cb56f10f458900616add048296cc5b8",
        "Created": "2022-08-19T07:30:57.586191262Z",
        "Path": "/bin/bash",
        ...
            "Networks": {
                "private1": {
                    "IPAMConfig": {
                        "IPv4Address": "172.18.0.100"
                    },
                    "Links": null,
                    "Aliases": [
                        "3aa051c75f11"
                    ],
...
        }
    }
]
  • 우리가 원하는 대역의 주소를 지정해 네트워크 생성하기
rapa@rapa:~/0819/board$ docker network create --driver bridge --subnet 10.10.0.0/16 --ip-range 10.10.10.0/24 --gateway 10.10.10.1 private2
528e7ecee3f15a03d2eceae6bb818819e77b45674338e433477842c50a25b745

ctrl+p ctrl+q로 빠져나오기

docker container inspect centos11

IP 확인

"Networks": {
                "private2": {
                    "IPAMConfig": {
                        "IPv4Address": "10.10.10.10"
                    },
                    "Links": null,
                    "Aliases": [
                        "52671517fe1d"
                    ],
                    "NetworkID": "528e7ecee3f15a03d2eceae6bb818819e77b45674338e433477842c50a25b745",
                    "EndpointID": "a20e6a073b850ad91947563035ec9ec29bc6a512d3a16da809b753416016622d",
                    "Gateway": "10.10.10.1",
                    "IPAddress": "10.10.10.10",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:0a:0a:0a:0a",
                    "DriverOpts": null
                }
            }
  • docker-compose 간단하게 작성
rapa@rapa:~/0819/board$ vi ~/.bashrc

95번째줄

alias dc=’docker-compose’

source ~/.bashrc

docker-compose

  • docker container run 명령들을 YAML 파일에 작성하는 것
  • 다음의 사항을 정의한다.
  1. version : 버전별로 지원되는 옵션이 달라진다.
    • 지원이 되지 않는 등의 문제가 있다면 해당 버전을 홈페이지에서 반드시 확인해야 한다.
  2. service(services라고 씀): 실제로 서비스를 제공하는 컨테이너에 대한 정의
  3. volume: 컨테이너에 연결할 볼륨을 정의한다. (필수 아님)
  4. network(networks라고 씀): 컨테이너들을 연결할 네트워크를 정의한다(필수아님 → 작성하지 않으면 모든 컨테이너는 docker0에 연결된다)
  • 위의 4가지 항목을 왼쪽 벽에 붙여라
  • 재사용이 가능하고, 수정이 용이함

각 항목의 하위 항목을 정의하려면 들여쓰기가 매우 중요

일반적으로 yaml 파일은 tab을 인식하지 못하기때문에 space bar을 이용

하나의 컴포즈 파일에 작성된 서비스는 자동으로 link가 된다.

예전에는 지원이 되었으나 지금은 지원 되지 않는 옵션 : —volumes-from 컨테이너의 디렉토리를 다른 컨테이너의 디렉토리와 마운트하는 것 (지금은 isci나 nfs 이용)

  • docker-compose ps를 이용하면 compose를 이용하여 배포한 컨테이너만 확인 가능
  • docker container run으로 생성한 것은 dc ps로 확인 불가

1. 버전 정의

version: ‘3.9’

2. 서비스 정의

services:

myctl1:

image: centos:7 # 이미지

environment:  # 환경변수

  MYSQL_ROOT_PASSWORD: test123                        # :을 사용하는 방법

  MYSQL_DATABASE: wordpress

networks:

  - private1

  - private2

myctl2:

build: .                               # 현재 위치에 있는 도커파일을 이용해 이미지를 만들고 그걸 사용

environment:

  - WORDPRESS_DB_USER=root         # 다음과 같이 -과 =를 이용해 쓸 수도 있음

  - WORDPRESS_DB_NAME=wordpress

depends_on: # 실행 순서 결정

  - myctn1  # myctn2가 실행되기 전에 myctn1이 먼저 실행. myctn1의 동작 완료를 확인하지는 않음

  - ports: # 

    - “8080:80” # 시간을 의미하는 12:30과 구분하기위해 일반적으로 큰따옴표를 붙임, host의 8888포트와 컨테이너의 80번 포트 연결

    - “33061:3306” # 이렇게 여러개 쓸 수 있음 -p 33061:3306

    - “8080”    # -P 8080 호스트의 랜덤포트와 컨테이너의 8080을 연결

    - “8081-8085” # 랜덤포트

networks:

    - private2

실행순서 결정

ctn1 3 → -ctn3 -ctn2

ctn2 1 → x

ctn3 2 → ctn2

3. 볼륨

  • 기존 볼륨 활용 가능
  • 만약 지정하지 않는다면, 디렉토리 이름을 이용하여 신규 생성
  • external: true 으로 기존에 만들어둔 볼륨을 사용 할 수 있다.

volumes:

  • testvolume1:/var/www/html # 0822_testvolume1과 컨테이너의 /var/www/html이 연결

volumes:

testvolume1: # 0822_testvolume1이 생성된다

external: true # 기존에 만들어 둔 testvolume1을 사용한다.

  • 볼륨 사용하기
  1. nfs → 디렉토리 마운트
  2. iscsi → 스토리지에서 volume을 생성하고 이를 컨테이너의 /dev/sda와 같은 형태로 연결
  3. tmpfs → 디스크가 아니라 RAM에 저장(영구 보관 불가)
  • 볼륨 생성
docker volume create [볼륨이름]
  • 볼륨 확인
docker volume ls
  • 볼륨 전체 삭제
docker volume prune

4. 네트워크 정의

  • external: true 으로 기존에 만들어둔 네트워크를 사용 할 수 있다.

networks:

private1:

driver: bridge # private1은 bridge타입으로 생성

external: true # 기존에 만들어두었던 private1을 재활용한다.
  • 네트워크 만들기
docker network create [네트워크이름]
  • 네트워크 확인
docker network ls
  • 네트워크 삭제
docker network rm [네트워크ID]

docker-compose 명령어

  • yaml코드에 있는 이미지를 이용해 컨테이너 실행
docker-compose up
  • 정의된 컨테이너 서비스, 볼륨 네트워크를 모두 정지시키고 삭제(external로 한 네트워크 및 볼륨은 삭제되지않음)
docker-compose down
  • 특정 컨테이너 중지
docker-compose stop 서비스명
  • 정지된 컨테이너 서비스 실행
docker-compose start 서비스명
  • 도커 컴포즈에 정의된 서비스 컨테이너 조회
docker-compose ps
  • 도커 컴포즈 야믈파일 설정 확인
docker-compose config

0개의 댓글