-
도커 Docker 🐳OS/Ubuntu 2023. 12. 9. 00:01
1. 도커란 ?
컨테이너를 사용하여
응용프로그램을 더 쉽게 만들고, 배포하고 실행할 수 있도록 설계된 도구이며
컨테이너 기반의 오픈 소스 가상화 플랫폼이다.
일반 컨테이너 개념에서 물건을 손쉽게 운송해주는 것처럼
어플리케이션 환경에 구애받지 않고 손쉽게 배포 관리를 할 수 있게 해준다.
컨테이너 기반 배포 방식은
구글을 비롯해 대부분의 서비스 회사가 컨테이너로 서비스 운영 중이다.
2. 도커를 사용해야 하는 이유
2대의 서버가 있을 때,
2대의 서버 세팅 시기가 다르다면 ,
운영체제 버전부터 컴파일러, 설치된 패키지까지 완벽하게 같게 하기가 쉽지 않다.
이러한 차이로 인해 문제가 발생하기 쉬운데,
도커는 서버마다 동일한 환경을 구성해주기 때문에
이러한 문제를 해결할 수 있다.
또한, docker를 사용하면 동일한 환경을 구성하기 때문에 auto scaling에 유리하다.
3. 도커와 기존 가상화 기술 (VM) 의 차이
Hypervisor
Hypervisor는 (VM)
호스트 시스템 (윈도우, 리눅스 등)에서
다수의 게스트 OS (가상머신) 를 구동할 수 있게 하는 소프트웨어이다.
각 VM 마다 독립적으로 동작한다.
Container
Container는 (Docker)
하이퍼 바이저 구조를 토대로 등장했으며,
VM보다 훨씬 가볍게 동작하기 때문에 성능에 유리하다.
Hypervisor 와 Containers 비교 사진
https://www.virtasant.com/blog/hypervisors-a-comprehensive-guide
출처 :
4. 도커의 이미지와 컨테이너
-
이미지란 코드, 런타임, 시스템 도구, 시스템 라이브러리 및 설정과 같은 응용 프로그램을 실행 하는데 필요한 모든 것을 포함하는
패키지
이다. -
이미지는 Github와 유사한 서비스인 https://hub.docker.com 을 통해 버전 관리된다.
-
컨테이너란
- 도커 이미지를 독립된 공간에서 실행할 수 있게 해주는 기술이다.
- 하나의 이미지는 여러개의 컨테이너를 실행할 수 있다.
- 컨테이너를
이미지 인스턴스
라고 부르기도 한다.
5. 도커 파일이란?
도커 이미지를 구성하기 위해 있어야할
패키지, 의존성, 소스코드 등을 하나의 file로 기록하여
이미지화 시킬 명령 파일
이다.
즉, 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에,
더 이상 새로운 서버가 추가되면
의존성 파일을 컴파일하고 이것 저것 설치할 필요가 없다.
6. 도커 파일 주요 명령어
FROM
새로운 이미지를 생성할 때 기반으로 사용할 이미지를 지정
이미지 이름:태그
# ex. jdk 11 이 있는 컨테이너 사용 FROM openjdk:11
ARG
이미지 빌드 시점에서 사용할 변수 지정
ARG JAR_FILE=build/libs/app.jar
COPY
호스트에 있는 파일이나 디렉토리를 Docker 이미지의 파일 시스템으로 복사
COPY ${JAR_FILE} ./app.jar
ENV
컨테이너에서 사용할 환경 변수 지정
# TimeZone 환경 변수 ENV TZ=Asia/Seoul
ENRTYPOINT
컨테이너가 실행되었을 때 항상 실행되어야 하는 커맨드 지정
ENRTYPOINT ["java", "-jar", "./app.jar"]
7. 도커 컴포즈란?
-
Docker Compose란
멀티 컨테이너
도커 어플리케이션을 정의하고 실행하는 도구이다. -
Application , Database , Redis , Nginx 등 각 독립적인 컨테이너로 관리한다고 했을 때 다중 컨테이너 라이프 사이클을 어떻게 관리해야 할까? -> 도커 컴포즈로 관리!
-
여러개의
도커 컨테이너로 부터 이루어진 서비스를구축
,네트워크 연결
,실행 순서
를 자동으로관리
해준다. -
docker-compose.yml
파일을 작성하여 1회 실행하는 것으로 설정된 모든 컨테이너를 실행.
8. Docker 설치
1. 각 OS에 맞게 Docker 설치를 진행한다.
귀여운게 생겼닼ㅋㅋ
- Linux Ubuntu
- ubuntu 22.04에 docker 설치 : ubuntu 설치 참고 링크
# 우분투 시스템 패키지 업데이트
sudo apt-get update
필요한 패키지 설치
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
Docker의 공식 GPG키를 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Docker의 공식 apt 저장소를 추가
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
시스템 패키지 업데이트
sudo apt-get update
Docker 설치
sudo apt-get install docker-ce docker-ce-cli containerd.io
version 확인
docker -v
#### ![](XChangeXChangeXChangeXChangeXChangeXChangeXf1595feb-98d0-4ffb-aeb8-b266333a7413-) <br/> #### 2. hub.docker.com 무료 플랜 가입 및 로그인 https://hub.docker.com <br/> #### 3. docker compose 설치 docker compose 는 `Mac` 또는 `Windows` 의 경우 `Docker desktop` 을 설치한 경우라면 docker compose 설치를 진행할 필요가 없으며, `Linux의 경우 추가적으로 docker-compose 설치가 필요하다.` #### ubuntu 22.04에 docker compose 설치 ```bash # https://github.com/docker/compose/releases 에서 최신 버전 확인후 설치 sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # 실행이 가능하게 권한을 세팅 sudo chmod +x /usr/local/bin/docker-compose # 설치 버전 확인 sudo docker-compose -v
9. Docker 로그인
windows의 경우 power shell을 실행하고 아래 명령어를 입력한다.
ubuntu에선 shell에 바로 입력
docker login
windows
로그인 실패시 좌측 하단에 도커 데스크탑이 실행중인지 확인!
ubuntu
10. 단일 컨테이너 환경 실습
목표 : Spring Boot 어플리케이션 이미지화 후 컨테이너에서 실행
10-1. jar 파일 생성
인텔리제이 내장 terminal을 사용하면
프로젝트 현재 위치에서 실행되어 편하다.
인텔리제이로 프로젝트 실행 후 내장 터미널 열기.
10-1-1. 생성될 jar 파일 이름 설정
jar 파일 이름을
app.jar
로 지정해서 생성되도록 하고자 한다.build.gradle 파일을 실행 후 다음의 코드를 작성해준다.
bootJar { archiveFileName = 'app.jar' }
10-1-2. build !
(windows)
.\gradlew clean
.\gradlew build
10-2. docker file 작성
10-2-1. 프로젝트의 루트 디렉토리에 파일 생성
파일 이름 : Dockerfile
10-2-2. 파일 내용 작성
#Dockerfile FROM openjdk:11 ARG JAR_FILE=build/libs/app.jar COPY ${JAR_FILE} ./app.jar ENV TZ=Asia/Seoul ENTRYPOINT ["java", "-jar", "./app.jar"]
10-2-3. docker file build
docker build -t {docker hub username}/{file name} {docker file 위치}
docker build -t zhyun/jar-docker-file-test .
생성된 docker images 확인!
docker images
10-3. docker 컨테이너 실행
docker run 명령어 사용!
docker run zhyun/jar-docker-file-test -p 8080:8080
-p : {host port}:{컨테이너 port}
docker 가 정상 동작중인지 확인을 위해 terminal을 하나 새로 열고
아래와 같이 명령어를 입력한다.
docker ps
실행중인 docker images 확인 가능!
+ 실행중인 컨테이너에 들어가보기
docker exec -it {container id} {shell}
docker exec -it 4d10189fd2a5 bash
우와 😀
11. 다중 컨테이너 환경 실습
11-1. 도커 컴포즈 파일에 작성해야 할 정보 : docker-compose.yml
version
도커 엔진버전에 따른 컴포즈 버전 선택 compose-v3 compose-v2
service
이곳에 실행하려는 컨테이너들을 정의
pharmacy-recommendation-app
서비스명 ( 네트워크 호스트명 ) / 같은 네트워크에 속한 컨테이너끼리 서비스 명으로 접근 가능
container_name
컨테이너 이름
build
dockerfile 이 있는 위치
depends_on
특정 컨테이너에 대한 의존관계
image
컨테이너 생성할 때, 사용할 도커 이미지 지정
environment
환경 변수
volumnes
호스트 디렉토리 : 컨테이너 디렉토리
ports
접근 포트 설정 (컨테이너 외부 : 컨테이너 내부) --> docker run -p 옵션과 같으며, 개방할 포트를 지정하는 것
restart
컨테이너 실행 실패하는 경우 재시작 여부
11-2. 실습 : 로컬에서 mariadb , redis 컨테이너 띄워서 사용
11-2-1. Dockerfile 작성
mariadb
# /database/Dockerfile FROM mariadb:10 ENV TZ=Asia/Seoul
redis
# /redis/Dockerfile FROM redis:6 ENV TZ=Asia/Seoul
11-2-2. 도커 컴포즈 파일 작성
version: "3.8" services: jar-docker-file-test-maria: container_name: /jar-docker-file-test-maria build: dockerfile: Dockerfile context: ./database image: zhyun/jar-docker-file-test-maria environment: - MARIADB_DATABASE=fc-pharmacy-directions - MARIADB_ROOT_PASSWORD=${SPRING_DATASOURCE_PASSWORD} volumes: - ./database/config:/etc/mysql/conf.d ports: - "3303:3306" # localhost에서 3306 port 를 사용중이기 때문에 3303으로 접근 jar-docker-file-test-redis: container_name: /jar-docker-file-test-redis build: dockerfile: Dockerfile context: ./redis image: zhyun/jar-docker-file-test-redis ports: - "6379:6379"
11-2-3. docker-compose 명령어로 컨테이너 띄우기
docker-compose -f docker-compose-local.yml up
컨테이너 동작 확인
docker ps
11-2-4. spring boot application.yml 에서 접속 정보 설정 후 어플리케이션 실행
# 실행 할 환경 정보 작성 spring: profiles: active: local group: local: - common prod: - common --- # profile 설정 1 : common spring: config: activate: on-profile: common --- # profile 설정 2 : local spring: config: activate: on-profile: local datasource: driver-class-name: org.mariadb.jdbc.Driver url: jdbc:mariadb://localhost:3303/fc-pharmacy-directions username: ${SPRING_DATASOURCE_USERNAME} password: ${SPRING_DATASOURCE_PASSWORD} redis: host: localhost port: 6379 jpa: hibernate: ddl-auto: create show-sql: true --- # profile 설정 3 : prod spring: config: activate: on-profile: prod
'OS > Ubuntu' 카테고리의 다른 글
ubuntu 22 : apache 2 + tomcat 띄우기 (0) 2023.12.10 ubuntu 22 : 🐳 + MySQL 8 + MariaDB 11 설치 시도 기록 (0) 2023.12.09 ubuntu 22 : MySQL 8 + MariaDB 10 설치 시도 기록 (0) 2023.12.09 ubuntu 22 : apache 2 + certbot : https 띄우기 (0) 2023.12.08 Ubuntu Server 디렉토리 구조 공부 (0) 2023.11.27 -