Kernel 위에 컨테이너
들이 있음여러개의 컴퓨터
가 있다 라고 생각하면 좋다 (분리해서 사용한다!)네트워크
도 프로세스
도 분리해서 사용할 수 있음호스트의 포트
와 컨테이너 포트
로 연결된다새로운 OS를 설치
해서 사용하는 것하나의 OS
안에서 환경을 분리
해서 사용컨테이너를 실행
하기 위한 순간을 이미지화 한 파일 = Docker Imageimage file = iso
라고 생각하면 좋다(파일을 이미지화! 찰칵!) AWS Snapshots
이 유사한 시스템서버 컴퓨터는 용량이 제한
되어 있기에 어마어마한 트래픽을 감당 할 수 없음. (ex: 수강신청 등 트래픽이 몰리는 상황) 여러 서버 컴퓨터를 열어주어야 하는 상황이 왔을 때 이미지를 활용한 컨테이너를 띄우면서
순간적으로 처리 영역을 확장
시킬 수 있음컨테이너란 이미지의 인스턴스
라고 생각할 수 있음깃허브와 같은 역할
을 함 (이미지를 가지고 와서 복잡한 설정
없이 바로 실행이 가능하게 해줌)docker run -d -p 80:80 docker/getting-started
Dockerfile을 생성
.txt와 같은 확장자 쓰지 않음Extension에서 Docker를 설치
# Dockfile
# 실행할 엔진/버전/경량화 버전
From node:12-alpine
# Adding build tools to make yarn install work on Apple sill
RUN apk add --no-cache python2 g++ make
WORKDIR / app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
# 본인의 Dockerfile이 있는위치로 이동
docker build -t getting-started .
docker run -dp 3000:3000 getting-started
# js / app.js
<Form onSubmit={submitNewItem}>
<InputGroup className="mb-3">
<Form.Control
value={newItem}
onChange={e => setNewItem(e.target.value)}
type="text"
placeholder="새로운 아이템"
aria-describedby="basic-addon1"
/>
<InputGroup.Append>
<Button
type="submit"
variant="success"
disabled={!newItem.length}
className={submitting ? 'disabled' : ''}
>
{submitting ? 'Adding...' : '아이템 추가'}
</Button>
</InputGroup.Append>
</InputGroup>
</Form>
업데이트는 실시간으로 반영되지 않음
현재는 이전의 도커 이미지로 실행 되고 있는 상태이기 때문에, 적용을 하기 위해선 다시 도커 빌드로 새로운 이미지를 생성
해줘야 함# 본인의 Dockerfile이 있는위치로 이동후
docker build -t getting-started .
# 도커 정보 확인
docker ps
# 컨테이너를 멈추고 삭제까지하는 명령어
docker rm -f {컨테이너 id}
# 다시 컨테이너 런
docker run -dp 3000:3000 getting-started
# window
netstat -ano | findstr "{포트번호}"
# Linux
netstat -pntl | grep {포트번호}
# mac
lsof -i :{포트번호}
Docker Hub Container Image Library | App Containerization
# 도커 허브로 푸시하는 쉘 명령어
docker push {아이디}/{이미지이름:tagname(버전)}
docker tag getting-started 유저네임/getting-started
docker ps
로 존재한다는걸 확인할 수 있다!docker image ls
를 통해 이미지의 존재 여부를 볼 수 있다docker login -u {유저네임}
# 입력 시 비밀번호 입력란이 나옴
# 도커 허브로 푸시하는 쉘 명령어
# 처음에는 오류가 발생했기 때문에 다시 푸시해준다
docker push {아이디}/{이미지이름:tagname(버전)}
ADD NEW INSTANCE 로 가상의 환경을 만들어준다
# window
docker run -dp 3000:3000 {아이디}/{이미지이름}getting-started
platform이 amd64
인 이미지를 만들어 주는 것
# mac os (M1)
docker build --platform=linux/amd64 -t {아이디}/{이미지이름}getting-started:amd64 .
docker push {아이디}/{이미지이름}:amd64
# 실행중인 컨테이너 멈추기
docker stop {container id} or {image name}
# 컨테이너 삭제
docker rm {container id} or {image name}
# 강제로 실행 종료하고 컨테이너 지우기
docker rm -f {container id} or {image name}
# 생성되어있는 도커 이미지 확인하기
docker image ls
# 도커 이미지 삭제하기
docker rmi {image id} or {image name:tagname(버전)}
각각의 독립적
으로 존재하기때문에 서로 접근할 수 없음
echo 명령어
를 활용하여 string값을 데이터에 저장
할 수 있음docker run -d ubuntu bash -c "echo 'hello world' > data.txt && tail -f /dev/null"
tail
부분은 프로세스가 끝나도 컨테이너가 꺼지지 않도록
하기 위해 붙여줌ls
# 데이터 확인 명령어
cat /{데이터명}data.txt
# -i 는 상호교류를 하겠다 -t 는 터미널
docker run -it ubuntu
# ls 로 확인해보면 txt파일 없음 여기엔
exit
docker ps
# 다시 확인해보면 처음 실행한 컨테이너만 남아있음 위에서 실행한 건 바로 없어짐
# 처음 실행했던 컨테이너도 삭제
docker rm -f {container id}
# ps 로 확인해보면 아무것도 없음
# 이제 프로세시와 저장공간이 분리된 걸 확인했으니 볼륨을 이용해보좌
# 저장되는 db 위치 확인
ls
#상위 폴더 접근
cd ..
#etc 확인
ls
cd etc
# todos 확인
ls
cd todos
# todo.db가 있는걸 확인
ls
docker volume create {volume name}
docker run -dp 3000:3000 -v {volume name}:/etc/todos {image name}
docker run -dp 3001:3000 -v {volume name}:/etc/todos {image name}