[Docker] 명령어 정리

Hoon·2022년 8월 17일
0

Docker

목록 보기
1/13
post-thumbnail

기본 컨테이너 명령어

컨테이너 생성

  • docker container run(생성/시작)
  • docker container create(생성만 됨)

컨테이너 삭제

  • docker container stop + docker container rm
  • docker container rm -f

생성된 컨테이너에 연결하기

  • docker container attach

생성된 컨테이너에 명령 전달하기(들어가지 않고)

  • docker container exec [컨테이너 이름] 필요한 명령

이미지 pull

  • docker pull httpd: 도커허브에서 제공되는 공식이미지 중 최신 이미지를 pull -> local
  • docker pull centos7: 도커허브 공식 centos 이미지 중 7 버전 -> local

이미지 리스트

  • docker image ls

컨테이너 리스트

  • docker container ls --all

컨테이너 리스트 id만 뽑기

  • docker container ls --all -q

모든 컨테이너 리스트 삭제

  • docker container rm -f $(docker container ls --all -q)

이미지 정보

  • docker image inspect 'imageID'(b692a91e4e15)

해당 이미지를 이용하여 컨테이터로 배포하면 처음 시작되는 명령:cmd

cmd와 비슷하게 처음 컨테이너가 시작되면 동작시키는 명령어: Entrypoint

도커의 이미지는 처음 만든 이미지를 기준으로 추가되는 내용을 레이어 형태로 얹게된다: Layers

  • 최초 이미지를 base로 하여 추가되는 내용만 sha 형태로 저장된다.

이미지를 만드는 방법

  1. 동작중인 컨테이너를 commit 하여 이미지로 만든다
  2. Dockerfile을 이용하여 베이스이미지 지정, 추가 패키지 선택, 컨테이너로 동작시 실행할 명령어등을 지정한 뒤 이를 build 하면 로컬 저장소에 이미지가 생성된다.

docker container run 옵션들

  • -i: 대화식 모드 열기
  • -t: 단말 디바이스 제공(마치 ssh로 연결하는 것) 일반적으로 it 옵션은 함께 사용하는 경우가 많다
  • -it는 붙여서 많이쓰는데 -it 뒤에 /bin/bash 또는 /bin/sh를 적어주면 컨테이너 실행시 쉘을 동작시켜 컨테이너에 들어갔을 때 쉘이 뜨게 해준다.
  • -d: 컨테이너를 백그라운드에서 동작시킨다. 데이터베이스나 웹서버와 같이 생성된 컨테이너로 관리자가 즉시 진입할 필요가 없는 경우에 많이 사용한다.
  • --name: 컨테이너에 이름 부여. 생성된 컨테이너는 기본적으로 id를 부여받고 이 중 12자리를 이용하여 관리할 수 있다. --name으로 이름을 부여할 수 있고 rename을 이용하여 나중에 변경할 수 있다. 단, 동시에 다수의 컨테이너(동일한 기능을 수행하는)를 생성하는 경우에는 이름을 지정하는 것이 불필요하다. 이름을 부여하지 않으면 자동으로 임의의 이름을 부여하게 된다.
  • --hostname: 컨테이너 내에서 사용하는 컨테이너의 호스트 이름. 지정하지 않으면 자동으로 id 값이 호스트 이름이다.
  • --rm: 삭제
  • --env(-e): 컨테이너 내에서 사용할 시스템 환경 변수를 지정할 수 있다.
    ex) -e MYSQL_DATABASE=testdb
  • -v: 호스트 경로와 컨테이너 경로의 공유 볼륨 설정.
    /home/rapa:/home/root <- host:container
    /home/rapa:/home/root:ro <- host:container, read-only
    볼륨마운트
    1. 호스트의 특정 디렉토리와 컨테이너의 특정 디렉토리를 마운트 할 때
    2. 별도의 볼륨을 만들어서 연결하는 방식으로도 사용된다(iSCSI, ceph)
  • -h: 컨테이너의 호스트명 지정
  • -p [Host 포트]:[Container port]: 호스트의 특정 포트와 컨테이너의 특정 포트를 매핑할 때 사용
  • -P: 컨테이너에서 노출한 특정 포트를 호스트의 임의의 포트와 자동 매핑해준다.
  • --link=[container:container_id]: 두 개 이상의 컨테이너를 연결하는 방법. 동일 호스트의 다른 컨테이너와 연결 설정으로 IP가 아닌 컨테이너의 이름을 이용해 통신. * 도커는 자체 DNS 서비스가 제공된다. 컨테이너간에는 private IP로 통신하는데 컨테이너를 재시작할 때 IP가 바뀔 수 있다. link를 해주면 이 문제를 해결할 수 있다.
    docker container run -d --name wpdb1 -e MYSQL_ROOT_PASSWORD=test123 -e MYSQL_DATABASE=wordpress -v wpdb1:/var/lib/mysql mysql:5.7
    docker container run -d --name wp1 -e WORDPRESS_DB_PASSWORD=test123 -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_NAME=wordpress -p 8001:80 --link wpdb1:db1 wordpress
    docker container exec wp1 cat /etc/hosts
    ...
    172.17.0.4	db1 f623c24c6adc wpdb1  <--- link 된 컨테이너의 ID, 이름, alias 명 을 IP 주소와 함께 등록
    172.17.0.2	1528100563f1 <-- 자신의 ID 와 IP 주소를 등록
  • --restart: 처음 생성시, 호스트 재부팅시 컨테이너를 어떻게 실행할 것인가? 웹서버나 DB와 같이 상시적으로 동작해야하는 컨테이너의 경우에는 초기 생성시 --restart=always로 하여 실행에 문제가 있더라도 계속해서 실행을 시도하도록 설정해주는 것이 좋다.

Dockerfile 명령어

  • RUN : 설정된 기본 이미지에 패키지 설치, 업데이트 등의 명령을 실행하고자 하는 경우 작성한다.
    • [shell 형식]
      RUN apt -y install nginx
      RUN yum -y install httpd
    • [exec 형식]
      RUN ["echo", "이것은 테스트입니다"]
  • CMD : 컨테이너로 배포될 때 실행할 명령어를
	가령 web 서버 컨테이너를 실행시키고 싶다면 RUN 으로 베이스이미지에 웹서버를 설치하고 컨테이너가 실행될 때 웹서버 데몬이 동작해야 하므로 CMD 를 이용하여 데몬실행명령을 전달한다. 
	CMD ngingx -g 'daemon off;'
    CMD ["nginx", "-g", "daemon off;"]
  • ENTRYPOINT : 컨테이너로 배포될 때 사용하는 명령어
	ENTRYPOINT nginx -g "daemon off;"
  • CMD와 ENTRYPOINT : 둘 다 Dockerfile 내에서 1번만 사용하라. 여러번 사용하면 마지막 라인만 처리된다.
    CMD, ENTRYPOINT에서 실행하는 명령어가 docker container run 에서 실행하는 옵션과 동일한 경우 ENTRYPOINT는 모두 처리한다. 하지만 CMD 는 동일 옵션이 있는 경우 docker container run 에 있는 옵션만을 처리한다. ENTRYPOINT는 고정적으로 실행할 명령을 작성하고 CMD는 변경될 가능성이 있는 매개변수, 옵션등에 대하여 지정할 때 주로 사용한다.
예)
  FROM ubuntu
  ENTRYPOINT ["top"]
  CMD ["-d", "10"]

  docker container run -it test:1.0
  docker container run -it test:1.0 -d 2 <- 이렇게하면 위의 CMD는 무시 된다.
  
  추가적으로 만약 컨테이너로 배포될 때 실행해야할 명령어가 ENTRYPOINT나 CMD 두 개로 부족할 경우에는 shell file을 만들고 CMD나 ENTRYPOINT를 이용하여 해당 쉘을 실행하도록 설정한다.
  
  ADD a.sh /root/a.sh 
  CMD ["/bin/bash", "/root/a.sh"]
  • CMD와 ENTRYPOINT 공통점 : 둘 다 Dockerfile 내에서 1번만 사용하라. 여러번 사용하면 마지막 라인만 처리된다.

  • COPY: 호스트환경의 파일, 디렉토리를 이미지 안에 복사하는 경우 작성한다. 단순한 복사 작업만 지원한다. 빌드 작업 디렉토리 외부의 파일은 copy 할 수 없다.

  • ADD: COPY를 포함. URL에 있는 파일을 붙여넣기 하는 것도 가능하다. 또한 패키지, 압축파일의 경우에는 이를 해제하여 내용물만 붙여넣기 할 수 있다. 단, URL 상의 tar 파일등은 해제되지 않은 상태에서 붙여넣기 된다.

예)
  photo, index.html을 압축한 test.tar

  COPY test.tar /var/www/html
  -> /var/www/html/test.tar 생성
  ADD test.tar /var/www/html
  -> /var/www/html/photho 생성
  -> /var/www/html/index.html 생성
  • VOLUME: 이미지에 볼륨을 할당하고자 할 때 사용한다.
  VOLUME /var/log # 컨테이너의 /var/log를 호스트에 있는 볼륨과 연결해 준다.
  VOLUME ["/var/log"]
  
  
  VOLUME testvol1:/var/log
  위와 같이 하면 ctn1, ctn2 , ... 등 모두 testvol1과 연결 된다. 그래서 특정 볼륨을 지정하지 않는편이다.
  컨테이너의 여러 디렉토리를 볼륨과 연결하고 싶다면?
  VOULME /var/log /var/www/html /var/lib/mysql
  • EXPOSE: 호스트 네트워크를 통해 들어오는 트래픽을 리스닝하는 포트와 프로토콜을 지정한다.
  • ONBUILD: 처음 이미지 빌드에 포함하지만 실행되지 않고, 해당 이미지가 다른 이미지의 기본 이미지로 사용되는 경우 실행될 명령을 지정할 때 작성한다.
    예시: "우리는 웹 개발 팀장이다" 팀원들중에 /blog를 만드는 팀에게 아래와 같이 지시했다. 제가 index.html 파일을 만들테니까 blog 팀은 개발된 파일, 디렉토리를 blog.tar로 만들어서 빌드하세요!
    처음 만드는 이미지: test:1.0
    blog 팀은 이미지를 만들 때 FROM test:1.0을 해야한다.
  • WORKDIR: 컨테이너 내에서 작업할 경로 설정
  WORKDIR /var/www
  ~ <- /var/www에서 실행
  WORKDIR /root
  ~ <- /root에서 실행
  • USER: 작업 사용자 지정하기
  • ARG: 컨테이너가 아니라 이미지에서 사용하는 변수 지정

Docker build (이미지 build)

Docker build [옵션]

  • -t(tag): 이미지명:태그 를 지정하는 경우.
    docker build -t myweb:1.0 이미지 생성
  • -f(file): Dockerfile이 아닌 다른 파일명으로 Dockerfile을 만들었을 때 지정하는 옵션.

이렇게 생성한 이미지를 도커 허브에 올리고 싶다면?

docker tag myweb:1.0 gildong/myweb:1.0`
docker push gildong/myweb:1.0 # 사전에 docker login 필요함. 정상로그인 되면 로그인정보(api 주소 + auth 정보)가 홈 디렉토리 > .docker > config.json 파일에 작성된다.

일반적으로는 두 개 이상의 이미지를 생성하고자 한다면 별도의 디렉토리를 만들고 각 디렉토리에서 별도의 Dockerfile을 생성하는 형식으로 이미지를 만들게 된다.

0개의 댓글