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 |