##1. docker CLI

###1. docker daemon과 통신하여 기능 수행

1. binary: docker

 1) docker group을 supplementary group에 포함시켜야 사용 가능 (user mod로 user의 정보를 변경할 때 그룹을 추가하는 방법을 unix command파트에서 배웠다)

docker의 권한을 jlim에 제공. 

id 명령 시 도커가 추가되지 않았다. 그러나 id username에선 추가가 되있다. 전자는 runtime 상태를 말하며, 후자는 configured 현재 설정을 말한다. 세션이 만들어지는 건 로그인할 때 만들어지기에, 설정을 했음에도 바로 반영되지 않고  새로 세션을 만들 때 설정이 반영된다(도커 그룹의 권한이 들어온다.)

 

2) 그룹 추가 후에는 session을 재생성해야, groups 정보를 다시 읽는다.

 가. 다시 말해 재로그인 하라는 뜻. 

     ** newgrp <group> 명령으로 바로 group 자체를 변경하는 방법을 쓸 수 도 있지만, 사실상 shell을 새로 실행하는 것이다.

3) Ubuntu 배포판

  가. Ubuntu는 재로그인으로는 groups가 반영되지 않는다. 그룹 반영은  gdm을 재실행 해야하므로 다음과 같이 실행한다. (또는 reboot으로 가능)

 

  ㄱ. X window에서 로그아웃 한다(우측 상단)

  ㄴ. <CTRL-ALT-F4>를 눌러서 tty4로 이동한 뒤에 console에 root로 로그인한다.

  ㄷ. systemctl restart gdm

  ㄹ. X window 로그인 한다.

 

gdm을  restart 한 뒤에 로그인하고 id 확인 시 docker가 나오는걸 확인해보자.

 

$ id
$ docker run hello-world
$ docker ps -a
$ docker rm 95fdbe270ac4  // CONTAINER ID 뿐만 아니라 NAMES 를 입력해도 삭제됨

삭제후 다시 docker ps -a 입력하여 컨테이너 아이디 확인하면 다음과 같이 삭제된걸 확인 할 수 있다

 

2. docker CLI : run (name)

새로 컨테이너를 만들어 컨테이너 이름을 직접 지정해보자

$ docker run --name hello-world_01 hello-world
$ docker ps -a
$ docker rm hello-world_01
$ docker ps -a

 

name을 지정하면 더 편리하게 관리할 수 있다.

이름으로 지우나 컨테이너 이름으로 지우나 상관없다.

 

/* 10개의 hello-world container를 만들어보자*/

이름은 hello-world_1  hello-world_2 ...hello-world_10 으로 한다.

일일이 docker run --name hello-world_숫자 hello-world  로 타이핑 해야할까? 아니다.

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

위와 같이 작성하면

1~10 까지 컨테이너가 생성된다

 

3. docker CLI : filter

1) docker CLI의 option에는 filter기능이 제공된다

  모든 명령어에 제공되는 것은 아니다. 일단 ps 부터 살펴보자

 

$ docker ps -a -f 'name=hello'

 

 

$ docker ps -a -f 'name=1-3'

// 1 ~ 3 이 들어간 이름을 가진 컨테이너만 뽑음

 

 

$ docker ps -a -f 'name=[1|3|5]'

 

FIltering 명령어 참고

https://docs.docker.com/engine/reference/commandline/ps/

 

docker ps

docker ps: List containers

docs.docker.com

 

 3. docker CLI : format 

1) 필터링 시 너무 길게 나오고 원하지 않은 정보도 같이 나온다, 이에 format 명령을 통해 원하는 정보만 뽑을 수 있다.

 

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

 

자주 사용되는 docker ps 명령은 alias에 등록해놓고 사용하면 편함( ~/.bash_aliases 편집)

 

출처

https://docs.docker.com/engine/reference/commandline/ps/

 

복수 컨테이너 삭제 시

rm <NAME|ID> [...]

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

 

xargs를 이용하면 쉽게 여러개의 container 를 삭제할 수 있다.

{{.Names}} 대신에 {{.ID}} 를 사용해도 같다.

 

이전에는 컨테이너만 지우지 Docker image 를 지우진 ㅇ낳는다.

 

4. docker CLI : rmi

rmi : remove images

 

rmi <image> [...]

 

$ docker rmi hello-world

Error response from daemon: conflict: unable to remove repository reference "hello-world" (must force) - container 98dcb7d003a7 is using its referenced image feb5d9fea6a5

hello-world image를 지우려하면 위 같은 에러가 나는데 이는 container존재하여 image삭제가 실패한 것이다.

force option으로 실행 할 수 있으나, 추천하지 않으며 되도록 container를 삭제한 뒤 image를 삭제한다.

$ docker ps -a -f 'ancestor=hello-world' --format {{.Names}} |xargs docker rm
wonderful_kowalevski

$ docker rmi hello-world
$ docker ps -a

 

 

5. docker CLI :image   ,  docker image를 관리하는 docker image

https://docs.docker.com/engine/reference/commandline/image/

 

docker image

docker image: Manage images.

docs.docker.com

 

build 와 관련된 기능은 여기서 다루지 않으며, 주로 운용 명령을 중점적으로 다루어 볼것이다.

-> inspect, load, ls, pull, rm ,save

 

6. docker CLI :image : ls 

$ docker image ls

REPOSITORY : dpcker image 저장소 이름

TAG :  태그 이름(버전 명)

 

7. docker CLI : images : pull

이미지를 가져오는 명령어

docker run 할 때 이미지가 없으면 이미지를 pull 해서 가져온 후 docker가 실행된다

docker run 은 이미지를  가져오는 기능이 포함되어있다.  그러나 당장 run 목적이 아니라, 나중에 run하거나 build 혹은 save 목적인 경우 이미지를 pull만 하는 경우에 위 명령어를 사용함.(nginx 는 예시를 든 이미지이다.)

* docker image pull == docker pull

docker image pull 을 다 쓰는 사람은 없으며, docker pull 이란 단축명을 주로 사용한다.

 

7. docker CLI : images : inspect
1) Return low-level information on Docker objects

$ docker image inspect nginx   // 전체 정보를 봄 , JSON형식


// 버전이라든지 여러 정보를 볼 수 있다. format을 이용해서 특정 정보만 볼 수 있다.
$ docker image inspect -f '{{.Config.Env}}' nginx   
$ docker image inspect -f '{{json .Config.Env}}' nginx  //기본적으로 JSON 형식으로 출력됨.

 

docker image inspect == docker inspect

 

8. docker CLI : images : save/load

1) Save one or more images to a tar archive 

너무 많은 데이터를 다운받으면 해당 ip에 대해 불이익을 받을 수 있다, 굉장히 큰 도커 이미지를 지웠다가 또 받는 반복을 이루어지면 불이익을 받기에, 자주 사용하는 특정 이미지는 저장해서 재사용하는 걸 권장

이를 위해 save/load 를 사용

 

stdout으로 출력되므로 redirection을 사용해서 저장한다. 옵션으로 -o 를 대신 사용할 수 있다.

$ docker image save nginx > docker_nginx_1.19.10.tar     // inspect를 확인해서 버전명 typing

$ file docker_nginx_1.19.10.tar
docker _nginx_1.19.10.tar: POSIX tar archive

 

Docker image 가 tar 파일로 저장된다.

여러 서버에 복사하거나 종종 사용하는 이미지는 network를 절약하거나 여러 문제를   일으키지 않도록 save해서 백업해두고 load로 사용하는 것이 좋다.

 

** docker image save == docker save

 

load : save한 이미지를 불러오기

standard in 으로 받아오자.

1) Load an image from a tar archive or STDIN

// nginx 이미지를 삭제해서 불러와보자

$ docker rmi nginx    
$ docker image ls

//nginx_1.19.10 버전 docker load 통해 docker에 밀어넣기   < : 밀어넣는다는 의미
$ docker load < docker_nginx_1.19.10.tar

+ Recent posts