기존에는 많은 컴퓨터가 필요한 영역이었으나 도커를 활용하면 1개의 컴퓨터의 자원을 분할하여 여러대의 컴퓨터처럼 사용할 수 있게된다.
따라서 연관성 있는 서비스끼리 연결을 시키면 특정 서비스가 문제가 생기더라도 나머지 서비스는 정상 작동을 할 수 있는 안정성이 생기게 된다. 이는 한 집에 모든 기능이 있는 것을 여러집에 나눠서 각각의 구역에 격리시켜둔 것과 같다.
그에 따른 구상도는 다음과 같다.

도커로 컨테이너를 통한 영역을 나눈다.
먼저 외부 PC에 대한 요청을 Nginx가 받아온다. 이후 필요한 관련 데이터를 backend단에 있는 필요한 기능을 처리할 수 있는 곳으로 해당 요청을 전송한다.
그러면 주요기능은 필요하다면 DB영역에서 데이터를 통신한 후 데이터를 가공해서 nginx로 보낸다.
그럼 ngix는 프론트엔드에 대한 정보와 backend단에서 온 정보를 합쳐서 동시에 외부 PC로 보낸다.
이런 구조로 구성하면 여러 데이터를 동시에 처리할 수 있게 되며 작업 처리속도 또한 확연히 빨라지게 된다.
apache의 경우 1:1로 전담을 하게 되는 상황인데 주요기능 1번이 필요한 상황에서도 2~6번에 해당하는 기능도 멈춰있기 때문이다.
Nginx의 경우는 웨이터처럼 필요한 자료를 주문을 넣고 그 주문이 해결 되면 자신이 토핑을 얹어서 내어놓는 방식이기에 대기 처리속도 역시 더 빠른 경향이 있다.
배포 및 인프라에 대한 궁금증 정리(Nginx vs Apache)
배포 및 인프라에 대한 궁금증 정리(Nginx vs Apache)
해당 내용은 내가 정리한 웹서비스 개발에 대한 개요 정리 게시글에서 이어지는 내용이다.https://warmice8226.tistory.com/66 웹 서비스 개발에 대한 개요 정리해당 글은 전문가가 작성한게 아니라 개인
warmice8226.tistory.com
여기서 위 구조를 구현한 디렉토리를 알아보자.
| project | 최상위 폴더 |
| ├─ docker-compose.yml | 컨테이너들의 설계도 |
| ├─ /nginx / nginx.conf | nginx의 규칙에 대해서 작성 |
| ├─ /mysql-data | DB데이터 저장소. 자동생성되므로 미리 만들지 않아도 된다. |
| ├─ /mysql-init / init.sql | init.sql 파일을 통해서 backend와 관련된 DB(Schema)를 자동을 생성. |
| ├─ /backend-1 | backend 핵심 기능 1번에 대한 서비스를 담는 영역 |
| ├─ /backend-2 | backend 핵심 기능 2번에 대한 서비스를 담는 영역 |
| ├─ /backend-3 | backend 핵심 기능 3번에 대한 서비스를 담는 영역 |
| ├─ /backend-4 | backend 핵심 기능 4번에 대한 서비스를 담는 영역 |
| ├─ /backend-5 | backend 핵심 기능 5번에 대한 서비스를 담는 영역 |
| ├─ /backend-6 | backend 핵심 기능 6번에 대한 서비스를 담는 영역 |
| ├─ .gitignore | git에 올리지 않을 파일을 지정. |
| ├─ /uploads | 파일 공용 저장소(필요할 경우) |
| └─ /jenkins_home | 젠킨스 데이터 저장소(설정 날아감 방지) |
순서대로 알아보자
1. docker-compose.yml
이 파일은 docker 기능이 docker compose 기능을 실행할 때 어떻게 컨테이너를 작성하고 해당 컨테이너의 속성이 어떻게 되는지 알려주는 기능을 한다. 즉 설계도이다.
포트 번호나 저장소 등의 값들이 : 으로 연결 될때, 왼쪽이 현재 컴퓨터, 오른쪽이 docker 내부 컴퓨터로 매칭이 된다.
# 1. 공용 네트워크 정의 (모두 이 안에서 대화함)
networks:
erp-network:
driver: bridge
services: #이 밑으로 service에 해당하는 내용을 작성.
# ----------------------------------------
# [1] Nginx (문지기)
# ----------------------------------------
nginx: #도커가 서비스의 이름으로 보여주는 곳
image: nginx:latest
container_name: nginx-gateway
ports:
- "80:80" # 외부 80포트를 여기 80포트로 연결
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf # 설정 파일 연결
- ./uploads:/usr/share/nginx/html/uploads # 파일 서버 기능
depends_on: # 기능1과 기능2가 있어야 이 서비스가 구동할 수 있다는 의미.
- 기능1
- 기능2
networks:
- erp-network
# ----------------------------------------
# [2] MySQL (데이터베이스)
# ----------------------------------------
db:
image: mysql:8.0
container_name: mysql-db
environment:
MYSQL_ROOT_PASSWORD: ${DATABASE_PASSWORD}
# .env에 작성한 파일을 읽어와서 해당 값에 넣어줌.
MYSQL_DATABASE: erp_db
# 최초 생성시 만들 1개의 데이터베이스 이름. 아래의 init 기능을 사용할 경우 필요없음.
volumes:
- ./mysql-data:/var/lib/mysql #내가 외부에서 사용할 저장소와 내부에서 사용할 저장소를 연동
- ./mysql-init:/docker-entrypoint-initdb.d # 시작 시 init.sql 실행. 쿼리문으로 여러개 작성가능.
ports:
- "3306:3306" # 개발 편의를 위해 열어둠
networks:
- erp-network
# ----------------------------------------
# [3] Backend Services (6개)
# ----------------------------------------
[기능1]: #도커가 서비스의 이름으로 보여주는 곳
build: ./backend-[기능1] #백엔드 서버의 빌드를 따라가는 곳.
container_name: service-[기능1]
networks:
- erp-network
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql-db:3306/[기능1]_db?useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&serverTimezone=Asia/Seoul
- DATABASE_USERNAME_KEY=${DATABASE_USERNAME}
- DATABASE_PASSWORD_KEY=${DATABASE_PASSWORD}
- SERVER_PORT=8081 # nginx.conf와 application.yml에 작성할 내용과 맞춰서 작성
[기능2]:
build: ./backend-[기능2]
container_name: service-[기능2]
networks:
- erp-network
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql-db:3306/[기능2]_db?useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&serverTimezone=Asia/Seoul
- DATABASE_USERNAME_KEY=${DATABASE_USERNAME}
- DATABASE_PASSWORD_KEY=${DATABASE_PASSWORD}
- SERVER_PORT=8082 # nginx.conf와 application.yml에 작성할 내용과 맞춰서 작성
[기능3]:
build: ./backend-[기능3]
container_name: service-[기능3]
networks:
- erp-network
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql-db:3306/[기능3]_db?useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&serverTimezone=Asia/Seoul
- DATABASE_USERNAME_KEY=${DATABASE_USERNAME}
- DATABASE_PASSWORD_KEY=${DATABASE_PASSWORD}
- SERVER_PORT=8083 # nginx.conf와 application.yml에 작성할 내용과 맞춰서 작성
[기능4]:
build: ./backend-[기능4]
container_name: service-[기능4]
networks:
- erp-network
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql-db:3306/[기능4]_db?useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&serverTimezone=Asia/Seoul
- DATABASE_USERNAME_KEY=${DATABASE_USERNAME}
- DATABASE_PASSWORD_KEY=${DATABASE_PASSWORD}
- SERVER_PORT=8084 # nginx.conf와 application.yml에 작성할 내용과 맞춰서 작성
[기능5]:
build: ./backend-[기능5]
container_name: service-[기능5]
networks:
- erp-network
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql-db:3306/[기능5]_db?useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&serverTimezone=Asia/Seoul
- DATABASE_USERNAME_KEY=${DATABASE_USERNAME}
- DATABASE_PASSWORD_KEY=${DATABASE_PASSWORD}
- SERVER_PORT=8085 # nginx.conf와 application.yml에 작성할 내용과 맞춰서 작성
[기능6]:
build: ./backend-[기능6]
container_name: service-[기능6]
networks:
- erp-network
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql-db:3306/[기능6]_db?useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&serverTimezone=Asia/Seoul
- DATABASE_USERNAME_KEY=${DATABASE_USERNAME}
- DATABASE_PASSWORD_KEY=${DATABASE_PASSWORD}
- SERVER_PORT=8086 # nginx.conf와 application.yml에 작성할 내용과 맞춰서 작성
# ---------------- [4] 젠킨스 (CI/CD) ----------------
jenkins:
image: jenkins/jenkins:lts
container_name: jenkins-server
ports:
- "9090:8080" # 호스트의 8080은 Nginx나 스프링이 쓸 수 있으니 9090으로 변경
volumes:
- ./jenkins_home:/var/jenkins_home
# 👇 젠킨스가 도커를 조종하기 위한 필수 설정 (Docker in Docker)
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
user: root # 도커 명령어 실행 권한 때문에 root 필요
networks:
- erp-network
2. nginx.conf
해당 기능에서는 nginx가 요청을 보내야할 때 어디로 데이터를 보낼 것인지를 기록하는 위치가 된다.
nginx.conf 파일에 들어가는 내용은 다음과 같다.
http {
# 파일 업로드 용량 늘리기 (기본은 1MB라 첨부파일 못 올림)
client_max_body_size 50M;
# 채팅 소켓을 위한 설정
upstream chat-server {
server service-chat:808n;
}
server {
listen 80;
server_name localhost;
# 1. 프론트엔드 화면 주기 (사용자가 그냥 접속했을 때)
location / {
root /usr/share/nginx/html; # 리액트 빌드 파일들이 있는 곳
index index.html;
try_files $uri $uri/ /index.html; # 리액트 라우팅을 위해 필수
}
# 2. 첨부파일 다운로드 처리 (중요 ⭐)
# 사용자가 http://my-company.com/uploads/사진.jpg 로 접근하면
# 스프링 부트를 거치지 않고 Nginx가 바로 파일을 줍니다. (속도 최적화)
location /uploads/ {
alias /usr/share/nginx/html/uploads/;
autoindex off; # 파일 목록 보여주기 금지
}
# 3. API 라우팅 (6대 서비스 연결)
location /api/[기능1]/ { proxy_pass http://service-[기능1]:8081; }
location /api/[기능2]/ { proxy_pass http://service-[기능2]:8082; }
location /api/[기능3]/ { proxy_pass http://service-[기능3]:8083; }
location /api/[기능4]/ { proxy_pass http://service-[기능4]:8084; }
location /api/[기능5]/ { proxy_pass http://service-[기능5]:8085; }
location /api/[기능6]/ { proxy_pass http://service-[기능6]:8086; }
# 4. 채팅 (WebSocket)
location /ws/ {
proxy_pass http://chat-server; #chat-server는 위에서 upstream으로 설정함.
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
}
3.mysql-init / init.sql
init.sql 파일은 최초 실행시 쿼리문을 실행하여 필요한 DB를 구현할 수 있다.
-- mysql-init/init.sql
CREATE DATABASE IF NOT EXISTS auth_db;
CREATE DATABASE IF NOT EXISTS hr_db;
CREATE DATABASE IF NOT EXISTS approval_db;
CREATE DATABASE IF NOT EXISTS common_db;
CREATE DATABASE IF NOT EXISTS chat_db;
CREATE DATABASE IF NOT EXISTS board_db;
CREATE DATABASE IF NOT EXISTS mail_db;
-- 필요한 경우 계정 권한 부여
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
여기에 필요한 경우 Table이나 특정 데이터 값까지 들어가도록 하여 테스트환경이나 데이터 복원 작업을 할 수있다.
4.backend-기능명
해당 기능은 여러번의 반복작업을 거쳐야한다. 그 때 도움을 받을 수 있는 것이 바로 아래의 사이트이다.
spring boot를 여러개 만들 때 쉽고 빠르게 만들 수 있게 해주며 특히 비슷한 이름, 비슷한 의존성을 추가할 경우 여러 기능으로 나눠서 바로바로 만들 수 있게 해준다.
나의 경우 spring boot를 자바로 구성할 생각이었기에 다음과 같이 설정하였다.
---- 좌측화면 구성 (기본 내용) ----
Project : Gradle-Groovy
Language : Java
Spring Boot : 3.5.8(mybatis가 제공되는 가장 마지막 버전)
그 아래쪽은 긴 텍스트들을 작성하게 되는데
Group : com.[종합 프로젝트 명]
Artifact : backend-[세부 기능명]
으로 작성하였다. 나머지 부분은 자동으로 변경되는대로 놔두었다.
Description의 경우 설명이므로 비워두거나 편하게 작성하면 된다.
Packaging : Jar
Configuration : YAML(yml과 동일함)
Java : 17
---- 우측화면 구성(의존성) ----
Spring Boot DevTools : 미리보기 기능이 있을 때 자동 갱신 기능을 추가해준다.
Lombok : 개발 편의성을 매우 많이 올려주므로 어떤 자바개발에도 필수로 들어간다. 꼭 넣어주자.
Spring Web : REST api, 내장 Tomcat 서버를 포함하여 컴퓨터에 별도의 서버설치 없이 웹이 작동할 수 있게한다.
Mybatis Framework : DB와 통신하는 방식이 xml과 mapper를 이용한 구조를 사용한다.
MySQL Driver : mysql과 통신을 하기 위한 JDBC 드라이버다. 만약 다른 종류의 sql을 사용한다면 해당 의존성을 찾는다.
고려대상
Spring Security : 인증과 보안에 대한 부분을 강화해준다.
OAuth2 Client : OAuth2 인증을 이용할 수 있는 기능을 추가해준다.(sns로그인 등)
JDBC API : 만약 실제 DB를 IDE에서 열람하고 조작하고 싶다면 해당 기능을 쓰면 좋다.
WebSocket : 실시간 양방향 통신이 필요한 경우 사용한다.(채팅, 화면공유, 화상회의 등)
Java Mail Sender : 메일을 발송할 수 있는 기능을 추가해준다. 메일서버의 의존이 필요하다.(google, naver 등)
Spring Data JPA : DB를 관리하는 또 다른 방안. 필자는 사용하지 않았다.
제외 대상
Thymeleaf : 현재 해당 개발은 프론트 엔드 부분을 Nginx가 담당하므로 Spring boot 에서는 화면을 작성할 필요가 없다.
이렇게 데이터를 작성하고 생성(Generate)을 하게되면 zip파일을 다운받는다.
이걸 아까 만든 데이터 파일 구조에 넣고 압축을 풀어주면 된다.
이후 개발프로그램에서 해당 프로젝트를 열어서 기본적인 세팅을 해주면 된다.
** 필요 없는 파일의 삭제
help.md
.gitignore
.gitattributes
src/main/resources 폴더 아래에 있는 static, templates 폴더 삭제 (여기서는 프론트엔드를 사용하지 않음)
**도커 구성을 위한 dockerfile 의 추가
여기서 dockerfile은 확장자 "없이" 단순 파일명이 dockerfile이다.
# 1. 빌드 단계 (Gradle이 설치된 이미지 사용)
FROM gradle:7.6-jdk17 AS builder
WORKDIR /app
COPY . .
# 테스트 제외하고 빌드 (속도 향상)
RUN ./gradlew clean build -x test
# 2. 실행 단계 (가벼운 JDK 이미지 사용)
FROM eclipse-temurin:17-jre
WORKDIR /app
# 빌드 단계에서 만들어진 jar 파일을 가져옴
COPY --from=builder /app/build/libs/*.jar app.jar
# 실행 명령어
ENTRYPOINT ["java", "-jar", "app.jar"]
해당 내용을 작성후 backend-[기능] 폴더에 넣어주면 된다.
src/main/resources 에 들어있는 application.yml (확장자가 yaml일 수 있음. 동일한 파일임) 의 내용을 이렇게 수정해준다.
server:
port: 8081 # [중요 1] 프로젝트마다 다르게 설정해야 함
spring:
application:
name: backend-[기능1] # MSA에서 서로를 식별하는 이름
datasource:
# [중요 2] 로컬 개발(IntelliJ)을 기준으로 작성합니다.
# 도커로 실행할 때는 docker-compose가 이 설정을 덮어씌웁니다.
url: jdbc:mysql://localhost:3306/[기능1]_db?useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&serverTimezone=Asia/Seoul #각 기능에 맞춰서 작성
username: ${DATABASE_USERNAME_KEY} # docker-compose.yml에서 받아온 key값이 변수로 작동
password: ${DATABASE_PASSWORD_KEY} # docker-compose.yml에서 받아온 key값이 변수로 작동
driver-class-name: com.mysql.cj.jdbc.Driver
#만약 jpa를 쓴다면 아래 속성을 사용할 것.
jpa:
hibernate:
ddl-auto: update # 개발 중에는 테이블 자동 생성/수정 (운영 시엔 validate나 none)
properties:
hibernate:
format_sql: true # 실행되는 SQL을 보기 좋게 출력
show_sql: true # 콘솔에 SQL 출력
open-in-view: false # DB 커넥션 관리 최적화
#Mybatis를 사용할 땐 아래 속성을 사용할 것.
mybatis:
# 1. XML 파일 위치 지정 (resources/mapper 폴더 안의 모든 xml)
mapper-locations: classpath:mapper/**/*.xml
# 2. DTO 패키지 생략 (선택사항) 혹은 별도의 mybatis 폴더 아래 configuration.xml 파일을 작성해서 사용가능.
# 이걸 쓰면 xml에서 com.[project명].[기능1].dto.[DTO이름] 대신 그냥 [DTO이름]으로 쓸 수 있음
type-aliases-package: com.[project명].[기능1].dto
configuration:
# 3. 스네이크 케이스 자동 변환 (user_id -> userId)
map-underscore-to-camel-case: true
# 4. 쿼리 로그 출력 (선택사항)
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 한글 깨짐 방지 및 로그 설정
logging:
level:
org.hibernate.SQL: debug
여기서 주의할 점은 각 기능별로 포트 번호를 다르게 지정해주어야 한다는 점이다.
나같은 경우 [기능 n] 에 대한 포트 번호는 808n 으로 지정하였다. [기능3] => 8083
또한 mybatis 설정을 하기 위해서는 폴더의 구조를 변경해주어야한다.
src/main/java/com/[프로젝트명]/[기능n] 패키지 아래에 mapper 패키지를 작성하고 그 아래에 interface를 구성해야한다.
또한 src/main/resources 폴더 아래에 mapper 폴더를 만들고 그 아래에 mapper.xml 파일을 만들어야한다.
두개의 파일 이름을 동일하게 할 필요는 없지만, 편의상 파일이름을 맞추는 편이며 xml파일에서는 추가로 설정을 해주어야한다.
mapper.xml 파일의 공통 사항
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.[프로젝트명].[기능n].mapper.[Mapper이름]">
</mapper>
바로 위 형태의 조건을 갖춰서 연동해주어야 한다.
5. .gitignore // .env
.gitignore
보통 서버로 데이터를 보내거나 새롭게 갱신을 할 때는 git과 github을 이용해서 만들게 된다.
이때 민감한정보나 불필요하게 용량이 큰 데이터는 문제가 되기 때문에 해당 내용을 제외하는 것이다.
# ==================================
# 1. 핵심 보안 (가장 중요 ⭐)
# ==================================
.env
.env.*
*.key
*.pem
# ==================================
# 2. 빌드 결과물 (용량 큼, 절대 올리지 마세요)
# ==================================
# 모든 하위 폴더의 build 폴더를 무시함
**/build/
**/out/
**/bin/
.gradle/
# ==================================
# 3. IDE 설정 파일 (내 컴퓨터 설정)
# ==================================
# IntelliJ
.idea/
*.iws
*.iml
*.ipr
# VS Code
.vscode/
# Eclipse / STS
.classpath
.project
.settings/
.springBeans
.sts4-cache/
# ==================================
# 4. 운영체제 파일 (맥/윈도우)
# ==================================
.DS_Store
Thumbs.db
Desktop.ini
# ==================================
# 5. 도커 및 로그
# ==================================
*.log
# 도커 볼륨 데이터 폴더 (우리가 만든 폴더)
mysql-data/
uploads/
jenkins_home/
.env
서버에서 사용할 민감한 데이터를 따로 모아서 작성해두는 파일. docker가 해당 파일을 읽고 변수명에 해당 하는 값을 집어넣어준다.
DATABASE_USERNAME=root
DATABASE_PASSWORD=root
여기서 데이터가 전달되는 과정을 살펴보면
.env > docker-compose.yml 로 변수값을 읽어옴.
docker-compose.yml에 지정된 "환경변수"에서 키 값으로 데이터를 보낼 수 있음.
여러 기능에서 해당 "환경변수"이름을 변수명으로 사용하여 데이터를 받을 수 있음.
마지막으로 docker-compose.yml을 작동시켜서 한번에 docker container를 조작하는 방법에 대해서 알아두면 기본적인 내용은 끝난다. docker-compose.yml을 작동시켜야하기 때문에 해당 파일이 있는 경로로 가서 명령어를 입력해야한다.
docker compose 명령어
| 코드 | 설명 |
| docker compose up -d | docker-compose.yml에 정의된 모든 서비스를 생성하고 시작. -d 옵션이 있어야 백그라운드 에서 실행됨. 그렇지않으면 관련된 모든 로그가 떠서 터미널 사용 불가. |
| docker compose down | 실행중인 모든 서비스를 중지하고 컨테이너와 네트워크를 삭제 |
| docker compose down -v | 데이터 볼륨까지 모두 삭제합니다.(초기화시 사용) |
| docker compose ps | docker ps 로 대체 가능. 실행중인 컨테이너의 상태를 보여줌 |
| docker compose stop [서비스명] | 컨테이너를 삭제하지 않고 잠시 멈춥니다. |
| docker compose start [서비스명] | 멈춰둔 컨테이너를 다시 실행합니다. |
| docker compose restart [서비스명] | 일부 혹은 전체를 다시 시작합니다. |
| docker compose logs [서비스명] | [서비스명]에 해당하는 컨테이너의 로그를 확인합니다. |
| docker compose logs -f [서비스명] | [서비스명]에 해당하는 컨테이너의 로그를 실시간으로 확인합니다. |
| docker compose exec [서비스명] /bin/bash | [서비스명]으로 접속하여 터미널을 열어둡니다.(ssh접속과 유사함) |
| docker compose build | dockerfile이 변경되었을 때 이미지를 새로 빌드합니다. |
| docker compose up -d --build | 이미지를 새롭게 빌드하고 실행합니다. |
| docker-compose logs -f --tail=20 [서비스명] | [서비스명]에 해당하는 컨테이너의 로그를 실시간으로 20줄만 확인합니다. 숫자변경 가능 |
| docker compose up -d --force-recreate | 컨테이너를 삭제하고 다시 빌드하여 실행합니다. docker-compose.yml을 변경했는데 적용이 안되는것 같을 때 사용합니다. |
| docker compose down -v --rmi all | 컨테이너를 종료하고 데이터볼륨, 이미지, 컨테이너까지 모두 삭제합니다. |
혹시 해당 명령어가 잘 작동하지 않는다면 아래 게시글을 참고해보면 좋다.
리눅스(ubuntu) 도커(docker) 최신 버전 설치 및 기본설정 방법
리눅스(ubuntu) 도커(docker) 최신 버전 설치 및 기본설정 방법
docker에 대해서 최신버전을 apt로 받았더니 compse 기능을 쓸 수 없어서 삭제하고 다시 설치하게 되었다. 리눅스 우분투 기준 최신버전의 docker를 받는 방법을 기록해둔다. 터미널에서 아래 명령어
warmice8226.tistory.com
이후 정상적으로 서비스가 동작하는 것을 확인하면 된다. 필자는 dockerfile에서 들여쓰기를 잘못하여 서버설정이 잘못되었던 경험이 있다. 처음해보는 거라서 무엇이 잘못인지도 몰랐었다. 힘내길 바란다.
'IT 공부내용 정리 > 배포(docker, 젠킨스)' 카테고리의 다른 글
| yml 파일과 properties파일의 차이 (0) | 2025.12.01 |
|---|---|
| 리눅스(ubuntu) 도커(docker) 최신 버전 설치 및 기본설정 방법 (0) | 2025.12.01 |
| 배포 및 인프라에 대한 궁금증 정리(Nginx vs Apache) (0) | 2025.12.01 |
| 웹 서비스 개발에 대한 개요 정리 (0) | 2025.12.01 |