실험 환경 구축을 위해 docker container 환경을 만들어야 하는 일이 생겼다.
환경 구축을 위한 command 목록은 아래와 같다.
# docker ubuntu 22.04 만들기
$ docker image pull ubuntu:22.04
# docker 실행
$ docker run -dit --name <container_name> <docker_image>
# 파일 전송
$ docker cp <host_path> <container_name>:/<container_path>
# container를 이미지로 만들기
$ docker commit <container_name> <repository:tag>
# 외부에서 명령어 실행
$ docker exec -it <container_name> <command>
# docker image 확인
$ docker images
# container 확인
$ docker ps -a
# container 내부 접속
$ docker exec -it /bin/bash
아래의 스크립트는 docker container를 원하는 개수만큼 만들어주는 스크립트이다.
use case는 다음과 같다.
1. container가 이미 만들어져 있으며 running 중인 경우, 무시
2. container가 이미 만들어져 있으나 running이 아닌 경우, container start
3. conatiner가 만들어져 있지 않은 경우, <docker_image>
에 대해 container를 만든 뒤 start
usgae: ./create_containers <container_num>
#!/bin/bash
# 제작할 container 개수
MAX_INDEX=$1
IMAGE_NAME="<docker_image>" # 사용하려는 Docker 이미지 이름 설정
declare -A pid_array # 백그라운드 프로세스의 pid를 담는 배열
for i in $(seq 1 "$MAX_INDEX"); do
CONTAINER_NAME="<container_name>$i" # $i는 지우지 말 것
# 컨테이너가 존재하는지 확인
CONTAINER_ID=$(docker ps -a --filter "name=^/${CONTAINER_NAME}$" --format "{{.ID}}")
if [ -n "$CONTAINER_ID" ]; then
if [ "$(docker ps --filter "name=^/${CONTAINER_NAME}$" --format "{{.ID}}")" ]; then
# case1. 컨테이너가 이미 실행 중
echo "컨테이너 $CONTAINER_NAME 가 이미 실행 중입니다."
else
# case2. 컨테이너가 존재하지만 실행 중이지 않다면 시작
echo "컨테이너 $CONTAINER_NAME 이 존재하지만 실행 중이 아닙니다. 실행 시키겠습니다."
docker start "$CONTAINER_NAME" &
fi
else
# case3. 컨테이너가 존재하지 않으므로 새로 생성
# background 프로세스로 진행되게 하여 제작 속도를 높임
echo "컨테이너 $CONTAINER_NAME 이 없습니다. 새로 생성합니다."
docker run -dit --name "$CONTAINER_NAME" "$IMAGE_NAME" /bin/bash &
pid_array[$CONTAINER_NAME]=$!
fi
done
for CONTAINER_NAME in "${!pid_array[@]}"; do
PID=${pid_array[$CONTAINER_NAME]}
wait "$PID"
echo "컨테이너 $CONTAINER_NAME의 생성이 완료되었습니다. "
docker start "$CONTAINER_NAME" &
done
wait
해당 script는 만들어진 container들에 대해 명령을 순차적으로 보내는 script이다.
tmux는 dstat 결과를 저장하기 위해 추가한 것으로 dstat 결과가 필요하지 않은 경우엔 tmux 관련된 부분을 지우면 된다.
usage: ./exec_containers.sh <container_num>
#!/bin/bash
SESSION_NAME="docker_stress"
RUN_CONTAINER=$1
echo "== ${RUN_CONTAINER} container =="
tmux new-session -d -s $SESSION_NAME "dstat -D total --output <dstat_result_path>"
for i in $(seq 1 $RUN_CONTAINER); do
docker exec <container_name>$i <some_work> &
done
wait
tmux send-keys -t $SESSION_NAME C-c
sleep 1
tmux kill-session -t $SESSION_NAME
echo "========= [done] =========="