가상화/Docker

Docker (#2-wordpress, Docker Volume)

bxmsta9ram 2021. 9. 23. 14:06

Docker (#1)에서 안 되었던 것들을 T tar 파일을 통해 컨테이너를 재설치

그리고, 그 이후부터 MariaDB, wordpress를 다뤄보자.

추석연휴.PDF
8.01MB

 

 

 

 

 

## SQL 설치 / OWN 클라우드 ##

## 도커 우분투 컨테이너에서 apt-get으로 vi 편집기를 설치해주자.

apt-get install vim

apt-get update

만약 apt-get으로 설치가 되지 않는다면, /etc/resolv.conf를 다음과 같이 수정한다.

# Generated by NetworkManager
search KEDU603
nameserver 168.126.63.1
nameserver 8.8.8.8

mysql -u root -p

1111,, 찾을 수 없다고 오류가 뜬다.

 

cd /etc/init.d

ls

경로에는 나타나는데 없다고 나옴...!

 

 

## MaridDB를 다시 설치해보자.

apt install mariadb-server

 

service mysql start


## 데이터베이스 만들기.

mysql -u root -p

하... 죽어도 안들어가진다. service mysql start 명령어도 안먹힘.





## 이도저도 안된다... T PC와 마운트 후 이미지 및 컨테이너 생성 ##

docker images

docker rmi 

docker rmi 2752c51c3a13

docker rmi fb52e22af1b0

 

docker ps -a

docker container prune

이미지랑 컨테이너 싹~ 다 날려버리기.


## T PC 마운트

yum -y install samba-client

mkdir /mnt

mount -t cifs //10.6.3.100/Docker /mnt -o username=root -o password=1234

 

 

## 마운트가 완료되었으면 아래와 같이 진행한다.

mkdir /temp

cd /temp

cp /mnt/ubuntu_owncloud.tar /temp

 

 

## T의 tar 파일을 가져다가 이미지 로드

docker load -i ubuntu_owncloud.tar

docker images

새로 생성된 것이 보인다.

 

 

## 로드한 이미지를 가지고 컨테이너 생성을 해보자. // -i와 -t의 합이 -it이다.

docker run -it --name owncloud -p 80:80 ubuntu_owncloud:20.04

컨테이너 생성 및 컨테이너로의 접속이 완료되었다 !!

 

## 틈새시장으로 MariaDB 접속 되는지 확인해보기 ㅋㅋ

mysql -u root -p

잘 된다!! 다시 빠져나오기.


## 새롭게 생성된 컨테이너 내에서 접속이 되는지 확인해보기.

service apache2 start

 

Host PC]

http://10.10.32.81/owncloud

^^.. 신뢰할 수 없는 도메인으로 서버에 접근하고 있다고 뜬다.

 

Docker]

vi /etc/hostname

 

 

 

vi /var/www/owncloud/config/config.php

이게 문제였음!! ㅋㅋ

 

 

service apache2 stop

service apache2 start


Host PC]

http://10.10.32.81/owncloud

정상적으로 접속되었다!! 아오


## 현재 컨테이너를 mycloud:20.04로 commit 하시오. (이미지 생성)

// 컨테이너 빠져나오기

exit

exit

 

docker ps -a

docker commit -a "bxmsta" -m "my first commit" owncloud mycloud:20.04

// m 옵션은 부가 설명임. 부가 설명이 끝난 뒤에 컨테이너 이름인 owncloud, 그리고 생성할 이름 mycloud:20.04

 

## Commit한 이미지를 mycloud.tar로 추출하시오.

docker save -o mycloud.tar mycloud:20.04

// 추출할 파일명을 임의로 mycloud.tar ,, 그리고 이미지 명인 mycloud:20.04

// 이제 이 이미지를 가지고 이미지로드 및 컨테이너 생성이 가능함.

 

 

## 현재 컨테이너 있는 것을 지워보자.

docker rmi ubuntu_owncloud:20.04

 


## 컨이터 애플리케이션 구축 ##

이번에는 데이터베이스와 워드프레스 웹 서버 컨테이너를 연동해서 워드프레스 기반 블로그 서비스를 만들어보자.

다음과 같이 두개의 컨테이너를 만든다.
전자는 db서버, 후자는 웹서버이다.  이 두대의 서버 즉, 컨테이너를 연동하여 웹페이지에 띄워보자.

 

// 우리가 이전까지 사용했던 컨테이너는 웹서버와 디비서버를 같이 사용했었음. (아파치 + MariaDB)

// 하지만 이제는 Web Server 역할을 하는 컨테이너 1개 + DB Server 역할을 하는 컨테이너 1개를 따로 2개 만들어서

   사용할 것임.

 

## DB Server

docker run -d --name wordpressdb -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress mysql:5.7

 

docker run -d --name wordpress --link wordpressdb:mysql -p 80 wordpress

// 첫번째 명령어의 wordpressdb와 두번째 명령어의 wordpressdb:mysql 을 통해 link 하고 연동하는 것임.


// 미리 준비된 wordpress 이미지를 이용해, wordpress Web Server 컨테이너를 생성한다.

   -p 옵션에서 80을 입력했으므로, 호스트의 포트 중 하나와 컨테이너의 80번 포트가 연결된다.

   docker ps 명령어로 호스트의 어느 포트와 연결되었는지 확인한다.

-d : Detached 모드로 컨테이너를 실행한다. (지금까지는 attach를 통해서 포그라운드로 접근하였던 것을 생각하자!!)

      다시 말해서 백그라운드에서 실행하도록 설정한다.

-e : 컨테이너 내부의 환경변수를 설정한다.

--link : 컨테이너의 내부 IP를 알 필요 없이 항상 별명(alias)으로 접근 가능하도록 설정한다.

 

docker run 명령어에서 연결 옵션은 --link <컨테이너 이름>:<별칭> 형식이다.

컨테이너 안에서 다른 컨테이너에 접속할 때는 <별칭>:<포트 번호> 형식으로 사용한다.

 

docker ps -a

docker port wordpress


Host PC]

http://10.10.32.81:49153

이렇게 wordpress를 통해서 Web Server와 DB Server를 따로 만들 수 있다. wordpress 사용법을 우리가 굳이 알 필요가 없음. 우리는 이 2개를 link 옵션을 통해서 엮을 수만 있으면 된다. wordpress는 책 1권이 따로 나오므로 따로 공부.


## 다음 실습을 위해서 컨테이너 전부 제거하기.

docker container prune

docker rm -fv wordpress

docker rm -fv wordpressdb


## -d 옵션은 무엇인가? ##

## -d 옵션을 사용하여 입출력이 없는 상태로 컨테이너를 실행해보자.

docker run -d --name detach_test ubuntu:14.04

docker start로 컨테이너를 시작해도, 컨테이너 내부에 터미널을 차지하는 포그라운드로써 동작하는 프로그램이 없으므로 컨테이너는 시작 X

 

// 한번 확인해보자.

docker start detach_test

docker ps -a

 

 

## 그렇다면 -it 옵션을 사용하여 mysql 컨테이너를 생성하면 어떻게 될 것인가?

docker run -it --name mysql_attach_test -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress mysql:5.7

터미널 나가기 해야지만 나가진다.

// 이 상태에서 아무 반응이 없다!! 하나의 터미널을 차지하는 mysql 프로그램이 포그라운드로 실행된 로그를 볼 수

   있다. mysql 이미지가 시작될 때  mysqld가 동작하도록 설정되어 있기 때문이다. 이 상태에서는 상호 입출력이 불가    하고, 단순히 프로그램이 포그라운드로 동작하는 것만 지켜볼 수 밖에 없다. 이 같은 이유로 -d 옵션을 사용하여

  컨테이너가 백그라운드로 동작하게 하는 것이다.

  컨테이너는 각기 하나의 모니터를 기본적으로 가지고 있다.  여러 개의 터미널을 열어 동일한 컨테이너에 동시에

  attach해 보면 바로 알 수 있다.

 

 

docker ps -a

docker attach mysql_attach_test

// 아무 반응이 없고 attach 하는 상황만 나오게 된다. Cntl+Shift+p+q로 종료

종료.

 

 

## CentOS7 설치

docker run -it --name mycentos centos:7

 

docker ps -a


## 새로운 터미널을 1개 더 열고, 창 2개에서 1개의 컨테이너에 접속해보기.

docker start mycentos

docker attach mycentos

1개의 터미널에서 명령어나 글을 작성하면 다른 터미널에서도 똑같이 따라 쓴다 ㅋㅋㅋ 모니터가 1개이기 때문에 그렇다고 함.


## 도커 볼륨 ##

도커 이미지로 컨테이너를 생성하면, 이미지는 읽기 전용이 되며 컨테이너의 변경 사항만 별도로 컨테이너에 쌓인다.

따라서 mysql 컨테이너를 삭제하면 컨테이너 계층에 저장되어 있던 DB 정보도 함께 삭제된다.

이를 방지하기 위한 방법 중 하나가 볼륨을 활용하는 것이다.

 

볼륨은 -v 옵션을 주고 사용하면 된다!!

 

## 1) 호스트 볼륨 공유 : CentOS의 특정한 디렉토리를 공유

    2), 3) : 볼륨을 따로 만들어서 볼륨을 공유

 

1) 호스트 볼륨 공유

  mysql 데이터베이스 컨테이너와 워드프레스 웹 서버 컨테이너를 생성한다.

  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

 

  docker run -d --name wordpress_hostvolume --link wordpressdb_hostvolume:mysql -p 80 wordpress

정상적으로 생성 되었다.

 

docker port wordpress_hostvolume

 


// 49159 인 것을 확인. 49159로 접속할 수 있는지 확인해보자.

Host PC]

http://10.10.32.81:49159

접근이 가능하다!!


위에서 작성할 때 사용했던 -v 옵션 뒤의 내용은 호스트의 /home/wordpress_db 디렉토리와 컨테이너의 /var/lib/mysql 디렉토리를 공유한다는 뜻이다.  실제로 호스트에서 db 파일이 있는지 확인한다.

 

Docker1]

cd /home

ls

 

ls -l ./wordpress_db/

## 우리는 host에 이런 DB 파일을 만든 적이 없음!! 이 컨테이너 안에 있는 DB 정보가 백업이 된 것이다!!

    이렇게 되면, 컨테이너의 DB 정보를 잘못해서 지웠더라도 이 곳에서 복구가 가능하다!!

 

 

 

## 컨테이너를 삭제하여 실제 DB 파일이 보존되는지 확인해 본다!!

docker stop wordpress_hostvolume wordpressdb_hostvolume

docker rm wordpress_hostvolume wordpressdb_hostvolume

 

## /home/wordpress_db 디렉토리를 확인하면 컨테이너가 사용한 데이터가 그대로 남아 있는 것을 확인할 수

   있다. 결과적으로 컨테이너의 파일이 호스트로 복사된 것이다!! 

   ==> 그렇다면 호스트에 이미 디렉토리와 파일이 존재하고 컨테이너에도 존재할 때 두 디렉토리를 공유하면

          어떻게 될까? 호스트의 볼륨을 공유하면 컨테이너의 디렉토리 자체가 덮어 씌워진다. 다시 말해서

          -v 옵션을 통한 호스트 볼륨 공유는 호스트의 디렉토리를 컨테이너의 디렉토리에 마운트한다.

컨테이너의 특정 디렉토리와 마운트 된 효과와 마찬가지다!! DB 파일들이 그대로 남아있는 것을 확인할 수 있다.

 

## 지금은 호스트볼륨을 공유해서 사용했는데, DB와 스토리지를 따로 만들어서 한 곳은 저장 용도로만 사용할 수 있다.


## 2. 볼륨 컨테이너 ##

// -v 옵션으로 볼륨을 사용하는 컨테이너를 다른 컨테이너를 생성할 때 --volumes-from 옵션을 설정하면 

   -v 또는 --volume 옵션을 적용한 컨테이너의 볼륨 디렉토리를 공유할 수 있다.

 

 

## 3. 도커 볼륨 ##

## 도커 자체에서 제공하는 볼륨 기능을 사용하는 것이다.

docker volume create --name myvolume

// 도커 볼륨을 제거할 때는 docker volume ls -> docker volume rm ID 

 

// 이 볼륨은 로컬 호스트에 저장되며, 도커 엔진에 의해 생성 및 삭제된다. 다른 명령어를 입력하여 myvolume 이라는

   볼륨을 사용하는 컨테이너를 다음과 같은 형식으로 생성한다.

   [볼륨의 이름]:[컨테이너의 공유 디렉토리]

 

// 아래 예시에서 생성되는 컨테이너는 볼륨을 컨테이너의 /root/ 디렉토리에 마운트 하므로, /root 디렉토리에 파일을

   쓰면 해당 파일이 볼륨에 저장된다.

docker run -i -t --name myvolume_1 -v myvolume:/root/ ubuntu:14.04 echo

 

 

Docker]

docker volume create --name myvolume

docker volume ls

 

 

// 컨테이너 만들기 : 볼륨 컨테이너를 컨테이너 내의 /root 디렉토리에 마운트하겠다

docker run -i -t --name myvolume_1 -v myvolume:/root/ ubuntu:14.04

 

 

// root의 볼륨으로 출력하라.

echo hello, volume~! >> /root/volume


## 터미널을 새로 열어 같은 볼륨을 사용하여 또 다른 컨테이너를 생성한 후, /root /를 확인해 본다.

터미널2]

docker run -i -t --name myvolume_2 -v myvolume:/root/ ubuntu:14.04


## 참고로 도커 볼륨은 16진수 난수로 /var/lib/docker/volume에 기록된다. (CentOS)

ls /var/lib/docker/volume


## 다음 명령어로 myvolume 볼륨이 어디에 저장되어 있는지 알 수 있다.

docker inspect --type volume myvolume

 

// 한번 해당 경로로 가보기

cd /var/lib/docker/volumes/myvolume/_data

 



## 도커의 모든 명령어는 DOCKER 접두어 다음에 CONTAINER, IMAGE, VOLUME 등을 명시한다.

 예컨대, docker container inspect, docker volume inspect는 각각 컨테이너와 볼륨의 정보를 출력해준다.

 

// -v 옵션을 사용한 도커 볼륨의 자동 생성

docker run -it --name volume_auto -v /root ubuntu:14.04

exit

docker volume ls

이름을 안 준 docker volume은 16진수 난수 이름으로 지정된다.

 

// 마운트 정보를 포함한 자동 생성 볼륨 확인

docker container inspect volume_auto

 

 

## 그렇다면 사용되지 않는 Volume 삭제하는 방법!!

docker volume prune

 

 

 

## 그렇다면 지금까지 우리가 Volume을 배운 이유는 ? ##

// 이처럼 컨테이너와 데이터를 구분하여 설계하는 방식을 stateless 하다고 한다. 반면에 stateful 방식은 지양하는

   것이 좋다. (나눠서 관리하는 것이 더 좋다!!)

 

 



 

 

 

 

 

 

## 과제 1. 기존 컨테이너와 이미지 볼륨을 모두 지운 뒤에 mycloud.tar파일을 로드하고, 새 볼륨             (ownload) 생성시 컨테이너 내의 '/var/www/owncloud/data'가  ownvolume을 사용하도록               설계하시오. ##

CentOS2(STG2)를 Storage로 만들어서 해보기.

1) 볼륨을 만든다.

2) 마운트를 시킨다.

3) 컨테이너를 만든다.

 

 

Docker1]

## 랜카드 추가

첫번째 - 브릿지, 두번째 - VMnet 2번

 

## nfs-server로 주고 받으려고 IP 설정을 다시 해줬음.

랜카드 2개를 달아서 주고 받았고, .101, .104 설정 그대로   해주기 위해서 IP 설정

 

ifconfig ens34 192.168.1.101 netmask 255.255.255.0 broadcast 192.168.1.255


STG2] - 그냥 CUI 모드인 STG를 사용하려 했는데, 기존에 KVM 실습때

  사용했던 Virtual Machine이라서 오류가 잦아 새로 만들었음. 이번엔 GUI로!

## Virtual Machine 새로 만들고, Docker1과 마찬가지로 랜카드 1개 추가 (1번째 - 브릿지 // 2번째 - VMnet2번)

ens32는 켬 그대로, ens33은 수동으로 IP 할당 및 이름은 Docker_STG로 설정.

 

 

## Docker1와는 다르게 설치때부터 192.168.1.104설정을 해주었기에 IP 할당은 필요X, SELINUX 해제, 방화벽 해제

ifconfig

아까 설치때 ens33에 Static으로 192.168.1.104/24를 주었기에 IP가 할당되어 있는 모습이다.

systemctl stop firewalld

// 방화벽 끄기

 

vi /etc/sysconfig/selinux

setenforce 0

 

 

yum -y update

yum -y install nfs-utils

mkdir /stg

chmod 777 -R /stg

 

vi /etc/exports                         // 이건 nfs-server인 STG2에서만 하는 것이다.

     읽기 쓰기 허용하고 sync 해라. 옵션은 no_root_squash해라                192.168.1 네트워크에 서버로 두겠다)

systemctl restart nfs-server

 

systemctl start nfs-server

systemctl enable nfs-server

 


## 볼륨 생성하기!!

Docker1]

docker volume create --name stg

docker volume ls

stg라는 볼륨이 생긴것을 확인할 수 있다.

 

cd /var/lib/docker

ls

 

cd volumes

ls

 

cd stg

ls

 

cd _data

ls

이제 아무것도 뜨지 않는다!! 볼륨만 만들었기에 아무것도 없음. 

 

// 이 볼륨이 만들어진 상태에서(컨테이너는 아직 생성 X) 마운트를 하자.

yum -y update

yum -y install nfs-utils


## Ping Test

Docker1]

ping 192.168.1.104

핑이 잘 간다.

STG2]

ping 192.168.1.101

역시 핑이 잘 간다.


공통]

vi /etc/hosts

 

Docker1]

ping stg

 

STG2]

ping docker1

마찬가지로 핑이 잘 간다.


## 마운트하기 ##

Docker1]

systemctl start nfs-server

systemctl enable nfs-server

systemctl stop firewalld

vi /etc/sysconfig/selinux

setenforce 0

 

mount -t nfs stg:/stg /var/lib/docker/volumes/stg/_data

마운트가 안된다 ...!

// 만약 마운트가 안되면 볼륨 삭제 했다가 다시 볼륨 생성!!

// docker volume rm 

docker volume create --name stg

docker volume ls

 

STG2]

vi /etc/exports            // 이새끼가 문제였음 ㅡㅡ;;

systemctl restart nfs-server

systemctl enable nfs-server

systemctl stop firewalld

 

 

Docker1]

systemctl start nfs-server

mount -t nfs stg:/stg /var/lib/docker/volumes/stg/_data


## 기존의 이미지, 컨테이너 제거 및 새로운 컨테이너 생성 ##

Docker1]

cd /

docker ps -a

docker container prune

 

 

docker images

docker rmi ubuntu:14.04

docker rmi centos:7

docker rmi wordpress

docker rmi mysql:5.7

 

 

docker volume ls

docker volume rm 1434bc14ae295f89fea6fdea6d11e94f18ecff9ecda0af43e1654029bdc3653d

docker volume rm ce33371b1690a55e08508febcca366f9a031e824fe6196f4f7e1e19d638d5795

docker volume rm dba8c49afa45b304f5029885beb36978e9a5324b394ed7666f16e117e9ac1c14

 

 

## 여기서부터는 아까 수업 시작때의 과정인데 안해줘도 상관없는데 그냥 써줬음 ㅎㅎ

## T PC 마운트

yum -y install samba-client

mkdir /mnt

mount -t cifs //10.6.3.100/Docker /mnt -o username=root -o password=1234

 

 

## 마운트가 완료되었으면 아래와 같이 진행한다.

mkdir /temp

cd /temp

cp /mnt/ubuntu_owncloud.tar /temp

 

 

## T의 tar 파일을 가져다가 이미지 로드

docker load -i ubuntu_owncloud.tar

docker images

새로 생성된 것이 보인다.

 

## 로드한 이미지를 가지고 컨테이너 생성을 해보자. // -i와 -t의 합이 -it이다.

docker run -it --name owncloud -p 80:80 -v stg:/var/www/owncloud/data ubuntu_owncloud:20.04

 

echo /proc/sys/net/ipv4/ip_forward=1                ★★★★★ forwarding이 안되서 그런것임!!

systemctl restart network

shutdown -h now


systemctl start docker

docker container prune

docker run -it --name owncloud -p 80:80 -v stg:/var/www/owncloud/data ubuntu_owncloud:20.04

컨테이너 생성 및 컨테이너로의 접속이 완료되었다!!


## 자료 공유 확인 ##

STG2]

cd stg

ls -l

 

Docker1] - 여기서는 실제 저장공간이 아니라, Storage의 stg 디렉토리에

                있는 파일들을 보여주는 역할을 한다고 생각하면 된다!!

cd /var/lib/docker/volumes/stg/_data

ls -l

 

 

지금까지의 과정을 살펴보면 [볼룸 생성] - [마운트] - [컨테이너 생성]의 과정을 거쳤다.

만약 볼륨을 생성하기 이전에 컨테이너를 만들어버리면, 볼륨을 백업해야 하는 번거로움이 생기게 된다!! 휴!!