Image
다운로드
docker pull [image명]:[tag명]
- dockerhub에 올라와 있는 이미지를 다운받는 명령어
- tag명: image의 버전을 구분하기 위해 설정한 값. 같은 이미지라도 버전에 따라 여러 태그가 있다. 태그 안붙이면 자동으로 최신 버전의 이미지가 다운로드 됨
조회
docker image ls
삭제
docker image rm (-f) [image명]
- -f : 특정 컨테이너에서 사용하고 있는 이미지일지라도 강제로 삭제해준다. (단 중지되어있는 컨테이너여야 함. 실행 중이면 삭제 안됨)
만약 같은 이름을 가진 이미지가 여러 개일 경우 image명:tag명 을 정확히 기입하거나 이름 대신 image id 값을 사용하는게 더 안전하다.
+) 사용되지 않는 이미지 전부 삭제
docker image rm $(docker images -q)
컨테이너
생성
docker create [image명]
- 이미지가 컴퓨터 내에 없을 경우, 도커허브에서 자동으로 다운 받아 생성함
더보기
하나의 컨테이너에 여러 이미지를 설치할 수 있는가?! ➡️ 불가능하다!
컨테이너와 이미지의 기본 개념은 아래와 같다.
- 이미지: 컨테이너를 실행하기 위한 템플릿. 애플리케이션과 그에 필요한 환경(라이브러리, 종속성, 설정 파일 등)이 포함되어 있음.
- 컨테이너: 이미지를 기반으로 실행된 인스턴스로, 격리된 환경에서 동작.
여러 컨테이너를 사용하는 것이 더 권장되는 이유
- 유지 보수 용이성: 각각의 컨테이너가 독립적이기 때문에, 업데이트나 수정이 더 쉽다.
- 격리 및 보안: 하나의 서비스가 문제가 생겨도 다른 서비스에 영향을 미치지 않는다.
- 확장성: 서비스 단위로 개별 확장이 가능.
- 마이크로서비스 아키텍처: 각 서비스가 분리되면 마이크로서비스 아키텍처를 구축하기에 유리.
여러 이미지를 사용할 때는 Docker Compose를 사용하여 여러 컨테이너를 조합해서 실행하는 것이 좋다.
만약 하나의 컨테이너에 여러 소프트웨어 설치하고 싶다면?
하나의 이미지에 필요한 소프트웨어를 모두 설치하고, 컨테이너가 실행될 때 여러 서비스를 실행하도록 설정하면 된다.
# 1. Dockerfile 작성
FROM ubuntu:latest
# Nginx 설치
RUN apt-get update && apt-get install -y nginx
# MySQL 설치
RUN apt-get install -y mysql-server
# Nginx와 MySQL을 동시에 실행하는 스크립트
CMD service mysql start && nginx -g "daemon off;"
# 2. 이미지 빌드
docker build -t my-nginx-mysql .
# 3. 컨테이너 실행
docker run -d -p 80:80 -p 3306:3306 my-nginx-mysql
조회
docker ps (-a)
- -a : 옵션을 주면 생성된 컨테이너를 모두 확인. status에서 실행 중인지 중단되었는지 확인할 수 있음
- 옵션을 안붙이면 실행 중인 컨테이너만 확인 가능
실행
docker start [container id]
- 생성된 컨테이너를 실행
docker run -d -p [host port]:[container port] [image 명]
- run : docker pull, create, start 다 합친 명령어
- -d: 백그라운드실행. 안넣으면 포그라운드에서 돌아감
- -p [호스트 포트]:[컨테이너 포트] : 호스트 컴퓨터와 컨테이너 포트 연결.
클라이언트 입장에서 바로 컨테이너에 접근할 수 없음. 반드시 호스트 컴퓨터를 거쳐야 하는데, 이때 1) 호스트 컴퓨터의 특정 포트와 컨테이너의 포트를 연결하면 2) 클라이언트가 호스트 컴퓨터로 접근하고 3) 컨테이너에 접근할 수 있게 됨.
중단
docker stop [container id]
- image명으로는 중단할 수 없음 (아마 여러 컨테이너가 같은 이미지를 사용할 수 있어서 image명만으로는 컨테이너를 식별할 수 없기 때문일 듯?)
- 컨테이너 NAMES로도 중단 가능함 (근데 걍 id 쓰자)
- 공백으로 띄우면 여러 컨테이너를 한꺼번에 중단할 수 있음
+) 강제 종료
docker kill [container id]
삭제
docker rm [container id]
- 단, 실행 중인 컨테이너는 삭제 안됨
- -f 옵션 주면 강제 중지 + 삭제 가능
+) 중지된 컨테이너 전부 삭제
docker rm $(docker ps -qa)
이게 정확히 들어가자면, 위 명령어는 두 부분으로 나뉜다. $() 부분은 국어의 안긴 문장, 안은 문장 그런거다.
docker rm $()
docker ps -qa
- docker rm $(): $() 안에 있는 아이디를 가진 컨테이너를 삭제
- docker ps -qa: 실행 상태에 상관 없이 모든 컨테이너 ID를 출력
- -q: 컨테이너 ID를 출력한다.
- -a: 모든 컨테이너 ID
그래서 rm의 목적어로 출력되는게 $(모든 컨테이너 ID)인데, rm 자체가 -f가 없으면 중지된 컨테이너만 삭제할 수 있기 때문에 결과적으로도 중지된 컨테이너만 삭제되는 것이다.
docker ps -qa
docker ps -q 만 하는 경우
그래서 -a가 없다면❓ 실행 중인 컨테이너 ID만 넘어감 -> rm으로 실행 중인 컨테이너는 삭제 못함 => 아무 일도 일어나지 않음.
로그 출력
docker logs [container id]
+) 마지막 10줄만 출력
docker logs --tail 10 [container id]
+) 실시간 출력
docker logs -f [container id]
+) 지금 시점부터 실시간으로 쌓이는 로그만 출력
docker logs --tail 0 -f [container id]