Docker - 설치, pull, run, 기본 명령어

8381 단어 rundockerpulldocker

본 게시물은 스스로의 공부를 위한 글입니다.
틀린 내용이 있을 수 있습니다.

📒 Docker 설치

  1. Linux
curl -s https://get.docker.com/ | sudo sh //리눅스 배포판에 따라 자동으로 최신버전 도커 설치
sudo usermod -aG docker ubuntu //ubuntu 유저 권한 추가
  1. Windows, MacOs
  • 도커는 기본적으로 리눅스 프로그램이다.
  • 그럼 윈도우나 맥이면 도커를 사용할 수 없는 걸까?
    • 아니! 리눅스os를 가상머신에 깔고 도커를 설치하면 된다.
    • 근데.. 너무 귀찮지 않아?
      • 아니! 도커가 알아서 리눅스 os까지 다 설치해주거든~
  • 도커 사이트에서 설치 가능하다.
  • 설치확인 : Docker Desktop 실행 후 docker version


📒 Docker 용어

우리가 스마트폰에서 app store에서 program을 다운로드 후 process를 실행하는 것처럼, 도커는 docker hub에서 image을 다운로드 받아 container로 실행한다.

이때 docker hub에서 image를 다운로드 하는것을 pull이라 하고, imagecontatiner로 실행하는 것을 run이라 한다.

  • app store = docker hub -> pull을 통해 image 다운
  • program = image -> run을 통해 container 실행
  • process = container

📌 run 명령어

  • run 명령어를 사용하면 사용할 이미지가 저장되어 있는지 확인하고 없다면 다운로드(pull) 한 후 컨테이너를 생성(create)하고 시작(start)한다.

    • 따라서 별도로 pull할 필요 없이, 바로 run 명령어로 시작하면 된다.

  • 도커 컨테이너 실행

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
  • run 옵션
    • -d: detached mode (백그라운드 모드)
    • -p [hostPort]:[ContainerPort] : 호스트와 컨테이너의 포트를 연결
    • -v: 호스트와 컨테이너의 디렉토리를 연결
    • -e 컨테이너 내에서 사용할 환경변수 설정
    • --name 컨테이너 이름 설정
    • --rm 프로세스 종료시 컨테이너 자동 제거
    • -it -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션
    • --network 네트워크 연결

예제를 통해 설치와 실행 방법에 대해 알아보자

🎈 예제0 - 아파치 웹 서버 이미지 다운, 실행, 삭제

  1. 도커허브에서 httpd 검색 (아파치는 httpd이다.)
    • 사이트 오른편에 docker pull httpd을 볼 수 있다.
  2. 터미널에 docker pull httpd 입력 -> 이미지가 다운로드 된다.
    • 사실 바로 run 명령어를 입력해도 저장된 이미지가 없으면 자동으로 pull해준다.
  3. docker images를 통해 현재 도커에 설치되어 있는 이미지들 확인
    • TAG = 이미지 버전, IMAGE ID = 이미지 식별자
  4. docker run httpd를 통해 container로 실행
    • docker run --name [컨테이너이름] httpd를 통해 컨테이너에 이름 붙여주기 가능
  5. docker ps를 통해 현재 실행중인 container 확인
    • 이때 컨테이너의 CONTAINER ID 또는 NAMES를 확인해두자
  6. docker stop [CONTAINER ID] 또는 docker stop [NAMES]를 통해 실행 중인 컨테이너 중지
    • 도커에서 컨테이너 중지와 컨테이너 삭제는 다르다.
    • docker ps -a를 통해 중지된 컨테이너도 모두 확인 가능하다.
    • 정지된 컨테이너를 다시 실행시키고 싶으면 docker start [NAMES]를 통해 가능
      • 로그를 실시간으로 확인하고 싶다면 docker logs -f [names]
  7. 컨테이너를 삭제하고 싶다면 docker rm [names] 입력
    • 도커는 기본적으로 실행중인 컨테이너는 지우지 못한다.
    • docker stop을 통해 중지시킨 후 삭제해야 한다.
    • 강제로 삭제하고 싶다면 docker rm --force [names]를 통해 가능
  8. 이미지까지 지우고 싶다면 docker rmi [REPOSITORY]를 통해 가능

🎈 예제1 - 도커 컨테이너에 우분투 설치와 실행

  • docker run ubuntu:20.04
    • 설치는 정상적으로 되나, 따로 명령어를 지정하지 않았으므로 바로 컨테이너 종료
docker run --rm -it ubuntu:20.04 /bin/sh   //우분투 설치 및 bash 실행
docker run --rm -it centos:8 /bin/sh       //centOs 설치 및 셸 실행
  • 컨테이너 내부에 들어가기 위해 sh를 실행하고, 키보드 입력을 위해 -it옵션을 줬다.

  • --rm 옵션이 없다면 컨테이너가 종료되더라도 삭제되지 않고 남아 있어 수동으로 삭제해야 한다.

  • exit를 하면 종료된다.


🎈 예제2 - hashicorp/http-echo

docker run --rm -p 5678:5678 hashicorp/http-echo -text="hello world"

  • -text 뒤 문자열을 그대로 출력해줌
  • -p 5678:5678 ~ 내 pc의 5678포트가 컨테이너의 5678포트로 연결
  • 브라우저에 localhost:5678에 접속하면 메시지를 볼 수 있다.

🎈 예제3 - MySQL

docker run -d -p 3306:3306 \
  -e MYSQL_ALLOW_EMPTY_PASSWORD=true \
  --name mysql \
  mysql:5.7
  • -d : 백그라운드로 실행을 해서 로그가 안보임
  • -e MYSQL_ALLOW_EMPTY_PASSWORD=true : 비밀번호 입력을 안하겠다.
  • --name mysql : 이름 설정
  • MySQL 실행
    • exec: 현재 구동 중인 컨테이너에 접속(백그라운드 실행 컨테이너 내부 접속)
docker exec -it mysql mysql
  • 이처럼 도커는 다양한 데이터베이스를 손쉽게 생성/삭제할 수 있기 때문에 개발할때도 많이 사용한다.


📒 도커 기본 명령어

📌 컨테이너

  • docker ps : 현재 실행중인 컨테이너 확인
    • docker ps -a : 중지된 컨테이너도 확인하려면 -a옵션
  • docker stop [options] container [container...]
    • 실행중인 컨테이너를 중지(하나 또는 여러개(띄어쓰기) 중지 가능). 여기서 컨테이너는 컨테이너id 또는 --name으로 지정된 이름을 입력한다.
  • docker rm [options] container [container..] 종료된 컨테이너를 완전히 제거
  • docker logs [options] container [container] 컨테이너가 정상적으로 동작하는지 확인하는 좋은 방법은 로그를 확인하는 것이다.
    • 옵션: -f 계속 대기하면서 새로 생기는 로그들도 보여준다.
  • Ctrl + P, Q 컨테이너 정지하지 않고 빠져나오기
  • docker rename [변경전컨테이너이름] [변경후컨테이너이름] 컨테이너 이름 변경

📌 이미지

  • docker images [options] [repository[:tag]] 도커가 다운로드한 이미지 목록을 보여줌

  • docker pull [options] name[:tag|@digest] 이미지를 다운로드

    • 하지만 docker run ~했을 때, 이미지 파일이 없다면 자동으로 pull한다.
  • docker rmi [options] image [image...] 이미지id를 입력하면 이미지삭제가 된다. 단, 컨테이너가 실행중인 이미지는 삭제되지 않는다.


📌 네트워크

  • docker network create [options] networkName 도커 컨테이너끼리 이름으로 통신할 수 있는 가상 네트워크를 만든다.

  • docker network connect [options] networkName container 기존에 생성된 컨테이너에 네트워크를 추가한다.

  • 예제 - mysql과 wordpress를 한 네트워크에 묶기

docker network create app-network //네트워크를 만들고
docker network connect app-network mysql //--name mysql로 만든 컨테이너를 네트워크에 속하게하기
 //워드프레스를 네트워크에 속하게 하고 mysql을 이름으로 접근한다.
docker run -d -p 8080:80 \
 --network=app-network \
 -e WORDPRESS_DB_HOST=mysql \
 -e WORDPRESS_DB_NAME=wp \
 -e WORDPRESS_DB_USER=wp \
 -e WORDPRESS_DB_PASSWORD=wp \ 
 wordpress

📌 Volume

  • -v 호스트경로:컨테이너내부경로 호스트와 컨테이너 디렉터리를 연결해준다.

  • 즉, 앱 데이터를 유지할 수 있는 옵션

  • 컨테이너를 rm으로 지우면 데이터도 함께 삭제된다.

  • 하지만 run할때 -v옵션을 주면 삭제 후 다시 설치해도 그 폴더로 다시 연결되기 때문에 데이터를 복구할 수 있다.

  • 도커툴박스는 가상머신을 이용하기 때문에 로컬경로에는 보이지 않는다. 경로를 만든 경우 가상머신에 생성이 된다.

  docker run -d -p 3306:3306 \
    -e MYSQL_ALLOW_EMPTY_PASSWORD=true \
    --network=app-network \
    --name mysql \
    -v /my/own/datadir:/var/lib/mysql \
    mysql:5.7

Reference

생활코딩-도커
인프런 초보를 위한 도커 안내서(subicura)

좋은 웹페이지 즐겨찾기