상세 컨텐츠

본문 제목

[Docker] 컨테이너 이해하기

Docker

by 얼레벌레또뇽 2024. 4. 2. 09:50

본문

도커를 이용하여 학습 실행시에 다른 서버에서 ssh로 명령어 전달하려고 했으나

https://www.clien.net/service/board/cm_app/18148408

 

docker exec -it /bin/bash 와 ssh id@ip -p port 접속한 shell 차이점? : 클리앙

gitlab runner로 CI/CD 적용하는 과정에 한가지 문제가 생겨 삽질하다 답을 찾지 못해 질문 한가지 드립니다. 연습으로 hello.c 를 gcc로 컴파일 하는건 gitlab runner로 CI/CD 연동하는걸 성공해서 실전으로

www.clien.net

이 글에서 첫번째 댓글인 docker container에 ssh로 접속한다는 생각을 해본적이 없다는 댓글을 보고 찝찝해졌다.

https://ko.linux-console.net/?p=7689

 

Docker 컨테이너에 SSH로 연결하는 방법

Docker 컨테이너에 SSH로 연결하는 방법 SSH는 시스템 관리자의 도구 상자에서 가장 많이 사용되는 명령 중 하나이지만 Docker와 함께 일반적으로 표시되지는 않습니다. 실행 중인 컨테이너에 SSH로

ko.linux-console.net

또한 위의 글에서 ssh 연결은 일반적으로 피해야하는 나쁜 습관이라 적혀있다. 항상 exec 명령어를 사용하여 컨테이너 내부의 셸을 가져오는것이 좋다고 적혀있다.

 

따라서 오늘은 run과 exec를 통해 컨테이너를 정확하게 이해하고자 한다.

 

 

 

- run : 새로운 컨테이너를 생성해 실행하는 명령어

- exec : 실행 중인 컨테이너에 명령어를 전달(외부 -> 내부)

- attach : 실행 중인 컨테이너에 직접 들어가 명령어를 실행 (내부 접근)

 

[ exec ]

docker exec <CONTAINER_ID> <COMMAND>

실행중인 컨테이너에서만 사용가능하며 run과 다르게 상태를 디버깅하기 위한 용도로 사용한다.

docker exec ghost pwd
docker exec -it ghost bash

컨테이너 내부를 탐색하면서 디버깅이 필요한 경우에는 sh나 bash 셸을 실행할 수 있다.

셸과 같이 커맨드라인을 통해 입출력을 주고받는 경우에는 -it 옵션을 붙여줘야 의도한대로 동작한다.

 

docker exec dockeruntu sh -c "cd ~ ; mkdir test ; ls"

sh -c 명령어를 사용하면 위와 같이 연결되거나 큰 따옴표로 쓰인 명령어들을 실행시킬 수 있다.

 

docker exec master sh -c "cd ~/test; echo '1' >> list ; echo '2' >> list ; echo '3' >> list ; cat list"

위의 명령어는 복잡하니 만약 셸 스크립트 작성이 가능하다면 아래처럼 만들 수 있다.

#! /bin/bash

COUNTER=1
FILE="/root/test/list"
CONTENT=""
while [ $COUNTER -le 3 ];
do
        CONTENT="$CONTENT$COUNTER'\'n"
        COUNTER=$(($COUNTER+1))
done

sudo docker exec master bash -c "echo -e $CONTENT > $FILE"

content 변수에 들어가는 내용은 1\n2\n3\n 이다.

여기서 그냥 echo 를 해버리면 list 에 개행 없이 1\n2\n3\n 가 그대로 들어가기 때문에,

마지막 echo 에 -e 옵션을 넣어서 개행이 적용되도록 한다.

 

 

[참고]

https://docs.docker.com/reference/cli/docker/container/exec/#extended-description

 

https://ok-lab.tistory.com/122

 

[Docker] exec, attach, run 비교하기

도커에서 컨테이너를 실행시킬 경우 run, exec, attach 등을 사용해 컨테이너에 접근해본 적이 있을 것이다. 그렇다면 각각의 명령어가 어떠한 차이점이 존재하는지에 대해서 알아보자. 이번 글에서

ok-lab.tistory.com

https://www.lainyzine.com/ko/article/docker-exec-executing-command-to-running-container/

 

docker exec 사용법: 실행중인 컨테이너에 명령어 실행하는 방법

docker exec는 이미 실행된 컨테이너 환경에 새로운 프로세스를 추가로 실행해, 컨테이너 환경을 디버깅할 수 있게 도와주는 명령어입니다.

www.lainyzine.com

https://eyeballs.tistory.com/49