풀스택 개발 들여다보기

[Docker] 자주 사용하는 도커 명령어들

영바이트 2022. 2. 20. 19:23

이전 포스팅에서 기본적인 도커 컨테이너 사용 방법과 이미지 관리 방법들을 살펴보았다. 기본적인 명령 외에 자주 사용하는 도커 명령어들을 살펴보자.

 

1. 도커 컨테이너 로그 확인하기

logs 명령어를 사용하면 컨테이너 안에서 생성되는 로그들을 호스트에서 확인할 수 있다.

$> docker logs -f 'container id'

-f 옵션은 follow의 의미로서 새로 생성되는 로그들을 계속해서 확인할 수 있도록 해준다.

 

 

2. 도커 컨테이너 네트워크 만들기

도커 컨테이너끼리 통신할 수 있는 네트워크를 간단하게 구성할 수 있다.

 

2.1 네트워크 생성

$> docker network create '네트워크 이름'

예) app-network 라는 이름의 네트워크 생성

$> docker network create app-network

 

2.2. 이미지 실행 시 네트워크 지정

--network 옵션을 사용해서 컨테이너를 네트워크에 연결할 수 있다.

$> docker run --name='컨테이너 이름' --network='네트워크 이름' '이미지 이름':'태그' [명령어]

예) 이미지를 활성화하면서 app-network라는 이름의 네트워크에 연결

$> docker run --name=ubuntu -it --network=app-network ubuntu:18.04 /bin/sh

 

이미지를 활성화할 때 이름을 지정해(--name=ubuntu) 주는 이유는 IP를 모르더라도 컨테이너 이름으로 해당 컨테이너에 접근 가능하기 때문이다. 예를 들면 app-network에 연결되어 있는 또 다른 컨테이너에서 ubuntu 컨테이너로 아래와 같이 ping 명령을 실행할 수 있다.

$> ping ubuntu

 

2.3. 만들어 놓은 컨테이너에 네트워크 연결

newtwork connect 명령을 이용하면 이미 실행 중인 컨테이너를 특정 네트워크에 연결할 수 있다.

$> docker network connect '네트워크 이름' '컨테이너 이름'

예) 실행 중인 ubuntu 컨테이너를 app-network에 연결

$> docker network connect app-network ubuntu

 

웹 서버 컨테이너를 app-network에 속하도록 생성하고 mysql이 실행 중인 컨테이너에 연결하는 예를 하나 살펴보자. 웹 서버 컨테이너의 이름을 web-server, mysql 컨테이너의 이름을 db-server라고 하였다.

$> docker run -d -p 8080:80 --name=web-server --network=app-network -e DB_HOST=db-server -e DB_NAME=server_db -e DB_USER=server_admin -e DB_PASSWORD=password /bin/sh

위의 예에서는 -p 옵션을 사용하여 호스트의 8080포트를 컨테이너의 80번 포트(http)에 연결하고 환경 변수를 설정하는 옵션인 -e 옵션을 이용해서 DB가 실행되고 있는 컨테이너의 이름 db-server를 DB_HOST 환경변수를 통해 전달하였다.

 

2.4. 컨테이너를 호스트의 네트워크에 연결하기

가장 자주 사용하는 구성은 호스트의 현재 네트워크에 컨테이너를 연결하는 것이다. --network 옵션의 값으로 'host'를 지정하여 구성할 수 있다. 예를 들어 mysql이 실행 중인 컨테이너를 띄우고 컨테이너 안에서 실행중인 DB를 호스트에서 접근할 수 있도록 할 수 있다.

$> docker run --name=mysql-server --network=host mysql-image /bin/bash

※ DB를 컨테이너에서 실행하는 것은 좋은 방법은 아니다. 왜냐하면 컨테이너가 삭제되면 컨테이너의 DB에 저장되었던 데이터도 모두 사라지기 때문이다.

 

'--network=host' 옵션을 설정해서 도커 컨테이너를 실행시키면 마치 호스트에서 실행되는 프로세스처럼 port 번호를 통해 해당 컨테이너에서 실행 중인 프로그램과 데이터를 주고 받을 수 있다.

 

 

3. 볼륨 마운트

호스트의 특정 디렉토리를 컨테이너의 디렉토리와 맵핑한다. 이 때 마운트 대상이 호스트의 디렉토리가 되기 때문에 컨테이너에서 실행되는 프로그램이 맵핑된 호스트의 디렉토리에 쓰고 읽는다. 따라서 호스트가 컨테이너 내부를 볼 수는 없다.

$> docker run --name '컨테이너 이름' -v '컨테이너 디렉토리':'호스트 디렉토리' '이미지 이름':'이미지 TAG' '명령어'

예)

$> docker run --name app_container -v /var/log/app:/var/log/app ubuntu:18.04 /bin/bash

 

 

4. 실행 중인 컨테이너에서 명령 실행 - docker exec

docker run 명령은 이미지를 컨테이너로 활성화시키는 역할을 한다. 이에 반해 docker exec 명령은 이미 활성화된(실행 중인) 컨테이너에서 명령을 실행할 수 있도록 해준다.

 

$> docker exec '컨테이너 ID' '명령어'

 

특히 detached 모드에서 실행 중인 컨테이너에서 명령을 실행할 때 반드시 필요하다. 예를 들어 아래와 같은 명령으로 detached 모드에서 실행 중인 컨테이너의 쉘을 실행하고 interactive 모드로 접속할 수도 있다.

$> docker exec -it '컨테이너 ID' /bin/bash

 


 

이번 포스팅에서는 도커를 사용하면서 자주 사용하게 되는 명령 및 옵션들인 로그 확인하기(docker logs), 네트워크 지정하기(docker run --network), 볼륨 마운트(docker run -v) 그리고 실행 중인 컨테이너에서 명령을 실행하기 위해 필요한 docker exec 명령에 대해 살펴보았다. 

 

이전 몇 개의 포스팅과 지금 이 포스팅까지 도커를 설치하고 이미지를 컨테이너로 만들고 관리하는 기본적인 방법에 대해 살펴보았다. 지금까지 컨테이너를 실행하고 관리하기 위해 커맨드 콘솔에 직접 명령어를 입력했다. 하지만 이렇게 하면 명령어가 조금만 길어지면 기억이 안 날 수도 있고 관리자가 바뀌면 도커 컨테이너 관리 자체가 안 될 수도 있다. 다음 포스팅부터는 스크립트 파일을 이용해서 도커 명령어를 기술하고 실행시키는 방법인 docker-compose 사용 방법에 대해 살펴보도록 하겠다.