docker-compose : 설정파일을 만들어서 docker 사용

설정파일은  docker-compose.yml  이다.

https://docs.docker.com/compose/

 

Overview

 

docs.docker.com

 

 

#1. Define and run multi-container applications with Docker.

docker-compose [-f <arg>...] [--profile <name>...] [options] [COMMAND] [ARGS...]

1. -f <config file>

  1) config: Yaml filetype

  2) default filename : docker-compose.yml

2. builds or rebuilds, creates, starts

https://docs.docker.com/compose/reference/ 

 

Overview of docker compose CLI

 

docs.docker.com

 

#2. Usage (help) 명령어 : docker-compose -h  

 

#3. docker-compose : install

$ sudo apt -y install docker-compose

1. 설치 후 간단한 설정을 만들자.

1) 먼저 docker-compose를 작업할 디렉터리 생성.

$ mkdir ~/docker-compose
$ cd ~/docker-compose/

#4. docker-compose : nginx

$ vi docker-compose.yml

1. docker-compose.yml 파일에 다음 장의 내용을 넣는다.

 1) yml 파일 형식은 indentaion,  space에 주의해야 한다.

   가. Official site - https://yaml.org/ 

 

2. docker-compose.yml (nginx)

version: '3'
services:
  nginx_8080:
    image: nginx
    restart: always
    hostname: nginx1
    container_name: cmp_nginx1_1 ## container_name을 미지정하면, directory이름을 prifix로하여 , 자동 생성함.
    networks: 
      mynet:
        ipv4_address: 172.20.0.10
    ports:
      - 8080:80

networks:
  mynet:
    ipam:
      driver: default
      config:
        - subnet: 172.20.0.0/24

 

 

restart 는 프로그램 종료 될 시 재시작.

container_name을 고정시킴, 지정하지 않을 시 디렉터리 이름을 고정해 자동생성.

docker net, volume은 docker compose와 같이 사용.

$ docker-compose up

 

3. 2번 터미널 : docker-compose 디렉터리에서 명령해야 한다.

jlim@home:~/docker-compose$ pwd
/home/jlim/docker-compose

$ docker-compose ps
$ docker ps
$ curl http://127.0.0.1:8080/

 

방금 실행한 것은 detach를 하지 않아, 해당 터미널이 닫히면 프로세서가 죽을 수 있다. 

detach하는 법으로 실행하자.

 

#4. docker-compose : nginx : up (detach)

1.

1 번 터미널 : docker-compose up -d

^C 를 눌러 실행문을 빠져나온다.

$ docker-compose up -d    #detach
$ docker-compose ps
$ docker-compose stop
$ docker-compose ps

 

 

#5. docker-compose : nginx : recreating

1. 1번 터미널:

 1) docker-compose.yml을 수정해보자.

   가. docker-compose.yml 은 수정 후 up --> recreating (container id는 당연히 변경됨)

 

이전 port binding에서 volumes바인딩 하자.

yaml 파일 아래 같이 수정

version: '3'
services:
  nginx_8080:
    image: nginx
    restart: always
    hostname: nginx1
    container_name: cmp_nginx1_1
    networks:
      mynet:
        ipv4_address: 172.20.0.10
    ports:
      - 8080:80
    volumes:
      - /home/jlim/nginx_doc_root:/usr/share/nginx/html

networks:
  mynet:
    ipam:
      driver: default
      config:
        - subnet: 172.20.0.0/24

 

volumes만 추가.

 

1번 터미널 : 수정 후 up.

$ docker-compose up -d
$ docker-compose ps

2번 터미널 : curl로 확인

$ curl http://127.0.0.1:8080/hello.txt

 

실습 완료 후 아래 명령을 하여 docker-compose 를 지워보자

$ docker-compose stop; docker-compose rm;

 

#6 Practice  :Nginx를 2개 설정 #1

1. 웹서버를 2개 실행하도록 yml 파일을 작성하자.

1) docker-compose.yml을 compose-nginx2.yml  (cp이용)로 변경해서 작업해보자.

compose-nginx2.yml

version: '3'
services:
  nginx_8080:
    image: nginx
    restart: always
    hostname: nginx1
    container_name: cmp_nginx1_1  #여기서는 container끼리 서로 접속하지 않지만, DB나 API서버를 사용한다면 container들의 hostname을 설정해줘야 하는 경우가 있다. 이런 경우 /etc/hosts에 서버를 등록한다. 예를 들어 아래와 같은 행을 추가할 수 있다. 
                                  # 172.20.0.10 nginx1 nginx1.domainname
                                  # 172.20.0.20 nginx2 nginx2.domainname
    networks:
      mynet:
        ipv4_address: 172.20.0.10
    ports:
      - 8080:80
    volumes:
      - /home/jlim/nginx_doc_root:/usr/share/nginx/html
  
  nginx_8081:
    image: nginx
    restart: always
    hostname: nginx2
    container_name: cmp_nginx2_1
    networks:
      mynet:
        ipv4_address: 172.20.0.20
    ports:
      - 8081:80
    volumes:
      - /home/jlim/nginx2_doc_root:/usr/share/nginx/html

networks:
  mynet:
    ipam:
      driver: default
      config:
        - subnet: 172.20.0.0/24

2. Nginx를 2개 설정 #2

1) docker-compose실행 :  -f 옵션 사용

$ docker-compose -f compose-nginx2.yml up -d
$ docker-compose -f compose-nginx2.yml ps

2개가 올라왔고 포트번호도 8080, 8081 로 되있다.

 

#7 docker : network

$ docker network ls
$ docker-compose -f compose-nginx2.yml stop
$ docker network rm dockercompose_mynet

##  에러발생 이유: network이 재생성 되면서 id값이 달리지기때문임.
$ docker-compose -f compose-nginx2.yml up -d
$ docker-compose -f compose-nginx2.yml up --force-recreate -d

 

 

Summary

1. docker CLI option이 복잡해지면..

 1) docker-compose를 사용하는 것을 권장

 2) 설정에 따라 /etc/hosts에 IP address와 hostname의 등록이 필요

+ Recent posts