Priceless

[Docker]Docker CLI for execution 본문

Docker & Kubernetes/Docker

[Docker]Docker CLI for execution

Hyun__ 2023. 12. 20. 14:58

Docker CLI (Command Line Interface)

run

같은 컨테이너에서 여러 개의 프로그램 실행하기 1

실습을 진행하기 위해

존재하는 컨테이너를 모두 삭제한다

 

이후 ubuntu_top이라는 이름의 컨테이너를 생성한다

ancestor는 ubuntu이며, 실행할 명령어는 top이다

argument는 1초의 delay를 준다

 

성공하면 top 명령어의 결과가 뜨고

1초마다 돌아가는 결과가 나타난다

 

다른 터미널을 열어 똑같은 명령어를 실행하면

오류가 나타난다

같은 이름을 가진 컨테이너를 생성할 수 없다

 

 

 

두 번째 터미널에서 컨테이너의 이름을 ubuntu_top2로 변경하면

새로운 컨테이너가 생성된 후 실행된다

같은 컨테이너에서 2개의 top 이 실행되기 위해서는

다른 방법의 접근이 필요하다

 

 

ubuntu_top을 제외한 다른 터미널을 종료한다

exec

run과 다른점

run은 컨테이너를 새롭게 실행하는 명령인 반면

exec는 기존에 존재하는 컨테이너에서 실행하는 명령어다

 

docker exec -it <existing container name> <command> "<option>" 

와 같이 명령어를 입력한다

 

새로운 터미널에서

docker exec -it ubuntu_top top "-d 0.2"  명령어를 실행한 후

하나의 컨테이너 안에 두 개의 프로세스를 실행했다

 

1번 터미널에서도 top에 새로운 프로세스가 나타난 것을 확인할 수 있다

 

 

새로운 터미널을 열고

exec로 bash를 실행한다

docker exec -it ubuntu_top bash 명령어를 통해

ubuntu_top 컨테이너에 bash를 실행한다

 

그 결과 bash와 bash가 실행한 자식 프로세스가 나타난다

 

1번 프로세스를 종료하면 

컨테이너에 속한 다른 프로세스들도 종료된다

 

 

 

binding

컨테이너의 자원을 외부와 연결하는 기능으로

일반적으로 I/O와 저장 공간을 연결한다

 

- network

port binding: host OS의 port와 컨테이너의 Port를 바인딩

network: docker network를 사용

 

- directory, file, block-device

mount binding: host OS의 디렉토리를 바인딩

volume: docker volume 저장소를 사용

device: host OS의 device, GPU 등을 바인딩

 

- environment

shell environment variables를 지정

컨테이너마다 customize 할 수 있는 설정을 환경 변수로 만들어 놓고

변수에 들어오는 값으로 작동할 수 있다

이미지마다 변수가 다르므로

너무 많이 변경될 경우 새로운 이미지를 만들어서 사용하는 방법도 있다

 

binding: net

nginx web server를 실행하기 위해

nginx 컨테이너가 사용할 port를 config에서 확인하기 위해 

docker insepct nginx 명령어를 수행한다

 

config를 확인하면 

80번 포트를 사용하여 외부와 연결할 수 있다

 

std를  사용하지 않는 이유는

daemon에서 SIGTTIN과 SIGTTOUT을 발생시키지 않기 위함이다

 

컨테이너를 실행하기 전에 

이전에 실행된 컨테이너를 삭제한다

 

docker run --rm -p  <host의 port 번호>:<container의 port 번호>를 입력하여

시스템의 포트와 도커의 포트를 연결한다

--rm 옵션을 통해 종료되면 자동으로 삭제한다

 

1번 터미널에서

포트 바인딩을 수행하고

 

2번 터미널에서 

포트의 listen 여부를 확인한다

-n은 numeric, -l은 listen, -t는 tcp를 보여주는 옵션이다

'sport = :8080' 필터를 추가한다

source port를 나타내며, 콜론은 없애도 무방하다

 

 

 

제대로 동작하는지 확인하기 위해 

curl을 통해 테스트한다

 

2번 터미널의 host 계정에서

본인의 IP 주소에 포트 번호를 입력한 후 접속하면 

nginx 페이지를 볼 수 있다

 

html코드로 나오기 때문에

웹브라우저를 띄운 후 접속하면

gui로 볼 수 있다

 

 

1번 터미널에서 

작동하는 컨테이너를 멈추기 위해 

CTRL - C를 누르면 종료된다

 

--rm 옵션으로

종료되면 컨테이너가 자동으로 삭제된다

 

 

binding: net: detech

detach mode를 통해 컨테이너를 백그라운드에서 실행할 수 있다

-d 옵션을 통해 사용하며

컨테이너 id가 출력된다

 

docker ps 명령어를 통해

프로세스가 실행 중인 것을 확인할 수 있다

 

백그라운드에서 실행되는 컨테이너의 log를 확인하기 위해 

새로운 터미널에서 

docker logs <iamge> 명령어를 통해

실행 중인 컨테이너가 출력하는 log를 확인할 수 있다

기본적으로 10줄 정도 출력되며

log를 계속 출력하기 위해 -f 옵션을 추가한다

 

binding: net: attach

-it 옵션을 추가하여 컨테이너를 실행했을 때

실행 중인 컨테이너에서 잠깐 빠져나오기 위해 detach해서 빠져나올 수 있다

^P^Q 를 입력하여 탈출할 수 있다

 

-itd 옵션을 통해 

interactive mode, terminal, detach 모드로 bash를 실행한다

 

컨테이너가 실행되자마자 detach 모드로 실행되므로 

shell 안에 들어갈 수 없다

 

^P^Q를 누르면

일시정지되며 host 계정으로 나올 수 있다

 

다시 컨테이너 안으로 들어가기 위해

docker attach <image> 명령어를 입력한다

 

binding: mount

nginx에 외부 디렉토리를 mount 하기 위해

nginx 웹서버가 사용하는 디렉터리 구조를 알아야 한다

 

이를 확인하기 위해 docker 공식 홈페이지를 참고한다

https://hub.docker.com/_/nginx 

 

 

 

1번 터미널에서 nginx 내에 shell을 만들어서 들어간다

서비스 목적이 아니라 내부 구조를 확인하기 위함이다

 

bash를 실행한 후 들어가면

root 계정으로 접속되기 때문에

ls 명령어를 쉽게 확인할 수 있도록

alias를 추가한다

 

이후 conf.d 디렉토리를 확인하면

default.conf 파일이 존재한다

 

 

config 정보를 확인하면

listen port는 80번

server name은 localhost

root location 등을 알 수 있다

 

 

 

user 계정으로 접속한 후

home 디렉토리에 nginx_doc_root 디렉토리를 생성한다

생성한 디렉토리에 "Hello Document root dir"을 포함하는

hello.txt 파일을 생성한다

 

-v 옵션을 통해

Host와 컨테이너의 디렉토리를 binding하여

<연결할 디렉토리>:<연결될 디렉토리> 와 같이 binding할 수 있다

 

2번 터미널에서

똑같은 포트에 접속하면

원래 있던 포트를 바인딩하여 override 되었으므로

원래 파일이 없어져

403 Forbidden 에러가 나타난다

 

하지만 hello.txt를 출력하는 경우

문구가 출력되는 모습을 확인할 수 있다

 

hello.txt 파일에 

"Hello world" 문구를 추가하면

이 또한 잘 출력된다

 

컨테이너를 중지하면

-rm 옵션으로 자동으로 삭제된다

 

 

 

docker에서 -v 대신 --mount를 권장한다고 한다

명령어 옵션에 type, 소스 디렉토리, 목적 디렉토리를 입력한다

 

명령어가 더욱 직관적이며, 기능적인 차이는 없다

 

binding: Env

환경 변수를 바인딩하기 위해

ubuntu bash를 실행한다

 

echo $LANG 명령어를 입력한 결과

아무것도 나타나지 않는다

 

환경 변수를 추가하기 위해 -e(--env) 옵션을 통해

LANG=en_US.utf8 옵션을 추가한다

 

이후 다시 $LANG 을 확인하면

en_US.utf8이 정상적으로 출력되는 것을 확인할 수 있다

 

 

Volume, Net

docker volume은 

docker volume을 manage 하기 위한 명령어로 

logical volume과 흡사하다

 

docker network는 

network IP 주소, subnet mask 등을 설정할 수 있다

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

docker-compose와 같이 쓰이는 경우가 많다

 

Stop, Start

docker stop은

컨테이너가 detached mode로 실행중이라면

외부에서 docker stop으로 정지할 수 있다

 

-it 옵션을 사용하지 않는 시스템은

stop signal 을 보내거나 docker stop으로 정지해야 한다

 

docker start는 

docker run 명령어에서 --rm 옵션을 쓰지 않는 경우 

exit하면 컨테이너는 남아있다

이를 stop한 후 재시작 하기 위해 

start 명령어를 사용할 수 있다

 

 

예시

-d 옵션으로

detach 모드로 작동한다

id 만 출력되고 백그라운드에서 작동한다

 

--rm 옵션이 없으므로

stop 이후에도 컨테이너는 남아있다

 

start 명령어를 통해 다시 실행시키면

실행 중으로 나타난다

 

 

 

 

'Docker & Kubernetes > Docker' 카테고리의 다른 글

[Docker]docker compose  (0) 2023.12.23
[Docker]Docker CLI for images  (0) 2023.12.17
[Docker] Docker Installation in Linux  (1) 2023.12.17
[Docker]chroot Container  (1) 2023.12.17