Docker를 통한 OwnCloud 구축 방법
Docker 기본 명령어, 웹서비스 기본 설정 실습
docker 구동
root 사용자만 docker 를 구동할 수 있음
docker-compose.yml 파일의 내용은 참고
sudo -s systemctl status docker cd /home/myteam/mycloud vi docker-compose.yml docker-compose up -d
docker 컨테이너 생성 확인
- mycloud는 owncloud, mariadb, redis 3개의 서비스로 구성되어 있다.
- owncloud:80 포트는 127.0.0.1:60080 포트에 바인딩 되어, 이 포트를 통해 docker 인스턴스의 서비스에 접속할 수 있다.
- mariadb, redis는 docker 바깥과 연결되지 않고, owncloud 하고만 연결되어 있다.
# docker ps -a CONTAINER ID IMAGE PORTS NAMES 1a6b5e32e9c4 owncloud 0.0.0.0:60080->80/tcp mycloud_mycloud_1 b8b2b299fbda mariadb 3306/tcp mycloud_mariadb_1 98ee5371cdd8 redis:alpine 6379/tcp mycloud_redis_1 # netstat -anp | grep docker-proxy | grep LISTEN tcp6 0 0 :::60080 :::* LISTEN 12889/docker-proxy
docker 컨테이너에 bash 로그인 후 DB 설정 작업
docker 인스턴스는 특별한 설정 없이는 호스트머신과 통신이 격리되어 있다. 하지만 원격콘솔을 지원하여 특별한 작업을 수행할 수 있다.
# docker exec -it mycloud_mariadb_1 bash root@b8b2b299fbda:/# mysql -uroot -p MariaDB> CREATE DATABASE IF NOT EXISTS 데이터베이스이름; MariaDB> GRANT ALL PRIVILEGES ON owncloud.* TO '아이디'@'%' IDENTIFIED BY '암호'; MariaDB> exit; root@b8b2b299fbda:/# exit
docker 컨테이너 내부 IP 확인하기
owncloud 설정 시 MariaDB 서버의 IP가 필요하며, Docker 내부에서 할당한 IP를 입력해야 한다.
# docker inspect mycloud_mariadb_1 | grep IPAddress "IPAddress": "172.17.0.2",
(고급) docker기반 웹서비스에 SSL 프록시 적용
docker 데몬이 웹에 직접 노출되지 않게 SSL 프록시를 적용한다.
http://127.0.0.1:60080 웹서비스를 https://foobar.kreonet.net/owncloud 주소로 프록시 설정을 한다.
- owncloud 코드/설정파일에서 프록시 설정
- 웹서버 (apache or nginx)에서 프록시 설정
owncloud 설정파일에서 프록시 설정 # vi /home/myteam/mycloud/owncloud/config/config.php 'overwrite.cli.url' => 'https://foobar.kreonet.net', 'htaccess.RewriteBase' => '/', 'trusted_proxies' => ['IP_ADDR'], 'overwriteprotocol' => 'https', 'overwritewebroot' => '/owncloud', 'forcessl' => true, owncloud 설정파일 갱신 (.htaccess 파일 갱신) # docker exec -u www-data -it mycloud_mycloud_1 /var/www/html/occ maintenance:update:htaccess .htaccess has been updated 아파치 웹서버 SSL Reverse Proxy 설정 # vi /etc/httpd/conf.d/ssl.conf # grep -E 'ProxyPass|LISTEN' /etc/httpd/conf.d/ssl.conf LISTEN 443 ProxyPass /owncloud http://127.0.0.1:60080 ProxyPassReverse /owncloud http://127.0.0.1:60080 아파치 웹서버 재시작 # systemctl restart httpd
(고급) 내부 HTTP 포트를 SELinux에 추가
docker의 HTTP 서비스와 바인딩 된 호스트머신의 60080 포트를 SELinux에 추가한다.
# semanage port -l |grep http_port_t http_port_t tcp 80, 443 # semanage port -a -p tcp -t http_port_t 60080 # semanage port -l |grep http_port_t http_port_t tcp 80, 443, 60080
참고) https://www.lesstif.com/pages/viewpage.action?pageId=12943812
(고급) 웹서비스 방화벽 해제
호스트머신의 https 웹서비스 방화벽을 해제하여 외부접속을 허용한다.
# vi /etc/firewalld/zones/public.xml 다음 둘 중 하나 추가 <service name="https"/> <port protocol="tcp" port="443"/> # firewall-cmd --reload # firewall-cmd --list-all public (active) target: default services: ssh http https dhcpv6-client
(참고) docker 로그보기
docker logs --tail 50 --follow --timestamps mycloud_mycloud_1
(참고) docker-compose 설명
- links
- 연결된 다른 컨테이너의 정보를 기술한다
- 본 예제에서는 owncloud 와 mariadb, redis 컨테이너가 동일한 네트워크로 연동되었다
- ports
- 컨테이너가 외부와 통신하기 위해, 컨테이너의 포트와 호스트머신의 포트를 연동한다.
- 본 예제에서는 127.0.0.1:60080 포트가 owncloud:80 포트와 연동되었다
- volumes
- 컨테이너 내부의 데이터는 휘발성이다. down/up 하면 사라진다.
- 중요한 데이터는 volumes를 통해 컨테이너 외부에 저장한다
# cat docker-compose.yml mycloud: image: owncloud links: - mariadb:mysql - redis:redis ports: - 60080:80 volumes: - /home/myteam/mycloud/owncloud/apps:/var/www/html/apps - /home/myteam/mycloud/owncloud/config:/var/www/html/config - /home/myteam/mycloud/owncloud/data:/var/www/html/data restart: always redis: image: redis:alpine command: redis-server --appendonly yes volumes: - /home/myteam/mycloud/redis/data:/data restart: always mariadb: image: mariadb volumes: - /home/myteam/mycloud/mariadb/conf.d:/etc/mysql/conf.d - /home/myteam/mycloud/mariadb/data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: changeme restart: always