이미지는 컨테이너를 만들기 위한 기본 환경을 제공한다
도커 이미지는 정적 파일로 이미지 파일 자체로는 할 수 있는게 없다. 이 이미지 파일을 이용해 컨테이너를 배포하면, 이미지 파일 안에 있는 것들이 컨테이너 안에 배포되며, 이 컨테이너는 APP 으로서 작동한다
- 생성된 컨테이너는 이미지의 내용을 그대로 풀어놓는 것과 같으므로 이미지 내용을 READ 만 가능하며, WRITE ( 수정 ) 할 수 없다. 수정할 수 있는 방법은 해당 이미지를 BASE 로 새 이미지를 만드는 것 밖에 없다
- 생성된 컨테이너는 이미지로부터 읽을 수 있는 부분과 추가적으로 자체 작성할 수 있는 Layer 로 구성된다
FROM : 새로 만들 이미지의 BASE 이미지를 지정
RUN : 이미지 자체에 각종 패키지 설치, 업데이트와 같은 명령을 전달. 여러번 사용 가능하다
CMD : 이미지가 아니라 이미지에서 컨테이너로 배포될 때, 컨테이너에서 실행할 명령을 작성
ex) 이미지에는 RUN 을 이용하여 웹서버를 설치 ( RUN apt install -y apache ) 하고, CMD 를 이용해 컨테이너로 배포될 때 웹서버 데몬 ( CMD apache2ctl -DFOREGROUND ) 을 실행하게 된다
ENTRYPOINT : CMD 와 동일하게 컨테이너를 시작시킬 때 실행할 명령
- CMD 와의 차이점은 이미지 내에 있는 CMD, ENTRYPOINT 의 내용을 docker run 으로 배포할 때, 이미지에 있는 옵션과 docker run 에 작성한 옵션이 겹치는 경우 이미지 내의 CMD 는 무시되지만 ENTRYPOINT 는 둘 다 실행된다
- ENTRYPOINT & CMD 는 Dockerfile 에서 1번만 사용한다. 만약, 여러번 작성된다면 마지막에 있는 명령만 실행된다. 이로 인해, 컨테이너 실행시 전달해야할 명령이 많다면 shell 파일을 미리 작성해서 이미지로 전달하고, 컨테이너로 실행할 때 이 shell 파일이 실행하도록 할 수 있다
COPY : Host 에 있는 파일이나 디렉터리를 이미지로 전달
ADD : COPY 의 기능을 포함하고, Url 에 있는 파일 붙여넣기도 가능하다. 추가적으로 압축이나 패키징 되어 있는 파일을 붙여넣기 할 때에는 압축 해제 & 패키지 해제 된 상태로 붙여넣기 된다
- ADD test.tar /var/www/html 을 하면, 패키지 해제가 되어 이미지에 붙여넣기 된다
ENV : 이미지에 시스템 환경 변수 추가
- ex ) USERNAME, PWD, HOSTNAME 등
- 컨테이너에서 env 명령을 실행하면 A="Hello" 가 보인다
EXPOSE : 방화벽에서 허용하고자 하는 Port 를 지정한다. 허용한 Port 는 docker run -p 를 이용하여 Host 의 Port 와 매핑해줘야 외부에서 해당 Port 로 접근이 가능하다
VOLUME : 배포되는 컨테이너에 자동으로 특정 Volume 이 연결되도록 하기 위한 설정
- VOLUME /var/log : 컨테이너의 /var/log 를 Host 의 임의의 볼륨 ( ID ) 과 연결
- VOLUME /var/www/html /root : 컨테이너의 두 디렉터리를 Host 의 임의의 두 볼륨과 연결
- VOLUME testvolume:/var/log : Host 의 testvolume 과 컨테이너의 /var/log 를 연결한다. 허나, 이와 같이 Host 의 volume 을 지정하는 방식은 해당 이미지를 통해 다수의 컨테이너를 만들때, 다수의 컨테이너들이 동일한 Host 의 volume 을 사용하므로 무결성에 문제가 생긴다. 따라서 위와 같이 Host 의 임의의 볼륨 ID 와 연결하는 방법을 사용해야 무결성의 문제를 해결할 수 있다
WORKDIR : 작업 경로를 지정한다
ONBUILD : 해당 이미지를 생성할 때에는 적용되지 않지만, 해당 이미지를 이용하여 새 이미지를 만들때 적용되는 명령
- ONBUILD ADD test.tar /usr/share/nginx/html 을 작성하면, 현재 이 이미지를 만들때는 해당 명령이 실행안되므로, test.tar 는 필요없다. 허나, 이 이미지를 가지고, 새 이미지를 만들때는 해당 명령을 실행하므로 test.tar 가 필요하다
docker build -t myweb:1.0 .
- -t 옵션은 태그나 이름을 위한 옵션
- 뒤에 . 은 현재 위치의 Dockerfile 을 통해 build 하겠다는 의미다
생성된 이미지를 도커 허브에 올리고 싶다면
docker tag myweb:1.0 gildong/myweb:1.0
- 위 와 같이 앞에 ID 가 나온다
Private Registry 에 올리고 싶다면
docker tag myweb:1.0 211.183.3.111:5000/myweb:1.0
- 위 와 같이 앞에 사설 저장소 주소 및 Port 번호 가 나온다
docker push [ 이미지 이름 및 태그 ] 를 통해 이미지를 저장소에 Push 한다
push 를 위해서는 사전 로그인이 필요하다. 정상 로그인되면 로그인을 위한 Api 주소와 인증 정보는 /home/.docker/config.json 파일에 작성된다
- 이는 --insecure-registry 를 통해 인증 없이 push 가 가능하게 할 수 있다