ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 도커 컨테이너(Docker Container)
    BackEnd/docker 2022. 3. 6. 11:07
    반응형

    컨테이너 생성

    run 명령어

      run 명령어를 입력하면 도커 이미지가 로컬 도커 엔진에 존재하지 않으므로 도커 중앙 이미지 저장소인 도커 허브에서 자동으로 이미지를 내려받습니다. 단 한 줄의 docker 명령어로 컨테이너를 생성 및 실행과 동시에 컨테이너 내부로 들어왔습니다. 셸의 사용자와 호스트 이름이 변경된 것(root@c3a41b157876)이 컨테이너 내부에 들어와 있다는 것을 나타냅니다. 컨테이너에서 기본 사용자는 root이고 호스트 이름은 무작위의 16진수 해시값입니다.

    $ docker run -i -t ubuntu:14.04
    Unable to find image 'ubuntu:14.04' locally
    14.04: Pulling from library/ubuntu
    2e6e20c8e2e6: Pull complete
    0551a797c01d: Pull complete
    512123a864da: Pull complete
    Digest: sha256:60840958b25b5947b11d7a274274dc48ab32a2f5d18527f5dae2962b64269a3a
    Status: Downloaded newer image for ubuntu:14.04
    root@c3a41b157876:/#

    docker run: 컨테이너를 생성하고 실행하는 역할을 합니다.

    • -i -t: 컨테이너와 상호 입출력을 가능하게 합니다. (-i: 상호 입출력, -t: tty를 활성화해서 배시(bash) 셸 사용)
    • -d: -i -t가 컨테이너 내부로 진입하도록 attach 가능한 상태로 설정한다면 -d는 Detached 모드로 컨테이너를 실행합니다. Detached 모드는 컨테이너를 백그라운드에서 동작하는 애플리케이션으로써 실행하도록 설정합니다. 즉, -d 옵션으로 run을 실행하면 입출력이 없는 상태로 컨테이너를 실행합니다. Detached 모드인 컨테이너는 반드시 컨테이너에서 프로그램이 실행돼야 하며, 포그라운드 프로그램이 실행되지 않으면 컨테이너는 종료됩니다.
    • -e: 컨테이너 내부의 환경변수를 설정합니다.
    • --link: 내부 IP를 알 필요 없이 항상 컨테이너에 별명(alias)으로 접근하도록 설정합니다. 단, --link에 입력된 컨테이너가 실행 중이지 않거나 존재하지 않는다면 --link를 적용한 컨테이너 또한 실행할 수 없습니다. deprecated된 옵션으로 도커 브리지(bridge) 네트워크 사용을 권장합니다.

    ubuntu:14.04: 컨테이너를 생성하기 위한 이미지의 이름입니다.

     

    create 명령어

      create 명령어는 컨테이너를 생성만 합니다. 그러므로 run 명령어와 달리 컨테이너 내부로 들어가지 않습니다. 즉, run 명령어는 pull, create, start 명령어를 일괄적으로 실행한 후 attach가 가능한 컨테이너라면 컨테이너 내부로 들어갑니다.

    $ docker create -i -t --name myubuntu ubuntu:14.04 # 컨테이너 생성
    $ docker start myubuntu                            # 컨테이너 시작
    $ docker attach myubuntu                           # 컨테이너 내부로 들어가기
    
    $ docker pull ubuntu:14.04                         # 이미지 내려받기
    $ docker images                                    # 도커 엔진에 존재하는 이미지 목록 출력
    $ docker inspect <option> <image or container>     # 컨테이너 세부정보 확인

     

    컨테이너에서 나오기

    • exit 입력 or Ctrl + D: 컨테이너 내부에서 빠져나오면서 동시에 컨테이너를 정지시킵니다.
    • Ctrl + P, Q: 단순 컨테이너의 셸에서만 빠져나옵니다. (애플리케이션 개발 시 사용)

     

    컨테이너 목록 확인

    $ docker ps # 정지되지 않은 컨테이너만 출력
    $ docker ps -a # 모든 컨테이너 출력 (STATUS: Exited는 정지, Up는 실행 중, Pause는 일시 중지된 상태)

     

    출력 결과 형태 지정

      ps 명령어의 출력 결과가 알아보기 힘들 때 --format 옵션에 {{.ID}}\t{{.Status}}와 같은 Go 템플릿을 입력해서 원하는 정보만 출력할 수 있습니다.

    $ docker ps -a --format "table {{.ID}}\t{{.Status}}"
    CONTAINER ID   STATUS
    c3a41b157876   Exited (0) 2 hours ago

     

    컨테이너 이름 변경

      컨테이너 생성 시 --name 옵션으로 이름을 설정하지 않으면 도커 엔진이 임의로 형용사와 명사를 무작위로 조합해 이름을 설정합니다.

    $ docker ps -a
    CONTAINER ID   IMAGE          COMMAND       CREATED       STATUS                   PORTS     NAMES
    c3a41b157876   ubuntu:14.04   "/bin/bash"   2 hours ago   Exited (0) 2 hours ago             reverent_poincare
    
    $ docker rename reverent_poincare myubuntu
    
    $ docker ps -a
    CONTAINER ID   IMAGE          COMMAND       CREATED       STATUS                   PORTS     NAMES
    c3a41b157876   ubuntu:14.04   "/bin/bash"   2 hours ago   Exited (0) 2 hours ago             myubuntu

     

    컨테이너 삭제

      한 번 삭제한 컨테이너는 복구할 수 없으므로 삭제할 때 신중해야 합니다.

    $ docker rm myubuntu   # 컨테이너 삭제
    myubuntu
    $ docker ps -a         # 컨테이너 삭제 확인
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
    
    # 실행 중인 컨테이너는 삭제할 수 없습니다.
    # 1) 컨테이너 정지 후 삭제합니다.
    $ docker stop myubuntu # 컨테이너 정지
    $ docker rm myubuntu   # 컨테이너 삭제
    
    # 2) 실행 중인 컨테이너 force 삭제
    $ docker rm -f myubuntu
    
    # 모든 컨테이너 삭제
    $ docker container prune

     

    컨테이너 외부 노출

      컨테이너는 가상 머신과 마찬가지로 가상 IP 주소를 할당받습니다. 기본적으로 도커는 컨테이너에 172.17.0.x의 IP를 순차적으로 할당합니다. 컨테이너를 새롭게 생성한 후 ifconfig 명령어로 컨테이너의 네트워크 인터페이스를 확인합니다.

    $ docker run -i -t --name network_test ubuntu:14.04
    root@3db2a1829193:/# ifconfig
    eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:02
              inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:8 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0
              RX bytes:736 (736.0 B)  TX bytes:0 (0.0 B)
    
    lo        Link encap:Local Loopback
              inet addr:127.0.0.1  Mask:255.0.0.0
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

      도커의 NAT IP인 172.17.0.2를 할당받은 eth0 인터페이스와 로컬 호스트인 lo 인터페이스가 있습니다. 외부에 컨테이너의 애플리케이션을 노출하기 위해서는 eth0의 IP와 포트를 호스트의 IP와 포트에 바인딩해야 합니다. 바인딩 시 -p 옵션을 사용합니다. -p 옵션은 컨테이너의 포트를 호스트의 포트와 바인딩해 연결할 수 있게 설정합니다.

      -p 옵션의 입력 형식: [호스트의 포트]:[컨테이너의 포트]

     

      여러 개의 포트를 외부에 개방하려면 -p 옵션을 여러 번 써서 설정합니다.

    $ docker run -i -t -p 3306:3306 -p 192.168.0.100:7777:80 ubuntu:14.04

     

      컨테이너를 생성하고 아파치 웹 서버를 설치해 외부에 노출하겠습니다. 아파치 웹 서버는 기본적으로 80번 포트를 사용하므로 여기서는 컨테이너의 80번 포트를 호스트와 연결합니다.

    $ docker run -i -t --name mywebserver -p 80:80 ubuntu:14.04
    root@8bb719d99d6c:/# apt-get update
    root@8bb719d99d6c:/# apt-get install apache2 -y
    root@8bb719d99d6c:/# service apache2 start

     

      아파치 웹 서버의 설치 및 실행이 완료되면 [도커 엔진 호스트의 IP]:80으로 접근합니다.

     

    컨테이너 애플리케이션 구축

      서비스를 컨테이너화(Containerize) 할 때 여러 개의 애플리케이션을 한 컨테이너에 설치할 수도 있지만, 컨테이너에 애플리케이션을 하나만 동작시키면 컨테이너 간의 독립성을 보장함과 동시에 애플리케이션의 버전 관리, 소스코드 모듈화 등이 쉬워집니다. 예를 들어, 데이터베이스와 웹 서버 컨테이너를 구분하는 편이 도커 이미지를 관리하고 컴포넌트의 독립성을 유지하기가 쉽습니다. 한 컨테이너에 프로세스 하나만 실행하는 것이 도커의 철학입니다.

     

      데이터베이스와 워드프레스 웹 서버 컨테이너를 연동해 워드프레스 기반 블로그 서비스를 만들어 보겠습니다.

    $ docker run -d \
    --name wordpressdb \
    -e MYSQL_ROOT_PASSWORD=wordpress \
    -e MYSQL_USER=wordpress \
    -e MYSQL_PASSWORD=wordpress \
    -e MYSQL_DATABASE=wordpress \
    mysql:5.7
    $ docker run -d \
    -e WORDPRESS_DB_USER=wordpress \
    -e WORDPRESS_DB_PASSWORD=wordpress \
    --name wordpress \
    --link wordpressdb:mysql \
    -p 80 \
    wordpress

      첫 번째 명령어는 mysql 이미지를 사용해 데이터베이스 컨테이너를, 두 번째 명령어는 워드프레스 이미지를 이용해 워드프레스 웹 서버 컨테이너를 생성합니다. 워드프레스 웹 서버 컨테이너의 -p 옵션에서 80을 입력했으므로 호스트의 포트 중 하나와 컨테이너의 80번 포트가 연결됩니다.

     

      wordpress 이름의 컨테이너가 사용 중인 호스트의 포트를 확인합니다. 출력 결과에서 0.0.0.0은 호스트의 활용 가능한 모든 네트워크 인터페이스에 바인딩함을 뜻합니다.

    $ docker port wordpress
    80/tcp -> 0.0.0.0:62849

     

      웹 브라우저로 [호스트IP]:62849에 접근했을 때 다음과 같은 화면이 나타나면 워드프레스 컨테이너가 성공적으로 생성된 것입니다.

     

      exec 명령어를 이용하면 컨테이너 내부의 셸을 사용할 수 있습니다. 다음 명령어를 입력하면 mysql 컨테이너 내부에 /bin/bash 프로세스를 실행하고, -i -t 옵션을 사용해 배시 셸을 쓸 수 있게 유지합니다.

    $ docker exec -i -t wordpressdb /bin/bash
    root@b7932c489695:/# echo $MYSQL_ROOT_PASSWORD
    wordpress
    반응형

    'BackEnd > docker' 카테고리의 다른 글

    컨테이너 로깅(Container Logging)  (0) 2022.03.12
    도커 네트워크(Docker Network)  (0) 2022.03.09
    도커 볼륨(Docker Volume)  (0) 2022.03.06
    도커 엔진(Docker Engine)  (0) 2022.02.26
    도커(Docker)  (0) 2022.02.26

    댓글

Designed by Tistory.