##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'프로그래머스 > Docker' 카테고리의 다른 글
| vs code 에서 도커 연결하기 (0) | 2023.01.30 |
|---|---|
| [인공지능 개요] Docker #5 - docker-compose (0) | 2023.01.03 |
| [인공지능 개요] Docker #4 - docker CLI 2편- run ex ec start stop (0) | 2023.01.03 |
| [인공지능 개요] Doker #2 - installation (0) | 2023.01.02 |
| [인공지능 개요] Doker #1 - history chroot container (0) | 2023.01.02 |