[Docker] Docker 컨테이너 실행하기

안나·2024년 1월 26일
0

DevOps

목록 보기
11/21
post-thumbnail

실행 환경

  • VirtualBox 6.1.50
  • Ubuntu 22.04

🐳Docker 버전 확인


  • Input
sudo docker version
  • Output
Client: Docker Engine - Community
 Version:           25.0.1
 API version:       1.44
 Go version:        go1.21.6
 Git commit:        29cf629
 Built:             Tue Jan 23 23:09:23 2024
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          25.0.1
  API version:      1.44 (minimum version 1.24)
  Go version:       go1.21.6
  Git commit:       71fa3ab
  Built:            Tue Jan 23 23:09:23 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.27
  GitCommit:        a1496014c916f9e62104b33d1bb5bd03b0858e59
 runc:
  Version:          1.1.11
  GitCommit:        v1.1.11-0-g4bccb38
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
  • 도커의 버전을 확인하게 되면 Client와 Server로 나누어 버전을 보여준다.
  • 도커 아키텍처 공부하러 가기
  • 이전에 도커의 엔진 아키텍처를 공부하면서 Docker Client에서 사용자가 명령을 입력하면 Docker Deamon으로 명령어를 전달하고 이를 수행하여 결과를 반환해준다고 공부했다.
  • 그렇기 때문에 도커는 하나의 실행파일 이지만 실제로 클라이언트와 서버의 역할을 각각 하고 있음을 저 버전확인을 통해 간접적으로 알아볼 수 있다.

🐳컨테이너 실행하기


드디어 컨테이너를 실행해 볼 단계이다 !

지금껏 이론으로만 접한 컨테이너를 드디어 띄워보자 !

도커를 활용하면 백엔드 프로그램, 데이터베이스 서버, 메시지 큐등 어떤 프로그램도 컨테이너로 추상화할 수 있다고 했다.

여러가지를 띄워볼건데 이전에 도커 실행 명령어를 간단히 보고 넘어가자

1. 컨테이너 실행하기 (run)

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
  • 자주 사용되는 run 명령어 옵션들
    옵션설명
    -ddetached mode 흔히 말하는 백그라운드 모드
    -p호스트와 컨테이너의 포트를 연결 (포워딩)
    -v호스트와 컨테이너의 디렉토리를 연결 (마운트)
    -e컨테이너 내에서 사용할 환경변수 설정
    –name컨테이너 이름 설정
    –rm프로세스 종료시 컨테이너 자동 제거
    -it-i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션
    –link컨테이너 연결 [컨테이너명:별칭]

1-1. ubuntu 16.04 컨테이너

ubuntu:16.04  환경의 컨테이너를 생성하고 내부로 들어가기!

  • Input
docker run ubuntu:16.04
  • Output

    • run명령어를 사용하면 사용할 이미지가 저장되어 있는지 확인하고 없다면 다운로드(pull)를 한 후 컨테이너를 생성(create)하고 시작(start)
    • ubuntu:16.04 이미지를 다운받은 적이 없기 때문에 이미지를 다운로드 한 후 컨테이너가 실행되었다.
    • 컨테이너는 정상적으로 실행됐지만 뭘 하라고 명령어를 전달하지 않았기 때문에 컨테이너는 생성되자마자 종료되었다. 컨테이너는 프로세스이기 때문에 실행 중인 프로세스가 없으면 컨테이너는 종료된다.

/bin/bash 명령어를 입력해서 ubuntu:16.04 컨테이너를 실행

  • Input

    docker run --rm -it ubuntu:16.04 /bin/bash
    • —rm : 프로세스 종료 시 컨테이너 자동 제거
    • -it : -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션
    • /bin/bash : 컨테이너 내부에 들어가기 위해 bash 쉘을 실행
  • Output

    • exit : exit 로 쉘을 종료하면 컨테이너도 같이 종료된다.
    • 이미지를 이전에 다운 받았기 때문에 이미지를 다운로드 하는 화면 없이 바로 실행된다.
    • cat /etc/issue 을 실행해보면 우분투 리눅스 인 것을 확인할 수 있다.

1-2. Redis 컨테이너

Redis 컨테이너를 생성하고 내부로 들어가기!

  • Input

    docker run -d -p 1234:6379 redis
    • Redis의 기본 포트번호는 6379이기 때문에 이 포터 번호로 통신하며 telnet 명령어로 테스트 할 수 있다.
    • -d : detached mode(백그라운드 모드)로 실행하기 위한 옵션
    • -p : 컨테이너의 포트를 호스트의 포트로 연결 (6379 포트를 1234로 연결)
  • Output

    • -d 옵션을 적었기 때문에 컨테이너를 실행하면 컨테이너의 ID(1990~~)을 보여준다.
      컨테이너는 종료된 것이 아니라 백그라운드에서 동작하고 있으며 컨테이너 ID를 이용하여 컨테이너를 제어할 수 있다. 컨테이너 목록을 확인하는 명령어를 통해 확인할 수 있다.
    • -p : 컨테이너의 6379포트를 호스트의 1234포트로 연결하였고 localhost의 1234포트로 접속하면 redis를 사용할 수 있다.
    • 호스트의 포트번호만 다르게 하면 하나의 서버에 여러개의 레디스를 띄울 수 있다.

1-3. MySQL 5.7 컨테이너

mysql 서버 컨테이너 생성하고 내부로 들어가기!

MySQL Docker hub 페이지에 접속하면 간단한 사용법과 환경변수에 대한 설명이 있다.

  • Input

    docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql mysql:5.7
    • Mysql의 기본 포트번호는 3306이고 포트는 3306포트를 호스트에서 그대로 사용
    • -d : detached mode(백그라운드 모드)로 실행하기 위한 옵션
    • -e : 환경변수 설정
      • 패스워드 없이 root계정을 만들기 위해 MYSQL_ALLOW_EMPTY_PASSWORD 환경변수를 설정
    • —name : 컨테이너에 읽기 어려운 ID 대신 쉬운 이름을 부여 (컨테이너의 이름은 mysql로 할당)

      --name옵션을 생략하면 도커가 자동으로 이름을 지어 줍니다. 이름은 유명한 과학자나 해커의 이름과 수식어를 조합하여 랜덤으로 생성합니다. (ex - boring_wozniak) 우리나라 과학자 장영실도 등록되어 있습니다.

  • Output

    • 이름을 sql로 설정했더니 docker ps로 컨테이너 목록을 보니까 name이 sql로 되어 있음을 확인 할 수 있었다.
    • 생성한 mysql 컨테이너에 접속하려 했으나 mysql 명령어를 찾을 수 없다고 하였다.
    • 그래서 콘솔에서 알려준 대로 mysql-client-core-8.0을 다운 받았더니 제대로 실행 됐다.
    • Bye가 참 귀엽다.

1-4. Wordpress 컨테이너

Wordpress 컨테이너 생성하고 내부로 들어가기!

워드 프레스는 데이터 베이스가 필요하다.

바로 전 생성했던 mysql 컨테이너를 이용할 것이다.

mysql 컨테이너에 워드프레스 데이터 베이스를 만들고

wordpress 를 실행할 때 —link 옵션을 사용해 mysql 컨테이너랑 연결해보자.

우선 mysql 컨테이너에 워드 프레스용 데이터 베이스를 생성해보자

  • Input

    # mysql에 접속
    mysql -h127.0.0.1 -uroot
    
    #워드 프레스용 데이터 베이스 생성
    create database wp CHARACTER SET utf8;
    
    #권한 부여
    grant all privileges on wp.* to wp@'%' identified by 'wp';
    
    #변경사항 적용
    flush privileges;
    
    #mysql 나오기
    exit 
    1. GRANT ALL PRIVILEGES ON wp.* TO wp@'%' IDENTIFIED BY 'wp';:
      • GRANT: 사용자에게 권한을 부여하는 MySQL 명령어입니다.
      • ALL PRIVILEGES: 모든 권한을 부여하는 키워드로, 사용자가 지정된 데이터베이스에 대해 모든 작업을 수행할 수 있도록 합니다.
      • ON wp.*: 권한을 부여할 데이터베이스와 테이블을 지정합니다. 여기서 wp.*wp 데이터베이스 내의 모든 테이블을 의미합니다.
      • TO wp@'%': 권한을 받을 사용자와 해당 사용자의 호스트를 지정합니다. wp는 사용자 이름을 나타내며, '%'는 모든 호스트를 나타냅니다. 따라서 '%'은 어떤 호스트에서든 접속할 수 있도록 허용합니다.
      • IDENTIFIED BY 'wp': 사용자를 식별하는 비밀번호를 설정합니다. 여기서는 'wp'로 지정되었습니다.
    2. FLUSH PRIVILEGES;:
      • 이 명령어는 MySQL에게 최근의 권한 변경 사항을 적용하도록 명령합니다. MySQL은 권한 변경을 즉시 적용하지 않을 수 있으므로, 이 명령어를 사용하여 즉시 적용하도록 할 수 있습니다.

다음은 워드프레스 컨테이너를 실행해보도록 하겠습니다.

  • Input

    docker run -d -p 8080:80 \
      --link mysql:mysql \
      -e WORDPRESS_DB_HOST=mysql \
      -e WORDPRESS_DB_NAME=wp \
      -e WORDPRESS_DB_USER=wp \
      -e WORDPRESS_DB_PASSWORD=wp \
      wordpress
    • 호스트의 8080포트를 컨테이너의 80포트로 연결하고
    • MySQL 컨테이너와 연결한 후
    • 각종 데이터베이스 설정 정보를 환경변수로 입력
  • Output

    • VBox의 Firefox의 주소창에 localhost:8080을 입력하면 자동으로 워드프로세스로 넘어간다.

1-5. tensorflow컨테이너

tensorflow서버 컨테이너 생성하고 내부로 들어가기!

설치하는 이미지는 python과 함께 numpy, scipy, pandas, jupyter, scikit-learn, gensim, BeautifulSoup4, Tensorflow가 설치되어있다

  • Input

    docker run -d -p 8888:8888 -p 6006:6006 teamlab/pydata-tensorflow:0.1
  • Output

    • VBox의 Firefox의 주소창에 localhost:8888을 입력하면 자동으로 주피터 환경으로 넘어간다.
    • 여기서 프로젝트 생성해서 위와같이 실행해주면 잘 돌아가는 것도 확인 할 수 있다.

🐳컨테이너 둘러보기


1. 컨테이너 로그보기 (logs)

생성해 두었던 mysql 컨테이너의 로그를 확인해보자

  • Input

    docker logs mysql
  • Output

    • 아무런 옵션을 주지 않았더니 전체로그를 다 보여준다.
    • -f, -tail 옵션을 줄 수도 있다.
    • ctrl + c로 로그 파일에서 빠져 나올 수 있다.

2. 컨테이너 명령어 실행하기 (exec)

  • Input
    docker exec -it mysql mysql -uroot
  • Output


🐳컨테이너 업데이트


새로운 버전으로 컨테이너를 업데이트 하기 위해서는 아래와 같은 과정을 거친다.

  1. 새 버전의 이미지 다운 ( pull )
  2. 기존 컨테이너 삭제 ( stop, rm )
  3. 새 이미지를 기반으로 새 컨테이너 실행 ( run )

근데 만약 데이터베이스 컨테이너를 업데이트한다고 하면 기존 업데이트를 삭제하면서 내부 데이터가 삭제될 것이다.

이런 상황을 방지하기 위해서는 데이터는 컨테이너 내부가 아닌 외부 스토리지에 저장 해야 한다. 가장 좋은 방법은 AWS S3같은 클라우드 서비스를 이용하는 것이 좋다. 그렇지 않다면 데이터 볼륨을 추가해서 사용해야 한다. 데이터 볼륨을 사용하면 해당 디렉토리는 컨테이너와 별도로 저장되고 컨테이너를 삭제해도 데이터가 지워지지 않는다.


1. 데이터 볼륨 사용해보기

데이터 볼륨을 사용하는 방식이 여러가지가 있지만 나는 호스트 디렉토리를 마운트해서 사용하는 방법으로 해보겠다.

마운트
리눅스는 하드 드라이브, CD-ROM, USB 등의 물리적인 장치들이 파일 시스템으로 인식되어야 사용할 수 있다. 이러한 하드웨어 장치를 액세스 하기 위해서는 리눅스의 특정한 위치 (디렉토리)에 연결 (할당)을 시켜주어야 한다. 이러한 과정을 마운트라고 한다.

  • Myql이라면 /var/liv/mysql 디렉토리에 있는 모든 데이터 베이스 정보가 담기므로 호스트의 특정 디렉토리로 연결해보자
  • Input
    docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql -v /my/own/datadir:/var/lib/mysql mysql:5.7
    • -v 옵션을 사용/my/own/datadir 디렉토리를 컨테이너의 /var/liv/mysql 디렉토리로 마운트
    • 데이터베이스 파일은 호스트의 /my/own/datadir디렉토리에 저장되고 컨테이너를 삭제해도 데이터는 사라지지 않음
    • 최신버전의 MySQL 이미지를 다운받고 다시 컨테이너를 실행할 때 동일한 디렉토리를 마운트 한다면 그대로 데이터를 사용
  • Output


🐳Docker Compose


단일 서버에서 여러개의 컨테이너를 하나의 서비로 정의해 컨테이너의 묶음으로 관리할 수 있는 작업 환경을 제공하는 관리도구
복잡한 설정을 쉽게 관리하기 위해 YAML방식의 설정파일을 이용

Docker Compose 공식문서

1. Docker Compose 설치하기

  • 리눅스 docker compose 설치 명령어

    curl -L "https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    • 아래와 같이 오류가 난다면 docker-compose에 권한이 없어서 생기는 오류이므로 권한을 주자

      sudo chmod -R 777 /usr/local/bin/ 
      #7은 읽기 쓰기 및 실행 권한을 말한다.
      #세 수는 하나는 소유자 하나는 그룹하나는 기타를 의미한다.
    • 그래도 안된다면 공식문서를 참고하자

      나는 공식문서에서 sudo apt install docker-ompose 로 설치하라길래 이 명령어도 입력해주었다.

    • 버전 확인


2. Wordpress 만들기

기존에 만들었던 wordpress를 compose를 이용해서 다시 만들어보자

  1. 빈 디렉토리 만들기

    # 디렉토리 생성 디렉토리 이름은 temp
    mkdir temp
    # 생성한 디렉토리로 이동
    cd temp
  2. docker-compose.yml 파일 만들기

    # docker-compose.yml 파일 생성
    touch docker-compose.yml
    
    # 파일 목록 확인
    ls
    
    # 파일 읽기
    vi docker-compose.yml
    
    # 키보드 i를 눌러 편집모드로 전환
    # esc 눌르면 읽기보드로 전환
    # 읽기모드에서 :q! 저장하지 않고 파일 나오기
    # 읽기모드에서 :wq! 저장하고 나오기
  3. 입력하기

    version: '2'
    
    services:
       db:
         image: mysql:5.7
         volumes:
           - db_data:/var/lib/mysql
         restart: always
         environment:
           MYSQL_ROOT_PASSWORD: wordpress
           MYSQL_DATABASE: wordpress
           MYSQL_USER: wordpress
           MYSQL_PASSWORD: wordpress
    
       wordpress:
         depends_on:
           - db
         image: wordpress:latest
         volumes:
           - wp_data:/var/www/html
         ports:
           - "8000:80"
         restart: always
         environment:
           WORDPRESS_DB_HOST: db:3306
           WORDPRESS_DB_PASSWORD: wordpress
    volumes:
        db_data:
        wp_data:
  4. compose 실행하기

    • Input

      docker-compose up
    • Output

      • 생성된 컨테이너 목록을 확인하면 워드프레스가 새로 생성되어 있음을 확인 할 수 있다.

이번 글에서는 컨테이너를 실행하고 살펴보았다.

다음 글에서는 직접 이미지를 만들고 배포해보도록 하자


다음게시글 -> [Docker] Docker 이미지 만들고 컨테이너 생성하기






📎 참고 링크

https://subicura.com/2017/01/19/docker-guide-for-beginners-2.html

0개의 댓글