도커에서 제공하는 스크립트로 설치
1 | $ sudo wget -qO- https://get.docker.com/ | sh |
도커 이미지
: 도커 컨테이너를 구성하는 파일 시스템과 실행할 어플리케이션 설정을 하나로 합친것으로, 컨테이너를 생성하는 템플릿 역할을 한다.
도커 컨테이너
: 도커 이미지를 기반으로 생성되며, 파일 시스템과 어플리케이션이 구체화돼 실행되는 상태.
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
이라는 에러 뜰 때
sudo systemctl start docker
실습
1 | $ sudo docker image pull gihyodocker/echo:latest |
위를 입력하여 이미지를 내려받자.
1 | $ docker container run -t -p 9000:8080 gihyodocker/echo:latest |
를 입력하여 내부 8080포트로 포트포워딩이 가능토록 해보자
1 | $ curl http://localhost:9000 |
을 입력하면 정상적으로 동작함을 볼 수 있다.
1 | $ docker container stop $(docker container ls -q) |
을 입력하여 컨테이너를 중지시킬 수 있다.
Dockerfile
FROM
: 도커 이미지의 바탕이 될 베이스 이미지. dOCKERFILE로 이미지를 빌드할 때 먼저 from 인스트럭션에 지정된 이미지를 내려받는다. 받아오는 이미지는 모두 도커 허브 레지스트리에 공개된 것이다. 콜론 뒤에 붙는것은 버전이라고 볼 수 있다.
RUN
: 도커 이미지를 실행할 때 컨테이너 안에서 실행할 명령을 정의하는 인스트럭션. 도커 안에서 실행할 명령을 그대로 기술한다.
COPY
: 도커가 동작중인 호스트 머신의 파일이나 디렉토리를 도커 컨테이너 안으로 복사하는 인스트럭션이다.
CMD
: 도커 컨테이너를 실행할 때 컨테이너 안에서 실행할 프로세스를 지정한다. RUN은 이미지를 빌드할 때 실행되고 CMD는 컨테이너를 시작할 때 한번 실행된다. RUN은 어플리케이션 업데이트 및 배치에, CMD는 어플리케이션 자체를 실행하는 명령이라고 생각하면된다.
CMD [“실행파일”,”인자1”,”인자2”] - 실행파일에 인자를 전달한다.
CMD 명령 인자1, 인자2 - 명령과 인자를 지정한다. 셸에서 실행되므로 셸에 정의된 변수를 참조할 수 있다.
CMD [“인자1”, “인자2”] - ENTRYPOINT에 지정된 명령에 사용할 인자를 전달한다.
ENTRYPOINT
: 컨테이너의 명령 실행 방식을 조정할 수 있다. CMD와 마찬가지로 컨테이너안에서 실행할 프로세스를 지정하는 인스트럭션인다. ENTRYPOINT를 지정하면 CMD의 인자가 ENTRYPOINT에서 실행하는 파일에 인자로 주어진다. 즉, ENTRYPOINT에 지정된 값이 기본 프로세스를 지정하는 것이다.
LAVEL
: 이미지를 만든 사람의 이름 등을 적을 수 있다.
ENV
: 도커 컨테이너 안에서 사용할 수 있는 환경변수를 지정한다.
ARG
: 이미지를 빌드할 때 정보를 함께 넣기위해 사용한다. 이미지를 빌드할 때만 사용할 수 있는 임시적인 환경변수 이다.
``
도커 이미지 빌드
도커파일 작성이 끝났으면 docker image build 명령으로 도커 이미지를 빌드할 수 있다.
문법은 다음과 같다.
-t 옵션으로 이미지명을 지정한다. 태그명도 지정할 수 있으며 생략시에는 latest태그가 붙는다.
-t 옵션과 이미지명은 반드시 지정해야 한다고 생각하는 편이 좋다. -t 옵션 없이도 빌드 자체는 가능하지만, 이미지명 없이는 해시값만으로 이미지를 구분해야 하므로 사용하기 번거롭다.
1 | docker image build -t 이미지명[:태그명] Dockerfile의 경로 |
실습을 진행해보자
1 | $ docker image build -t example/echo:lastest . |
example은 네임스페이스를 의미한다. 이미지명에 이렇게 사용자 네임스페이스를 추가할 수 있으며 이미지명의 충돌을 피하기 위해 네임스페이스를 붙이는것이 좋다.
1 | $ docker image ls |
를 입력하여 생성된 이미지의 정보를 확인할 수 있다.
ENTRYPOINT
1 | FROM golang:1.10 |
위와같이 도커파일을 만들고 아래를 입력하여 빌드해보자
1 | $ docker image build -t sh/golang:latest . |
아래 명령어는 컨테이너 안에 들어가 go version
을 입력한 것과 같다.
즉 아래 명령어의 version이 도커파일의 CMD 부분에 대입되는것이다.
1 | $ docker container run sh/golang:latest version |
이처럼 ENTRYPOINT는 이미지를 생성하는 사람이 컨테이너의 용도를 어느정도 제한하려는 경우에도 유용하다.
도커 컨테이너 실행
다음 명령어로 실행 할 수 있다.
1 | $ docker container run example/echo:latest |
다음 명령어로 데몬으로 실행할 수 있다. 명령어의 결과로 나오는 값은 컨테이너의 id이다. 도커 명령으로 컨테이너를 조작할 때 사용된다.
1 | $ docker container run -d example/echo:latest |
포트 포트포워딩
HTTP 요청을 받는 애플리케이션은 컨테이너 밖에서 온 요청을 컨테이너 안에 있는 어플리케이션에 전달해줘야 한다. 이를 바로 포트 포워딩이라 한다. 포트 포워딩이란 호스트 머신의 포트를 컨테이너 포트와 연결해 컨테이너 밖에서 온 통신을 컨테이너 포트로 전달한다. 이 기능 덕분에 컨테이너 포트를 컨테이너 외부에서도 이용할 수 있다.
다음 명령어로 포트포워딩을 할 수 있다. 9000포트로 접속할 경우 컨테이너 내부 8080포트로 연결된다.
1 | $ docker container run -d -p 9000:8080 example/echo:latest |
또는 아래와 같이 빈 포트로 자동할당되도록 할 수 있다.
1 |
|
/