Docker 시작하기
현대의 대부분의 소프트웨어는 클라우드 환경에서 동작하게 되고, 서비스를 잘게 나누어 다양한 클라우드 환경에서 쉽게 배포하고 운영하기 위한 컨테이너 기술의 필요성이 대두되었다. 도커는 운영체제 위에서 프로세스를 독립적으로 실행가능하게 만들어 주는 리눅스 컨테이너 기술이다.
기본적으로 container 라는 환경을 구성하고 그 안에서 docker image를 실행시키는 방식이다.
여기서 docker image는 실행에 필요한 코드 및 패키지 등 모든 필요사항을 가진다.
도커는 운영체제 위에서 동작하며 같은 커널에서 어플리케이션이 동작하지만 메모리나 OS 등이 완벽하게 격리될 수 있다.
Installation
아래와 같이 brew 로 docker 를 설치하고, 권한을 할당하여 sudo 없이 docker 를 실행 할 수 있게 해준다.
1 | brew install docker docker-compose docker-machine && |
먼저 도커를 실행하면 도커 엔진이 실행되며 도커 이미지를 도커 엔진이 실행하면 컨테이너가 생성된다.
먼저 container를 설정하기 위해서 우리는 dockerfile을 작성해야 하는데 기본적인 dockerfile의 형태는 다음과 같다.
Dockerfile
1 | # set node.js environment |
그 뒤에 다음 명령어를 통해 docker image를 만들어 준다.
1 | docker build -t test . // image의 별명을 입력받아 docker image를 만들어 준다. |
앱 실행하기
다음 명령어를 통해 해당 machine의 4000번 포트를 외부 80번 포트에 연결해 준다.
1 | docker run -p 4000:80 -d test # test 라는 이미지를 실행한다. |
Docker container 중지하기
1 | docker container stop __container_name_or_id__ |
docker 로그인 하기
1 | docker login |
Docker image 배포하기
1 | docker image tag 붙이기 |
도커 허브의 이미지 받아서 실행하기
1 | docker run -p 4000:80 username/repository:tag |
지우기
1 | docker container rm __image_id__ |
모든 도커 컨테이너 삭제
docker rm $(docker ps -a -q)
모든 도커 이미지 삭제
docker rmi $(docker images -q)
실행중인 컨테이너의 쉘에 접근
docker exec -it container_id /bin/bash
docker 실행하면서 bash 실행하기
docker run -p 80:80 -it {컨테이너 이름} /bin/bash
Docker network
아래 옵션을 주면 네트워크 포트가 매핑된다.
하지만 아래와 같은 host 네트워크는 리눅스 운영체제에서만 동작하고 mac 이나 window 환경에서는 호스트의 포트에 매핑이 되지 않으니 주의하여야 한다.
1 | docker run --network host |
Docker Compose
container 내에서 여러개의 image가 돌아야 하고 서비스가 복잡해 질수록 많은 이미지들을 관리해야할 필요가 생기게 된다. 여기서 docker-compose.yml을 사용한다.
즉, docker compose 는 여러개의 도커 컨테이너가 동작하기 위한 방법을 기술한 것이다.
Docker-compose.yml 파일은 docker container가 배포 환경에서 어떻게 동작해야 할지 명시한다.
docker compose의 동작 순서는 다음과 같다.
- dockerfile 과 함께 어플리케이션의 환경을 정의하여 어디에든 배포할 수 있도록 설정한다.
- docker compose 파일에 서비스들을 정의하여 독립된 환경에서 함께 실행될 수 있도록 한다.
- docker compose 를 실행시킨다.
docker-compose example
1 | version: '3' |
1 | docker swarm init |
앱과 swarm을 내리기
1 | docker stack rm getstartedlab |
여기서 swarm 이란 여러 서버에서 동작하는 앱처럼 분산환경에서 배포하기 위한 것이다. 여러 대의 machine을 swarm 이라 불리는 dockerized cluster로 합쳐준다.
swarm을 실행하면 전체 노드들의 관리자로써 swarm을 통제할 수 있게 된다.
다음은 해당 machine을 swarm의 관리자로 임명하고 초기화하는 명령어이다.
1 | docker swarm init |
Docker-machine을 통해 virtual machine을 생성할 수 있는 hypervisor를 만들 수 있다.
아래 명령어를 docker-machine을 통해 vm들을 생성하는 명령어이다.
1 | docker-machine create --driver virtualbox myvm1 |
다음 명령어를 통해 특정 vm이 swarm의 manager가 되도록 한다.
1 | docker-machine ssh myvm1 "docker swarm init --advertise-addr <myvm1 ip>" |
특정 vm이 swarm에 참여하도록 하려면 다음 명령어를 수행한다.
1 | docker-machine ssh myvm2 "docker swarm join \ |
swarm에 포함된 node 들을 보는 명령어는 다음과 같다.
1 | docker-machine ssh myvm1 "docker node ls" |