|
|
FROM → 베이스 이미지 지정
WORKDIR → 작업 디렉토리 설정
COPY → 파일 복사
CMD → 컨테이너 실행 시 기본 명령어
4. Docker 이미지 빌드
docker build -t mypython-app .
mypython-app 이라는 이름으로 이미지가 만들어 진다.
vboxuser@ub2:~/dockerfileTest$ docker build -t mypython-app .
DEPRECATED: The legacy builder is deprecated and will be removed in a future release.
Install the buildx component to build images with BuildKit:
https://docs.docker.com/go/buildx/
Sending build context to Docker daemon 3.072kB
Step 1/4 : FROM python:3.9-slim
3.9-slim: Pulling from library/python
ea56f685404a: Pulling fs layer
b3ec39b36ae8: Pulling fs layer
fc7443084902: Pulling fs layer
38513bd72563: Pulling fs layer
ea56f685404a: Download complete
a5e5b1b19090: Download complete
967a6079ce08: Download complete
b3ec39b36ae8: Download complete
fc7443084902: Download complete
38513bd72563: Download complete
38513bd72563: Pull complete
b3ec39b36ae8: Pull complete
fc7443084902: Pull complete
ea56f685404a: Pull complete
Digest: sha256:2d97f6910b16bd338d3060f261f53f144965f755599aab1acda1e13cf1731b1b
Status: Downloaded newer image for python:3.9-slim
---> 2d97f6910b16
Step 2/4 : WORKDIR /app
---> Running in 4b1ebd9e1e26
---> Removed intermediate container 4b1ebd9e1e26
---> 4326dc094ffb
Step 3/4 : COPY . .
---> f36759c0c4e6
Step 4/4 : CMD ["python", "app.py"]
---> Running in 0689c8c61116
---> Removed intermediate container 0689c8c61116
---> 2fabfad59d37
Successfully built 2fabfad59d37
Successfully tagged mypython-app:latest
5. 컨테이너 실행
docker run --rm mypython-app
| vboxuser@ub2:~/dockerfileTest$ docker images i Info → U In Use IMAGE ID DISK USAGE CONTENT SIZE EXTRA eclipse-temurin:25-jre 681c543d6f36 478MB 122MB mykube-app:1.0 c741aaf92588 511MB 135MB U mypython-app:latest 2fabfad59d37 183MB 45MB python:3.9-slim 2d97f6910b16 185MB 47.2MB vboxuser@ub2:~/dockerfileTest$ docker run --rm mypython-app Hello Dockerfile |
Redis 컨테이너 통신 실습 아키텍처
아키텍처 개요
Docker 네트워크 (bridge): 컨테이너들이 같은 네트워크에 속해 서로 이름으로 접근 가능
Redis 서버 컨테이너: 데이터를 저장하고 제공
Redis 클라이언트 컨테이너: redis-cli를 통해 서버에 접속하여 데이터 읽기/쓰기
아키텍처 다이어그램 (개념)
| +-------------------+ +-------------------+ | redis-client | <----> | redis | | (redis-cli tool) | | (Redis server) | | name: redis-client| | name: redis | +-------------------+ +-------------------+ | | +-----------+---------------+ | Docker Network: mynetwork (bridge, gateway 역할) |
mynetwork 네트워크가 게이트웨이 역할을 하며 두 컨테이너를 연결
클라이언트는 redis라는 컨테이너 이름으로 서버에 접근
1. 네트워크 생성
docker network create mynetwork
2. Redis 서버 실행
docker run -dit --name redis --network mynetwork redis
=> redis 라는 이름의 서버 컨테이너가 mynetwork에 연결.
3. Redis 클라이언트 실행
docker run -it --name redis-client --network mynetwork redis redis-cli -h redis
=> redis-cli를 실행하면서 -h redis 옵션으로 서버 컨테이너 이름을 지정.
4. 클라이언트에서 데이터 테스트
set mykey "Hello Redis"
get mykey
결과: "Hello Redis"
<실습>
| vboxuser@ub2:~/dockerfileTest$ docker network create mynetwork b13a586c1c02c64d2137f48ce1ea466b2f67d98fca57b5fa5d7337b4995d9579 vboxuser@ub2:~/dockerfileTest$ docker network ls NETWORK ID NAME DRIVER SCOPE 181075b54ebb bridge bridge local 784d68f7dde5 host host local b13a586c1c02 mynetwork bridge local bcb326870cbc none null local vboxuser@ub2:~/dockerfileTest$ vboxuser@ub2:~/dockerfileTest$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4a02003ff343 redis "docker-entrypoint.s…" 16 seconds ago Up 14 seconds 6379/tcp redis 5c56c02a3612 mykube-app:1.0 "java -jar /app/app.…" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp, [::]:80->80/tcp hopeful_brattain vboxuser@ub2:~/dockerfileTest$ docker images i Info → U In Use IMAGE ID DISK USAGE CONTENT SIZE EXTRA eclipse-temurin:25-jre 681c543d6f36 478MB 122MB mykube-app:1.0 c741aaf92588 511MB 135MB U mypython-app:latest 2fabfad59d37 183MB 45MB python:3.9-slim 2d97f6910b16 185MB 47.2MB redis:latest c88d347edef6 208MB 56.3MB U |
네트워크 상세 정보 확인:
docker network inspect mynetwork
Containers 항목에 네트워크에 연결된 컨테이너들이 나열 되어 있다.
각 컨테이너 이름(redis, hopeful_brattain)과 IP 주소를 확인할 수 있다.
docker network inspect <네트워크명> → 해당 네트워크에 연결된 컨테이너 목록과 IP 확인 가능
같은 네트워크에 있으면 컨테이너 이름으로 서로 접근 가능 (redis-cli -h redis 같은 방식
| vboxuser@ub2:~/dockerfileTest$ docker network inspect mynetwork [ { "Name": "mynetwork", "Id": "b13a586c1c02c64d2137f48ce1ea466b2f67d98fca57b5fa5d7337b4995d9579", "Created": "2026-07-28T06:20:20.070733694Z", "Scope": "local", "Driver": "bridge", "EnableIPv4": true, "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "172.18.0.0/16", "IPRange": "", "Gateway": "172.18.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Options": {}, "Labels": {}, "Containers": { "4a02003ff343914aa10614bdac1a2815d10e8f05defd9d6549f74a546532cb02": { "Name": "redis", "EndpointID": "8f9c8de5d9a57b6bdc97f56c247cd8ad2e6957c96d2411b5f4df91ad4e68689b", "MacAddress": "b6:d8:1c:c5:d1:92", "IPv4Address": "172.18.0.2/16", "IPv6Address": "" } }, "Status": { "IPAM": { "Subnets": { "172.18.0.0/16": { "IPsInUse": 4, "DynamicIPsAvailable": 65532 } } } } } ] |
redis-client 컨테이너를 띄워서 redis 서버에 접속하면, 네트워크 통신이 잘 되는지 직접 확인할 수 있다.
| vboxuser@ub2:~/dockerfileTest$ docker run -it --name redis-client --network mynetwork redis redis-cli -h redis redis:6379> set mykey "Hello Redis" OK redis:6379> get mykey "Hello Redis" redis:6379> |
2. Redis 클라이언트 실행
docker run -it --name redis-client --network mynetwork redis redis-cli -h redis
redis-cli를 실행하면서 -h redis 옵션으로 서버 컨테이너 이름을 지정
| docker exec -it redis-client bash vboxuser@ub2:~/dockerfileTest$ docker exec -it redis-client bash root@19c76cd5af41:/data# redis-cli -h redis redis:6379> get my (nil) redis:6379> get mykey "Hello Redis" // -h redis는 같은 네트워크에 있는 redis 서버 컨테이너 이름을 지정하는 것 |
정리
컨테이너 간 통신은 같은 네트워크에 연결하는 것이 핵심
Redis 서버와 클라이언트를 각각 컨테이너로 띄워서, 이름(redis)으로 접근 가능
네트워크가 내부적으로 게이트웨이 역할을 하여 통신을 중계
spring.application.name=myback
spring.main.web-application-type=servlet
server.port=80
server.servlet.context-path=/mykubernetes
package kr.co.ictedu.myback.hello;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/")
public String hello() {
return "안녕 Kubernetes!";
}
}
D:\ictstudy\springboot\workspace\myback>gradlew clean bootJar
Starting a Gradle Daemon, 1 incompatible and 1 stopped Daemons could not be reused, use --status for details
BUILD SUCCESSFUL in 6s
5 actionable tasks: 4 executed, 1 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.5.1/userguide/configuration_cache_enabling.html
D:\ictstudy\springboot\workspace\myback>dir build\libs
D 드라이브의 볼륨: Data
볼륨 일련 번호: 903F-798A
D:\ictstudy\springboot\workspace\myback\build\libs 디렉터리
2026-07-28 오후 12:57 <DIR> .
2026-07-28 오후 12:57 <DIR> ..
2026-07-28 오후 12:57 19,866,633 myback-0.0.1-SNAPSHOT.jar
1개 파일 19,866,633 바이트
2개 디렉터리 911,676,043,264 바이트 남음
D:\ictstudy\springboot\workspace\myback>
vboxuser@ub2:~/api$ vim Dockerfile
vboxuser@ub2:~/api$ cat Dockerfile
FROM eclipse-temurin:25-jre
WORKDIR /app
COPY myback-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 80
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
vboxuser@ub2:~/api$ docker run -d -p 80:80 mykube-app:1.0
5c56c02a3612ffaa426850da2ceaab011b2bd0e9b1b1dd93449fdd1fc9f9fad9
vboxuser@ub2:~/api$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c56c02a3612 mykube-app:1.0 "java -jar /app/app.…" 12 seconds ago Up 11 seconds 0.0.0.0:80->80/ tcp, [::]:80->80/tcp hopeful_brattain
vboxuser@ub2:~/api$
http://192.168.0.47/mykubernetes/
<참고>
Window에서 미니콘다
https://swmakerjun.tistory.com/80
|
|