ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Docker (5)Dockerfile & build, tag, -f, RUN&CMD
    생활코딩 Docker 2022. 2. 3. 17:14

    ===

    강의요약

    -

    commit(백업느낌)

    vs

    build(Dockerfile로 존재하지 않는 이미지를 생성하는, 만들어가는 느낌,

    Dockerfile은 어떤 과정을 통해 이미지가 만들어졌는지 남들도 알 수 있다)

     

    - docker build -t web-server-build .

    - -t, -f..

    - FROM, RUN, WORKDIR, COPY, CMD

     

    ===

    https://youtu.be/0kQC19w0gTI

     

    ===

    도커를 사용하다보면 남의 이미지를 사용해서 나의 컨테이너를 만드는 방법을 아셨다면 나의 이미지도 만들어보고 싶다는 생각이 들지 않나요? Dockerfile에 이미지를 생성하는 명령을 적은 후에 build 명령을 실행하면 이미지가 생성됩니다. commit이 이미 존재하는 컨텐이너를 이미지로 만드는 일종의 백업의 용도라면, build는 존재하지 않는 이미지를 생성하는 것이라고 할 수 있습니다. 그렇게 이미지를 만들면 이미지를 바탕으로 컨테이너를 만들 수 있고, docker hub와 같은 레지스트리로 push해서 공유할수도 있습니다. 이미지를 만들어봅시다!

     

    ===

    Dockerfile을 만들어서 image를 만드는 build명령을 사용방법을 소개하는 수업

     

    내가 만들고 싶은 이미지에 대해 Dockerfile의 형식에 맞춰 적고 build명령을 내리면 Dockfile을 바탕으로 새로운 image를 만들게 된다

     

    ===

    이전 시간, commit은 안에서 무슨 일이 벌어졌는지 알 수가 없었다

     

    vs commit

    결과적으로 이미지가 만들어지는 건 같아

     

    commit은 백업과 같은 느낌

    build는 시간의 순서에 따라 구체적으로 기록해서 생성하는 느낌

     

    ===

    웹서버가 설치돼 있는 이미지를 만들것, 이렇게 만들면 run해서 컨테이너를 만들면 바로바로 웹서버를 사용할 수 있게 만들 수 있다

     

    ===

    먼저 commit

     

    vscode의 도커확장기능이 깔려있는 상태, 왼쪽에서 CONTAINER와 IMAGES를 더 쉽게 볼 수 있다

     

    ubuntu 20.04버전으로 컨테이너를 만들어볼것

    docker run --name web-server -it ubuntu:20.04

    *-it : 만들어지자 마자 쉘에서 여러가지 명령을 실행하기 위해서, (3)exec (4)run bash 였어 여긴 그냥 run -it네

    이미지도 받아지고

    컨테이너도 만들어진다

     

    먼저 commit을 해볼거야, 쳐보면 설명이 나옴

    커밋은 이렇게 컨테이너 지정, 이미지이름 지정하면 됨

    docker commit web-server web-server-commit

    docker images

     

    사실 뭐 아무것도 안했으니 내용은 똑같겠죠

    이것과 똑같은 작업을 build로 해볼 것

     

    ===

    Dockerfile

    먼저 Dockerfile이라는 약속된 이름의 파일을 만듦

     

    FROM : Dockerfile은 FROM으로 시작, 

    FROM ubuntu:20.04 라고 쓰면 docker run에서 이미지이름을 적는것과 똑같은 것

    이렇게만 해놓고 docker build를 할건데, 터미널에 쳐보면 형식이 나옴

    OPTIONS에 이름을 정할 땐 -t,(태그)

    docker build -t web-server-build .

    . : 현재 디렉토리에 Dockerfile이 있으므로

    또 이 디렉토리는 이미지를 만들 때 사용할 파일들을 여기에 위치시킬것 무슨말?  --index.html 을 이 디렉토리에 둔다는 말, 뒤에나옴 별 거 아님

     

    이러면 IMAGE가 만들어진다, 

    이게 Dockerfile로 이미지를 만드는 방법

     

     

    ▽vscode에서 Dockerfile이라고 해야 도커파일로 인식함. 다른 파일명으로 하고 싶으면 Dockerfile을 만들고 복붙해서 다른 파일을 만들면 됨

    이렇게 파일명에 띄어쓰기가 들어가면 명령어가 안 먹는다

     

    ▽베이스 이미지 pull미리 안해도 됨

     

    ▽이름 안넣고 docker build . 하면 REPOSITORY와 TAG가 <none>인 채로 만들어짐.

    docker build -t 이름만쓰기 . 하면 TAG는 latest로 만들어짐

    docker build -t 이름:태그 . 이렇게콜론을넣으면 TAG에 이름이 채워짐  ▽ : 뒤를 태그로 인식하는구나

    docker build -f 도커파일명 . 하면 그 폴더에 있는 이름이 Dockerfile이 아닌걸로 만들 수 있다, 뒤의 . 도 위치를 따로 지정 가능

    (검색해보기)어떤 REPOSITORY에 latest가 있는데 똑같은 REPOSITORY명으로 태그 안쓰면 그 전건 <none>이 됨

    그럼 버전 관리는 현재 있는 latest를 태그이름을 바꿔주고 새거 올리는건가?

     

    이미 ubuntu같은 도커허브에 있는건 그게 그대로 가져와지나봐 방금 만든게(가져온게) CREATED가 3weeks ago래

     

    ===

    다음 할 것을 commit으로 먼저 해보기, python3를 깔 것

    python3안에는 웹서버가 내장돼 있기 때문에 그걸 이용하기 위해

     

    *apt : ubuntu의 appstore

     

    apt update

    apt install python3

    여기서 commit하면 이미지가 또 만들어짐(직접 명령어를 치진 않음)

     

    ===

    Dockerfile로 돌아와서

    Dockerfile안에서 저런 운영체제의 명령어를 실행시킬 때는 RUN이라고 하는 지시어를 쓴다

     

    FROM ubuntu:20.04

    RUN apt update

    RUN apt install python3

     

    이렇게 하면 되지만 RUN 명령어를 쓸 때마다 layer라는 것이 생성이되는데, 이 맥락에서는 별로 효율적이지 않다

    FROM ubuntu:20.04

    RUN apt update && apt install -y python3

    특별한 이유가 있지 않다면 이렇게 하나로 연결한다

     

    *&& : 앞의 명령어가 성공이 됐을 때 뒤에 있는 명령어가 실행됨, 이걸로 RUN에 여러개의 명령어를 배치시킬 수 있다

     

    그리고 이 과정에서 y/n이 뜨는데 그땐 Dockfile이 작동하지 않는다

    *-y : 자동으로 yes를 누르는 입력

    ▽도커파일에 띄어쓰기가 들어가면 안되는 것도 그렇고 유효성검사가 없으니 내가 이런 정도쯤으로 신경써줘야 하는 느낌

     

    WORKDIR

    ★내가 만들 웹서버가 사용자 요청이 들어왔을 때 요청을 특정 디렉토리에서 찾게 하고 싶으면, 뒤에 올 명령어의 대상 폴더

    일단 생성해야해

    생성할 때 mkdir /var/www/html 을 하는데, 중간에 www라는 디렉토리가 없으면 html도 생성이 안됨

    이때 -p라는 옵션을 하면 경로 전체가 생성이 된다

    mkdir -p /var/www/html

    cd /var/www/html

     

    ▽WORKDIR을 설정을 안하면 /bin/bash가 / 에서 시작함

    그리고 index.html도 / 에 만들어짐

    근데? WORKDIR 설정을 안하든 /var/www/html에 하든

    127.0.0.1:8888/index.html 는 페이지가 잘 나온다

    127.0.0.1:8888라고만 쳐도 페이지가 잘 나온다  ▽이건 서버 설정아냐?

     

    여기까지 한걸 Dockfile에서 똑같이 하려면

     

    WORKDIR /var/www/html

     : 웹서버가 사용자 요청이 들어왔을 때 어디 디렉토리에서 찾을지 + 디렉토리 없으면 만들고 + 사용자를 그 디렉토리로 이동하고 + 이제부터 우리가 실행하는 run이나 entrypoint, cmd같은 명령어가 실행될 때는 여길 대상으로 명령이 실행되게 되는 것

     

    그리고나서 사용자가 요청이 들어왔을 때 요청을 응답해줄 기본 웹페이지를 생성할 것(▽python3안에 들어 있는 웹서버의 설정이 어쩌구:포트 로 요청하면 index.html을 열도록 설정했나봐)

     

    터미널에서는

    echo "Hello, <strong>Docker</strong>" > index.html

    하면 되겠지

     

    이걸 도커파일에서는 하려면 방법이 여러가지가 있는데

    이러면 index.html은 /var/www/html에 생겨나게 됨. 물론 이렇게 하는 방법이 있겠지만 

    거기서 이렇게 만들지 말고 로컬에서 만들고 복사 하는 방법

     

    COPY

    더 편리한 방법으로

    Dockerfile이 만들어지고 있는 디렉토리에

    index.html을 내가 만들고

    내용 채워넣고

    Dockerfile이 빌드에 의해서 실행될 때 index.html파일을 호스트에서 image로 카피

    COPY ["index.html", "."]

    앞에것 : 호스트에 있는 index.html

    뒤에것 : /var/www/html 이라는 말 (WORKDIR 때문)

    로 복사하라는 것

    이제 웹서버를 실행시켜야 한다

    터미널에선

    python3 -m http.server

    내장돼 있는 웹서버가 실행이 되면서, 기본 포트인 8000 포트에 listening하게 되는 것

     

    우리가 하고 싶은건, 도커파일에서 만든 이미지를, 컨테이너로 생성할 때 바로 python3 -m http.server가 실행이 돼서 바로 웹서버를 사용할 수 있는 상태가 됐으면 좋겠는 것

    그때 사용할 수 있는 명령어가 CMD

     

    ▽아 RUN은 이미지를 만들 때(build가 되는 시점)고, CMD는 컨테이너를 만들때구나, 밑에 또 나온다

    CMD ["python3", "-m", "http.server"]

    python3

    가 갖고있는 옵션중에 -m

    http.server

     

    근데 이때 도커에서 웹서버를 실행하기 위해선 python3에 기본적으로 포함돼 있는 웹서버의 특성으로 인해 -u옵션을 주셔야 실행되고 있는 현재 상태가 로그가 화면으로 출력됨

     

     

    이제 명령어 써볼 것

    ▽이렇게 ;로 세줄을 쭉 연달아 쓰고 엔터를 눌러도 되네

     

    docker build -t web-server-build .;

    docker rm --force web-server;

    docker run -p 8888:8000 --name web-server web-server-build;

     

    세줄 연달아 실행해볼 것

    이미지 빌드하고

    rm은 혹시나 똑같은 이름의 컨테이너가 있으면 지우는 것

    ▽-p 가 8888:8000 인 이유는 8000이 python 웹서버의 포트로 내부적으로 돼 있다. 저~위에 터미널에 쳤을 때 port 8000이라고 써있잖아

    컨테이너 run

    이러면 로그에 python 웹서버 실행 뜬다

     

    ===

    RUN vs CMD

    RUN

     : build 가 되는 시점에 실행되는 명령어, 이미지에 반영

    CMD

     : 컨테이너가 실행될 때 실행되는 것, 컨테이너에 반영

     

    ===

    CMD는 자동으로 실행되는데,

    자동으로 시작하지 않도록 하고 싶을 수도 있다

    명령어를 실행할 때(run할 때) 맨 마지막에 pwd를 써주면, pwd가 CMD대신에 실행된다

    실행하는 시작명령을 변경할 수가 있는 것 : override

    ▽아 시작 명령이 따로 있구나 저 뒤에 인자로 쓰는거고 도커파일에선 CMD로 줄 수 있는거고, 그래서 또 써주면 변경이 되는거군  --이것도 배운적이 있어 추가필기를 할 구석이 있는데, CMD해서 실행되는 프로그램이 끝나면 연결 끊기는거였나? (알아보기)

     

    ===

    Package 'python' has no installation candidate

    우분투 저장소에 문제가 있는지 에러가 떠서

    https://positivemh.tistory.com/582

    여기에 나와있는대로 vim으로 서버 바꿔보려고 했는데? vim도 안깔리고 > 로 할까 하다가

    그냥 debian으로 하니까 10초만에 되네

    FROM debian
    RUN apt update && apt install -y python3
    WORKDIR /var/www/html
    COPY ["index.html", "."]
    CMD ["python3", "-u", "-m", "http.server"]

     

Designed by Tistory.