Docker - Container
도커 컨테이너
- 도커 이미지의 실행 가능한 인스턴스
- 개별 애플리케이션의 실행에 필요한 실행환경을 독립적으로 운용
컨테이너 생성
- 다운받은 이미지가 없는 경우 자동으로 다운받아서 생성
- 이미지 다운로드(pull) + 컨테이너 생성(create) + 실행(start) + 접속(attach) 까지 한번에 수행
- 접속(attach) : -it 명령어 사용
- run 대신 create 키워드 사용 시 생성까지만 되고 실행되지는 않음
docker run [옵션] [저장소이름/]<이미지이름>[:버전]
docker run -d --name myweb -p 80:8080 tomcat:8.5.72-jdk8
옵션 | 설명 |
---|---|
-d | 백그라운드에서 컨테이너 실행 |
-i -t | 컨테이너 내부로 진입하여 컨테이너와 상호 입출력 |
–name <이름>이름> | 컨테이너에 이름 지정(지정하지 않을 경우 16진수 임의 값으로 이름 생성) |
-p <호스트Port>:<컨테이너Port>컨테이너Port>호스트Port> | 외부에서 컨테이너 내부로 접근할 수 있게 호스트 PC의 포트와 컨테이너 내부 포트를 연결 |
-e <환경변수>=<값>값>환경변수> | 환경변수 설정 |
–link | 다른 컨테이너에 링크 추가 |
컨테이너를 생성했다. 다운 받은 것이 없기 때문에 자동으로 다운 받아서 생성이된다.
그 후에 이미지 검색을 하면 확인 가능하다.
docker ps -a
-
-d(백그라운드에서 실행) 옵션 없이 생성하면 실행되는 로그가 출력된다.
이건 foreground에서 실행되는 것이라고 한다.
그 후에는 아무것도 입력할 수 없게 된다.
-
실습 때는 power shell 창을 하나 더 열어서 foreground에서 실행했던 것을 stop 해주었다.
-> 그랬더니 원래 power shell 창에 입력 가능해졌다.
근데 -it 옵션을 주고 실행했을 때는 역시 같은 foreground 방식으로 실행되고
입력이 불가했다가, [Ctrl + c]를 입력하면 다시 입력이 가능해졌다.
-
create를 사용하여 생성만 했을 경우.
상태에 created라고 출력되는 것이 확인 가능하다.
이때, 실행을 원할 경우 start 명령어를 사용하면 된다.
docker start [ID]
컨테이너 확인
docker ps [옵션]
// docker ps : 실행 중인 컨테이너 조회
//docker ps -a : 종료된 컨테이너까지 조회
// 컨테이너의 ID만 조회
docker ps -a -q
항목 | 설명 | |
---|---|---|
CONTAINER ID | 컨테이너에 자동 할당되는 고유 ID 중 일부 출력 | |
IMAGE | 컨테이너 생성 시 사용된 이미지 | |
COMMAND | 컨테이너 시작 시 자동으로 실행될 명령어, 대부분 이미지에 미리 내장되어 있음, | 컨테이너 생성 시 변경 가능 |
CREATED | 컨테이너 생성 후 흐른 시간 | |
STATUS | 컨테이너 상태 | |
PORTS | 컨테이너에 개방된 포트, 호스트와 연결된 포트를 출력 | |
NAMES | 컨테이너 생성 시 지정한 이름(–name 옵션) |
-
컨테이너 생성 후 확인하기.
-
컨테이너를 종료하고 -a 옵션 없이 조회했을 경우 아무것도 안 나오는 것을 확인할 수 있다.
- IMAGE : 컨테이너를 생성할 때 사용한 이미지
- COMMAND : 컨테이너를 실행할 명령어
- docker image inspect [ID] : Cmd 부분
- STATUS : 현재 컨테이너 상태
- UP : 실행 중인 생태
- PAUSE : 정지
- EXITED : 종료
- command가 종료되면 컨테이너도 종료
컨테이너 상세 내용 조회
docker inspect <컨테이너 이름 or ID>
docker inspect myweb
컨테이너 실행/종료
docker start/stop/restart <컨테이너 이름 or ID>
docker start myweb
docker stop myweb
docker restart myweb
위에서 종료했던 컨테이너를 start 통해서 다시 실행했다.
종료했기 때문에 start를 사용했고 정지했을 경우 restart를 사용하면 된다.
컨테이너로 파일 복사
- 내 pc에 있는 파일을 컨테이너로 복사
- 경로가 컨테이너 내부일 경우 <컨테이너명:경로> 로 지정컨테이너명:경로>
docker cp [옵션] <원본파일경로> <복사할경로>
docker cp d:\test.txt myweb:/root
D드라이브에 test.txt 파일을 만들었다.
-
/bin/bash shell 종료를 원할 경우 exit 명령어 사용.
컨테이너 명령어 실행
- shell을 실행하면 컨테이너에 접근 가능
- shell 접근 후 다양한 명령어 사용 가능
- ex) 종료 시 exit
docker exec [옵션] <컨테이너이름 or ID> <명령어>
docker exec -it myweb /bin/bash
컨테이너 삭제
- 이미지를 삭제 할 때는 rmi. 이거랑 헷갈리기 없기.
- 구동 중인 컨테이너는 삭제 불가
- 컨테이너를 정지시킨 후 삭제
- dockr rm -f [ID] : 실행 중이어도 삭제 가능.
docker rm [옵션] <컨테이너이름 or ID> [컨테이너 이름 or ID …]
docker rm tomcat:8.5
docker rm -f tomcat:8.5
docker ps -a를 통해 모든 컨테이너 조회. 잘 삭제 되었다!
공통환경으로 컨테이너 생성
test.txt 파일이 공통으로 필요한 파일일 때 사용한다.
컨테이너를 만들고 컨테이너마다 test.txt 파일을 복사할 필요가 없다.
느낌은 오는데 말로 정리하기가 어렵다.
컨테이너는 이미지로 만드는 건데.. 컨테이너로 이미지를 생성한다니..
docker commit [컨테이너명] [이미지명:태그]
docker commit myweb myweb_image:1.0
test.txt 파일이 있는 컨테이너로 이미지 생성
-
docker run -d --name myweb2 -p 81:8080 myweb_image:1.0
생성한 이미지로 컨테이너 생성
-
// /root에 test.txt 파일이 존재하는지 확인
docker exec myweb2 ls/root
도커 허브에 업로드 하기
docker push [dockerHub ID]/[이미지명:태그]
docker push abcd1234/apine-linux:1.0
번외
리눅스를 생성하고 리눅스 명령어 사용해보기.
exit 입력시 종료 후 원래대로 돌아온다.
docker run -it --name alpine-linux alpine:latest
오늘 수업 때는 명령어도 진짜 많이 사용해봤다.
이것저것 한꺼번에 섞어서 하다보니 겁나 헷갈린다. 블로그 쓰면서 정리하는데도 헷갈리네.
선행학습 된 게 없기 때문에(shell이나.. 리눅스 등) 대략적인 것만 알아두라고 하셨다.. 정말 그래도 되나요.