Priceless
[Docker]Docker CLI for execution 본문
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 |