ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • _Docker_docker CLI(Command Line Interface)
    Tools/Docker 2024. 7. 25. 20:30

    이번에는 docker의 명령어를 정리했다.

    참고 사이트:

    https://docs.docker.com/reference/

     

    Reference documentation

    Find reference documentation for the Docker platform’s various APIs, CLIs, and file formats

    docs.docker.com

     

    1. ps (process)

    docker ps <옵션>

    docker의 ps를 보여주는 명령어.

    실행되지 않은 ps를 함께 보려면, '-a' 옵션을 함께 사용.

     

    • CONTAINER ID
    • IMAGE: 사용된 컨테이너 이미지.
    • COMMAND: 사용된 명령어.
    • CREATED: 만들어진 시간.
    • STATUS: 명령어가 사용되고 실행된 상태. (Exited (0)은 성공)
    • NAMES: 컨테이너 이름.

    1.1. -f (filter)

    -f, --filter

     docker ps -a -f "name=hello"

    filter를 사용하여 특정 단어가 들어간 docker를 찾을 수 있음.

     

    다음과 같이 사용할 수도 있음.

    for ii in {5..10}; do docker run --name hello-world_${ii} hello-world; done

     

    filter 는 name외에도 다른 것들을 사용할 수 있으므로, 필요하다면 찾아보도록 하자.

     

    1.2. --format

    docker에서 얻는 정보가 너무 긴 경우 내가 원하는 column 정보만 뽑아서 볼 수 있다.

    docker ps -af 'neme=hel' --format "{{.ID}} {{.Image}} {{.Status}} {{.Names}}"

    필요한 정보만 출력

     

     

    2. rm (remove)

    docker rm <옵션> <docker id 또는 name>

    docker의 process를 지우는 명령어.

     

    예시:

    docker rm

     

    이번에는 hello-world_1 ~ hello-world_10을 한꺼번에 지우는 명령어.

    docker ps -af 'name=hello' --format "{{.Names}}" | xargs docker rm

    'xargs'를 사용하면 쉽게 여러개의 contatiner를 지울 수 있다. (xargs: eXtended ARGuments의 약자.)

     

    만약, 이름에서 걸리지 않는 경우 사용하는 이미지를 검색하여 지울 수 있음.

    docker ps -af 'ancestor=hello-world' --format "{{.Names}}" | xargs docker rm

    ancestor는 docker의 image를 필터링해서 docker process를 지워줌.

     

    모든 docker ps를 삭제하고 싶다면 다음과 같이 ID를 가지고 지우는 방법도 있다.

    docker ps -a --format '{{.ID}}' | xargs docker rm

     

    3. rmi (remove images)

    docker의 image를 지우는 명령어.

    만약 해당 이미지를 사용하는 docker process가 있다면, error 메시지가 나온다.

    hello-world image를 사용하는 docker process가 있기 때문에 hello-world image를 지울 수 없음

     

    물론 이를 강제로 지울 수 있지만, 추천하지 않는다.

    이미지가 정상적으로 지워진다면, 다음과 같이 확인할 수 있다.

    hello-world image가 정상적으로 지워짐

     

    4. image

    docker image <명령어>

    docker image

    docker의 image를 관리하는 명령어.

    위의 명령어 중 몇 가지만 살펴보자.

     

    4.1. ls

    docker image ls

    docker image의 list를 보여줌. docker images 명령어와 같다.

    docker image ls

    • Repository: docker image 저장소 이름
    • TAG: Tag name (version)

     

    4.2. pull

    docker image pull

    docker image를 pull 해줌. docker pull 명령어와 같다.

    우리가 docker를 run할 경우 해당 image가 없다면 docker를 pull한 이후에 run이 됨.

    당장 run이 목적이 아닌, 나중에 run을 하거나 build, save가 목적인 경우에는 pull을 함.

    pull을 할 image는 docker hub에서 쉽게 찾을 수 있음.

     

    nginx image를 pull한 모습.

     

    docker hub:

     

    Docker Hub Container Image Library | App Containerization

    Increase your reach and adoption on Docker Hub With a Docker Verified Publisher subscription, you'll increase trust, boost discoverability, get exclusive data insights, and much more.

    hub.docker.com

     

    4.3. inspect

    docker image의 여러가지 정보를 확인할 수 있다.

    docker image inspect 명령어는 docker inspect 명령어와 같다.

    docker image inspect <이미지명>

    inspect 명령어로 확인한 docker image의 정보

     

    -f, --format 옵션을 사용하여 특정 정보만 불러올 수 있다.

    docker image inspect -f '{{.Config.Env}} {{.Architecture}}' nginx

     

    4.4. save

    docker는 너무 많은 데이터를 다운 받을 경우 불이익이 발생할 수 있다고 한다.

    그러므로 계속 지우고 다운을 받는 것 보다는 자주 사용하는 이미지, 특정 버전의 이미지는 저장했다가 재사용 하는 것을 권장한다.

    stdout으로 출력이 되므로 redirection을 사용하여 저장.

    docker image save 명령어는 docker save 명령어와 같다.

    docker image save <이미지명> > <파일명.tar>

    docker image save

     

    4.5. load

    앞에서 저장한 이미지를 불러오도록 해보자.

    docker image load 명령어는 docker load 명령어와 같다.

    load 기능은 stdin으로부터 가져온다.

    docker image load < <파일명.tar>

    docker image load

     

    5. run

    docker run <옵션> <이미지> <명령> <매개변수>

    아래의 명령어를 살펴보자.

    docker run -it --name ubuntu_top ubuntu "top" "-d 1"
    • -i, --interactive: interactive mode.
      표준 입력(stdin)을 활성화하며, 컨테이너와 연결(attach)되어 있지 않더라도 표준 입력을 유지. (Bash에 명령 입력)
    • -t, --tty: terminal
      Bash를 사용하려면 이 옵션을 사용.
      이 옵션을 설정하지 않으면 명령을 입력할 수 있지만, shell이 표시되지 않음.
    • --name ubuntu_top: container 이름을 ubuntu_top으로 지정.
    • ubuntu: ancestor 지정.
    • "top": top 명령어 사용.
    • "-d 1": delay를 1초로 사용.

    결과:

    docker run으로 실행한 top 명령

    Process가 1개 실행된 것을 볼 수 있다.

     

    5.1. docker name지정

    docker run을 하면 이름이  random으로 지정된다.

    이름을 지정하고 싶다면, '--name' 옵션을 사용하여 명령어를 입력해보자.

    docker run --name my-hellow-world hello-world

    docker name 지정

     

    만약 똑같은 이름의 docker container를 만들고 싶다면 for문을 사용하여 만들 수 있다.

    for ii in {1..5}; do docker run --name hello-world_${ii} hello-world; done

     

    6. exec

    docker exec <옵션> <이미지> <명령> <매개변수>

     

    exec는 이미 사용중인 container에 진입하기 위한 명령어이다.

    이전에 위에서 docker run 명령으로 top을 실행시킨 터미널에 진입을 해보자.

    docker exec -it ubuntu_top top "-d 0.2"

    docker exec로 실행한 top 명령

     

    기존 run에서 실행된 top명령과 exec로 실행된 top 명령이 있어서 하나의 contaniner에서 process가 두 개 실행된 것을 볼 수 있다.

     

    추가로 exec로 bash를 실행해보자.

    docker exec -it ubuntu_top bash

    실행된 3개의 process

     

    컨테이너를 닫으려면 순차적으로 닫아도 되고 1번 run을 실행한 컨테이너만 닫아도 모두 종료.

     

     

    7. binding

    binding은 container와 외부 자원을 연결.

    많이 사용하며, 주로 I/O와 storage 관련을 연결.

    - network

    • port binding: host OS의 port와 container의 port를 바인딩.
    • network: docker network 사용. (compose에서 다룰 예정)

     

    - directory, file(regular file), block-device

    • mount binding: host OS의 directory를 바인딩.
    • volume: docker volume 저장소 사용. (compose에서 다룰 예정)
    • device: host OS의 device, GPU를 바인딩.

     

    - environment (굉장히 많이 사용.)

    • shell environment variables를 지정. (shell의 환경변수를 다루는 방법.)

     

    여기서는 port binding과 mount binding을 다룰 것이다.

     

    - port binding

    port를 binding하는 것은 web server를 다룬다는 의미.

    우리가 이전에 사용했던 nginx이미지를 inspect 명령으로 살펴보자.

    docker inspect nginx

    Config부분의 ExposedPorts의 내용을 보면 80/tcp 포트를 외부로 노출하고 있는 것을 볼 수 있다.

    config의 일부

     

    여기서 또 살펴볼 것은 stdin과 stdout, stderr를 사용하지 않는 것을 볼 수 있는데 daemon은 sigttin과 sigttout을 발생시키지 않기 위해서이다.

    이제 실제로 실행을 해보자.

     

    - foreground

    docker run --rm -p 8080:80/tcp --name nginx_8080 nginx
    • --rm: 종료시 자동으로 삭제
    • -p 8080:80/tcp: 
      -p: port를 binding 하겠다.
      8080: host의 port 번호.
      80/tcp: container의 port 번호.

    8080포트로 들어오면 docker 내부의 80/tcp포트로 연결을 해주겠다는 의미.

     

    Listen을 확인해보자.

    ss -nlt 'sport = :8080'
    ss -nlt 'sport = 8080'
    • ss (socket statistics): 시스템의 소켓 상태를 조회.
    • -n: numeric
    • -l: listen
    • -t: tcp
    • sport: source port

    시스템 소켓 상태를 조회하는데 source port가 8080인 것을 조회하라는 의미.

    작동하는지 확인

     

    작동하는지 확인을 했으므로, curl 명령어로 테스트를 해보자.

    curl 127.0.0.1:8080

    터미널로도 확인할 수 있고 브라우저에서도 확인이 가능하다.

    터미널 확인
    브라우저 확인

     

    - background

    지금까지는 foreground에서 실행을 했지만, 이번에는 background에서 실행을 해보자.

    이를 detach mode라 한다.

    docker run -d --rm -p 8080:80/tcp --name nginx_8080 nginx

    자세히 보면 foreground 명령어에 '-d' 옵션을 추가했다.

    이를 실행하면 container ID가 출력되며 실행된다.

    docker run backgorund

    log를 확인하고 싶다면 docker logs 명령어를 사용하면 된다.

    만약 계속해서 추적 관찰(following mode)을 하고 싶다면, -f 옵션을 사용하면 된다.

    docker logs nginx_8080
    docker logs -f nginx_8080

    docker logs

     

    detach mode로 작동하는 경우 web service는 안으로 들어갈 수 없지만, bash shell의 detach mode에서 작업하는 경우 attach를 할 수도 detach를 할 수도 있다.

     

    container를 running 상태로 두고 잠시 빠져나올때는 detach를 할 수 있다.

    바로 ctrl + p, ctrl + q를 순차적으로 입력하면 된다.

    이는 우리가 docker를 실행시 '-it' 옵션을 사용했을 경우에만 가능.

    escape key sequence : ^P^Q

    처음 실행할 때 -d 옵션을 추가하면 detach mode로 실행할 수 있다.

    '-it' 옵션에 추가하여 '-itd'로 사용.

    docker run --rm -itd --name ubuntu_bash ubuntu bash

    detach mode로 ubuntu bash 작동

     

    접근하기 위해서는 attach 명령어를 사용한다.

    docker attach ubuntu_bash #ubuntu_bash에 접근

    docker attach

    여기서 'ctrl + p, ctrl + q' 명령어를 입력하면 read escape sequence가 출력되며 나올 수 있다.

    docker detach

     

    attach와 detach에 대해서 잘 알고 싶다면 tmux를 공부해보는 것도 좋다.

     

    - mount binding

    이번에는 nginx에 외부 directory를 mount해보자.

    그 전에 nginx 웹서버가 사용하는 directory 구조를 알아야 한다.

    이는 docker hub에서 관련 문서를 보거나 직접 컨테이너에 들어가서 볼 수 있다.

    docker run --rm -it nginx bash

    내부 구조를 color로 보고 싶다면 다음 명령어를 입력하자.

    alias ls='ls --color'

     

    nginx의 설정파일의 위치는 '/etc/nginx'

     

    여기서 nginx의 설정은 nginx.conf에 있고 conf.d는 editional file들이 들어있다.

     

    여기서 more default.conf를 입력하여 내용을 보자.

    more default.conf

    more default.conf

    location / 는 root이다.

    /usr/share/nginx/html 이 바로 web document root 이다.

    이 부분은 주소로 사용하면, http://127.0.0.1/usr/share/nginx/html

     

    이 부분을 외부 host에서 mount로 binding 해보자.

     

    - '--volume', '-v'

    binding directory는 $HOME/nginx_workspace 폴더를 생성하여 내부의 /usr/share/nginx/html 과 연결을 할 것이다.

    우선 docker container에서 exit을 하고 host로 이동하여 셋팅하자.

    mkdir ~/nginx_workspace
    readlink -f ~/nginx_workspace

     

    폴더 생성 및 절대경로

     

    nginx_workspace 폴더 내부에 간단한 파일을 하나 만들자.

    echo "Hello Document root dir" > ~/nginx_workspace/hello.txt

    hello.txt 생성

     

    이제 docker run을 실행할 건데 이번에는 '-v' 옵션이 추가되었다.

    • -v: host의 file을 container와 연결. 여러 volume을 지정할 수 있다.
      사용예시: '-v host_file:container_file'
    docker run --rm -d -p 8080:80/tcp \
    -v /home/blue/nginx_workspace:/usr/share/nginx/html \
    --name nginx_8080 nginx

     

    이제 테스트를 해보자.

    터미널을 한개 더 열어서 curl로 nginx에 접속해보자.

    curl 127.0.0.1:8080

     

    이번에는 Forbidden이 뜨는데 원래 있던것을 binding해서 overriding 했기 때문이다.

    하지만 hello.txt는 잘 보인다.

    curl 127.0.0.1:8080/hello.txt

    home directory의 내용을 추가해도 함께 수정이 되는 것을 볼 수 있다.

     

    - '--mount'

    하지만, 요새는 docker에서 -v 가 아닌 --mount 사용을 권장하고 있다.

    -v 와 --mount 의 기능은 같지만, 명령어의 직관과 통일성을 위해 --mount 를 권장하고 있다.

    • type=bind : mount의 bind 기능.
    • type=volume : volume을 사용.
    docker run --rm -d -p 8080:80/tcp \
    --mount type=bind,src=/home/blue/nginx_workspace,dst=/usr/share/nginx/html \
    --name nginx_8080 nginx

     

    - environment variables 

    이번에는 환경 변수를 binding 하는 방법을 알아보자.

    옵션은 '--env', '-e'를 사용하면 된다.

    예시:

    • --env KEY=value
    • --env-file env_file
    docker run --rm -it -e LANG=en_US.utf8 --name ubuntu_bash ubuntu bash

    LANG이 적용된 것을 볼 수 있음.

     

    - docker volume, network

     이 기능들은 docker-compose와 같이 쓰이는 경우가 많음.

    개별적으로 쓰기에는 관리가 복잡하다.

    그러므로 이는 나중에 docker-compose와 함께 다룰 것이다.

     

    • docker volume
      • docker volume management.
      • Logical volume과 흡사.
    • docker network
      • network IP address, subnet mask 등 설정.

     

    8. start & stop

    • docket start
      • docker run 에서 '--rm' 옵션을 쓰지 않는 경우 exit를 하면 container가 남음.
      • stop 이후 재시작 할 때 docker start로 가능.
    • docker stop
      • detache mode로 실행중이면, 외부에서 docket stop으로 정지.
      • '-it' 옵션을 사용하지 않는 시스템은 signal 또는 docker stop으로 정지.

    예시:

    docker start & stop 예시

     

    9. 정리

    • detach mode :-d
    • stdio 사용: -it
    • 종료시 자동 제거: --rm
    • binding (port) : -p host_port:container_port
    • binding (file) : --mount  or -v
    • binding (env.) : -e KEY=value or --env-file

    'Tools > Docker' 카테고리의 다른 글

    _Docker_docker 설치 및 권한  (1) 2024.06.03
    _Docker_chroot container & isolation  (0) 2024.05.31
Designed by Tistory.