도커의 간단한 사용 예제
실습 환경은 rockylinux8 에서 진행했다.
docker 설치 & 레지스트리 설정
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo [https://download.docker.com/linux/centos/docker-ce.repo](https://download.docker.com/linux/centos/docker-ce.repo)
설치 과정 중 터미널에 GPG key 가 나오는데 docker의 공식 홈페이지와 비교하여 안정성을 확인한다.
GPG key : 060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35
도커 데몬을 재시작하고, 리눅스와 함께 시작하도록 systemd의 유닛에 등록한다.systemctl start docker
systemctl --now enable docker
docker -v
도커의 버전 확인docker run hello-world hello world
이미지를 실행해보자
hello-world 이미지가 없기 때문에 도커 레지스트리에서 이미지를 pull 받는 과정을 출력해준다.
//파일을 생성하는 과정을 출력해준다.
1. Docker 클라이언트가 Docker 데몬에 접속했습니다.
2. 도커 데몬이 도커 허브에서 "hello-world" 이미지를 가져옵니다. (amd64)
3. Docker 데몬은 해당 이미지에서 현재 읽고 있는 출력을 생성하는 실행 파일을 실행하는 새 컨테이너를 생성했습니다.
4. Docker 데몬은 해당 출력을 Docker 클라이언트로 스트리밍하여 터미널로 보냈습니다.
보다 야심 찬 것을 시도하려면 다음을 사용하여 Ubuntu 컨테이너를 실행할 수 있습니다 :
$ docker run -it ubuntu bash //운영체제를 컨테이너화 시킨 후 해당 os 에 접속
docker의 이미지는 registry라고 하는 저장소에 모여있다.
별도의 레지스트리를 지정하지 않으면 도커 허브에서 이미지를 찾아온다.
도커 설치하기
docker ps
실행 중 컨테이너 보기docker ps -a
중지된 컨테이너까지 모두 보기
docker search nginx
이미지 검색 명령어
-> docker hub와 같은 정보를 가리킨다.
docker pull nginx
이미지의 버전을 명시하지 않으면 docker hub의 최상단에 있는것을 가져온다.
- 이미지는 여러개의 레이어로 구성되어 있어 레이어마다 pull complete메시지가 발생한다.
- nginx : latest
별도의 : (태그) 을 붙이지 않으면 기본으로 latest 태그가 적용된다.
최신버전, mainline → 패치 곧장 적용 버그 패치, 기능 패치, 업데이트
Its, stable → 메이저 업데이트, 보안 패치 - Digest : 이미지의 고유 식별자, 이미지에 포함된 내용과 이미지의 생성환경을 식별할 수 있다.
- Status : 이미지를 내려받은 레지스트리, 이미지, 태그 등의 상태정보를 확인할 수 있다.
이미지가 레이어로 구성되어 같은 내용의 경우 여러 이미지에 동일한 레이어를 공유하므로 전체 용량이 감소한다. 이미지 업데이트시 변경 내용이 있는 경우 변경된 부분만 추가 하여 레이어로 구성한다.
docker history nginx:stable
docker hostiry nginx:latest
→ 도커 컨테이너 이미지 자체를 만드는 명령을 보여준다.
이처럼 도커로 작성된 컨테이너는 레이어를 재사용하기 때문에 여러 이미지를 내려받더라도 디스크 용량을 효율적으로 사용할 수 있다.
docker images
다운받은 이미지 조회docker images nginx
다운받은 이미지 필터링 해서 조회
컨테이너 실행하기
docker run -d -p 8080:80 --name hello-nginx --restart always nginx:latest
//-d(--detach) : 컨테이너를 백그라운드에서 구동한다는 의미
//-p(--publish) : 외부에서 호스트로 보낸 요청을 컨테이너 내부로 전달하는 옵션
//--restart always : 컨테이너의 재시작과 관련된 정책 옵션
//-p 8080:80 : 컨테이너 외부의 8080포트와 내부의 80포트를 매칭하여 실행시킨다.
run 명령어와 함께 사용할 수 있는 옵션에는 다음과 같이 있다.
이렇게 실행하고 난 후 컨테이너를 식별할 수 있는 고유한 ID를 출력한다.
컨테이너 ID는 docker ps
로 확인할 수 있다.
--name 옵션으로 이름을 설정하지 않으면 문자열을 임의로 생성하여 부여한다.
💡 note
컨테이너는 변경 불가능한 인프라(immutable infrastructure)를 지향한다.
초기에 인프라를 구성한 후 임의로 디렉터리 연결이나 포트 노출과 같은 설정을 변경할 수 없다.
이러한 특성 덕분에 컨테이너로 배포된 인프라는 배포된 상태를 유지한다.
docker ps
docker ps
docker ps -f id=e5 //id의 일부로 필터링하여 검색할 수 있다.
docker ps -a //중지된 컨테이너까지 조회
컨테이너 정지 및 삭제하기docker stop a15 e52
컨테이너 실행 중지docker container prune
중지된 컨테이너 모두 삭제, 이미지 삭제가 아님docker image prune -a
모든 도커 이미지 삭제 (연관된 컨테이너가 없는 경우 삭제)
이미지를 사용하고 있는 컨테이너가 있는 경우
WARNING! This will remove all images without at least one container associated to them.
이라는 메시지가 뜬다.
→ docker prune
을 이용하여 컨테이너를 지우고 이미지를 지워야 한다.
사용하지 않는 컨테이너 정리하기
컨테이너나 이미지를 삭제하기 전에 먼저 컨테이너를 정지해야한다.
컨테이너 정지하기
docker ps -q -f ancestor=nginx
//-f : 컨테이너를 필터링
//-q(--quiet) : 해당되는 컨테이너의 ID만 설정한다.
//ancestor는 컨테이너를 생성하는데 사용한 이미지를 기준으로 필터링한다.
docker stop $(docker ps -q -f ancestor=nginx)
$() 내부의 명령을 변수삼아 실행하면 해당하는 모든 컨테이너를 정지된다.docker stop $(docker ps -a -q)
모든 컨테이너를 정지시킨다.
컨테이너 삭제하기docker container prune
정지되어있는 모든 컨테이너를 완전 삭제한다.docker rm $(docker ps -aq -f ancestor=nginx)
기존에 정지된 모든 컨테이너를 nginx로 필터링하여 삭제한다.
컨테이너 이미지 삭제하기
컨테이너의 기반 이미지를 삭제한다. → 이미지 삭제 시에도 stop, rm 까지 해주어야 함
이미지를 사용하는 컨테이너가 있을 때 이미지를 지울 수 없다.
참고로 이미지는 컨테이너가 정지 상태가 아닌 삭제 상태일 때 삭제할 수 있다.docker rmi $(docker images -q nginx)
nginx:stable, nginx:latest를 모두 삭제함docker iamge prune -a
모든 이미지 삭제
모두 삭제되었는지 다음의 명령어로 확인해볼 수 있다.
docker images
docker ps -a
docker volume ls
참고자료
[도서]컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커
https://www.oracle.com/kr/cloud/cloud-native/container-registry/what-is-docker/
'DevOps' 카테고리의 다른 글
Raid의 정의와 구축 실습 (0) | 2023.06.28 |
---|---|
[kubernetes] 파드, 컨테이너, 도커, 쿠버네티스의 관계 (0) | 2023.06.24 |
[kubernetes] 컨테이너 인프라 환경이란? (0) | 2023.05.25 |
[docker] 바인드마운드 vs 볼륨 (0) | 2023.05.24 |
[docker] docker 란? (0) | 2023.05.19 |