공부중에 작성한 내용입니다. 정확하지 않을 수 있어요. 😀
기본적으로, Docker compose는 4가지의 카테고리(service, version, volumns, networks)로 작성하며, 특히 service와 version을 많이 사용한다.
어떤 버전의 docker compose를 사용할 것인지 지정해준다.
보통 "3"을 많이 사용한다.
앞서 설명했듯, Docker Compose는 여러 개의 도커들을 관리하는 기술이다. servies 옵션은 어떠한 컨테이너를 관리할 것인지를 지정해준다.
위의 코드에서는, nginxproxy, nginx, apache라는 세 개의 컨테이너를 쓸 것이다.
docker run에서의 -v옵션과 동일한 역할을 한다.
호스트PC의 폴더와 컨테이너 내부 폴더를 바인딩하는 것.
여러 volume을 지정할 수 있기 때문에, 리스트 형태로 작성을 해준다. 따라서, 앞에 하이픈(-)을 붙여야 한다.
컨테이너간 네트워크의 분리를 위한 추가 설정 부분
하지만 대형 서비스가 아닌 이상, 보통 하나의 네트워크 안에서 여러 개의 도커를 쓰기 때문에, 공부하는 입장에서 보통은 쓰지 않는다.
docker run 에서의 -p와 동일한 역할
YAML문법에서는 -p문법을 썼을 때와 같이 11:22와 같이 작성할 경우, 시간으로 인식을 할 수 있기 때문에, "11:22"와 같이 쌍따옴표로 감싸준다.
컨테이너가 다운되었을 시, 항상 재시작하라는 설정. 서버도 사람이 만든건지라 갑자기 서버가 다운되는 변수가 일어나는데, 이 설정을 해준다면 웬만한 상황에서는 다시 복구를 자동으로 해준다(고 합니다 ㅎ)
Dockerfile의 ENV 옵션과 동일한 역할을 한다.
옵션에 들어갈 변수 역시 리스트형태로 앞에 하이픈(-)이 붙어야 한다.
다만, 보안을 위해서 environment에 들어갈 내용을 따로 파일로 작성하여, env_file 옵션으로 불러들이는 경우도 있다.
여러 컨테이너를 Docker Compose로 실행할 경우, 각 컨테이너가 실행을 시작하는 시점이 미묘하게 다를 수 있다.
따라서 특정 컨테이너가 시작되자마자, 다른 컨테이너에 접속하도록 프로그래밍을 한다면, 접속하고자 하는 컨테이너가 생성되기 전이라서 의도치 않게 오류가 발생할 수 있다.
따라서, 컨테이너의 depends_on 옵션에 컨테이너를 리스트형태로 적어주면, 해당 컨테이너가 생성되기 이전에, 어떤 컨테이너가 먼저 생성되어야 하는지를 도커에게 알려줄 수 있다.
컨테이너 내부에서, 다른 컨테이너에 접속하고 싶을 때 사용하는 옵션.
DockerHub에서 다운로드받은 이미지가 아니라, dockerfile을 기반으로 컨테이너를 작성하고 싶을 때 사용.
컨테이너 이름 설정
이 옵션 없이 그냥 docker compose로 컨테이너를 띄웠을 때, 도커파일과 관련이 있는 이름으로 도커가 그냥 임의로 지정을 해준다.
그거 말고, 내가 직접 이름을 지어주고 싶을 때 사용.
.yml 확장자의 파일이 있는 해당 파일로 이동한뒤
docker-compose up -d
(-d는 백그라운드에서 실행한다는 옵션. 만약 이 옵션이 없다면,
Docker의 출력물만 나오면서, 다른 명령은 실행할 수 없게 된다.)
명령을 실행해준다. (하나의 폴더 안에 하나의 yml 파일만 있어야 한다. 명령이 실행되는 폴더 안에 있는 yml파일만을 참조하기 때문에, 여러 개의 docker-compose를 만들고 싶다면 여러개의 폴더를 만들고 하나의 폴더 안에 하나의 yml 파일만이 있게 해주자.)
만약 이미지 재빌드가 필요하다면
docker-compose up --build -d
와 같이 --build 옵션을 붙여준다. 만약 안붙여주면 기존에 작성되었던 이미지를 사용한다.
Docker Compose 중지 명령
docker compose stop
docker-compose up 으로 만들어진 컨테이너 삭제
docker-compose down
docker-compose logs
각 컨테이너의 모든 로그(출력결과) 확인
doker-compose config
실행 중인 Docker Compose 의 docker-compose.yml 설정 확인
docker-compose exec <컨테이너이름>
실행중인 컨테이너에 명령어를 실행/ 하지만 보통 그냥 docker exec를 쓰지, 이렇게는 별로 안쓴다.