ubuntu 기준으로는 sudo apt install docker.io로 설치가능하나, 라즈베리파이 기준으로는 너무 오래된 docker가 설치되거나 설치가 안될수 있어서 다음 방법으로 설치하는걸 추천한다고 함

curl -sSL https://get.docker.com | sh

만약 sudo apt-get install로 하려면 다음과정을 거쳐도 됨

# 또는 아래 방법도 가능
#1. 먼저, 기존에 설치되어 있는 Docker 패키지를 제거합니다(있는 경우):
sudo apt-get remove docker docker-engine docker.io containerd runc
#2. Docker설치를 위한 패키지 업데이트
sudo apt-get update
#3. Dockertㅓㄹ치에 필요한 패키지들 미리 설치
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
#4. Docker의 공식 GPG추가(Docker에서 제공했고 신뢰할수 있다는 디지털 서명)
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg | sudo apt-key add -
#5. Docker repository를 APT sources에 추가합니다(APT:패키지관리자 가 인식할수있도록 저장소추가)
echo "deb [arch=armhf] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
    $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list
#6. 다시 패키지를 업데이트한 후 Docker를 설치합니다: (이제 apt-get사용가능)
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

설치후 잘 설치됐는지 확인하고 특정 사용자에게 docker그룹추가를 통한 일종의 docker sudo권한 부여

# 잘 설치되었는지 확인
sudo docker images 
sudo docker run hello-world
# sevity사용자를 Docker그룹에추가(해당사용자가 root가 아니어도 docker명령을 다룰수 있게 해줌)
sudo usermod -aG docker sevity

 

docker images해보면 현재 서버에 있는 도커이미지들 목록이 나온다. (일종의 git으로 치면 로컬 저장소개념으로 원격서버에 저장된건 아님)

$ docker images
REPOSITORY                  TAG       IMAGE ID       CREATED        SIZE
auth-service_auth-service   latest    cf72ade83f7f   7 hours ago    455MB
postgres                    13        9ca11a5f9994   12 days ago    350MB
hello-world                 latest    38d49488e3b0   2 months ago   4.85kB

특정 image를 지우려면 docker rmi 사용가능. 예를들어 docker rmi  9ca11a5f9994

 

Dockerfile을 만들고 아래처럼  build하면 된다.(맨뒤 .은 생략불가하면 Dockerfile 위치를 나타낸다)

docker build -t auth-service .

Dockerfile에 대한 샘플은 여기참조

 

실행은 다음처럼 docker run으로 하면 된다.

docker run auth-service

환경변수 설정이 필요한 경우 다음처럼 -e를 쓰면됨

docker run -e "ENV_VAR_NAME1=value1" -e "ENV_VAR_NAME2=value2" my-image

하지만 커멘드라인이 길어지니 docker-compose.yml에 다음처럼 기록가능

version: '3.8'
services:
  auth-service:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    environment:
      - DATABASE_URL
      - DATABASE_USERNAME
      - DATABASE_PASSWORD

이경우 docker run이 아닌 docker-compose 를 쓰면 된다.

docker-compose up을 하면 docker build와 docker run을 모두 수행하며,

docker-compose build를 하면 docker build까지만 된다.

docker-compose를 쓰면 여러 도커이미지를 동시에 켜거나 끄는등의 동시 핸들링에도 용이하다.

docker-compose up --build를 해서 --build 옵션을 주면 실행전 무조건 빌드를 거치게 된다.

 

AWS와 연동하기

Elastic Container Service (ECS)는 Docker 컨테이너를 쉽게 배포, 실행 및 스케일링할 수 있게 해주는 완전관리형 컨테이너 오케스트레이션 서비스입니다.이걸 사용해서 연동해보겠습니다.

ECS는 아마존 EC2 인스턴스나 AWS Fargate를 사용하여 실행할 수 있습니다.

 

AWS Elastic Container Service(ECS)를 사용해 애플리케이션을 배포하려면 다음과 같은 단계를 따릅니다.

1. AWS 계정 생성: AWS에서 제공하는 서비스를 이용하려면 먼저 AWS 계정이 필요합니다. 계정이 없다면 AWS 웹사이트에서 생성할 수 있습니다.

2. Docker 이미지를 Docker Hub에 푸시: 먼저, 로컬에서 Docker 이미지를 생성한 후 이를 Docker Hub에 푸시합니다.

# 로컬에서 Docker 이미지를 빌드합니다. 
docker build -t online-judge-auth-service .

# Docker Hub에 로그인합니다.
docker login --username=your-username --password=your-password

# Docker Hub에 이미지를 푸시합니다.
docker tag online-judge-auth-service:latest your-username/online-judge-auth-service:latest
docker push your-username/online-judge-auth-service:latest


3. ECS 클러스터 생성: AWS Management Console에 로그인한 후, ECS 페이지로 이동해 새 클러스터를 생성합니다. 

4. Task Definition 생성: ECS 클러스터 내에 'Task Definitions' 페이지로 이동해 새로운 Task Definition을 생성합니다. 이 과정에서 Docker 이미지의 위치(Docker Hub의 URL), 컨테이너에 필요한 CPU와 메모리, 포트 매핑 등을 설정합니다.
* 이 과정이 좀 중복적으로 느껴지고 직관적이지 않았지만 필요했다.

5. ECS Service 생성: 생성한 Task Definition을 이용해 ECS Service를 생성합니다. 이 과정에서 원하는 수의 Task를 실행하도록 설정하고, 필요한 경우 로드 밸런서를 설정합니다.

* 이번 프로젝트에서는 로드밸런서는 사용하지 않고 그냥 EC2인스턴스로 실행

6. 보안 그룹 설정 확인: 생성한 ECS Service가 외부에서 접근 가능하도록, 해당 서비스가 사용하는 보안 그룹의 인바운드 규칙을 확인합니다. 필요한 경우 포트를 열어줍니다.
* 보안규칙을 통해 8080포트를 열어줘야 했다.

7. 서비스 확인: ECS Service가 성공적으로 시작되면, Task의 IP 주소나 연결된 로드 밸런서의 DNS 이름을 이용해 애플리케이션에 접근해봅니다.

* curl로 접근해보니 잘 되었다.

이러한 단계들은 AWS Management Console을 통해 수행할 수 있지만, AWS CLI나 SDK를 이용해 스크립트로 자동화할 수도 있습니다. 비록 초기 설정에는 약간의 시간이 소요될 수 있지만, 한 번 환경을 구성하고 나면 새로운 버전의 애플리케이션을 쉽게 배포할 수 있습니다.

 

이해하기 따라로웠던개념들

1. VPC: 이건 가상서버라는 개념이 아니라 가상랜환경이란 의미에 가까웠다. 랜환경안에 여러 호스트가 있을 수 있는..

2. 서브넷개념: 서브넷을 여러개 분리해서 둘 수 있었는데 물리적으로 다른 위치로 구성할 수 있었다. 서브넷은 쉽게 말해서 공유기나 스위치로 묶이는 작은 단위라고 볼 수 있다.

3. 인스턴스 설정후 키페어 설정후 다음 커멘드로 ssh접속이 가능했다.

ssh -i /path/my-key-pair.pem ec2-user@my-instance-public-dns-name

4. ssh로 들어가서 도커를 수동으로 시작하려면 다음명령어를 사용

sudo docker run -p 8080:8080 -e DATABASE_URL='jdbc:postgresql://sevity.com:5432/online_judge' -e DATABASE_USERNAME='online_judge_admin' -e DATABASE_PASSWORD='password_here' ee6ac0195619

 

Docker Image관련

docker images: 생성된 image나열하기

sevity@sevityubuntu:~/workspace/online_judge/problem-frontend$ docker images
REPOSITORY         TAG       IMAGE ID       CREATED         SIZE
frontend-service   latest    34ae6e43cd4e   4 hours ago     1.92GB
problem-service    latest    a360d436d839   4 hours ago     517MB
auth-service       latest    befdc9e37ac1   4 hours ago     526MB
<none>             <none>    96430f927c57   4 hours ago     526MB
<none>             <none>    58e82ecb1610   11 hours ago    1.92GB
<none>             <none>    f9bb20adb713   35 hours ago    1.92GB
<none>             <none>    de59f27bcff9   2 days ago      1.92GB
<none>             <none>    c4cf8ec43872   3 days ago      1.92GB
<none>             <none>    25e3f42a4b64   4 days ago      1.92GB

docker system prune: 불필요한 이미지, 컨테이너, 볼륨 및 네트워크를 일괄 삭제

위의 <none>처럼 누적되는 image들 정리가능(Docker 이미지 빌드 과정에서 새로운 이미지 태그를 생성할 때마다 새로운 이미지 ID가 생성되는데, 만약 이전 이미지 태그를 유지하지 않고 새로운 태그를 계속 생성한다면, <none> 태그와 함께 이전 버전의 이미지가 누적될 수 있다. 이러한 누적은 디스크 공간을 차지하므로, 불필요한 이미지를 정리하는 것이 좋다.)

sevity@sevityubuntu:~/workspace/online_judge/problem-frontend$ docker system prune
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N] y
Deleted Containers:
7e93e0f073dccae0ea2ec28b7051138a38fb8137feb8bd1b9e9c5d9df1a084ab
c18f484efede43192c18b4987096409454ac358a6ca802c93061ad233d3a214a

Deleted Networks:
auth-service_default
my-network
problem-service_default

Deleted Images:
deleted: sha256:2d86f8a15708197b0dcdb54d2461d060b289ac122e1f49d27e79ada0b34f01b2
deleted: sha256:52c9722d7ab889e55af2f0f8d1540f5b218a6e40df5b5fa331bcb1a08ac6aa5b
deleted: sha256:d6d5fafa7731073ac0bf4e2d731d04dc413fae64a39de29255e6b530fada5f97
deleted: sha256:708bb9cc93ee48ba372c9d329441b1735717e09516670cf08dbe2518f02261d5

Deleted build cache objects:
i8eaq1edr2a8koj2n1o043xva
wpr37m52re2lf3gmkndy630t6

Total reclaimed space: 31.52GB

 

docker rmi: 특정 image 삭제

 

 

모든 image삭제하기(아래 과정을 거쳐야 의존성 문제가 해결되면서 다 지워진다)

# 모든 컨테이너 정지:
docker stop $(docker ps -aq)
# 모든 컨테이너 삭제:
docker rm $(docker ps -aq)
# 모든 이미지 삭제:
docker image prune -a

 

Docker Container 관련

Docker Container는 현재 실행 중인 Docker image를 의미하며

docker ps를 하면 컨테이너의 목록을 나열한다(어떤 포트를 listen하고 있는지도 알 수 있다)

$ docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED       STATUS       PORTS                                       NAMES
7e93e0f073dc   problem-service    "java -jar /app/app.…"   3 hours ago   Up 3 hours   0.0.0.0:9993->9993/tcp, :::9993->9993/tcp   cranky_yonath
b2fb854a135c   frontend-service   "docker-entrypoint.s…"   3 hours ago   Up 3 hours                                               frontend-service
b4bf33f71cf4   auth-service       "java -jar /app/app.…"   3 hours ago   Up 3 hours                                               affectionate_feynman4

docker ps --filter "expose=9993"를 하면 특정 포트만 필터링해서 볼 수도 있다.

$ docker ps --filter "expose=9993"
CONTAINER ID   IMAGE             COMMAND                  CREATED       STATUS       PORTS                                       NAMES
7e93e0f073dc   problem-service   "java -jar /app/app.…"   3 hours ago   Up 3 hours   0.0.0.0:9993->9993/tcp, :::9993->9993/tcp   cranky_yonath

docker stop을 통해 실행중인 docker container를 종료할 수 있다.

주의할점은 위의 docker ps결과에 나온 컬럼기준으로 IMAGE이름으로는 안되고 CONTAINER_ID또는 맨 오른쪽 컬럼인 NAMES를 인자로 주어야 동작한다는 점이다.

# IMAGE이름으로는 stop이 안된다.
$ docker stop problem-service
Error response from daemon: No such container: problem-service

# CONTAINER_ID나 NAME으로는 가능
$ docker stop 7e93e0f073dc
7e93e0f073dc

만약 IMAGE이름으로 stop하고 싶다면 다음처럼 해준다.

# problem-service라는 이름의 IMAGE로 부터 생성된 container 모두를 stop한다.
$ docker ps -q --filter ancestor=problem-service | xargs docker stop
7e93e0f073dc

 

docker stop을 했다고 해도 지워진건 아니며 docker rm을 통해 지워줘야 한다.

stop된 컨테이너를 포함해서 조회하려면 docker ps -a를 해주면 된다.

 

 

 

 

 

 

 

 

 

 

 

 

반응형

'Programming > Linux' 카테고리의 다른 글

하둡 - 실습 - 웹서버로그분석  (0) 2023.07.29
하둡(Hadoop)  (0) 2023.07.29
vimdiff  (0) 2021.04.07
X Window System(X11) - 여러 호스트에서 ssh로 붙어서 사용하기  (0) 2021.01.08
Ansible  (1) 2020.10.22

+ Recent posts