Docker (#2-wordpress, Docker Volume)
Docker (#1)에서 안 되었던 것들을 T tar 파일을 통해 컨테이너를 재설치
그리고, 그 이후부터 MariaDB, wordpress를 다뤄보자.




## SQL 설치 / OWN 클라우드 ##
## 도커 우분투 컨테이너에서 apt-get으로 vi 편집기를 설치해주자.
apt-get install vim
apt-get update
mysql -u root -p
cd /etc/init.d
ls
## MaridDB를 다시 설치해보자.
apt install mariadb-server
service mysql start
## 데이터베이스 만들기.
mysql -u root -p
## 이도저도 안된다... 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
## 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
## 다음 실습을 위해서 컨테이너 전부 제거하기.
docker container prune
docker rm -fv wordpress
docker rm -fv wordpressdb
## -d 옵션은 무엇인가? ##
## -d 옵션을 사용하여 입출력이 없는 상태로 컨테이너를 실행해보자.
docker run -d --name detach_test ubuntu:14.04
// 한번 확인해보자.
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
## 도커 볼륨 ##
도커 이미지로 컨테이너를 생성하면, 이미지는 읽기 전용이 되며 컨테이너의 변경 사항만 별도로 컨테이너에 쌓인다.
따라서 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와 스토리지를 따로 만들어서 한 곳은 저장 용도로만 사용할 수 있다.
## 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 container inspect volume_auto
## 그렇다면 사용되지 않는 Volume 삭제하는 방법!!
docker volume prune
## 그렇다면 지금까지 우리가 Volume을 배운 이유는 ? ##
// 이처럼 컨테이너와 데이터를 구분하여 설계하는 방식을 stateless 하다고 한다. 반면에 stateful 방식은 지양하는
것이 좋다. (나눠서 관리하는 것이 더 좋다!!)



## 과제 1. 기존 컨테이너와 이미지 볼륨을 모두 지운 뒤에 mycloud.tar파일을 로드하고, 새 볼륨 (ownload) 생성시 컨테이너 내의 '/var/www/owncloud/data'가 ownvolume을 사용하도록 설계하시오. ##
1) 볼륨을 만든다.
2) 마운트를 시킨다.
3) 컨테이너를 만든다.
Docker1]
## 랜카드 추가
## nfs-server로 주고 받으려고 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번)
## Docker1와는 다르게 설치때부터 192.168.1.104설정을 해주었기에 IP 할당은 필요X, SELINUX 해제, 방화벽 해제
ifconfig
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에서만 하는 것이다.
systemctl restart nfs-server
systemctl start nfs-server
systemctl enable nfs-server
## 볼륨 생성하기!!
Docker1]
docker volume create --name stg
docker volume ls
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
지금까지의 과정을 살펴보면 [볼룸 생성] - [마운트] - [컨테이너 생성]의 과정을 거쳤다.
만약 볼륨을 생성하기 이전에 컨테이너를 만들어버리면, 볼륨을 백업해야 하는 번거로움이 생기게 된다!! 휴!!

