01. Java
02. git
03. Database
04. Jsp [Server]
05. HTML,CSS
07. JS
06. 미니프로젝트-2W
08. SpringFramework , SrpingBoot
19. 중간프로젝트 (1M)
10. Linux 명령어
11. AWS
12. Docker(v)
13. React JS [Front-end]
14. App - Android
15. 최종프로젝트 (1M)
컨테이너를 생성하는데 필요한 명령문을 textfile로 정의한 것
dockerfile은 도커이미지를 기반으로 새로운 이미지를 추가하여 나만의 이미지를 생성할 수 있는 이미지 설정파일
dockerfile만드는 규칙
- 파일명은 반드시
dockerfile
이어야함- 도커파일에 사용하는 명령문 사용 (from, copy, cmd 등)
- build명령으로 dockerfile에 나열된 명령문을 이미지로 생성
docker build -t <파일명:버전명> <dockerfile의 위치>
명령어 설명 FROM 이미지:태그 운영환경의 베이스 이미지명을 기술 COPY 호스트파일경로:이미지의파일경로 사용자의 OS에 있는 파일을 도커 이미지파일 안으로 복사 RUN [커맨드, 매개변수] command를 실행(run)하여 이미지에 포함시키는 역할을 합니다. 도커이미지를 만들 때 1번 실행 (추가할 라이브러리 설치에 사용) RUN 쉘명령형식 위와 같음 WORKDIR 경로 shell의 cd명령문처럼 컨테이너 상에서 작업 디렉토리로 전환을 위해서 사용됩니다. 이후에 도커는 해당 디렉토리에서 작업 ARG 변수이름=값 변수 선언입니다. 선언한 변수는 dockerfile에서 달러로 접근 가능능 ENV 변수이름=값 컨테이너가 가져야 할 환경변수 선언 VOLUME 각 컨테이너가 파일 또는 데이터를 공유할 수 있도록 host에 생성 EXPOSE 포트/프로토콜 컨테이너 동작시 사용할 포트/프로토콜 지정 CMD [커맨드, 매개변수..] 컨테이너가 처음 실행될 때 실행시킬 서비스 or 스크립트 or 명령문 지정 (컨테이너 실행시 매개변수로 변경 가능) CMD 쉘명령형식 위와 같음 ENTRYPOINT [커맨드, 매개변수] 컨테이너가 처음 실행될 때 실행시킬 서비스 or 스크립트 or 명령문 지정 (변경불가능 고정명령문) ENTRYPOINT 쉘명령형식 위와 같음 LABEL 키=값 이미지에 컨테이너의 정보를 저장 USER 유저명 컨테이너 실행시 적용할 유저 설정
docker logs -f <CONTAINER_ID or NAMES>
자바를 설치하고 자바 파일을 생성해서 실행
메모장 열기
notepad(vi) Hello.java
- 코드작성
public class Hello { public static void main(String[] args) { System.out.println("hello world docker file"); } }
docker search openjdk
notepad(vi) dockerfile
- 도커파일 작성
# 이 도커파일의 베이스이미지를 기술 FROM openjdk:11 # 헬로자바 파일을, 이미지 안에 / 경로로 복사 하겠음 COPY Hello.java / # 1번 실행하고 싶은 명령문이 들어갑니다. RUN javac Hello.java # 컨테이너가 실행되기 전 최종적으로 동작할 명령문을 작성 # java프로그램에서 Hello클래스 실행 ENTRYPOINT ["java", "Hello"]
docker build -t <이미지명>:<태그> <빌드할도커파일위치> docker build -t hellojava:latest .
docker run <옵션> <이미지:태그> docker run --name first hellojava:latest
ENTRYPOINT ["tail","-f","/dev/null"]
FROM openjdk:11 # 도커 컨테이너 안에 폴더 생성 RUN mkdir /home/app # 도커 컨테이너 안에 작업공간을 이동 WORKDIR /home/app # RUN touch project.txt #우리 프로젝트를 도커 컨테이너 디렉토리 안으로 복사 COPY build/libs/BootMyWeb-0.0.1-SNAPSHOT.jar ./app.jar #실행 #ENTRYPOINT고정으로 실행시킬 명령문 #CMD는 RUN시에 변경될 수도 있는 명령문 ENTRYPOINT ["java", "-jar"] CMD ["app.jar"]
docker build -t second .
docker run --name demo-webserver -d -p 8282:8282 second:latest
docker logs -f demo-webserver
eth0(host) : 호스트가 사용하는 네트워크 인터페이스
veth(베스천 호스트) : veth
는 컨테이너와 도커 브릿지 네트워크를 이어주는 통로 역할
docker0(브릿지) : 도커 설치 시 자동으로 생성되는 네트워크 인터페이스스
네트워크에서 베스천호스트는 외부에서 내부 네트워크에 접근할 수 있는 유일한 방법인 접근점
도커는 컨테이너가 실행될 때
- 하나는 컨테이너 내부(eth0)에
- 하나는 호스트 외부(vethXXX)에 연결접점을 만들고 연결
- 도커가 컨테이너 방(eth0) 안과 베스천 호스트 복도(veth) 사이에 직통 비밀통로를 만듬
- bridge가 veth를 통해 eth0으로 연결
- bridge네트워크는 내부에서 각 컨테이너들을 연결하는 역할
- bridge네트워크는 컨테이너의 gateway역할
- host의 eth0은 도커 호스트에서 bridge 네트워크를 연결해줌 (포트포워딩)
docker run -name webserver -d -p 8181:8484 이미지명
해당 명령문에서 eth0(도커호스트)로 8181요청이 들어오면 컨테이너의 8484로 연결해주는 역할 수행
- default brdige network : 컨테이너 간 아이피를 통해 통신 가능
- user defined bridge network : 컨테이너 간 아이피, 컨테이너 명을 통해 통신 가능
docker network docker network ls
docker inspect <이미지명 or network명>
docker network create 네트워크명 docker network create web-network
- 옵션을 지정하는 방식
driver - 도커 네트워크 인터페이스지정, subnet - 서브넷마스크 범위지정, gateway - 네트워크 입구아이피 지정 docker network create --driver bridge --subnet 192.168.100.0/24 --gateway 192.168.100.1 test-network
docker network connect 네트워크명 컨테이너명 docker network connect web-network webserver docker network connect web-network webserver-mysql
docker network disconnect 네트워크명 컨테이너명 docker network disconnect web-network webserver
docker network rm <네트워크명>
docker run --net <네트워크명> <이미지> docker run --name webserver -d -p 8181:8484 --net web-network myweb:v1
볼륨은 컨테이너와 관련된 특별한 유형의 폴더
일반적으로 볼륨은 모든 데이터 유형을 저장 가능
볼륨을 사용하면 컨테이너 간에 데이터를 공유 가능
볼륨은 도커HOST에 저장 -> 컨테이너 밖에 저장됨
컨테이너가 삭제된 경우에도 데이터 볼륨은 남아서 여전히 제어가 가능하게 할 수 있음
host에 볼륨이 직접 생성되는 경로는 /var/lib/docker/볼륨명/_data
docker volume docker volume ls
docker volume create <볼륨명> docker volume create webserver-upload
docker inspect <볼륨명> docker inspect webserver-upload
docker volume prune
- 도커파일에서 volume을 선언하는 방법
- 이 방식은 host에 볼륨이 생성될 때 이름이 난수로 생성
- 컨테이너 삭제 후 난수로 생성된 볼륨은 어떤 역할을 하는지 알 수 없음
- 직접 볼륨을 생성하고 컨테이너 배포시 볼륨은 연결(마운트) 하는 방법
- 새로운 컨테이너가 생성될 때 volume을 참조해서 만들어지며 data가 공유됨