version: '3.3'
services:
stirling-pdf:
image: frooodle/s-pdf
ports:
- '8080:8080'
volumes:
- ./trainingData:/usr/share/tesseract-ocr/4.00/tessdata #Required for extra OCR languages
- ./extraConfigs:/configs
# environment:
# APP_LOCALE: en_GB
# APP_HOME_NAME: Stirling PDF
# APP_HOME_DESCRIPTION: Your locally hosted one-stop-shop for all your PDF needs.
# APP_NAVBAR_NAME: Stirling PDF
# APP_ROOT_PATH: /
# ALLOW_GOOGLE_VISIBILITY: true
Docker 컨테이너(container)는 격리된 환경에서 돌아가기 때문에 기본적으로 다른 컨테이너와의 통신이 불가능합니다. 하지만 여러 개의 컨테이너를 하나의 Docker 네트워크(network)에 연결시키면 서로 통신이 가능해집니다. 이번 포스팅에서는 컨테이너 간 네트워킹이 가능하도록 도와주는 Docker 네트워크에 대해서 알아보도록 하겠습니다.
네트워크 조회
Docker 네트워크의 기본은 내 컴퓨터에서 어떤 네트워크가 생성되어 있는지를 아는 것일 겁니다.docker network ls커맨드를 사용하면 현재 생성되어 있는 Docker 네트워크 목록을 조회할 수 있습니다.
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
143496b94e57 bridge bridge local
311d6534f79f host host local
aa89f58200a6 none null local
bridge,host,none은 Docker 데몬(daemon)이 실행되면서 디폴트로 생성되는 네트워크입니다. 대부분의 경우에는 이러한 디폴트 네트워크를 이용하는 것 보다는 사용자가 직접 네트워크를 생성해서 사용하는 것이 권장됩니다.
네트워크 종류
Docker 네트워크는bridge,host,overlay등 목적에 따라 다양한 종류의 네트워크 드라이버(driver)를 지원하는데요.
bridge네트워크는 하나의 호스트 컴퓨터 내에서 여러 컨테이너들이 서로 소통할 수 있도록 해줍니다.
host네트워크는 컨터이너를 호스트 컴퓨터와 동일한 네트워크에서 컨테이너를 돌리기 위해서 사용됩니다.
overlay네트워크는 여러 호스트에 분산되어 돌아가는 컨테이너들 간에 네트워킹을 위해서 사용됩니다.
본 포스팅에서는 기본값이고 가장 많이 사용되는bridge네트워크에 대해서만 다루도록 하겠습니다.
네트워크 생성
먼저docker network create커맨드를 사용해서 새로운 Docker 네트워크를 생성해보도록 하겠습니다.
$ docker network create our-net
e6dfe4a9a5ec85abcb484662c30a3a0fc76df217dde76d52fac39fae8412ca68
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
143496b94e57 bridge bridge local
311d6534f79f host host local
aa89f58200a6 none null local
e6dfe4a9a5ec our-net bridge local
추가된 네트워크는docker network ls커맨드로 확인할 수 있습니다.-d옵션을 사용하지 않았기 때문에 기본값인bridge네트워크로 생성된 것을 볼 수 있습니다.
네트워크 상세 정보
방금 추가한 네트워크의 상세 정보를docker network inspect커맨드로 확인해보도록 하겠습니다.
이제 두 개의 컨테이너가 네트워크를 통해 서로 소통이 가능한지 테스트를 해보도록 하겠습니다.
먼저one컨테이너에서two컨테이너를 상대로ping명령어를 날려보겠습니다. 컨테이너 이름을 호스트네임(hostname)처럼 사용할 수 있습니다.
$ docker exec one ping two
PING two (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.119 ms
64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.105 ms
64 bytes from 172.19.0.3: seq=2 ttl=64 time=0.116 ms
64 bytes from 172.19.0.3: seq=3 ttl=64 time=0.883 ms
64 bytes from 172.19.0.3: seq=4 ttl=64 time=0.127 ms
반대로two컨테이너에서one컨테이너를 상대로ping명령어를 날려보겠습니다. 이번에는 컨테이너 이름 대신에 IP를 사용하겠습니다.
$ docker exec two ping 172.19.0.2
PING 172.19.0.2 (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.927 ms
64 bytes from 172.19.0.2: seq=1 ttl=64 time=0.079 ms
64 bytes from 172.19.0.2: seq=2 ttl=64 time=0.080 ms
64 bytes from 172.19.0.2: seq=3 ttl=64 time=0.079 ms
64 bytes from 172.19.0.2: seq=4 ttl=64 time=0.107 ms
$ docker network rm our-net
Error response from daemon: error while removing network: network our-net id e6dfe4a9a5ec85abcb484662c30a3a0fc76df217dde76d52fac39fae8412ca68 has active endpoints
위와 같이 제거하려는 네트워크 상에서 실행 중인 컨테이너가 있을 때는 제거가 되지가 않습니다.
그럴 때는 해당 네트워크에 연결되어 실행 중인 모든 컨테이너를 먼저 중지 시키고, 네트워크를 삭제해야 합니다.
$ docker stop one two
one
two
$ docker network rm our-net
our-net
네트워크 청소
하나의 호스트 컴퓨터에서 다수의 컨테이너를 돌리다 보면 아무 컨테이너도 연결되어 있지 않은 네트워크가 생기가 마련입니다. 이럴 때는docker network prune커맨드를 이용해서 불필요한 네트워크를 한번에 모두 제거할 수 있습니다.
$ docker network prune
WARNING! This will remove all networks not used by at least one container.
Are you sure you want to continue? [y/N] y
마치면서
이상으로 Docker 네트워크의 전반적인 라이프사이클에 대해서 살펴보았습니다. 본 포스팅에서 사용했던 각 커맨드에 대한 좀 더 자세한 내용은 아래 Docekr CLI 레퍼런스를 참고바라겠습니다.
version: '2.0'
services:
db:
image: mariadb:10.5
container_name: seafile-mysql
environment:
- MYSQL_ROOT_PASSWORD=db_dev # Requested, set the root's password of MySQL service.
- MYSQL_LOG_CONSOLE=true
volumes:
- /opt/seafile-mysql/db:/var/lib/mysql # Requested, specifies the path to MySQL data persistent store.
networks:
- seafile-net
memcached:
image: memcached:1.6
container_name: seafile-memcached
entrypoint: memcached -m 1024
networks:
- seafile-net
seafile:
image: seafileltd/seafile-mc:latest
container_name: seafile
ports:
- "80:80"
# - "443:443" # If https is enabled, cancel the comment.
volumes:
- ./seafile-data:/shared # Requested, specifies the path to Seafile data persistent store.
environment:
- DB_HOST=db
- DB_ROOT_PASSWD=db_dev # Requested, the value shuold be root's password of MySQL service.
- TIME_ZONE=Asia/Seoul # Optional, default is UTC. Should be uncomment and set to your local time zone.
- SEAFILE_ADMIN_EMAIL=me@example.com # Specifies Seafile admin user, default is 'me@example.com'.
- SEAFILE_ADMIN_PASSWORD=asecret # Specifies Seafile admin password, default is 'asecret'.
- SEAFILE_SERVER_LETSENCRYPT=false # Whether to use https or not.
- SEAFILE_SERVER_HOSTNAME=docs.seafile.com # Specifies your host name if https is enabled.
depends_on:
- db
- memcached
networks:
- seafile-net
networks:
seafile-net:
Seafile 파일 업로드 실패 - 네트워크 오류
이것으로 문제가 해결되었습니다: Seafile 웹 UI에 로그인하고 아바타를 클릭한 후 "System Admin" > Settings > FILE_SERVER_ROOT > 그리고 여기에 다음과 같이 Seafile URL 또는 IP 주소를 입력해야 합니다. "hxxp://{YOUR_SERVER_URL}/seafhttp" 예를 들어, 내 서버 URL은 "seafile.local"이기 때문에 다음과 같이 입력합니다. hxxp://seafile.local/seafhttp
docker-syslog.yml 파일의 'SEAFILE_SERVER_HOSTNAME='에 저장할 수도 있습니다. URL이 (seafile.local)과 같은 도메인 이름인 경우 DNS 서버에 해당 URL에 대한 기록이 있어야 합니다. 저는 Pi-Hole을 제 로컬 DNS 서버로 사용하고 있고 제 서버의 IP를 가리키는 seafile.local에 대한 레코드를 추가한 다음 이 도메인을 시스템 관리자 URL 설정에 넣었고 즉시 파일을 업로드할 수 있었습니다.
도커설치를 하시다 보면 손쉽게 커맨드쉘에서 docker run ~~ 입력하시는 경우가 있는데 나중에 reference로 해당 docker를 어떻게 설치했는지 살펴볼 때 (1) 기록이 남지 않는다는 점과 (2) 수정이 필요할 때 꽤 불편하다는 단점이 있습니다.
Portainer를 쓰시면 Stack에서 docker-compose의 내용을 적용하시면 레코드를 남길 수 있기 때문에 이 방법을 추천드리며 간혹 참고하는 사이트에서 docker-compose의 내용은 없고 cli로 정리된 경우가 있습니다. 이럴때는 웹상에서 cli명령어를 docker-compose명령어로 바꿔주는 아래 사이트를 이용해보세요.
아래 코드로 docker-compose.yml 파일 생성 후 'docker-compose up -d'로 실행하세요.
-- version: '3.1'
services:
ghost: image: ghost:4-alpine restart: always ports: - 8080:2368 environment: # see https://ghost.org/docs/config/#configuration-options database__client: mysql database__connection__host: db database__connection__user: root database__connection__password: example database__connection__database: ghost # this url value is just an example, and is likely wrong for your environment! url: http://localhost:8080 # contrary to the default mentioned in the linked documentation, this image defaults to NODE_ENV=production (so development mode needs to be explicitly specified if desired) #NODE_ENV: development volumes: - ./ghost/data:/var/lib/ghost/content db: image: mysql:5.7 restart: always environment: MYSQL_ROOT_PASSWORD: example