# 웹서버 띄우기 with Docker
# 부제 - Docker를 이용한 APM (apache2 + php + mysql) 설치
# 우성이형의 조언으로, 약간의 속도 이득 보다는, 오랜 역사를 가지고 사용되어온 안정적인 APM으로 웹 서버용 docker container를 띄워보려한다.
# By Young Jin Kim in 2017.03.16
# Docker install
apt-get update
apt-get install docker
# Ubuntu container 띄우기
docker pull ubuntu
docker run -i -t -p 6116:22 -h <IMAGE ID> --name csgweb ubuntu
## run은 image를 container를 만드는 것이다.
## -i -t 는 -i(interactive), -t(Pseudo-tty) 옵션을 사용하면 실행된 Bash Shell에 입력 및 출력을 할 수 있습니다.
## 라고 하는데, 그냥 ssh를 사용하기 위해서는 이 옵션으로 run을 하면 된다.
## -h <IMAGE ID>는 접속 했을 때 영어로 길게 나오는 image id 를 입력해 줄 수 있다고 한다.
## --name <container name> 은 container 이름을 설정해 줄 수 있고 ,
## 옵션에 달려있지 않은 마지막 옵션은 어떤 이미지를 띄울지 알려주는 건데 아까 pull로 받았던 ubuntu를 입력해주면 된다.
## 이렇게 하면, sshd를 사용할 수 없다. (열심히 공부해봤으나, Dockerfile을 이용하지 않고서는 불가능 했다.)
## 첨부된 Dockerfile로 만들면 된다 그 후 실행은 다음과 같이 하면된다.
docker --rm -t sshd .
docker run -d -p 6116:22 -p 6117:80 -h csg.hanyang.ac.kr --name csgweb sshd
## 6116 포트는 ssh를 접속하기 위해, 6117은 웹서버를 접속하기 위한 port이다.
## 따라서 뒤에서 Listen과 함께 바꾸는 두 포트는 바꾸지 않아도 무방하다.
# Container에 접속하기.
## 사실 이미 run을 실행하면, 컨테이너에 접속해있다.
## 여기서 exit를 치면 나오면서 container가 자동으로 stop이 된다.
## 만약 서버를 위해 종료시키지 않고 나오고 싶다면, CTRL + P 를 누른 후 다시 CTRL + Q를 누르면 나와진다.
## 만약 이미 exit로 정지된 container를 다시 띄우고 싶다면,
## docker start <container name>을 하면되고
## container 이름을 까먹었다면
## docker ps -a
## 를 하면된다.
## 이미 띄워져 있는 container에 다시 들어가고싶다면,
## docker attach <container name>
# Ubuntu container에서 APM 설치
apt-get update
## apt-get을 최신 버전으로 업데이트
apt-get install apache2
## apache를 2버전으로 깐다 (언제 버전이 바뀔지 모름)
apt-get install libapache2-mod-php
## php의 최신 버전은 자주 바뀐다. 알아서 최신 버전으로 깔아준다. 이 글이 쓰여진 시점에는 php7.0을 깔아주었다.
vi /var/www/html/index.php
## 이를 통해 다음의 내용을 담고 있는 index.php 파일을 만들어 준다.
## vi 사용법 정도는... 스스로... 구글에 검색해보면 나옵니당. 하지만 이 글을 읽는다면 이미 알겠쥬?
<?php
echo "Hello CSG World.";
?>
## 작성이 잘 되어있는지 확인하기 위해서는 다음과 같이 입력해본다.
cat /var/www/html/index.php
apt-get install mysql-server mysql-client
## Mysql 설치하기. 알아서 버전을 찾아서 설치해주는 것 같다.
## 도커에서 설치할 때 root에 비번이 설정이 되어있지 않아서 설정해주는 듯 하다. 우리는 와이파이비번으로.
apt-get -y install php7.0-mysql php7.0-curl php7.0-gd php7.0-intl php-pear php-imagick php7.0-imap php7.0-mcrypt php-memcache php7.0-pspell php7.0-recode php7.0-sqlite3 php7.0-tidy php7.0-xmlrpc php7.0-xsl php7.0-mbstring php-gettext
## php와 mysql등 다양한 서비스를 연동하기 위해 이것 저것을 깔아주는 단계
## 아마 7.0기준으로 되어있으니, 버전이 달라진다면 여기도 달라지겠죠..?
/etc/init.d/apache2 restart
## apache2를 재시작 하면, 서버 이름이 없다는 느낌의 경고문구가 나온다. 해결방법은 아마 서버 이름을 설정해주면 될 듯?
apt-get install phpmyadmin
## phpmyadmin이라는 것을 설치한다.
## 마지막에 Configure database for phpmyadmin with dbconfig-commmon?라고 물어볼 때
## 쿨하게 No라고 대답해준다.
vi /etc/apache2/apache2.conf
## 위의 파일 가장 끝에 다음의 내용을 추가해주었다.
# Insert by Young Jin Kim 2017.03.16
# Enable PhpMyAdmin
Include /etc/phpmyadmin/apache.conf
## 확인하고 싶다면 다음같이 입력을 해보자.
tail /etc/apache2/apache2.conf
/etc/init.d/apache2 restart
## apache2를 재시작 하면, 서버 이름이 없다는 느낌의 경고문구가 나온다. 해결방법은 아마 서버 이름을 설정해주면 될 듯?
vi /etc/apache2/sites-available/000-default.conf
## 여기서 <VirtualHost *:80> 에서 80에 해당하는 부분이 container 내부의 port이다. 이게 docker에서 건네주는 포트와 맞으면 된다.
vi /etc/apache2/ports.conf
## 마찬가지로 여기서도 Listen 80에 해당하는 부분을 맞춰주자.
## 위의 두 부분 모두 docker ps를 하면 보이는 PORTS 부분에 0.0.0.0:6116->22/tcp 여기서 22/tcp의 숫자 부분과 같으면 된다.
/etc/init.d/apache2 restart
## 다시 restart를 하자!
## 이제 server의 아이피주소 + :port 를 하면 아마도 index.html로 들어가 질 것 이다.
## 끝에 /index.php로 들어가면 Hello world를 볼 수 있다!~
# 만들어 놓은 Docker container를 image로 저장하기
docker commit -a "CSG Y.J. KIM <kimyoungjin06@gmail.com>" -m "test" csgweb csgweb:0.2
## commit 명령어가 현재 띄워져 있는 container를 저장하는 명령어이다.
## -a 는 뒤에 올 "CSG ~"가 편집자라는 뜻이고,
## -m 은 "test" 라는 메시지를 붙이는 것이다.
## 두 옵션을 빼면
## docker commit <option..> <container name> <image name>:<version>
## 이 양식이다.
## 이제 저장된 image를 확인하고 싶다면 다음과 같이 하면 된다.
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
csgweb 0.2 7bf69b38fcdf 8 seconds ago 1.134 GB
## 이전에 백업해놓은 이미지를 지우고 싶다면 docker rmi <image name>을 하면 된다.
# 이후 만들어 놓은 image로 다시 docker를 띄웠을 때는?
docker run -i -t -p 6116:22 -p 6117:80 -h csg_web --name csgweb ubuntu
# Docker container가 꺼졌을 때는?
docker start csgweb
## 이제 container에 들어가기
docker attach csgweb
## 나올 때는 (CTRL + P) + (CTRL + Q)
## 또는 docker-enter csgweb
## 이렇게 들어갔을 때는, 그냥 exit로 나오면 된다.
## 단 git에서 특정한 패키지를 받아야만 된다.
## 이제 csgweb에서 root로 로그인 한 뒤에 apache2를 재시작한다.
/etc/init.d/apache2 restart
# DB서버란? 아직까지는 필요없지만, 혹시라도 사용자가 늘어난다면 다음 글을 참고하여라
https://blog.lael.be/post/1866
# Docker 기본명령어가 궁금하다면 다음 글을 참고하여라.
http://pyrasis.com/Docker/Docker-HOWTO#commit
# 이 과정을 단순히 하고 싶다면 Docker build file 을 만들어 보자!
http://www.yongbok.net/blog/how-to-running-an-ssh-services-in-a-docker-container/
# 이 이미지를 git hub과 연동시키기.
## 추가할 예정