도커 스터디 2일차(컨테이너 외부노출 등)

MINK·2023년 3월 22일
0

Docker

목록 보기
1/5

2.2.4 컨테이너를 외부에 도출

  • 컨테이너 웹 서버 설치 중 오류
root@87d270ead910:/# apt-get update
root@87d270ead910:/# apt-get install apache2 -y
root@87d270ead910:/# service apache2 start
 * Starting web server apache2                                                                                                                                                                              
 AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
 *
 # 보시는 바와 같이 서버이름을 설정해주지 않아서 오류가 발생합니다.
  • 아래와 같이 서버이름을 설정해주시면 해결!
grep ServerName /etc/apache2/apache2.conf
echo "ServerName localhost" >> /etc/apache2/apache2.conf
grep ServerName /etc/apache2/apache2.conf
service apache2 restart

참고사이트

https://zetawiki.com/wiki/%EC%9A%B0%EB%B6%84%ED%88%AC_apache2:_Could_not_reliably_determine_the_server%27s_fully_qualified_domain_name

브라우저로 아파치 웹 서버에 접속

호스트 IP의 80번 포트로 접근 -> 80번 포트는 컨테이너의 80번 포트로 포워딩 -> 웹 서버 접근


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

  • 애플리케이션을 하나 혹은 분리된 애플리케이션 컨테이너로 구성
  • 데이터베이스와 워드프레스 웹 서버 컨테이너를 연동해 워드프레스 기반 블로그 서비스를 만들기
  • -e
    • 컨테이너 내에서 사용할 환경 변수를 설정
    • 보통 설정 값이나 비밀번호를 전달할 때 사용
## 1. mysql 이미지를 사용해 데이터베이스 컨테이너
# http://127.0.0.1:52389/ -> 
PS C:\Users\Playdata># docker run -d --name wordpressdb -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress mysql:5.7
9ce9c6cddcc591a12085c3f902bf116f7d36e3a5d02379fc8eaf56ada925ddd4

## 2. 미리 준비된 워드프레스 이미지를 이용해 워드프레스 웹 서버 컨테이너를 생성
# database Connect 에러가 뜬다면 -e WORDPRESS_DB_USER=root 작성
PS C:\Users\Playdata># docker run -d -e WORDPRESS_DB_HOST=mysql -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=password --name wordpress --link wordpressdb:mysql -p 80 wordpress
c120fa257d843ceb250972dd54d8c837a5f2602c23a8b0265f70d8e482467ea0
# wordpress 실행 에러
# docker: Error response from daemon: Cannot link to a non running container: /wordpressdb AS /wordpress/mysql.
# -> wordpressdb 실행 후 실행하기

# error establishing a database connection 해결방법
docker run -e WORDPRESS_DB_USER=root 작성

p.32

  • 호스트와 바인딩된 포트만 확인하려면 docker port 명령을 사용. wordpress라는 이름의 컨테이너가 사용 중인 호스트의 포트가 출력된 결과
C:\Users\mink>docker port wordpress
80/tcp -> 0.0.0.0:61735
  • -d : -i -t가 컨테이너 내부로 진입하도록 attach 가능한 상태로 설정한다면 -d는 Detached 모드로 컨테이너를 실행합니다. Detached 모드는 컨테이너를 백그라운드에서 동작하는 애플리케이션으로써 실행하도록 설정

--- 브라우저로 워드프레스 컨테이너에 접근 ---

  • 컨테이너 내부에서 프로그램을 실행하지 않은 채로 -d 옵션을 설정 ( 포그라운드로써 동작하는 프로그램이 없으므로 컨테이너 시작 불가)
# 컨테이너가 생성되고 종료된 상태
PS C:\Users\Playdata> docker run -d --name detach_test ubuntu:14.04
7c77ac6ece4e31b1f14d9863905d9c6ecbd469bf0d0681291393406e381a5379
PS C:\Users\Playdata> docker ps -a
CONTAINER ID   IMAGE          COMMAND             CREATED             STATUS          PORTS           NAMES
7c77ac6ece4e   ubuntu:14.04   "/bin/bash"        14 seconds ago      Exited (0) 12 seconds ago     detach_test
  • 하나의 터미널을 차지하는 mysqld프로그램이 포그라운드로 실행된 로그를 볼 수 있음.
docker run -i -t --name mysql_attach_test -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress mysql:5.7
# exec 명령어를 사용하면 컨테이너 내부에서 명령어를 실행한 뒤 그 결과값을 반환받을 수 있음
# -i -t 옵션을 추가해 /bin/bash를 상호 입출력이 가능한 형태로 exec 명령어를 사용
PS C:\Users\Playdata> docker exec -i -t wordpressdb /bin/bash
root@9ce9c6cddcc5:/# echo $MYSQL_ROOT_PASSWORD
password

# 설정된 환경변수가 실제로  MYSQL에 사용됐는지 확인 
# mysql -u root -p (password)
root@9ce9c6cddcc5:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.37 MySQL Community Server (GPL)

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
# 실행됨
  • --link : A컨테이너에서 B컨테이너로 접근하는 방법 중 가장 간단한 것은 NAT로 할당받은 내부 IP를 쓰는 것이다.
# wordpress wordpressdb를 둘 다 죽임
PS C:\Users\Playdata> docker stop wordpress wordpressdb
wordpress
wordpressdb

# 이유 : 컨테이너를 연결해주는 link는 실행 순서의 의존성도 정의해줌
PS C:\Users\Playdata> docker start wordpress
Error response from daemon: Cannot link to a non running container: /wordpressdb AS /wordpress/mysql
Error: failed to start containers: wordpress
  • 이처럼 link 옵션은 컨테이너 간에 이름으로 서로를 찾을 수 있게 도와준다.

2.2.6 도커 볼륨

  • 도커 이미지로 컨테이너를 생성하면 이미지는 읽기 전용이 되며 컨테이너의 변경 사항만 별도로 저장. 각 컨테이너의 정보를 보존

  • 이미 생성된 이미지는 어떠한 경우로도 변경되지 않으며, 컨테이너 계층에 원래 이미지에서 변경된 파일시스템 등을 저장.

  • 이미지에 mysql을 실행하는데 필요한 애플리케이션 파일이 들어있다면 데이터베이스를 운용하면서 쌓이는 데이터가 저장

단점

  • mysql 컨테이너를 삭제하면 컨테이너 계층에 저장돼있던 데이터베이스의 정보도 삭제된다
    • 방지방법
      • 볼륨
        • 호스트와 볼륨을 공유, 볼륨 컨테이너 활용, 도커가 관리하는 볼륨을 생성

2.2.6.1 호스트 볼륨 공유

# mysql 데이터베이스 컨테이너 생성
# -v 옵션 : [호스트의 공유 디렉토리]:[컨테이너의 공유 디렉토리] 형태
# /var/lib/mysql 디렉터리는 MYSQL이 데이터베이스의 데이터를 저장하는 기본 디렉토리
PS C:\Users\Playdata> #docker run -d --name wordpressdb_hostvolume -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress -v /home/wordpress_db:/var/lib/mysql mysql:5.7
2d2bd512e0082c534e78089c5ebdc3c56f88c225c1a22954c5c1cee1def1adc0


# 워드프레스 웹 서버 컨테이너 생성
# -p 옵션으로 컨테이너의 80포트를 외부로 노출
PS C:\Users\Playdata> #docker run -d -e WORDPRESS_DB_PASSWORD=password --name wordpress_hostvolume --link wordpressdb_hostvolume:mysql -p 80 wordpress
c70ba9c91d706e40939d44499b50c46cd313f3b6260445a115da951c2c691a8c
  • 워드프레스 컨테이너에 -p 옵션으로 컨테이너의 80 포트를 외부에 노출했으므로 docker ps 명령어에서 확인한 wordpress_hostvolume 컨테이너의 호스트 포트로 워드프레스 컨테이너에 접속

  • -v 옵션 : [호스트의 공유 디렉토리]:[컨테이너의 공유 디렉토리] 형태

# 호스트에 이미 디렉터리와 파일이 존재하고 컨테이너에도 존재할 때 두 디렉터리를 공유하는 경우는?
# alicek106/volume_test 이미지활용
PS C:\> docker run -i -t --name volume_dummy alicek106/volume_test
Unable to find image 'alicek106/volume_test:latest' locally
latest: Pulling from alicek106/volume_test
56eb14001ceb: Pull complete
7ff49c327d83: Pull complete
6e532f87f96d: Pull complete
3ce63537e70c: Pull complete
587f7dba3172: Pull complete
Digest: sha256:e0287b5cfd550b270e4243344093994b7b1df07112b4661c1bf324d9ac9c04aa
Status: Downloaded newer image for alicek106/volume_test:latest

# /home/testdir_2/test 파일 존재확인
root@66ba8cf2b24a:/# ls /home/testdir_2/
test

# -v 옵션의 값인  /home/wordpress_db:/home/testdir_2 디렉터리를 확인하면 원래 존재했던 test파일이 없어지고
# 호스트에서 공유된 파일이 존재
# 정리 : -v 옵션을 통한 호스트 볼륨 공유는 호스트의 디렉터리를 컨테이너의 디렉터리에 마운트
PS C:\> docker run -i -t --name volume_overide -v /home/wordpress_db:/home/testdir_2 alicek106/volume_test
root@d13b9d4aa93e:/# ls /home/testdir_2/
auto.cnf    ca.pem           client-key.pem  ib_logfile0  ibdata1  performance_schema  public_key.pem   server-key.pem  wordpress
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile1  mysql    private_key.pem     server-cert.pem  sys

# 태그를 지정하지 않았는데 이미지가 pull된 것은 이미지의 태그를 지정하지 않으면
# 도커 엔진이 latest 태그로 지정된 이미지를 pull하기 때문

2.2.6.2 볼륨 컨테이너

# -v 옵션으로 볼륨을 사용하는 컨테이너를 다른 컨테이너와 공유하는 것
# --volumes-from 옵션을 설정하면 -v 또는 --volume 옵션을 적용한 컨테이너의 볼륨 디렉터리를 공유
# 그러나 직접 볼륨 공유하는 것이 아닌 -v 옵션을 적용한 컨테이너 공유
# 앞에서 생성한 volume_overide 컨테이너에서 볼륨을 공유받는 경우
PS C:\> docker run -i -t --name volumes_from_container --volumes-from volume_overide ubuntu:14.04
root@bad4d8daee94:/# ls /home/testdir_2/
auto.cnf    ca.pem           client-key.pem  ib_logfile0  ibdata1  performance_schema  public_key.pem   server-key.pem  wordpress
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile1  mysql    private_key.pem     server-cert.pem  sys
  • --volumes-form 옵션을 적용한 컨테이너와 볼륨 컨테이너 사이의 관계

볼륨 컨테이너의 구조

  • 이러한 구조를 활용하면 호스트에서 볼륨만 공유하고 별도의 역할을 담당하지 않는 일명 '볼륨 컨테이너' 로서 활용가능
  • 볼륨을 사용하려는 컨테이너에 -v 옵션 대신 --volume-from 옵션을 사용
  • 볼륨 컨테이너에 연결해 데이터를 간접적으로 공유받음

2.2.6.3 도커 볼륨

  • docker volume 명령어 사용

  • 이전 방식과 달리 도커 자체에서 제공하는 볼륨 기능 활용하여 데이터 보존

    # create 명령어로 볼륨 생성
    PS C:\> docker volume create --name myvolume
    myvolume
    
    # 볼륨 확인
    # 여기서는 기본적으로 제공되는 드라이버 local사용
    # **( 볼륨을 생성할 때 플러그인 드라이버를 설정해 여러 종류 스토리지 백엔드 가능)
    # 이 볼륨은 로컬 호스트에 저장되며 도커 엔진에 의해 생성되고 삭제
    PS C:\> docker volume ls
    DRIVER    VOLUME NAME
    local     myvolume
    
    
    # [볼륨의 이름]:[컨테이너의 공유 디렉토리]
    # /root/ 디렉터리에 마운트하므로 /root 디렉터리에 파일을 쓰면 해당 파일이 볼륨에 저장
    PS C:\> docker run -i -t --name myvolume_1 -v myvolume:/root/ ubuntu:14.04
    root@a590ba5d873b:/# echo hello, volume! >> /root/volume
    
    # /root 디렉터리에 volume 파일 생성.
    # 다른 컨테이너도 myvolume 볼륨을 쓰면 볼륨을 활용한 디렉터리에 volume 파일 존재.
    # 파일 생성확인
    PS C:\> docker run -i -t --name myvolume_2 -v myvolume:/root/ ubuntu:14.04
    root@ab8199ba21f6:/# cat /root/volume
    hello, volume!

도커 볼륨 사용 구조

  • 볼륨은 디렉토리 하나에 상응하는 단위로서 도커 엔진이 관리.
  • 도커 볼륨도 호스트 볼륨 공유와 마찬가지로 호스트에 저장함으로써 데이터를 보존하지만 파일이 실제로 어디에 저장되는지 사용자는 알 필요없음
# docker inspect를 사용하면 볼륨이 실제로 어디 저장되었는지 확인가능
# 컨테이너, 이미지, 볼륨 등 도커의 모든 구성 단위의 정보 확인할때 사용
# --type 옵션 : image, volume 등을 입력해야 좋게 명시됨

PS C:\> docker inspect --type volume myvolume
[
    {
        "CreatedAt": "2022-03-03T15:01:05Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/myvolume/_data",
        "Name": "myvolume",
        "Options": {},
        "Scope": "local"
    }
]
# 도커의 모든 명령어는 docker 접두어 다음에 container, image, volume 등을 명시하고 특정 구성 단위를 제어하는 명령어 사용가능
# docker container inspect - 컨테이너 정보, docker volume inspect - 볼륨의 정보
# Drive는 볼륨이 쓰는 드라이버
# Label은 볼륨을 구분하는 라벨

# create를 별도로 쓰지않아도 -v 옵션을 입력해서 수행
# -v 옵션 : 볼륨을 자동 생성
# 도커 볼륨 이름을 지정해주지 않으면 무작위 16진수 형태인 볼륨이 자동 생성됨
PS C:\> docker run -i -t --name volume_auto -v /root ubuntu:14.04

PS C:\> docker volume ls
DRIVER    VOLUME NAME

local     f1e5bdae44b2ec3a089161c06d54c1d53ede8b73b1c8dd1775af696bf7eb0405
local     myvolume

# -v 옵션 대신 --mount 옵션을 사용할 수 있다. 두 옵션의 기능은 같지만, 볼륨의 정보를 나타내는 방법이 다르기 때문에 둘 중 사용하기 편한 옵션을 사용하면 된다.


# 사용되지 않는 볼륨을 한꺼번에 삭제하려면 docker volume prune 명령어를 사용
C:\Users\mink>docker volume prune

# 
profile
parkminkyu velog

0개의 댓글