ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 도커 컨테이너 실행하기
    BackEnd/도커 2021. 3. 7. 14:25

    컨테이너 실행하기(run) > 웹 앱 실행하기 > mysql 에 워드프레스 설치하기 > 자주 사용하는 명령어 


    도커 실행

    도커 허브를 켜야 도커 클라이언트를 사용할 수 있다.

    > cmd 에서 docker 명령을 하기 위해서는 로컬 pc 에 설치한 도커 허브를 시작해야한다. 

    docker 라는 명령어를 통해 client 에서 server 로 명령을 전달할 수 있다.


    컨테이너 실행하기

    docker run [option] 이미지명:태그 [command] [arg..]

     

    * run 은 create + start 를 합친 명령어로, 명령어가 컨테이너를 생성, 실행함.

    - create 할 때 파일스냅샷을 컨테이너 하드디스크에 적재

    - start 할 때 run 명령어를 컨테이너 실행 명령어로 적재

    이미지가  cache 저장소(var/lib/docker)나 Docker Hub에 존재하는 것을 pull 해오고,
    가져온 이미지를  컨테이너의 하드디스크에 적재하고, 커널을 통해 파일시스템 등 리소스를 이용해 이미지를 실행한다.

    * [command] 에 입력을 한다면  시작 명령어를 무시하고 command 를 실행한다.

    docker run --rm --it ubuntu:20.04 /bin/sh

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

    컨테이너는 정상적으로 실행되지만 다른 작업에 대한 명령이 없기 때문에 컨테이너는 실행되자마자 종료된다.

    컨테이너는 프로세스이기때문에 실행중인 프로세스가 없으면 컨테이너는 종료된다.

     

    /sh  는 shell  을 의미한다.

    # 은 ubuntu 의 shell 안에 들어왔음을 의미한다.

    shell 안에 들어와 이전처럼 컨테이너가 바로 종료되지 않는다.

    ls 는 내 파일목록이 아닌 ubuntu 컨테이너 내 파일목록이다.

     

    --rm 옵션이 없는 경우 exit 을 통해 나오면 

    컨테이너 실행-중지-삭제 단계 중 중지상태가 되고 다시 컨테이너에 붙을 수 있다.

     

    [ Options ]

    -d detached mode(백그라운드 모드) 
    컨테이너 실행 후 바로 빠져나와 다른 작업을 실행할 수 있는 상태가 된다
    docker run -d -p 5000:8080 이미지명
    -p 호스트와 컨테이너의 포트를 연결한다.

    -v 호스트와 컨테이너의 디렉토리를 연결
    필요한 파일을 컨테이너로 넣어줄 수도 있고, 컨테이너 내 생성된 내용이 백업될 수 도 있다.
    컨테이너 정지하면 데이터 날라가기 때문.
    -e 컨테이너 내에서 사용할 환경변수를 설정
    --name 컨테이너 이름 설정 
    --name 컨테이너이름 이미지이름:버전
    --rm 프로세스 종료 시 컨테이너 자동 제거
    -it i : interactive ,  t: terminal 터미널 입력을 할 수 있다.
    docker exec -it mysql bash 
    > 실행되고 있는 컨테이너에 mysql 내로 접속해 원하는 작업을 할 수 있다.

    network 네트워크 연결

     

    *-p 포트포워딩

    도커컨테이너는 네트워크 구성 상 NAT(Network Address Translation) 내부망에서 동작하고 공인 IP 가 아닌 

    사설IP 를 사용해 기본적으로 컨테이너 외부(인터넷망 등)에서 내부로 접속이 불가능하다.

    이를 극복하기 위해 NAT 환경에서 포트 포워딩이라는 기법을 사용한다.

    NAT 가 동작하는 라우터/게이트웨이의 특정 포트 번호로 유입하는 트래픽을 NAT 내부에서 동작하는 시스템의 특정 포트로 전달해주는 기법이다.

    예로 NAT 내부에서 TCP 2000포트로 접속되는 서버 프로그램이 동작하면 NAT 라우터/게이트웨이는 TCP 2000포트로 들어오는 모든 트래픽을 NAT 내부망 특정 IP 를 갖는 시스템의 TCP 2000으로 무조건 전달하게 설정할 수 있다.

    도커 시스템 관점에서 NAT 구성을 살펴보면 도커를 구동하는 호스트 시스템이 라우터/게이트웨이, 

    도커 컨테이너는 NAT 망 내부 시스템이 된다.

    -p 8080:80/tcp  호스트 8080으로 들어오는 트래픽은 도커 컨테이너 80번으로 전달된다.

    overlay network

     

    * -v 볼륨

    -v ${pwd}:/usr/src/app
    volume 로컬디렉토리:도커경로

    jar 파일을 copy 를 통해 컨테이너에 담아 사용하면 수정 사항 반영을 하려면 빌드와 재기동 단계를 다시 실행해야한다.

    개발 시 이런 번거로움을 줄이기 위해 도커 컨테이너가 로컬 파일을 바라보게해 수정에 대해 즉각적으로 확인할 수 

    있도록 하는 것이 볼륨이다.

    도커 컨테이너 내에 존재해 참조할 필요가 없는 파일을 볼륨으로 명시할 수도 있다.

    경로를 도커 컨테이너 경로를 명시하면 로컬을 참조하지 않는다.

    -v usr/src/app/node_modules
    docker run -d -p 5000:9090 -v usr/src/app/node_modules -v ${pwd}:/usr/src/app 이미지아이디

    웹어플리케이션 실행하기

    docker run --rm --p 5678:5678 hashicorp/http-echo -text="hello world"
    hashicorp 라는 회사에서 만든 http-echo 라는 웹서버 를 띄우고,
    -p 5678 포트로 연결한다.

    localhost:5678 에 접속하면 "hello world" 라는 메세지를 볼수 있다. 

    curl 명령어를 이용하면 브라우저처럼 http 로 접속해서 결과 받아온다.

    curl localhost:5678
    
    "hello world"

    5679로 호스트 포트만 변경해서 다른 메세지를 정의해 실행하면

    컨테이너의 5678 포트로 두 개의 웹 서버가 서로 격리되어 충돌하지 않는 웹서버로 실행이 된다.


    mysql 에 워드프레스 블로그 실행하기

    mysql 에 wordpress 를 저장할 수 있도록 wp 라는 이름의 데이터베이스 생성

    create database wp CHARACTER set utf8;
    grant all privileges on wp.* to wp@'%' identified by 'wp';
    flush privileges;
    quit

     

    앞서 만든 mysql 을 실행한 상태에서 진행 

    docker run -d -p 8080:80 
    -e WORDPRESS_DB_HOST=host.docker.internal 
    -e WORDPRESS_DB_NAME=wp 
    -e WORDPRESS_DB_USER=wp 
    -e WORDPRESS_DB_PASSWORD=wp wordpress

    >docker exec -it mysql mysql 로 mysql 접속해서 database 를 확인해보면 wp 가 새로 추가된 것을 볼 수 있다.

     

    wp 로 들어가 table 을 조회하면 워드프레스 관련 테이블들이 생성되어 있는 것을 볼 수 있다.

     

     user 를 검색해보면 아까 가입한 내 정보를 확인할 수도 있다.


    자주 사용하는 도커 명령어 

    docker ps -a  모든 컨테이너 리스트
    (-a 가 없으면 실행 중인 컨테이너만 나옴)
    docker images 모든 이미지 리스트
    docker start [options] 컨테이너명 컨테이너 시작
    -a 옵션 : attach 컨테이너에 붙어서 로그가 계속 나옴
    docker stop [options] 컨테이너명 실행 중인 컨테이너 중지 
    docker logs [options] 컨테이너  컨테이너 정상 동작 중인지 확인 

    -f  옵션 : 대기중인 상태로 추가적인 로그가 생기면 계속 보여줌 
    docker rm [options] 컨테이너 컨테이너 삭제 
    docker pull [options] repository:tag 이미지를 직접 다운로드 
    docker exec [options] 컨테이너명 [command] 이미 실행 중인 컨테이너에  exec 로는  원하는 작업을 할 수 있다.
    docker exec -it mysql bash 
    ocker exec mysql bash
     docker system prune  중지된 컨테이너의 모든 자원을 삭제 
    docker rm `docker -a -q`
    docker rm $(docker -a -q)
    중지된 모든 컨테이너를 삭제 
    `` 내에 명령어가 실행되며 나오는 컨테이너 번호를 rm 함

     

    *ps 상태를 볼 때 원하는 정보만 지정해서 볼 수도 있다.

    $ docker ps --format "table {{.Image}}\t{{.Status}}\t{{.Ports}}"
    
    \(tab)는 화면에 표시할 때 tab 표시로 간격 주도록 한 것

    1. ID : Container ID

    2. Image : docker image

    3. Command : container 실행시 사용한 command

    4. Created : 컨테이너가 생성된 시간입니다.

    5. Status : 컨테이너의 상태입니다. 실행중은 Up 종료는 Exited, 일시정지 Pause 등이 있습니다.

    6. Ports : 컨테이너가 개방한 포트와 호스트에 연결한 포트입니다. 특별한 설정을 하지 않은 경우 출력되지 않습니다.

    7. Names : container name


    network create 명령어

    mysql과 wordpress 서로 연결 시 , 각각의 이름이 있으면 연결하기 편한데,

    만약 이름이 없으면 host internal 이라는 가상의 네트워크를 통해 연결하는데..

    기존 코드 (1.도커 컨테이너 실행하기 내용)
    
    docker run -d -p 8888:80 
    -e WORDPRESS_DB_HOST=host.docker.internal 
    -e WORDPRESS_DB_NAME=wp 
    -e WORDPRESS_DB_USER=wp 
    -e WORDPRESS_DB_PASSWORD=wp wordpress

    network 를 만들면 아래와 같이 연결할 수 있다.

    docker network create app-network
    docker network connect app-network mysql

    워드프레스를 app-network 에 속하게 하고 mysql 을 이름으로 접근한다.

    docker run -d -p 8888: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

     

    반응형

    'BackEnd > 도커' 카테고리의 다른 글

    도커 네트워크 관련 링크  (0) 2022.08.06
    도커 이미지 빌드 Dockerfile  (0) 2021.03.28
    도커 컴포즈  (0) 2021.03.24
Designed by Tistory.