Docker

문주은·2021년 11월 28일
0

1. Docker 개념

1-1. Docker란?

  • 서버를 구축할 os에 컨테이너를 설치하여 가상 서버처럼 사용하는 오픈 소스
  • os를 독립적으로 사용 가능하기 때문에 os에 독립적인 개발/배포 환경을 제공
  • 하나의 서버에 여러개의 컨테이너를 실행 가능하며 서로 영향을 미치지 않고 독립적으로 샐행 가능
    👉🏻 즉, os에 독립적이지만 물리적인 리소스만 공유

1-2. 컨테이너

  • 컨테이너는 여러 화물을 배에 실는 운송수단으로 활용할 수 있는 것 처럼, 서버에서도 다양한 프로그램 실행환경을 컨테이너로 추상화하고 어디에서든 실행할 수 있는 것을 의미
  • 격리된 공간에서 프로세스가 독립적으로 동작하는 기술

1-3. 이미지

👉🏻 컨테이너 실행에 필요한 모든 정보(파일, 설정값)들을 포함

  • 상태값을 가지지 않고 변하지 않는다.
  • 이미지를 실행함으로서 컨테이너가 실행되고 추가되거나 변하는 값은 컨테이너에 저장

2. Docker 구조

  • client-server 아키텍처
    • server : 실제로 컨테이너를 생성하고 실행하며 이미지를 관리하는 주체
    • client : 도커, 데몬 API를 이용할 수 있도록 CLI 제공
  • client가 daemon(데몬)에게 명령어를 통해 요청을 보냄
    - daemon : 도커 컨테이너 생성, 실행, 배포하는 백그라운드 프로세스.
    즉, API요청 수신 및 도커 객체 관리
    (이미지 출처 : https://docs.docker.com/get-started/overview/)

3. Docker 실행

docker 설치 : https://haengsin.tistory.com/128 참고

3-1. 도커 이미지 생성

3-1-1. Dockerfile로 이미지 생성

(1) touch Dockerfile
touch Dockerfile 명령어를 통해 아무것도 없는 Dockerfile 생성(현재는 Docker 위치에서 진행)
(2) Dockerfile에 ubuntu 설치
Dockerfile에 18.04 버전 ubuntu 추가(만약, FROM ubuntu만 한다면 가장 최신 버전으로 설치)
(3) 이미지 생성
docker build -t image이름 . 명령어를 통해 Dockerfile이 있는 현재 경로(.)에서 test_image 라는 이름의 도커 image가 생성
(4) 생성된 이미지 확인
docker images

3-1-2. Docker Hub에서 이미지 다운로드

  • 형상 관리 툴과 연계되어 코드를 build해서 자동으로 이미지화 하는 기능을 제공

3-1-3. Docker image 삭제

docker rmi image이름

3-2. 컨테이너 생성 및 실행

3-2-1. 컨테이너 생성을 위한 shell 파일 작성

  • vi container_start.sh

3-2-2. 컨테이너 실행

  • docker run
  • --restart=always : docker를 실행할 때마다 container를 항상 같이 재시작
  • --name : 생성할 컨테이너명
  • test_image : 컨테이너를 실행할 이미지 이름

3-2-3. 실행된 컨테이너 확인

  • docker ps & docker ps -a
    docker ps -a : 좀비 프로세스까지 확인

3-3. 컨테이너 접속

docker exec -it test_container bash

4. Docker CLI Command

4-1. 로컬에 있는 파일을 컨테이너에 복사

docker cp 로컬경로/옮길파일 컨테이너명:/컨테이너경로
ex) docker cp /DATA/Nanum/NanumGothic.ttf \
test_container:/usr/share/fonts/dejavu/

4-2. 현재 가동중인 컨테이너를 이미지로 만들기

docker commit -a '작성자_strtype' 가동중인컨테이너 생성할이미지명
ex) docker commit -a 'auth_je' test_container test_image0.2`
-> container to image

4-3. 이미지를 tar파일로 만들기

docker save -o "test_image0.2" "test_image0.2.tar"
: 이미지를 tar파일로 만들어 filezila에서 로컬 컴퓨터에 옮긴 다음 다른 서버에도 동일하게 환경 설정 가능
-> image to tar

4-4. tar파일을 이미지로 만들기

docker load -i "test_image0.2tar"
: tar파일로 만들어진 이미지를 다른 서버에서 읽은 후 다시 이미지로 만들기
-> tar to image

4-5. container 전체 삭제

docker stop $(docker ps -q) && docker rm $(docker ps -aq)

4-6. images 전체 삭제

docker rmi $(docker images -f "dangling=true" -q)

4-7. container root 계정으로 들어가기

docker exec -u 0 -it airflow-airflow-triggerer-1 bash

4-8. 이미지를 다시 빌드하지 않고 컨테이너 시작

docker-compose up

  • 반대로 이미지를 다시 빌드하고 컨테이너 시작 : docker-compose up --build

5. shell file을 활용한 간소화

5-1. 이미지 build.sh

🖥 build_image.sh

# !/bin/bash
# 필요한 주석

# 설정값
NAME = "이미지명"

docker build -t $NAME ./경로
echo "built $NAME image"

5-2. 컨테이너 실행.sh

🖥 container_start.sh

# !/bin/bash

# 설정값
HOST_NAME = `hostname`
HOST_IP = `hostname -l | awk "{print $1}"`
NAME = "컨테이너명"
VOLUMNE = '/로컬경로/:/컨테이너경로/'

PID = `docker ps -a -f name=$NAME -q`
if [-n "$PID"]
then
	echo "$NAME already exists"
    exit 1
fi
docker run -d --restart=always \
		   -p 80:80 \   # <host포트>:<container포트>
           -u aiusr \
           -e HOST_NAME = $HOST_NAME \
           -e HOST_IP = $HOST_IP \
           -v $VOLUMNE \
           --name 이미지명
           $NAME

5-3. 컨테이너 중지.sh

🖥 container_stop.sh

# !/bin/bash

# 설정값
NAME = "컨테이너명"
PID = `docker ps -a -f name=$NAME -q`

if [-n "$PID"]
then 
	docker stop $PID
    docker rm $PID
    echo "$NAME stopped"
fi

ETC

ETC-1. sudo 권한 없이 docker 실행

1) docker group 확인

# docker group 이 존재하는 것을 출력값을 통해 확인 가능
$ cat /etc/group | grep docker

docker:x:999:

# 만약 docker group이 존재하지 않는다면 아래 명령어 입력 
$ sudo groupadd docker

# docker group에 사용자 추가 확인
$ id $USER

2) 사용자를 Docker group에 추가

# 현재 사용자($USER)를 docker 그룹에 추가
$ sudo usermod -aG docker $USER

# 새로고침
$ newgrp docker

ETC-2. data mount directory 변경

1) 현재 docker daemoun 경로 확인

$ sudo systemctl status docker
docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2024-12-27 01:57:36 UTC; 28min ago
TriggeredBy: ● docker.socket

2) docker mount 경로 변경

$ sudo vi /lib/systemd/system/docker.service

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --data-root=/data/docker  --user devops
ExecReload=/bin/kill -s HUP $MAINPID
  • --data-root=/data/docker --user {username} 추가
profile
Data Engineer

0개의 댓글