0부터 시작하는 Docker 공부 - Docker 복습

Jaehong Lee·2022년 8월 21일
0
post-thumbnail

지금까지 배웠던 것을 돌아보자

1. 컨테이너와 이미지

  • 이미지는 컨테이너를 만들기 위한 기본 환경을 제공한다

  • 도커 이미지는 정적 파일로 이미지 파일 자체로는 할 수 있는게 없다. 이 이미지 파일을 이용해 컨테이너를 배포하면, 이미지 파일 안에 있는 것들이 컨테이너 안에 배포되며, 이 컨테이너는 APP 으로서 작동한다

    • 생성된 컨테이너는 이미지의 내용을 그대로 풀어놓는 것과 같으므로 이미지 내용을 READ 만 가능하며, WRITE ( 수정 ) 할 수 없다. 수정할 수 있는 방법은 해당 이미지를 BASE 로 새 이미지를 만드는 것 밖에 없다
    • 생성된 컨테이너는 이미지로부터 읽을 수 있는 부분과 추가적으로 자체 작성할 수 있는 Layer 로 구성된다

2. 이미지 만들기 - Dockerfile

  • commit 을 이용하여 동작중인 컨테이너를 이미지로 변환할 수 있지만, 안정성 면에서 떨어져 추천하지는 않는다. 따라서, Dockerfile 을 이용하여 이미지를 만드는 방법을 가장 추천한다

Dockerfile Option

  • 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 를 이용해 만든다

docker build -t myweb:1.0 .

  • -t 옵션은 태그나 이름을 위한 옵션
  • 뒤에 . 은 현재 위치의 Dockerfile 을 통해 build 하겠다는 의미다

3. 이미지 push & pull

tag

  • 생성된 이미지를 도커 허브에 올리고 싶다면

    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 번호 가 나온다

push

  • docker push [ 이미지 이름 및 태그 ] 를 통해 이미지를 저장소에 Push 한다

  • push 를 위해서는 사전 로그인이 필요하다. 정상 로그인되면 로그인을 위한 Api 주소와 인증 정보는 /home/.docker/config.json 파일에 작성된다

    • 이는 --insecure-registry 를 통해 인증 없이 push 가 가능하게 할 수 있다
profile
멋진 엔지니어가 될 때까지

0개의 댓글