2.도커 컨테이너 실행

도커에서 제공하는 스크립트로 설치

1
2
$ sudo wget -qO- https://get.docker.com/ | sh
$ sudo usermod -aG docker shkim

도커 이미지 : 도커 컨테이너를 구성하는 파일 시스템과 실행할 어플리케이션 설정을 하나로 합친것으로, 컨테이너를 생성하는 템플릿 역할을 한다.

도커 컨테이너 : 도커 이미지를 기반으로 생성되며, 파일 시스템과 어플리케이션이 구체화돼 실행되는 상태.

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
2
docker image build -t 이미지명[:태그명] Dockerfile의 경로

실습을 진행해보자

1
$ docker image build -t example/echo:lastest .

example은 네임스페이스를 의미한다. 이미지명에 이렇게 사용자 네임스페이스를 추가할 수 있으며 이미지명의 충돌을 피하기 위해 네임스페이스를 붙이는것이 좋다.

1
$ docker image ls

를 입력하여 생성된 이미지의 정보를 확인할 수 있다.

ENTRYPOINT

1
2
3
4
FROM golang:1.10

ENTRYPOINT ["go"]
CMD [""]

위와같이 도커파일을 만들고 아래를 입력하여 빌드해보자

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
2
$ docker container run -d -p 9000:8080 example/echo:latest

또는 아래와 같이 빈 포트로 자동할당되도록 할 수 있다.

1
2
3
4
5

$ docker container run -d -p 8080 example/echo:latest
// 빈 포트가 에페메랄 포트로 자동 할당된다.
$ docker container ls
//포트를 확인해보자

/

Share