Docker cheatsheet

Docker cheatsheet

도커관련 관련 후딱 참조. 한꼭지가 길어지면 별도 글이 될 수 있다.

특징

고립된 프로세스. 가상머신과 달리 베이스 머신과 커널은 공유한다.

Docker

docker search nginx # 이미지 검색. default registry : 도커허브(https://hub.docker.com)
docker pull nginx # 이미지 땡기기. default tag=latest
docker pull nginx:stable # 태그이름까지 넣어서 이미지 땡기기.
docker push 192.168.1.10:8443/multistage-img #[레지스트리주소/태그]로 로컬의 이미지를 푸쉬
docker history nginx:stable # 이미지가 만들어지는 히스토리 보여줌. expose port, copy 등등...
docker run -d -p 8080:80 --name nginx-exposed --restart always nginx
# -d(--detach) : detach. 백그라운드 실행
# -p(--publish) : [host]:[container]. 호스트의 8080포트를 컨테이너의 80포트로 연결.
# --name:컨테이너 이름은 nginx-exposed
# --restart always : 오류가 발생될 경우 언제나 재시작
docker run -d -p 8081:80 -v /root/html:/usr/share/nginx/html --restart always --name nginx-bind-mounts nginx
# -v(--volume) : [host-path]:[container-path]. 호스트 디렉토리를 컨테이너 경로에 붙임
docker run -d -v nginx-volume:/usr/share/nginx/html -p 8082:80 --restart always --name nginx-volume nginx
# -v : [volume-name]:[container-path]. 볼륨을 컨테이너 경로에 붙임
docker ps # 시스템의 컨테이너 상태 확인. 리눅스 ps와 비슷
docker ps -f id=asdf # asdf로 시작하는 컨테이너 검색. 주요 필터는 다음과 같다.
# 이미지가 아니고 컨테이너 기준으로 필터링함!
# ancestor : 사용하는 이미지
# id : 컨테이너 아이디
# name : 컨테이너 이름
# label : 컨테이너 레이블
# status : 컨테이너 작동 상태
# exited : 종료됐을 때 반환 값
docker ps -f ancestor nginx # nginx라는 이미지를 사용하는 컨테이너 조회
docker ps -q -f ancestor nginx # nginx라는 이미지를 사용하는 컨테이너의 아이디(-q)만 조회
docker ps -a -f ancestor nginx # -a옵션을 줘서 현재 수행 중인 컨테이너말고 전체 컨테이너 조회
docker exec 7da ls /usr/share/nginx/html # 컨테이너 내 명령(ls /usr/share/nginx/html) 실행.
docker exec -it nginx-container-name /bin/bash # nginx-container-name을 가진 bash 실행.
docker exec -it nginx-container-name /bin/sh # alphine이미지에는 bash가 없다. sh를 쓰자 ㅋㅋㅋ
docker volume create nginx-volume # 도커 볼륨 생성
docker volume inspect nginx-volume # 개별 볼륨 확인
docker volume ls # 볼륨 목록
docker stop [container name] # name 컨테이너 중지
docker stop [container id] # 컨테이너 아이디로 정지. 전체 아이디 말고 앞의 몇글자만 입력 가능
docker stop $(docker ps -q -f ancestor=nginx) # 이미지 이름이 nginx인 컨테이너의 아이디(-q)만 땡긴 후 정지
docker stop $(docker ps -a -q) # 실행 중인 컨테이너 전체 종료
docker images nginx # nginx라는 이름을 가진 이미지 검색. 와일드카드 잘 먹음
docker rm $(docker ps -q -f ancestor=nginx)
# 이름이 nginx인 이미지를 사용하는 컨테이너의 아이디를 이용하여 컨테이너 삭제
docker rm -f $(docker ps -q -f ancestor=nginx)
# -f를 이용하여 실행 중인 컨테이너도 강제 삭제
docker rmi $(docker images -q nginx) # nginx 이미지의 아이디를 찾아서 삭제
docker build -t [tagname] . # 현재 폴더의Dockerfile을 이용하여 태그 이름을 달아 이미지 빌드.
docker build -t [-t]* . # 복수개의 태그를 달아 이미지 여러개 한번에 생성 가능

Dockerfile

FROM oepnjdk:8 # 기본 이미지
LABEL description="Echo IP Java Application" # 이미지 설명
EXPOSE 60431 # 컨테이너에서 사용하는 포트. 컨테이너가 돌아가는 워커에서 60431포트로 요청이 들어오면 해당 호스트로 던진다. 실제 실행할 때 -p 60431:80과 같이 [워커포트]:[컨테이너 내부 포트]를 연결해줘야 트래픽이 컨테이너 내부로 들어간다. 안 잡아두면 어떻게 되지? 60431을 컨테이너로 던지지만 그냥 흘러나가나?
COPY [host-path] [iamge-path] # 호스트 경로의 파일을 이미지 경로로 복사
WORKDIR /opt # 현재 경로를 /opt로 이동
ENTRYPOINT ["java", "-jar", "app-in-image.jar"] # 컨테이너 구동시 java -jar app-in-image.jar 실행. 스프링붓이므로 자르 바로 실행

컨테이너 빌드 기본 프로세스

  • 소스로 바이너리 생성
  • Dockerfile로 작성
  • 도커이미지 빌드
  • 빌드 완료

멀티 스테이지 빌드

바이너리 빌드와 이미지 빌드를 쪼갬. 빌드용 바이너리를 만들어서 빌드하고, 거기서 바이너리를 배포할 컨테이너에 넣음

용어정리

용어정리

문제들

설치 중 에러 - podman 충돌

rocky(or centos or RHEL) 8 이상 버전에서 기본 적으로 podman이랑 buildah 패키지가 설치가 되는데 container.d 설치시 패키지 충돌로 에러가 뜨는 경우가 있다. docker를 쓸거면 podman을 삭제하고 설치하자.

https://lifegoesonme.tistory.com/481

참조

참조