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