Docker _ 2

구름코딩·2020년 9월 11일
0

Docker

목록 보기
3/5

실전

도커 설치하기

기본적으로 도커는 리눅스 컨테이너 기술이므로 macOs, Windows에 설치할 경우 가상머신에 설치가 된다

맥에 설치

Doker for mac을 설치

설치 후

도커 클라-호스트

도커는 하나의 실행파일이지만 실제로 클라이언트와 서버 역활을 각각 할수 있다. 도커 커맨드를 입력하면 도커 클라이언트가 도커 서버로 명령을 전송하고 결과를 받아 터미널에 출력해 준다.

컨테이너 실행하기

도커를 실행하는 명령어

docker run [OPTIONS] IMAGE[:TAG|@DIGEST][COMMAND] [ARG...]

다음은 자주 사용하는 옵션

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

ubuntu 16.04 container

ubuntu 16.04컨테이너를 생성하고 컨테이너 내부로 들어가보기

명령어 docker run ubuntu:16.04

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

ubuntu:16.04 이미지를 다운받은 적이 없기 때문에 이미지를 다운로드 한 후 컨테이너가 실행되고. 컨테이너는 정상적으로 실행됐지만 뭘 하라고 명령어를 전달하지 않았기 때문에 컨테이너는 생성되자마자 종료된다. 컨테이너는 프로세스이기 때문에 실행중인 프로세스가 없으면 컨테이너는 종료된다.

명령어 docker run --rm -it ubuntu:16.04 /bin/bash

\bin\bash명령어를 입력하여 ubuntu:16.04컨테이너를 실행

컨테이너 내부에 들어가기 위해 bash쉘을 실행하고 키보드 입력을 위해 -it옵션을 준다. 추가적으로 프로세스가 종료되면 컨테이너가 자동으로 삭제되도록 --rm옵션도 추가하였다.

이전 명령어에서 이미지를 다운받았으므로 다운로드없이 바로 실행된다.

도커를 이용하여 가장 기본적인 컨테이너를 만드는 과정이였다

redis container

redis컨테이너 만들기

redis는 메모리 기반의 다양한 기능을 가진 스토리지이다. 6379포트로 통신하여 telent명령어로 테스트해 볼 수 있다. raids컨테이너는 detached mode(백그라운드모드)로 실행하기 위해 -d옵션을 추가하고 -p옵션을 추가하여 컨테이너의 포트를 호스트의 포트로 연결해보겠다.

-d옵션이 없다면 프로세스가 foreground로 실행되어 아무키도 입력할수 없게 된다. 컨테이너를 종료할려면 ctrl + c를 입력해야한다

-d옵션을 주었으므로 컨테이너를 실행하자마자 컨테이너의 ID를 보여주고 바로 쉘로 돌아온다. 이는 종료된것이 아닌 백그라운드 모드로 동작하고 있고 컨테이너 ID를 이용하여 컨테이너를 제어할 수 있다. -p 옵션을 이용하여 호스트의 1234포트를 컨테이너의 6379포트로 연결하였고 localhost의 1234포트로 접속하면 redis를 사용할 수 있다

MySQL 5.7 container

MySQL서버 컨테이너 만들기

가장 흔하게 사용하는 데이터베이스로, -e옵션을 이용하여 환경변수를 설정하고, --name옵션을 이용하여 컨테이너에 읽기 어려운 ID대신 쉬운 이름을 부여할 예정이다

--name옵션을 생략하면 도커가 자동으로 이름을 지어주며, 유명과학자나 해커의 이름과 수식어를 조합하여 랜덤생성한다

MySQL Docker hub페이지에 접속하면 간단한 사용법과 환경변수에 대한 설명이 있다. 여러가지 설정값이 있는데 패스워드 없이 root계정을 만들기 위해 MYSQL_ALLOW_EMPTY_PASSWORD환경변수를 설정하고, 그리고 컨테이너의 이름은 mysql로 할당하고 백그라운드 모드로 띄우기 위해 -d옵션을 주고 포트는 3306포트를 호스트에서 그대로 사용해보겠다

docker run -d -p 3306:3306 \
  -e MYSQL_ALLOW_EMPTY_PASSWORD=true \
  --name mysql \
  mysql:5.7

# MySQL test
$ mysql -h127.0.0.1 -uroot

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> quit

도커의 기본 명령어

도커의 run명령어를 이용하여 여러개의 컨테이너를 실행해보았다. 이제 컨테이너의 상태를 살펴보고 어떤 이미지가 설치되어 있는지 확인하는 명령어를 알아보자

컨테이너 목록 확인하기 : ps

컨테이너 목록을 확인하는 명령어이다

docker ps [options]

choeunsig > docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
eeb0e027cf78        wordpress           "docker-entrypoint.s…"   20 minutes ago      Up 20 minutes       0.0.0.0:8080->80/tcp                festive_noyce
7312ba07d942        mysql:5.7           "docker-entrypoint.s…"   26 minutes ago      Up 26 minutes       0.0.0.0:3306->3306/tcp, 33060/tcp   mysql

ps명령어는 실행중인 컨테이너 목록을 보여준다. detached mode로 실행중인 컨테이너들이 보인다. 어떤 이미지를 기반으로 만들었는지, 어떤 포트와 연결이 되어있는지 등 간단한 내용을 보여준다

docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                               NAMES
ed4e2a003d1e        ubuntu:16.04        "/bin/bash"              22 seconds ago      Exited (0) 6 seconds ago                                       dreamy_goldberg
eeb0e027cf78        wordpress           "docker-entrypoint.s…"   20 minutes ago      Up 20 minutes              0.0.0.0:8080->80/tcp                festive_noyce
7312ba07d942        mysql:5.7           "docker-entrypoint.s…"   26 minutes ago      Up 26 minutes              0.0.0.0:3306->3306/tcp, 33060/tcp   mysql

처음 실행했다가 종료된 컨테이너(exited)가 추가로 보여진다. 컨테이너는 종료되어도 삭제되지 않고 남아있는다. 종료된건 다시 시작할 수 있고 컨테이너의 읽기/쓰기 레이어는 그대로 존재한다. 명시적으로 삭제를 하면 깔끔하게 컨테이너가 제거된다

컨테이너 중지하기 : stop

실행중인 컨테이너를 중지하는 명령어이다

docker stop [options] CONTAINER [CONTAINER...]

옵션은 특별한게 없고 실행중인 컨테이너를 하나 또는 여러개(띄어쓰기로 구분)를 중지할 수 있다.

앞에서 실행한 ubuntu:16.04 컨테이너를 중지해보자. 중지하려면 컨테이너의 ID또는 이름을 입력하면 된다. ubuntu:16.04 컨테이너의 id를 ps명령어를 통해 확인하고 중지하자

도커 ID의 전체 길이는 64자리 입니다. 하지만 명령어의 인자로 전달할 때는 전부 입력하지 않아도 됩니다. 예를 들어 ID가 abcdefgh...라면 abcd만 입력해도 됩니다. 앞부분이 겹치지 않는다면 1-2자만 입력해도 됩니다.

컨테이너 제거하기 : rm

종료된 컨테이너를 완전히 제거하는 명령어이다

docker rm [options] CONTAINER [CONTAINER...]

종료도 stop과 마찬가지로 옵션에 특별한건 없다. 위 명령어를 실행하면 컨테이너만 말끔히 삭제되며 host os는 아무런 흔적도 남지않고 컨테이너만 격리된채 실행되다 삭제되는것이다.

중지된 컨테이너를 일일이 삭제하는 건 귀찮은 일이다. docker rm -v $(docker ps -a -q -f status=exited)명령어를 입력하면 중지된 컨테이너 id를 가져와서 한번에 삭제된다

이미지 목록 확인하기 : images

도커가 다운로드한 이미지 목록을 보는 명령어이다

docker images [options]repository[:tag]]

간단하게 도커 이미지 확인

REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
wordpress                      latest              420b971d0f8b        2 hours ago         546MB
dnstlr2933/docker101tutorial   latest              7f6bd44a94a7        24 hours ago        27.3MB
docker101tutorial              latest              7f6bd44a94a7        24 hours ago        27.3MB
<none>                         <none>              8375e3cde933        24 hours ago        85.5MB
<none>                         <none>              61b6564ffce1        24 hours ago        72MB
<none>                         <none>              401a4d257960        24 hours ago        224MB
mysql                          5.7                 ef08065b0a30        28 hours ago        448MB
python                         alpine              0f03316d4a27        2 days ago          42.7MB
redis                          latest              41de2cc0b30e        9 days ago          104MB
ubuntu                         16.04               4b22027ede29        3 weeks ago         127MB
ubuntu                         latest              4e2eef94cd6b        3 weeks ago         73.9MB
nginx                          alpine              6f715d38cfe0        4 weeks ago         22.1MB
node                           12-alpine           18f4bc975732        6 weeks ago         89.3MB
docker/getting-started         latest              1f32459ef038        8 weeks ago         26.8MB

이미지 주소와 태그, id, 생성시점, 용량을 확인할수 있다. 이미지가 너무 많이 쌓이면 용량을 차지하므로 사용하지 않는 이미지는 지우는것이 좋다

이미지 다운로드하기 : pull

이미지 다운로드하는 명령어이다

docker pull [options] NAME[:TAG|@DIGEST]

ex) ubuntu:14.04 다운받기
docker pull ubuntu:14.04

run명령어를 입력하면 이미지가 없을때 자동으로 다운받으니 pull 명령어를 언제 쓰는지 궁금할수 있는데, pull은 최신버전으로 다시 다운받는다. 같은 태그지만 이미지가 업데이트 된 경우는 pull명령어를 통해 새로 다운받을수 있다

이미지 삭제하기 : rmi

다운받은 이미지를 삭제하는 명령어이다

docker rmi [options] IMAGE [IMAGE...]

images명령어를 통해 얻은 이미지 목록에서 이미지 id를 입력하면 삭제가 된다. 단 컨테이너가 실행중인 이미지는 삭제되지 않는다.

컨테이너 둘러보기

컨테이너 로그 보기 : logs

컨테이너가 정상적으로 동작하는지 확인하는 좋은 방법은 로그를 확인하는 것이다
로그 확인하는 명령어

docker logs [options] container

옵션 : -f, --tail

docker logs만 출력할 경우 실행한 모든 로그가 다 출력되므로 옵션을 통해 제어를 할수 있다

--tail옵션을 통해서 밑에서 3개의 로그만을 취할수 있다

docker logs --tail 3 [container]

172.17.0.1 - - [11/Sep/2020:11:07:28 +0000] "POST /wp-admin/admin-ajax.php HTTP/1.1" 200 512 "http://127.0.0.1:8080/wp-admin/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Whale/2.8.105.22 Safari/537.36"
172.17.0.1 - - [11/Sep/2020:11:08:51 +0000] "POST /wp-admin/admin-ajax.php HTTP/1.1" 200 512 "http://127.0.0.1:8080/wp-admin/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Whale/2.8.105.22 Safari/537.36"
172.17.0.1 - - [11/Sep/2020:11:09:52 +0000] "POST /wp-admin/admin-ajax.php HTTP/1.1" 200 512 "http://127.0.0.1:8080/wp-admin/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Whale/2.8.105.22 Safari/537.36"

-f옵션을 이용하면 실시한으로 찍히는 로그를 볼수 있다
docker logs -f [container]

종료를 위해선 ctrl + c키를 누르면된다

컨테이너 명령어 실행하기 : exec

컨테이너를 관리하다 보면 실행중인 컨테이너에 들어가보거나 컨테이너의 파일을 실행하고 싶을 때가 있다.

컨테이너 명령어를 실행하는 방법

docker exec [options] CONTAINER COMMAND [ARG...]

run 명령어와 유사해 보이는데, 차이는 run은 새로운 컨테이너를 만들어서 실행하고 exec는 실행중인 컨테이너에 명령어를 내리는 것이다

MySQL 컨테이너에 접속해보기

1) 안전하게 쉘로 완전한 권한을 얻고 실행하는 방식
docker exec -it mysql /bin/bash
mysql -uroot

2) 바로 mysql명령어를 실행하는 방식
docker exec -it mysql mysql -uroot

컨테이너 업데이트

컨테이너를 새로운 버전으로 업데이트 하는 과정을 알아보자

도커 컨테이너 업데이트

도커에서 컨테이너 업데이트만 하는것은 어렵지 않은데, 새 버전의 이미지를 다운(pull)받고 기존 컨테이너를 삭제(stop, rm)한 후 새 이미지를 기반으로 새 컨테이너를 실행(run)하면 된다.

단, 컨테이너를 삭제한다는 것은 컨테이너에서 생성된 파일이 사라진다는 뜻으로 데이터 베이스라면 그동안 쌓였던 모든 데이터가 사라진다는 것이고, 웹 어플리케이션이라면 그동안 사용자가 업로드한 이미지가 모두 사라진다는 것이다.

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

데이터 볼륨을 사용하는 방법중 호스트의 디렉토리를 마운트해서 사용하는 방법을 보자.
run 명령어에서 소개한 옵션중 -v옵션을 사용한다. mysql이라면 /var/lib/mysql디렉토리에 모든 데이터베이스 정보가 담기므로 호스트의 특정 디렉토리를 연결해 주면된다

#before
docker run -d -p 3306:3306 \
-e MYSQL_ALLOW_EMPTY_PASSWORD=true \
--name mysql \
mysql:5.7

#after
docker run -d -p 3306:3306 \
-e MYSQL_ALLOW_EMPTY_PASSWROD=true \
--name mysql \
-v /my/own/datadir:/var/lib/mysql \ # <- vlume mount
mysql:5.7

위의 예시에서는 호스트이 /my/won/datadir디렉토리를 컨테인의 /var/lib/mysql디렉토리로 마운트했다. 이제 데이터베이스 파일은 호스트의 /my/won/datadir 디렉토리에 저장되고 컨테이너를 삭제해도 데이터는 사라지지 않는다. 최신 버전의 MySql이미지를 다운받고 다시 컨테이너를 실행할때 동일한 디렉토리를 마운트하면 그대로 데이터를 사용할수 있는것이다.

Docker Compose

지금까지 도커를 커맨드라인에서 명령어로 작업했다. 이런 간단하고 단순 작업이라면 괜찮지만 컨테이너 조합이 많아지고 여러가지 설정이 추가되면 명령어가 복잡해진다

도커는 복잡한 설정을 쉽게 관리하기 위해 YAML방식의 설정파일을 이용한 Docker Compose라는 툴을 제공한다. 깊게 파고들면 은근 기능이 많고 복잡하므로 가볍게만 보자

설치하기

docker for mac으로 설치했다면 자동으로 설치가 된다

Docker Compose 이용해서 Wordpress만들기

먼저 빈디렉토리를 하나 만들고 docker-compose.yml파일을 만들어 설정을 입력한다.

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:

파일에 위 코드를 치고 docker-compose up명령어를 치면 워드프레스가 설치된다

profile
내꿈은 숲속의잠자는공주

0개의 댓글