도커를 이용하여 학습 실행시에 다른 서버에서 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 : 실행 중인 컨테이너에 직접 들어가 명령어를 실행 (내부 접근)
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