ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 도커 (4)run하면, detache, -it, logs, tag바꾸기, 일괄삭제,
    docker 2022. 1. 25. 16:45

    ============

    run하면

    docker는 기본 root계정으로 접속

    docker container run -p 9090:8080 example/echo:latest

    이 상태에서 어떻게 빠져나올까? : 커맨드가 안먹어, Ctrl + C 도 안먹어 

    (근데 명령 프롬프트에서는 안먹어, wsl은 Ctrl + C 먹어)

     

    왜그럴까?

    docker container run -p 9090:8080 example/echo:latest

    에서

     

    docker run 하면 도커로 제어를 돌리고, 도커가 컨테이너를 실행해

    컨테이너는 실행이 종료될때까지 제어권을 갖고 있다

    run 하는 순간 컨테이너가 STOP되기 전엔 제어권을 계속 갖고 있다

    (▽뒤에 설명 나올 것, 간단하게는 main.go를 Dockerfile에서 CMD로 실행시키고 있는데 main.go는 서버를 리스닝 중)

     

    이걸 풀어주는 옵션을 써줘야해 -d, -it

     

    ============

    -d, -it

    -d : detache, 백그라운드에서 실행하는 것

    attach : 접속

     

    #5 detache 모드로 실행 

    그러므로 docker container run -d -p 9091:8080 example/echo:latest 하면

    안썼을 때 start server같은거 뜨는건 컨테이너 로그인데

    얘는 실행하고 바로 돌아옴

     

    -d, --detach : Run container in background and print container ID

     

    C:\Users\myanj> docker container run -d -p 9091:8080 example/echo:latest

    45822027b1d01c97fe09a177d1a79611ce72452b1a7880ac2e2ea03ec9ca108c ⇐ 컨테이너 ID 출력 후 제어권을 호스트로 반환


    C:\Users\myanj> docker container ls⇐ 제어권을 반환 받았으므로 다른 작업이 가능

     

    ============

    아까 명령어 안먹을 때 attach 모드로 실행한 컨테이너를 중지 하는법 (컨테이너를 실행한 창과 다른 창에서 container stop 명령으로 중지)

    (wsl에선 그냥 Ctrl+C하면 되긴해)

     

    C:\docker> docker container run -p 9092:8080 example/echo:latest

    제어권이 컨테이너로 가서 컨테이너 내부에서 입력을 받을 수 없음

    2022/01/25 01:03:11 start server

    종료 시그널을 처리할 수 없음 ⇒ 별도의 창을 실행해서 종료(stop)해야 함

     

    ID를 이용

    C:\Users\myanj> docker container ls

    CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                    NAMES

    45822027b1d0   example/echo:latest   "go run /echo/main.go"   4 minutes ago    Up 4 minutes    0.0.0.0:9091->8080/tcp   elated_lovelace

    1065e6ae0f54   example/echo:latest   "go run /echo/main.go"   10 minutes ago   Up 10 minutes   0.0.0.0:9090->8080/tcp   amazing_rosalind

     

    C:\Users\myanj> docker container stop 1065e6ae0f54

    1065e6ae0f54

     

    이걸 풀어주려면 실행시 -it 옵션 추가

     

    ============

    -it

    -it는 입출력 공유

    -i, --interactive                    Keep STDIN open even if not attached

    -t, --tty                            Allocate a pseudo-TTY

     

    i는 상호 주고 받겠다

    t는 tty를 쓰겠다, 검색해보니 tty는 터미널이라고 생각하래

     

    docker container run -it -p 9093:8080 example/echo:latest

    하면? 컨트롤+C가 먹어

    ⇒ 컨테이너가 실행 중지되면 호스트로 제어를 반환, 확인하는 사진

     

    입력한 값이 컨테이너쪽으로 전달이 안됨

     

    입출력 공유되니까

    종료시그널이 컨테이너로 넘어가고

    그럼 종료되고

    종료되니까 호스트로 제어권이 넘어오고

     

    ============

    -itd

    docker container run -itd -p 9093:8080 example/echo:latest

     

    일반적으로 컨테이너 프로그램은 백그라운드로 돌려야 내가 쉽게 다른 명령어를 쓸 수 있다, 안그러면 터미널을 계속 띄워야해

     

    it는 생활코딩이 운영체제 배워야 알 수 있댔어

     

    https://i5i5.tistory.com/314

    여기보면

    보통 -itd 옵션을 많이 씁니다.

    • -i, --interactive=false: 표준 입력(stdin)을 활성화하며 컨테이너와 연결(attach)되어 있지 않더라도 표준 입력을 유지합니다. 보통 이 옵션을 사용하여 Bash에 명령을 입력합니다.
    • -t, --tty=false: TTY 모드(pseudo-TTY)를 사용합니다. Bash를 사용하려면 이 옵션을 설정해야 합니다. 이 옵션을 설정하지 않으면 명령을 입력할 수는 있지만 셸이 표시되지 않습니다.
    • --name=””: 컨테이너에 이름을 설정합니다.
    • -d, --detach=false: Detached 모드입니다. 보통 데몬 모드라고 부르며 컨테이너가 백그라운드로 실행됩니다.
    • -p, --publish=[]: 호스트에 연결된 컨테이너의 특정 포트를 외부에 노출합니다. 보통 웹 서버의 포트를 노출할 때 주로 사용합니다.

     

    ============

    ctrl+z 안먹는데?

     

    ============

    프롬프트에

    # : 관리자권한

    $ : 그냥

     

    ============

    logs

    detach모드는 컨테이너를 백그라운드로 사용할 때 씀

    근데 로그는 볼 수 없어

    docker container logs 컨테이너ID

    하면 볼 수 있다, 계속 보려면 -f해줘야함

     

    ============

    도커허브에 올리려면 태그명 변경

    docker image tag example/echo:latest jisookim/echo:1.0

    이러면

    jisookim/echo:1.0로 바뀜

     

    ============

    이미지가 도커허브에 나오는건 시간이 걸릴수도 있다

     

    ============

    이렇게 이미지를 만들고

     

    ▽두번째 인자를 첫번째 인자로 바꾸는거네

     

    ============

    dangling 이미지 : 이름없는 이미지, <none> 이런거, 에러가 생기거나 하면 이런게 쌓임

    가 많아지면 관리가 어려워짐, 이미지라는게 하드디스크에 일정한 공간을 차지하고 쓸 수가 없으니 삭제를 해줘야해

     

    물론 docker image rm 이미지식별자(이름이 없으니 ID)

    이렇게 써주면 돼

    근데 ID가 복잡하잖아 많아지면 더 복잡할거고

     

    ============

    dangling 이미지 일괄 삭제 ⇒ PowerShell에서 실행

     

    -f

     : 필터

     

    docker image ls -f "dangling=true"

     : dangling 이미지만 조회

     

    docker image ls -f "dangling=true" -q

     : dangling 상태 이미지의 이미지 ID만 조회

     

    shell에서 명령어 실행결과를 문자열로 받아오는게 $()

     

    PS C:\Users\myanj> $(docker image ls -f "dangling=true" -q) ⇐ $(명령) 명령의 실행 결과를 문자열로 반환

    e9c8fc774d74

     

    그럼 이제

    docker image rm $(docker image ls -f "dangling=true" -q)

     

    만약 컨테이너에서 사용중인 이미지면 삭제가 안되는데 컨테이너 먼저 중지(stop)하고 하기

    개별 하든지 : docker container stop 컨테이너ID

    모든 컨테이너 스탑하기 : docker container stop $(docker container ls -q)

    --docker container stop 의 인자값으로 넣는것임

     

    모두 스탑됐는지 docker container ls 로 확인

     

    그럼 지워짐

     

    ============

    모든 상태의 컨테이너를 삭제

    docker container ls 는 실행상태

    docker container ls -aq : 모든 상태의 ID만 가져오기

     

    docker container rm -f $(docker container ls -aq)

     : -f는 강제종료하고 삭제

     

    container 대신 image면 모든 이미지 삭제

     

    ============

    ls -a -q ⇒ ls -aq

    --는 풀네임

    -는 단축

    단축할 땐 결합을 할 수 있어

     

    UNIX POSIX에서 사용하는 네이밍 규칙

Designed by Tistory.