코딩배우기

왕초보 도커 입문해서 도커 사용법을 정리해 봤다.

탁이 2021. 8. 9. 20:00

새삼스럽지만 도커(Docker)에 입문했기 때문에 정리해 봤습니다. 이제 도커는 세상에서는 당연한 기술. 적어도, 조금 만져본정도의 기본적인 지식 정도는 익혀야 합니다.

요약

  • Docker는 기존의 Linux 커널 기능으로 이루어져 있다
  • 이미지를 공유하여 여러 사람이 여러 곳에서 쉽게 이미지로 컨테이너를 시작할 수 있다
  • Docker 커멘드에서 컨테이너를 하나하나씩 명령한다
  • Docker 커멘드를 두드리는건 불편하니 Dockerfile 을 이용하자
  • 하나 하나 컨테이너를 관리하는 불면하니 docker-compose 로 동일한 호스트 OS의 여러 컨테이너를 한꺼번에 관리 하자

가상화 개요 (호스트형 가상화 vs 하이퍼 바이저 형 가상화 vs 컨테이너형 가상화)

호스트 형 가상화

호스트 OS에서 실행하는 가상화 소프트웨어를 이용하여 VM을 관리하는 방식이다. 오버 헤드가 크다. 대표적인 예는 VirtualBox, VMWare Player.

하이퍼 바이저 형 가상화

하드웨어의 하이퍼 바이저를 사용하여 VM을 관리하는 방식이다. 호스트 OS없이 하드웨어를 직접 제어한다. 오버 헤드 크다. 대표적인 예는 KVM, Heper-V, ESXi, Xen.

컨테이너 형 가상화

호스트 OS에서 컨테이너라는 VM과 비슷한 행동을하는 가상 파티션을 준비하고 관리하는 방식이다. 컨테이너는 호스트 OS의 커널을 이용한다.

일반적으로 1 컨테이너 1 프로세스에서 사용하는 Web 서버 컨테이너 라든지 DB 서버 컨테이너 라든지 로그 관리 컨테이너 라든지 여러 컨테이너를 세우는 구성이 된다.

다른 가상화와 비교해 컨테이너 형 가상화 (Docker)의 장점

  • 동작 빠름
    • VM마다 CPU 나 메모리와 스토리지 등을 할당 같은 처리가 필요없이 오버 헤드가 적기 때문에
    • 게스트 OS가 없기 때문에 소비하는 자원이 적기 때문에
    • 게스트 OS가 없기 때문에 애플리케이션까지의 패킷 전송 처리 (컨텍스트 스위치 등)이 적기 때문에
  • 시작도 빠름
    • 게스트 OS를 시작할 팔요가 없기 때문에
  • 이동성이 높음
    • Docker 엔진만 있으면 기본 어디서나 움직인다. 다른 가상화는 준비에서벌써 좀 고생한다.
    • Dockerfile과 docker-compose.yml 의한 인프라의 코드화
  • 이미지가 가벼움
    • Docker 이미지는 레이어에서 관리하고 있기 때문에
  • Docker 이미지를 쉽게 공유 할 수있는 구조를 갖추고있다
    • 특히 공식 Docker 이미지가 포함되어있는 경우 (Jenkins 나 WordPress 등)는 배포가 엄청 간단
    • ECR 등 프로젝트에 닫혀 있고 완전 관리 환경을 갖추고있다

컨테이너 형 가상화 (Docker)의 단점

  • 호스트 OS의 커널과 다른 OS는 움직일 수 없다
  • 학습 비용 (이 포스트로 해결하자 !!!)

Docker 개요

Docker란

Docker는 오픈 소스 컨테이너 관리 소프트웨어이다.

구성 요소

Docker는 Docker Engine을 중심으로 여러 구성 요소 단위로 기능이 개발되고있다.
필요에 따라 여러 요소를 조합하여 사용한다.

Docker Engine

Docker 이미지 작성 및 컨테이너 시작 등을 할 Docker의 핵심 구성 요소 이다.
Linux 커널의 기능을 사용하여 기본 처리를 실시해, Docker 데몬으로 동작한다.

Docker Compose

여러 컨테이너를 중앙에서 관리하는 구성 요소.

Docker Registry

Docker 이미지를 공개 · 공유 구성 요소.

Docker Machine

비 Linux 환경에 Docker의 실행 환경을 명령으로 자동 생성하는 구성 요소.

Docker Swarm

컨테이너를 클러스터 화하여 관리하는 구성 요소.
솔직히 Kubernetes의 인기에 따라 존재감을 잃어 가고있다.

Docker Kitematic

Docker GUI 도구 구성 요소.
아무튼, 나는 포함한 여러분은 CUI다루면 되니까 여기서는 다루지 않음.

Docker 내부 구조

namespace

Docker는 Linux 커널 namespace 기능을 사용하여 컨테이너 당 파티션을 실현하고있다.
namespace마다 다음을 관리하고있다.

  • PID : 프로세스에 관련
  • Network : IP 주소, 포트 번호, 라우팅, 필터링 등의 네트워크 관련
  • UID / GID : 사용자 ID와 그룹 ID 관련
  • MOUNT : 마운트 관련
  • UTS : 호스트 이름과 도메인 이름 관련
  • IPC : 메시지 큐 등의 프로세스 간 통신 관련

cgroup (control group)

Docker는 Linux 커널의 cgroup의 기능을 사용하여 컨테이너가 사용하는 물리적 시스템 자원 (CPU 나 메모리 등)의 할당 관리를 실현하고있다. 프로세스를 그룹화하고 각 그룹에 리소스 사용량 제한을 가하고있다.

네트워크

링크 기능

컨테이너는 각 가상 NIC (eth0)가 할당 172.17.0.0 / 16 세그먼트의 IP를 DHCP로 할당된다.
컨테이너의 가상 NIC는 호스트 OS에서 하나의 브리지 (docker0)에 연결되어 있기 때문에 컨테이너끼리 통신 할 수 있다. (링크 기능)
그러나 여러 물리적 서버가 존재하는 다중 호스트 환경에서 다른 물리적 서버에 링크 기능을 사용한 통신은 불가.

인터페이스

컨테이너에서 확인 인터페이스 정보는 이하와 같음. 컨테이너의 관점에서 보면 마치 물리 NIC (eth0)처럼 보인다.

컨테이너에서 확인 인터페이스 정보는 다음.
컨테이너의 관점에서 보면 마치 물리적 NIC (eth0)처럼 보인다.

# ip a

34: eth0@if35: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever

그러나 호스트 OS 측에서 보면 실체는 veth임을 다음에서 알 수있다.
veth는 L2의 가상 NIC이며, 컨테이너의 NIC (eth0)와 호스트 OS의 브리지 (docker0) 사이에서 터널링을하고있다.

# ip a

35: vethd48920c@if34: <BROADCAST,MULTICAST,UP,LOWER_UP> 
mtu 1500 qdisc noqueue master docker0 state UP group default 
link/ether 9e:bd:4d:63:ed:38 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet6 fe80::9cbd:4dff:fe63:ed38/64 scope link valid_lft forever preferred_lft forever

또한 호스트 OS에서 다음과 같이, docker0 브리지를 확인할 수있다.

# ip a 
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP>
mtu 1500 qdisc noqueue state DOWN group default 
link/ether 02:42:bd:f7:d8:19 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever

외부 통신

Docker는 Linux 커널의 iptables 기능을 이용하여 호스트 OS의 외부 통신을한다.
docker0와 호스트 OS의 물리적 NIC간에 NAPT이 이루어지고있다.

Docker Hub

Docker Hub 공식 레지스트리 서버. 공식 Docker 이미지 (official라고 기재되어있는 것) 외에 일반 사용자의 고유 이미지도 공개되어있다.

기본적으로 pull과 push이 저장소에 대해 수행된다. 개인 레지스트리를 구축하고 그것을 이용하는 것도 가능하다. GitHub 제휴 및 공용 클라우드 통합 기능이 포함되어있다.

동일한 이미지가 push 된 경우 Docker Hub에서 하나 밖에 처리하지 않는다. (모든 개별적으로 관리하고 있으면 Docker Hub 용량이 터무니 없게된다)

Docker 환경 구축

전제

  • Ubuntu16.04
  • 인터넷 통신 가능

도커 설치

Docker (Community Edition)을 설치하는 예.

$ sudo apt-get remove docker docker-engine
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu
$(lsb_release -cs) stable" $ sudo apt-get install docker-ce
$ sudo docker -v Docker version 18.06.0-ce, build 0ffa825

Docker 주요 명령

이미지 관리 (image)

  • pull : Docker 이미지를 레지스트리에서 검색
  • ls : Docker 이미지 목록을 표시
  • inspect : Docker 이미지의 상세보기
  • tag : Docker 이미지에 태그를 붙이기
  • push : Docker 이미지를 레지스트리에 업로드
  • rm : Docker 이미지 삭제
  • save : Docker 이미지를 tar 파일에 저장
  • load : save로 굳힌 tar에서 Docker 이미지를 생성
  • import : export로 굳힌 tar 파일에서 Docker 이미지를 생성

컨테이너 관리 (container)

  • ls : 컨테이너 목록보기
  • run : Docker 이미지에서 컨테이너를 생성
  • stats : 컨테이너의 자원 사용량을 표시
  • logs : 컨테이너에서 실행 로그 확인
  • create : Docker 이미지에서 컨테이너 생성
  • start : 컨테이너의 시작
  • stop : 컨테이너의 정지
  • restart : 컨테이너를 다시 시작
  • pause : 컨테이너의 일시 정지
  • unpause : 일시 정지 컨테이너의 시작
  • rm : 정지 중 컨테이너 삭제
  • attach : 실행중인 컨테이너에 연결
  • exec : 실행중인 컨테이너에 연결
  • top : 실행중인 컨테이너 프로세스 나열
  • port : 컨테이너의 공개 포트 번호 표시
  • rename : 컨테이너의 이름 변경
  • cp : 컨테이너와 호스트 OS간에 파일 및 디렉토리 복사
  • diff : Docker 이미지가 생성 된 이후의 변경 정보를 표시
  • commit : 변경된 컨테이너에서 이미지를 만들기
  • export : 컨테이너를 tar 파일에 저장

기타

  • version : Docker 버전보기
  • info : Docker의 실행 환경 정보를 표시
  • search : Docekr 이미지 검색
  • login : Docker Hub에 로그인
  • logout : Docker Hub에서 로그 아웃

Dockerfile

Dockerfile 개요

Dockerfile는 컨테이너의 구성 정보를 정의하는 파일이다. Dockerfile을 준비하면 여러 번 Docker 명령을 두드릴 필요없이 하나의 명령어로 Docker 이미지를 생성 할 수 있기 때문에 구축의 번거 로움을 간소화하거나 실수를 없애거나 Dockerfile 자체를 절차의 일부로 다룰 수있다. 

반대로 Dockerfile가 없다고면 컨테이너 작업에 대한 지침이나 파라미터 시트 등을 별도로 관리 할 필요가 있다. 새로운 이미지를 만드는 데 기반 이미지에서 일단 컨테이너를 시작하여 명령 실행한다.

build

build 명령

build 명령 Dockerfile에서 Docker 이미지를 생성한다.
-t 옵션으로 완성 임의의 Docker 이미지 이름을 지정한다.
-f 옵션 Dockerfile의 경로를 지정한다.

# docker image build -t <イメージ名> -f <Dockerfile>

Automated Build

GitHub 또는 Bitbucket에서 공개되는 Dockerfile에서 Docker 이미지를 빌드하고 Docker Hub에 등록하는 기능.
GitHub (Bitbucket) 계정과 Docker Hub 계정 간의 연계 설정이 필요하다.
파일 이름이 "Dockerfile"이어야한다.

레이어

build 실행시 내부에서 명령마다 이미지를 만드는 운동을하고 있지만, 실제로는 효율적으로 이미지를 관리하기 위해 각 이미지의 전체가 아니라 이미지 간의 차이 (tar) 인 레이어 스택 를 관리하고있다.

이 레이어 수는 스토리지 드라이버 유래에 제한이 있기 때문에 가능한 명령은 다음과 같이 하나로 정리하는 것이 좋다.

NG 예

RUN yum -y install httpd RUN yum -y install git

OK 예

RUN yum -y install \ httpd\ git

명령

명령 목록

  • FROM : 기본 이미지 지정
  • MAINTAINER : 작성자 정보 설정
  • ENV : 환경 변수를 설정
  • WORKDIR : 위치 (디렉토리)로 이동
  • USER : 사용자 변경 설정
  • LABEL : 메타 정보 (버전이나 댓글 등) 설정
  • EXPOSE : 공개 포트 번호 설정
  • ADD : 파일이나 디렉토리를 검색 (원격 가능)
  • COPY : 파일이나 디렉토리를 검색 (로컬 전용)
  • VOLUME : 볼륨 설정
  • ONBUILD : 다음 build시 실행되는 명령을 설정
  • RUN : 기본 이미지로 부팅 한 컨테이너에서 실행하는 명령을 설정
  • CMD : 만든 이미지가 시작되면 실행할 명령을 설정
  • ENTRYPOINT : 만든 이미지가 시작되면 실행할 명령을 설정

명령 자세한

FROM

기반 이미지 지정하는 명령.

FROM centos

MAINTAINER

Dockerfile 작성자 정보를 설정하는 명령.
그러나 MAINTAINER은 1.13에서 사용되지 않으며 대신 LABEL 명령을 사용.

MAINTAINER goldkou

ENV

컨테이너의 환경 변수를 설정하는 명령.
run 명령 env 옵션과 유사 할 수 있지만, env 옵션의 내용이 우선된다.

ENV hoge=hogehoge\ fuga=fugafuga

WORKDIR

위치 (디렉토리)를 이동하는 명령.
다음 이후의 명령은 이동 한 먼저 위치가 기점이된다.

WORKDIR /tmp RUN ["pwd"]

USER

사용자 변경 명령.
다음 이후의 명령들은 변경 한 후 사용자된다.

USER admin RUN ["whoami"]

LABEL

이미지에 메타 정보 (버전이나 댓글 등)을 설정하는 명령.
inspect 명령으로 내용을 확인할 수있다.

LABEL title="sampleImage"\ version="1.0"\ description="This is a sample."

# docker image inspect 1a5099f89ade |grep title "title": "sampleImage", # docker image inspect 1a5099f89ade |grep version "org.label-schema.schema-version": "= 1.0 org.label-schema.name=CentOS Base Image org.label-schema.vendor=CentOS org.label-schema.license=GPLv2 org.label-schema.build-date=20180531", "version": "1.0" # docker image inspect 1a5099f89ade |grep description "description": "This is a sample.",

EXPOSE

컨테이너의 공개 포트 번호를 설정하는 명령.
외부에서 액세스하는 경우에는 run 명령의 -p 옵션을 사용하여 포트 포워딩이 필요합니다.

EXPOSE 80

ADD

파일이나 디렉토리를 검색하는 명령.
호스트 OS에서 로컬 파일 또는 원격 파일도 가능.
원격 파일의 경우 퍼미션이 600이되는 점에주의.

ADD https://github.com/docker/cli/blob/master/README.md /tmp

COPY

파일이나 디렉토리를 검색하는 명령.
호스트 OS에서 로컬 파일 만 가능. 로컬 파일을 복사 할 경우는 COPY를 사용하는 것이 추천되고있다.

COPY tmp.txt /tmp

VOLUME

볼륨 할애 명령.
컨테이너의 마운트 포인트를 지정한다. 호스트 OS 등에서 볼륨이 마운트된다. 컨테이너 파일은 컨테이너를 제거하면 사라지기 때문에 중요한 데이터는 컨테이너가 아니라 외부 볼륨으로 관리 할 것.

VOLUME /myvol

ONBUILD

다음 build에서 실행할 명령을 이미지로 만드는 명령. Dockerfile에서 생성 한 Docker 이미지를 기본 이미지로 다른 Dockerfile 빌드 될 때 실행되는 명령을 설정한다.

다음은 ADD 명령을 이용하여 호스트 OS의 tmp.tar 파일을 컨테이너 / var / www / html 부하에 포함하는 예.

ONBUILD ADD tmp.tar /var/www/html/

RUN

Docker 이미지를 만들 때 컨테이너에서 명령을 실행하는 명령. 실행 파일은 Exec 형식과 Shell 형식의 2 종류가있다.

Exec 형식은 쉘을 거치지 않고 실행한다. 공식적으로는 이쪽이 권장되고있다.
Shell 형식은 / bin / sh -c 쉘을 통해 수행한다.

Exec 형식 예

RUN ["yum -y install httpd"]

Shell 형식 예

RUN yum -y install httpd

CMD와 ENTRYPOINT의 차이는 RUN은 "Docker 이미지를 만들기위한 명령" 을 정의하는 반면, CMD와 ENTRYPOINT는 "Docker 이미지가 시작된 이후 실행되는 명령"을 정의하는 점이다 .

CMD와 ENTRYPOINTCMD

Dockerfile에서 만든 Docke 이미지에서 실행 컨테이너에서 지정된 명령을 실행하는 명령. run 명령의 인수에 지정된 명령에 CMD의 내용을 대체 할 수있다.

하나의 Dockerfile에 CMD는 하나씩. Exec 형식은 쉘을 거치지 않고 실행한다.
Shell 형식은 / bin / sh -c 쉘을 통해 수행한다.

Exec 형식 예

CMD ["ping","127.0.0.1","-c","5"]

Shell 형식 예

CMD ping 127.0.0.1 -c 5

여러개 CMD를 실행하려면

여러 명령을 실행하려면 명령들을 쉘 스크립트에 정의하고 CMD에서 그 쉘을 실행하도록합시다.

ENTRYPOINT

Dockerfile에서 만든 Docke 이미지에서 실행 컨테이너에서 지정된 명령을 실행하는 명령. run 명령의 인수에 지정된 명령에 CMD의 내용을 재정의 할 수 있지만 - entrypoint 옵션이 필요합니다.

하나의 Dockerfile에 ENTRYPOINT 하나만.
Exec 형식은 쉘을 거치지 않고 실행한다. 공식적으로는 권장으로되어있다.
Shell 형식은 / bin / sh -c 쉘을 통해 수행한다. 공식적으로는 비추천으로되어있다.

Exec 형식 예

ENTRYPOINT ["ping","127.0.0.1","-c","5"]

Shell 형식 예

ENTRYPOINT ping 127.0.0.1 -c 5

CMD와 ENTRYPOINT 함께

CMD와 ENTRYPOINT을 하나의 Dockerfile 병용하는 경우, CMD 값이 ENTRYPOINT의 끝에 추가된다. (CMD가 ENTRYPOINT 옵션으로 취급)
다음은 localhost로 ping 명령어의 예.

ENTRYPOINT ["ping"] CMD ["127.0.0.1", "-c", "50"]

CMD와 ENTRYPOINT의 차이

CMD와 ENTRYPOINT의 주요 차이점은 run 명령어 실행시 덮어 쓰기 방법뿐.

주석

Dockerfile은 #으로 주석 처리합니다.

# This is a comment out of the dockerfile.

Dockerfile 움직여 본다

우선 각각의 의미는 그렇게 없지만, 여러가지 명령을 Dockerfile에 써본다.

FROM centos

MAINTAINER goldkou

LABEL title="sampleImage"\
      version="1.0"\
      description="This is a sample."

RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol

ENV hoge=hogehoge

EXPOSE 80

WORKDIR /tmp
RUN ["pwd"]

ADD https://github.com/docker/cli/blob/master/README.md /tmp

COPY sample.txt /tmp

compose

동일한 호스트 OS의 여러 컨테이너를 일괄 관리하는 구성 요소.
"docker-compose.yml"파일에 여러 컨테이너의 구성 정보를 정의하고 docker-compose 명령 기동이나 정지 등의 관리를한다.
일반적으로 여러 서버 군 (컨테이너 군)에서 1 개의 서비스를 구성하기 위해 둘을 합친 compose의 수요가있다.

docker-compose.yml

서비스 목록

  • image : 기본 이미지 지정
  • build : Dockerfile 지정
  • command : 컨테이너에서 실행하는 명령 설정
  • links : 컨테이너 간의 연결 설정
  • ports : 호스트 OS 외부에 공개 포트 설정
  • expose : 컨테이너 사이에서만 공개 포트 설정
  • volumes : 볼륨 마운트 설정
  • volumes_from : 다른 컨테이너를 볼륨으로 장착하기위한 설정
  • environment : 환경 변수 설정
  • env_file : 환경 변수를 파일 가져 오기 설정
  • container_name : 컨테이너의 이름 설정

서비스 상세

image

기본 이미지의 지정을한다.
Docker 이미지를 직접 지정하는 방법.
docker-compose.yml에는 image 또는 build 중 하나의 기재가 필요. (당연한 이야기이지만 컨테이너 시작은 이미지 필수이기 때문)

docker-compose.yml

sampleserver: image: ubuntu

build

Dockerfile 지정한다.
Dockerfile의 FROM 명령으로 이미지 지정할 수 있으므로 간접적으로 이미지를 지정할 수있다.
docker-compose.yml에는 image 또는 build 중 하나의 기재가 필요. (당연한 이야기이지만 컨테이너 시작은 이미지 필수이기 때문)

디렉토리 구성

# ls Dockerfile docker-compose.yml

Dockerfile

FROM ubuntu

docker-compose.yml

sampleserver: build .

command

컨테이너에서 실행하는 명령을 지정한다.

command: /bin/bash

links

컨테이너 사이의 네트워크 설정을한다.
links에서 지정한 컨테이너에 지정된 원본 컨테이너에서 연결 허용한다.
컨테이너의 / etc / hosts에 이름 설정이된다.

links: - dbserver

ports

컨테이너 외부에 공개 포트 설정을한다.
다음은 호스트 OS로 5000 번 포트 액세스를 컨테이너의 5000 포트로 전송하는 설정 예.

ports: - "5000:5000"

expose

컨테이너 사이에서만 공개 포트 설정을한다.

expose: - "5000"

volumes

컨테이너에 볼륨을 마운트합니다.
<마운트 원래 경로> : <마운트 지점 (컨테이너)의 경로> 형식으로 지정한다. (컨테이너 측은 생략 가능)

volumes: - /tmp:/tmp

volumes_from

다른 컨테이너에서 볼륨을 마운트한다.
아래는 storage라는 컨테이너에서 마운트 예.

volumes_from: - storage

environment

컨테이너의 환경 변수 설정을한다.

environment: - hoge=hogehoge

env_file

컨테이너의 환경 변수를 파일로드로 설정한다.

envfile

hoge=hogehoge fuga=fugafuga

env_file: envfile

container_name

컨테이너의 이름을 지정한다.

container_name: sample-container1

docker-compose 명령

docker-compose.yml 파일과 동일한 디렉토리에서 명령을 실행할 필요가있다.
또는 -f 옵션으로 파일 경로를 지정하고 실행하는 것도 가능하다.

docker-compose 명령 목록

  • ps : 컨테이너 목록 표시
  • up : 컨테이너 생성 및 시작
  • scale : 생성하는 컨테이너 수 지정
  • logs : 컨테이너 로그 확인
  • run : 컨테이너의 실행
  • start : 컨테이너의 시작
  • stop : 컨테이너의 정지
  • restart : 컨테이너를 다시 시작
  • rm : 컨테이너 삭제

docker-compose 명령 자세한

ps

컨테이너의 표시를한다.

# docker-compose ps Name Command State Ports --------------------------------------------------

up

docker-compose.yml에서 컨테이너를 생성하고 시작한다.

scale

docker-compose.yml 파일에서 생성하는 컨테이너의 수를 지정한다.

run

시작 된 컨테이너에서 새롭게 명령을 실행한다.
다음은 / bin / bash를 실행하는 예.

# docker-compose run ubuntuServer /bin/bash root@552410439d29:/#

start

여러 컨테이너를 일괄로 시작한다.
아무것도 지정하지 않으면 일괄실행.

# docker-compose start
Starting ubuntuServer ... done
Starting centosServer ... done

stop

여러 컨테이너를 일괄로 정지한다.
아무것도 지정하지 않으면 대량실행.

# docker-compose stop

restart

여러 컨테이너를 일괄 다시 시작한다.
아무것도 지정하지 않으면 일괄실행.

# docker-compose restart
Restarting sample_ubuntuServer_1 ... done
Restarting sample_centosServer_1 ... done

rm

여러 컨테이너를 일괄 삭제한다.
아무것도 지정하지 않으면 일괄로 실행.

# docker-compose rm
Going to remove sample_ubuntuServer_1, sample_centosServer_1 Are you sure? [yN] y Removing sample_ubuntuServer_1 ... done
Removing sample_centosServer_1 ... done