본문 바로가기
컴퓨터공학/도커

도커 명령어 모음

by 유리병 2023. 12. 13.

목차


     

     

    도커 명령어의 구조

    도커는 상위 4개 명령어가 있고, 그 아래 하위 커맨드들이 존재한다.

    상위 4개 명령어는 다음과 같다.

    • Image
    • Container
    • Network
    • Volume

     

     

    Image

    Image란? 

    이미지란 가상화 환경을 추상화 해서 만들어 놓은 것이다.

    객체지향 언어에서 class를 instance화 해서 객체를 만드는 것처럼 도커는 image를 instance화 해서 container를 만든다.

     

     

    docker search (이미지명) | 이미지 검색

    CLI 환경

    이렇게 나오긴 하지만 보기도 별로고 결과물도 많이 나오지 않는다.

    무엇보다 문서들이 나오지 않는다. 

     

    Docker Desktop 환경

    이렇게 이미지도 찾을 수 있고 클릭하면 해당 이미지에 대한 문서도 나온다.

    httpd는 아파치에서 도커 허브에 넣어놓은 공식 아파치 http web server의 이미지명이다.

     

    docker image pull (이미지명) | 이미지 다운로드

     

     

    docker image list/ls | 내가 다운받은 이미지 리스트 확인

    docker image list

    docker image ls 둘 모두 사용 가능하다

     

    docker image rm (이미지명) | 이미지 삭제

     

    이미지를 삭제하기 전에는 이미지를 구현한 컨테이너를 먼저 삭제 후 이미지를 삭제해야 한다.

    docker image rm -f (이미지명) | 이미지 강제 삭제

    위 명령으로 컨테이너가 남아있어도 이미지를 강제 삭제 할 수 있으나 깔끔하게 삭제되지 않는 것을 볼 수 있다.

    반드시 컨테이너를 삭제하고 이미지를 삭제하도록 하자

     

     

     

    Container

    docker container ps | 작동중인 컨테이너 리스트 보기

    docker container ps -a | 내 도커의 모든 컨테이너 리스트 보기

    현재 실행되고 있는 도커는 없지만 만들어진 컨테이너는 2개 있는 것을 확인할 수 있다.

     

    docker container create --name (1) -dit -p (2):(3) (4) -e (5)

    1. 생성할 컨테이너의 이름
    2. 내가 접속할 포트번호
    3. 오리지널 이미지에서 열어 놓은 포트번호
    4. 이미지명
    5. 환경변수
    • -d : --detache = 컨테인가 실행될 때 백그라운드에서 작동하도록 하는 명령어
    • -i : --interactive = 컨테이너를 STDIN을 사용해서 접근할 수 있도록 하는 명령어
    • -t : --tty = 컨테이너에 터미널을 통해 접근할 수 있도록 하는 명령어
    • -dit : 컨테이너를 실행하면 Background에서 동작하도록 하고, 터미널과 STDIN을 사용해 컨테이너에 접근할 수 있도록 하라.

    docker container create --name apache_docker -dit -p 8080:80 httpd

    아파치 컨테이너를 생성한 직후에는 아직 실행이 되지 않아 docker container ps 명령어의 결과가 나오지 않는다.

    docker container ps -a 명령어로 생성한 컨테이너를 보면 방금 만든 아파치 컨테이너가 존재함을 확인할 수 있다.

     

    후술하겠지만 생성된 컨테이너는 docker container start apache_docker 명령으로 실행할 수 있다.

    컨테이너가 실행되었으니 docker container ps에서 목록이 나타나는 것을 확인할 수 있다.

    접속할 포트를 사용해서 접속해보면 위와 같이 아파치 서버가 돌아가는 것을 확인할 수 있다. 

    docker container run --name (1) -dit -p (2):(3) (4) -e (5)

    (1) ~(5), 옵션은 Container Create와 동일하다.

     

    docker container run 명령은 아래 세 개의 명령을 합친 명령이다.

    • image pull - 이미지가 없으면 자동으로 이미지를 받아온다.
    • container create - 해당 이름의 컨테이너가 존재하지 않으면 자동으로 해당 컨테이너를 생성한다.
    • container start - 해당 이름의 컨테이너가 실행되지 않았으면 자동으로 해당 컨테이너를 실행한다.

     

    docker container run --name nginx_docker -d -p 80:80 nginx

    이미지를 다운, 컨테이너 생성, 컨테이너 실행까지 한번에 되서 localhost:80으로 바로 접속이 가능한 것을 확인할 수 있다.

     

    docker container start (컨테이너명) | 컨테이너 실행

    처음에 실행되고 있는 컨테이너가 존재하지 않았지만 start명령어로 nginx도커를 실행시킨 것을 확인할 수 있다.

    docker container stop (컨테이너명) | 컨테이너 종료

    stop명령어로 실행중인 도커 컨테이너를 종료하는 것을 확인할 수 있다.

    종료되도 여전히 컨테이너가 존재하기때문에 ps -a명령으로 확인할 수 있다.

    docker container rm (컨테이너명) | 컨테이너 삭제

    rm명령어로 도커를 삭제한 것을 볼 수 있다.

     

    도커를 삭제하기 전에 반드시 컨테이너 실행을 종료하도록 하자!

    docker exec -it (1) (2) | 터미널을 통해 컨테이너에 접근

    1. 컨테이너명
    2. 실행 명령문

    docker container run --name mysql_docker -dit -p 3307:3306 -e MYSQL_ROOT_PASSWORD=12345 mysql

    위 명령은 mysql 컨테이너에 환경변수로 mysql root의 비밀번호를 12345로 설정한 컨테이너를 만드는 명령어이다.

    -it 옵션을 줬기 때문에 터미널을 통해 mysql 내부로 접속이 가능하도록 만들었다.

    이때 mysql 내부도 접속하기 위한 명령어가 바로 docker -it (1) (2)이다.

    현재 3306포트가 사용중이기 때문에 3307포트로 바꿔서 사용하도록 하겠다.

     

    docker exec -it mysql_docker /bin/bash 명령으로 mysql container 내부로 접근한 후, 

    mysql -u root -p로 mysql을 실행한 것을 확인할 수 있다.

    우리가 컨테이너를 생성할 때 환경변수로 루트 비밀번호를 12345로 설정했기 때문에 위 비밀번호로 들어가면 루트 계정에 접속이 가능하다.

     

    루트 계정에 접속해 데이터베이스를 생성하고 해당 데이터베이스로 이동하는 등의 작업을 하는 것을 볼 수 있다.

     

     

    외부에서 이 데이터베이스에 접근해볼까?

    먼저 유저를 만들고 권한을 설정한다.

    유저명 @ '%' 으로 유저를 만들어 외부 ip에서도 DB에 접속 가능하도록 설정해주자.

     

    그리고 dbeaver에 들어가서 접속을 테스트하면 아래와 같이 접속되는 것을 확인할 수 있다.

    webdev 데이터베이스도 만들어진 것을 확인할 수 있다.

     

     

    docker container cp [1] [2] | 도커와 컴퓨터 사이의 파일 전송

    1. 복사할 파일의 경로
    2. 붙혀넣을 경로

    컴퓨터 -> 도커로의 파일 전송 테스트

    docker container run --name apache_docker -p 80:80 -dit httpd

    위와 같이 아파치 컨테이너를 하나 만든 후, 아파치에 접속하면 아파치의 기본 화면이 뜨는 것을 볼 수 있다.

     

    위와 같은  index.html파일을 만든 후, 

    docker container cp index.html apache_docker:/usr/local/apache2/htdocs

    위 커맨드로 index.html파일로 이동시키면 아래와 같이 컨테이너에 파일이 들어간 것을 확인할 수 있다.

    이제 다시 아파치 서버에 접속해보면 우리가 넣어준 페이지로 접속하는 것을 볼 수 있다.

     

     

    도커 -> 컴퓨터로의 파일 전송 테스트

    방금 도커로 전송한 index.html파일을 바탕화면으로 전송해보자.

    위와 같이 전송이 잘 되는 것을 확인할 수 있다!

     

     

    docker container logs -f (컨테이너명) | 도커 로그 확인하기

    위 커맨드로 한번 로그를 켜놓으면 로그가 뜰 때마다 갱신된다.

    리눅스의 tail명령어와 유사하게 동작한다.

     

    docker container rename (기존이름) (새이름) | 도커 이름 변경하기

    private repository를 만들 때 도커명을 ip주소로 바꿔줘야 하기 때문에 컨테이너 이름을 바꿀 일이 있을 것이다.

     

     

    컨테이너 생성의 환경변수에 대하여

    환경 변수는 이미지 제조사가 만들어서 넣어둔 것이다.

    위에서 mysql컨테이너를 만들 때 환경변수를 사용해 루트 비밀번호를 미리 설정한 것을 볼 수 있었다.

    제조사가 배포한 이미지 document에 환경변수들과 그 사용법이 다 적혀있으니 잘 참고하도록 하자!!

     

    이 환경변수들을 이용할 경우 mysql 컨테이너를 만들 때, root 비밀번호 설정, 데이터베이스 생성, 유저 생성, 유저 비밀번호 설정 등 많은 작업을 수행해둔 컨테이너를 생성할 수 있다.

    docker container create --name mysql_docker -it -p 3306:3306 -e MYSQL_ROOT_PASSWORD=12345 -e MYSQL_DATABASE=webdev -e MYSQL_USER=webmaster -e MYSQL_PASSWORD=12345 mysql

     

     

    Network

    docker network create (네트워크명) | 네트워크 생성

    docker network create myweb 명령어로 네트워크를 생성할 수 있다.

    docker network inspect (네트워크명) | 네트워크 정보 출력

    위와 같이 docker network ls로 생성된 네트워크들을 볼 수 있다.

    docker network inspect (네트워크명) | 네트워크 정보 출력

    docker network insepct myweb명령어로 해당 네트워크의 정보를 확인할 수 있다.

    ip, Gateway, submnet mask등의 정보가 출력되는 것을 볼 수 있다.

     

    --gateway (ip주소) : 네트워크 게이트웨이 설정 옵션

    생성할 네트워크의 ip주소를 설정할 수 있다.

    --subnet (subnet mask) : 네트워크 서브넷마스크 설정 옵션

    생성할 네트워크의 subnet mask를 설정할 수 있다.

     

    옵션을 이용해 네트워크를 만들어보자

    docker network create --gateway 172.19.0.1 --subnet 172.19.0.0/24 myweb

    위 옵션을 적용해서 생성한 network의 subnet과 gateway는 우리가 설정한 대로 만들어질 것이다. 

     

     

    docker network rm (네트워크명) | 네트워크 삭제

    docker network rm myweb으로 네트워크를 삭제하면 더이상 해당 네트워크가 보이지 않는 것을 볼 수 있다.

     

     

    docker network connect (네트워크명) (도커 명) | 네트워크에 컨테이너 삽입

    docker network connect myweb apache_docker

    docker network connect myweb mysql_docker

    위 명령어로 컨테이너들을 네트워크에 추가한 후, inspect으로 네트워크를 보면 아래와 같이 네트워크 안에 컨테이너들이 들어간 것을 확인할 수 있다.

     

    도커라이징을 통해 서비스를 배포할 때 이렇게 하나의 가상 네트워크를 만들고 그 안에 컨테이너들을 넣어서 배포한다.

    유동ip를 고정ip로 바꾸고 하는 작업들이 필요하지만 기본적인 원리는 위와 같다. 

     

    docker network disconnect (네트워크명) (도커명) | 네트워크에서 컨테이너 제거

    docker network disconnect myweb apache_docker

    docker network disconnect myweb mysql_docker

    위 명령어로 컨테이너를 네트워크에서 제거한 후, inspect으로 네트워크를 보면 컨테이너에서 네트워크가 제거된 것을 볼 수 있다.