Freebsd PF 방화벽 (Packet filter)

feebsd 문서:https://www.freebsd.org/doc/handbook/firewalls-pf.html

참고페이지: https://www.cyberciti.biz/faq/how-to-set-up-a-firewall-with-pf-on-freebsd-to-protect-a-web-server/

 

방화벽 테스트를 위하여 pure-ftpd 와 sshd_config 의 port 변경이 필요 합니다.

pure-ftpd 설치는 아래 링크를 참고하시면 됩니다.

[ftp-server] FreeBSD pure-ftpd 설치

 

/etc/rc.conf 수정

root@bsd11:~ # vi /etc/rc.conf

#PF setting
pf_enable="YES"
pflog_enable="YES"
pf_rules="/etc/pf.conf"
pflog_logfile="/var/log/pflog"


 

/etc/pf.conf 파일 생성

root@bsd11:~ # vi /etc/pf.conf
ext_if="em0"

set limit { states 80000, frags 5000 }

set block-policy drop

set skip on vnet1

set skip on lo0

scrub in all

antispoof for $ext_if

block in all

block out all

table <bruteforce> persist

table <sshbruteforce> persist

table <ftp> persist

block in quick log proto tcp from <bruteforce> to port 80

block in quick log proto tcp from <sshbruteforce> to port 2424

block in quick log proto tcp from <ftp> to port 21

pass in log proto tcp from any to port 21 keep state

pass in log proto tcp from any to port 30000:50000 keep state

pass in log proto tcp from any to port 2424 keep state

pass in on $ext_if proto tcp from any to $ext_if port 2424 \
            flags S/SA keep state \
            (max-src-conn-rate 10/30, overload <sshbruteforce> flush global)

pass in on $ext_if proto tcp from any to $ext_if port 80 \
        flags S/SA synproxy state

pass in on $ext_if proto tcp from any to $ext_if port 80 \
        flags S/SA keep state \
        (max-src-conn 100, max-src-conn-rate 300/10, \
        overload <bruteforce> flush global)

 

sshd_config 설정변경

root@bsd11:~ # vi /etc/ssh/sshd_config
#Port 22
Port 2424

 

 

pure-ftpd.conf 설정변경

PassivePortRange 주석을 제거 하여 설정값을 활성하 시키고 사용할 포트 Range 를 지정합니다.

root@bsd11:~ # vi /usr/local/etc/pure-ftpd.conf

PassivePortRange             30000 50000

 

시스템 리부팅

root@bsd11:~ # init 6

 

pf commands

pf config check 

root@bsd11:~ # service pf check
Checking pf rules.

 

pf status 확인

root@bsd11:~ # service pf status
Status: Enabled for 0 days 00:01:01           Debug: Urgent

State Table                          Total             Rate
  current entries                        0
  searches                             227            3.7/s
  inserts                                0            0.0/s
  removals                               0            0.0/s
Counters
  match                                227            3.7/s
  bad-offset                             0            0.0/s
  fragment                               0            0.0/s
  short                                  0            0.0/s
  normalize                              0            0.0/s
  memory                                 0            0.0/s
  bad-timestamp                          0            0.0/s
  congestion                             0            0.0/s
  ip-option                              0            0.0/s
  proto-cksum                            0            0.0/s
  state-mismatch                         0            0.0/s
  state-insert                           0            0.0/s
  state-limit                            0            0.0/s
  src-limit                              0            0.0/s
  synproxy                               0            0.0/s
  map-failed                             0            0.0/s
root@bsd11:~ #

 

 

 

pf.conf 설정내용 설명

— 차후 작성

 

 

Freebsd rename nic device

KVM 에서 운영하는 freebsd nic name 이 vtnet0 입니다.

일반적인 환경에서는 문제가 없지만 PF 등을 설정할때 다른 가상 Device 와 착각? 을 할것으로 보입니다. 🙂

vtnet0 -> em0 로 바꾸는 방법을 간단히 소개 할려고 합니다.

 

변경전 

root@bsd11:~ # ifconfig
vtnet0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=6c07bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,TSO6,LRO,VLAN_HWTSO,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
        ether 52:54:00:c1:cb:84
        hwaddr 52:54:00:c1:cb:84
        inet 192.168.0.40 netmask 0xffffff00 broadcast 192.168.0.255
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: Ethernet 10Gbase-T <full-duplex>
        status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
        inet 127.0.0.1 netmask 0xff000000
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
        groups: lo
root@bsd11:~ #

 

/etc/rc.conf 수정 및 시스템 리부팅

root@bsd11:~ # cat /etc/rc.conf
hostname="bsd11"
keymap="us.iso.kbd"
ifconfig_vtnet0_name="em0"
ifconfig_em0="inet 192.168.0.40 netmask 255.255.255.0"
root@bsd11:~ # init 6

ifconfig_vtnet0_name=”em0″  // vtnet0 의 Device name 을 em0 로 변경 합니다.
ifconfig_em0=”inet 192.168.0.40 netmask 255.255.255.0″  // 기존 vtnet0 를 em0 로 변경 합니다.

 

변경후 

root@bsd11:~ # ifconfig
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=6c07bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,TSO6,LRO,VLAN_HWTSO,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
        ether 52:54:00:c1:cb:84
        hwaddr 52:54:00:c1:cb:84
        inet 192.168.0.40 netmask 0xffffff00 broadcast 192.168.0.255
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: Ethernet 10Gbase-T <full-duplex>
        status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
        inet 127.0.0.1 netmask 0xff000000
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
        groups: lo
root@bsd11:~ #

 

Freebsd dokuwiki port install

dokuwiki 소개: 

DokuWiki(도쿠위키)는 데이터베이스가 필요 없는 사용하기 간단하고 범용성이 높은 오픈 소스 위키 소프트웨어입니다. 간명하고 읽기 편한 구문으로 사용자에게 사랑을 받고 있습니다. 유지 보수, 백업과 통합이 쉬워 관리자가 선호 합니다. 접근 제어 기능와 인증에 의한 연결 기능을 내장하고 있어, 특히 기업 환경에서의 이용에도 적합합니다. 활기찬 공동체가 기여한 많은 플러그인은 기존의 위키 이외의 광범위한 사용을 가능하게 합니다.

dokuwiki official site: https://www.dokuwiki.org/ko:dokuwiki

설치전 확인 사항: dokuwiki 설치전 apache 또는 nginx  Web Server 가 설치 되어 있어야 하며, php 설치 되어 있어야 합니다.

db 의 경우 별도로 필요 하지 않습니다.

 

dokuwiki 설치

root@bsd11:~ # whereis dokuwiki
dokuwiki: /usr/ports/www/dokuwiki
root@bsd11:~ # cd /usr/ports/www/dokuwiki/ && make config-recursive install

 

설치후 메세지

======================================================================
                          INSTALLATION NOTES

The wiki program have been installed to /usr/local/www/dokuwiki.

Please configure your web server to allow running PHP scripts there.

Please create dedicated data directory outside the installation directory
and make it owned by the process running these PHP scripts.  It is important
to make sure that your PHP intepreter does not allow running PHP scripts
there.

For first install, you may have to manually copy the contents from
/usr/local/www/dokuwiki/data into the newly created data directory and change
the owner of /usr/local/www/dokuwiki/conf to the web server.

Please go to http://www.your.host/dokuwiki/install.php to finish the
installation.  For FULL configuration instructions, see
http://wiki.splitbrain.org/wiki:config

After installation please change the permissions of
/usr/local/www/dokuwiki/conf back to root:wheel.

======================================================================

===>  Cleaning for php71-7.1.14
===>  Cleaning for php71-gd-7.1.14
===>  Cleaning for libXpm-3.5.12
===>  Cleaning for xextproto-7.3.0
===>  Cleaning for xorg-macros-1.19.1
===>  Cleaning for xproto-7.0.31
===>  Cleaning for libX11-1.6.5,1
===>  Cleaning for bigreqsproto-1.1.2
===>  Cleaning for xcmiscproto-1.2.2
===>  Cleaning for xtrans-1.3.5
===>  Cleaning for kbproto-1.0.7
===>  Cleaning for inputproto-2.3.2
===>  Cleaning for xf86bigfontproto-1.2.0
===>  Cleaning for libXau-1.0.8_3
===>  Cleaning for libXdmcp-1.1.2
===>  Cleaning for libxcb-1.12_2
===>  Cleaning for check-0.12.0
===>  Cleaning for xcb-proto-1.12
===>  Cleaning for python27-2.7.14_1
===>  Cleaning for libffi-3.2.1_2
===>  Cleaning for libpthread-stubs-0.4
===>  Cleaning for libxslt-1.1.29_1
===>  Cleaning for libgcrypt-1.8.2
===>  Cleaning for libgpg-error-1.27
===>  Cleaning for libiconv-1.14_11
===>  Cleaning for libXext-1.3.3_1,1
===>  Cleaning for libXt-1.1.5,1
===>  Cleaning for libSM-1.2.2_3,1
===>  Cleaning for libICE-1.0.9_1,1
===>  Cleaning for freetype2-2.8_1
===>  Cleaning for png-1.6.34
===>  Cleaning for jpeg-turbo-1.5.3
===>  Cleaning for nasm-2.13.03,1
===>  Cleaning for php71-mbstring-7.1.14
===>  Cleaning for oniguruma-6.7.1
===>  Cleaning for php71-openssl-7.1.14
===>  Cleaning for php71-session-7.1.14
===>  Cleaning for php71-xml-7.1.14
===>  Cleaning for php71-zlib-7.1.14
===>  Cleaning for dokuwiki-20170219e
root@bsd11:/usr/ports/www/dokuwiki #

 

설치후  rebooting 을 하지 않는다면 rehash 를 실행 합니다.

root@bsd11:/usr/ports/www/dokuwiki # rehash
root@bsd11:/usr/ports/www/dokuwiki #

 

apache24 설정

httpd.conf 설정 // Directory 기존 설정을 주석처리후 아래와 같이 설정 합니다.

주석을 제거 하여 활성화 합니다.

root@bsd11:/usr/local/etc/apache24 # vi httpd.conf
#<Directory />
#    AllowOverride none
#    Require all denied
#</Directory>
<Directory />
    AllowOverride none
    Order deny,allow
    Deny from all
</Directory>

Alias /wiki /usr/local/www/dokuwiki
<Directory "/usr/local/www/dokuwiki">
AllowOverride None
Order Allow,deny
Allow from all
</Directory>


LoadModule vhost_alias_module libexec/apache24/mod_vhost_alias.so

LoadModule rewrite_module libexec/apache24/mod_rewrite.so

# Virtual hosts
Include etc/apache24/extra/httpd-vhosts.conf


 

httpd-vhosts.conf 를 설정 합니다.

wiki.test.com 은 임시로 test 를 위하여 dns-server 에서 사전에 작업을 하였습니다.

root@bsd11:~ # cd /usr/local/etc/apache24/extra
root@bsd11:/usr/local/etc/apache24/extra # vi httpd-vhosts.conf
<VirtualHost *:80>
    ServerAdmin admin@test.com
    DocumentRoot "/usr/local/www/dokuwiki"
    ServerName wiki.test.com
    ErrorLog "/var/log/wiki.test.com-error_log"
    CustomLog "/var/log/wiki.test.com-access_log" common
</VirtualHost>

 

dokuwiki 디렉토리 권한설정

root@bsd11:/usr/local/etc/apache24/extra # cd /usr/local/www/
root@bsd11:/usr/local/www # chown -R www:www dokuwiki/

 

apache24 를 재시작 합니다.

root@bsd11:/usr/local/etc/apache24/extra # service apache24 restart
Performing sanity check on apache24 configuration:
Syntax OK
Stopping apache24.
Waiting for PIDS: 719.
Performing sanity check on apache24 configuration:
Syntax OK
Starting apache24.
root@bsd11:/usr/local/etc/apache24/extra #

 

 

http://vhost.domain/install.php 또는 http://domain/dokuwiki/install.php

Choose your language : 에서 Ko 를 선택 하면 페이지정보를 한글로 볼수 있습니다.

test 를 위하여 대략적인 정보를 기입한후 저장을 클릭합니다.

 

새 도쿠 위키를 클릭합니다.

 

로그인을 클릭합니다.

 

로그인을 합니다.

 

dokuwiki 가 정상적으로 설치 되었습니다. 🙂

 

보안설정의 경우 아래 링크를 참고 합니다.

http://www.dokuwiki.org/security 

jwilder/nginx-proxy image 이용 Nginx-web 컨테이너 추가

 

[docker] docker-compose Nginx-proxy multi-wordpress site

docker-compose Nginx-proxy 를 이용하여 Multi-Wordpress 컨테이너를 구성 하였습니다.

이번에는 WordPress 가 아닌 Nginx web-site를 구성 합니다.

 

Github

test@docker-test:~$ git clone https://github.com/visualwork/Docker-test.git

/Docker-test/test06 에 있습니다. 🙂

 

 

docker ps 확인시 nginx-proxy 컨테이너가 80 port 연결을 받아 다른 컨테이너의 Virtualhost로 접속하게 하였습니다.

test@docker-test:~/web-service$ docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                NAMES
5d75a1fe1bc0        wordpress:latest      "docker-entrypoint.s…"   5 minutes ago       Up 5 minutes        80/tcp               wp_blog2
c5a3310e88d8        mariadb               "docker-entrypoint.s…"   5 minutes ago       Up 5 minutes        3306/tcp             wp_blog_db2
9e7e6c795f52        wordpress:latest      "docker-entrypoint.s…"   8 minutes ago       Up 8 minutes        80/tcp               wp_blog
242f3c32f658        mariadb               "docker-entrypoint.s…"   8 minutes ago       Up 8 minutes        3306/tcp             wp_blog_db
fc8761f89097        jwilder/nginx-proxy   "/app/docker-entrypo…"   11 minutes ago      Up 11 minutes       0.0.0.0:80->80/tcp   nginx-proxy
test@docker-test:~/web-service$

 

ex) blog1 docker-compose.yml file

  wordpress:
     image: wordpress:latest
     expose:
       - 80
     restart: always
     volumes:
       - ./web-data:/var/www/html
     environment:
       VIRTUAL_HOST: blog1.test.com

VIRTUAL_HOST : blog1.test.com 으로 설정 되어 있습니다. environment: 의 VIRTUAL_HOST 부분을 참조 하여 nginx-proxy 에서 자동으로 등록하게 되어 있습니다.

 

nginx 를 사용할 디렉토리를 생성후 임시docker-compose.yml 을 만들어 줍니다.

컨테이너 구동만을 테스트 하기 위하여 임시로 만드는 docker-compose 파일입니다.

test@docker-test:~/web-service$ mkdir www
test@docker-test:~/web-service$ cd www
test@docker-test:~/web-service/www$ vi docker-compose.yml
version: '2'
services:
  nginx-www:
    image: nginx:latest
    restart: always
    environment:
      - VIRTUAL_HOST=www.test.com
    container_name: nginx-www

networks:
  default:
    external:
      name: nginx-proxy

 

nginx-www 컨테이너를 구동합니다

test@docker-test:~/web-service/www$ docker-compose up -d --build
Pulling nginx-www (nginx:latest)...
latest: Pulling from library/nginx
8176e34d5d92: Already exists
5b19c1bdd74b: Pull complete
4e9f6296fa34: Pull complete
Digest: sha256:4771d09578c7c6a65299e110b3ee1c0a2592f5ea2618d23e4ffe7a4cab1ce5de
Status: Downloaded newer image for nginx:latest
Creating nginx-www ... done
test@docker-test:~/web-service/www$

 

nginx-www 컨테이너 확인

test@docker-test:~/web-service/www$ docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                NAMES
7fcc8b64bf87        nginx:latest          "nginx -g 'daemon of…"   43 seconds ago      Up 42 seconds       80/tcp               nginx-www
5d75a1fe1bc0        wordpress:latest      "docker-entrypoint.s…"   12 minutes ago      Up 12 minutes       80/tcp               wp_blog2
c5a3310e88d8        mariadb               "docker-entrypoint.s…"   12 minutes ago      Up 12 minutes       3306/tcp             wp_blog_db2
9e7e6c795f52        wordpress:latest      "docker-entrypoint.s…"   15 minutes ago      Up 15 minutes       80/tcp               wp_blog
242f3c32f658        mariadb               "docker-entrypoint.s…"   15 minutes ago      Up 15 minutes       3306/tcp             wp_blog_db
fc8761f89097        jwilder/nginx-proxy   "/app/docker-entrypo…"   18 minutes ago      Up 18 minutes       0.0.0.0:80->80/tcp   nginx-proxy
test@docker-test:~/web-service/www$

 

nginx-proxy 컨테이너에 접속 합니다.

www.test.com ip 정보를 확인 합니다.

test@docker-test:~/web-service/www$ docker exec -it fc8761f89097 /bin/bash
root@fc8761f89097:/app# cat /etc/nginx/conf.d/default.conf
~중략
# www.test.com
upstream www.test.com {
                                ## Can be connect with "nginx-proxy" network
                        # nginx-www
                        server 172.18.0.7:80;
}
server {
        server_name www.test.com;
        listen 80 ;
        access_log /var/log/nginx/access.log vhost;
        location / {
                proxy_pass http://www.test.com;
        }
}
root@fc8761f89097:/app# 

 

docker inspect 명령어를 이용하여 nginx-www 에 설정된 ip  정보를 확인 합니다.

test@docker-test:~/web-service/www$ docker inspect nginx-www |grep 172
                    "Gateway": "172.18.0.1",
                    "IPAddress": "172.18.0.7",
test@docker-test:~/web-service/www$

정상적으로 설정이 되어 있습니다. 🙂

docker-compose down 하여 컨테이너를 정지 합니다.

test@docker-test:~/web-service/www$ docker-compose down
Stopping nginx-www ... done
Removing nginx-www ... done
Network nginx-proxy is external, skipping
test@docker-test:~/web-service/www$

 

디렉토리 생성

test@docker-test:~/web-service/www$ mkdir www-data
test@docker-test:~/web-service/www$ mkdir -p mariadb/db-data
test@docker-test:~/web-service/www$ mkdir -p nginx/conf
test@docker-test:~/web-service/www$ mkdir -p php/conf

 

docker-compose file 생성

test@docker-test:~/web-service/www$ vi docker-compose.yml
version: '2'
services:
  mysql:
    image: mariadb:10.3.1
    volumes:
      - ./mariadb/db-data/:/var/lib/mysql
      - ./mariadb/my.cnf:/etc/mysql/mariadb.conf.d/custom.cnf
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      MYSQL_DATABASE: docker
    container_name: mariadb-www

  nginx-www:
    image: nginx:latest
    restart: always
    volumes:
      - ./nginx/conf:/etc/nginx/conf.d
      - ./www-data:/www

    environment:
      - VIRTUAL_HOST=www.test.com
    container_name: nginx-www

  php:
    build: php
    expose:
      - 9000
    restart: always
    volumes:
      - ./php/conf/php.ini:/usr/local/etc/php/conf.d/custom.ini
      - ./www-data:/www
    container_name: php-www


networks:
  default:
    external:
      name: nginx-proxy

 

nginx/conf/default.conf 파일생성

test@docker-test:~/web-service/www$ cd nginx/conf/default.conf
server {
    listen       80 default_server;
    server_name  localhost _;
    index        index.php index.html index.htm;
    root         /www;

    location / {
        try_files   $uri $uri/ /index.php?$query_string;
        autoindex on;
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

 

php/Dockerfile 파일생성

test@docker-test:~/web-service/www$ vi php/Dockerfile
FROM php:7.1-fpm

RUN apt-get update

# Some basic extensions
RUN docker-php-ext-install -j$(nproc) json mbstring opcache pdo pdo_mysql mysqli

# Curl
RUN apt-get install -y libcurl4-openssl-dev
RUN docker-php-ext-install -j$(nproc) curl

# GD
RUN apt-get install -y libpng-dev libjpeg-dev
RUN docker-php-ext-install -j$(nproc) gd

# Intl
RUN apt-get install -y libicu-dev
RUN docker-php-ext-install -j$(nproc) intl

 

php/conf/php.ini 파일생성

test@docker-test:~/web-service/www$ vi php/conf/php.ini
display_errors = On
display_startup_errors = On
default_charset = "UTF-8"
html_errors = On
date.timezone = Asia/Seoul

 

mariadb/my.cnf 파일생성

test@docker-test:~/web-service/www$ vi mariadb/my.cnf
# MariaDB database server configuration file.
#
# You can copy this file to one of:
# - "/etc/mysql/my.cnf" to set global options,
# - "~/.my.cnf" to set user-specific options.
#
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

# This will be passed to all mysql clients
# It has been reported that passwords should be enclosed with ticks/quotes
# escpecially if they contain "#" chars...
# Remember to edit /etc/mysql/debian.cnf when changing the socket location.
[client]
port            = 3306
socket          = /var/run/mysqld/mysqld.sock
default-character-set = utf8mb4


# Here is entries for some specific programs
# The following values assume you have at least 32M ram

# This was formally known as [safe_mysqld]. Both versions are currently parsed.
[mysqld_safe]
socket          = /var/run/mysqld/mysqld.sock
nice            = 0

[mysqld]
#
# * Basic Settings
#
#user           = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
lc_messages_dir = /usr/share/mysql
lc_messages     = en_US
skip-external-locking
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address           = 127.0.0.1
#
# * Fine Tuning
#
max_connections         = 100
connect_timeout         = 5
wait_timeout            = 600
max_allowed_packet      = 16M
thread_cache_size       = 128
sort_buffer_size        = 4M
bulk_insert_buffer_size = 16M
tmp_table_size          = 32M
max_heap_table_size     = 32M
#
# * MyISAM
#
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched. On error, make copy and try a repair.
myisam_recover_options = BACKUP
key_buffer_size         = 128M
#open-files-limit       = 2000
table_open_cache        = 400
myisam_sort_buffer_size = 512M
concurrent_insert       = 2
read_buffer_size        = 2M
read_rnd_buffer_size    = 1M
#
# * Query Cache Configuration
#
# Cache only tiny result sets, so we can fit more in the query cache.
query_cache_limit               = 128K
query_cache_size                = 64M
# for more write intensive setups, set to DEMAND or OFF
#query_cache_type               = DEMAND
#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
# As of 5.1 you can enable the log at runtime!
#general_log_file        = /var/log/mysql/mysql.log
#general_log             = 1
#
# Error logging goes to syslog due to /etc/mysql/conf.d/mysqld_safe_syslog.cnf.
#
# we do want to know about network errors and such
#log_warnings           = 2
#
# Enable the slow query log to see queries with especially long duration
#slow_query_log[={0|1}]
slow_query_log_file     = /var/log/mysql/mariadb-slow.log
long_query_time = 10
#log_slow_rate_limit    = 1000
#log_slow_verbosity     = query_plan

#log-queries-not-using-indexes
#log_slow_admin_statements
#
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
#       other settings you may need to change.
#server-id              = 1
#report_host            = master1
#auto_increment_increment = 2
#auto_increment_offset  = 1
#log_bin                        = /var/log/mysql/mariadb-bin
#log_bin_index          = /var/log/mysql/mariadb-bin.index
# not fab for performance, but safer
#sync_binlog            = 1
expire_logs_days        = 10
max_binlog_size         = 100M
# slaves
#relay_log              = /var/log/mysql/relay-bin
#relay_log_index        = /var/log/mysql/relay-bin.index
#relay_log_info_file    = /var/log/mysql/relay-bin.info
#log_slave_updates
#read_only
#
# If applications support it, this stricter sql_mode prevents some
# mistakes like inserting invalid dates etc.
#sql_mode               = NO_ENGINE_SUBSTITUTION,TRADITIONAL
#
# * InnoDB
#
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!
default_storage_engine  = InnoDB
# you can't just change log file size, requires special procedure
#innodb_log_file_size   = 50M
innodb_buffer_pool_size = 256M
innodb_log_buffer_size  = 8M
innodb_file_per_table   = 1
innodb_open_files       = 400
innodb_io_capacity      = 400
innodb_flush_method     = O_DIRECT
#
# * Security Features
#
# Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/
#
# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
#
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem

character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci



#
# * Galera-related settings
#
[galera]
# Mandatory settings
#wsrep_on=ON
#wsrep_provider=
#wsrep_cluster_address=
#binlog_format=row
#default_storage_engine=InnoDB
#innodb_autoinc_lock_mode=2
#
# Allow server to accept connections on all interfaces.
#
#bind-address=0.0.0.0
#
# Optional setting
#wsrep_slave_threads=1
#innodb_flush_log_at_trx_commit=0

[mysqldump]
quick
quote-names
max_allowed_packet      = 16M

[mysql]
#no-auto-rehash # faster start of mysql but no tab completion

[isamchk]
key_buffer              = 16M

#
# * IMPORTANT: Additional settings that can override those from this file!
#   The files must end with '.cnf', otherwise they'll be ignored.
#
!includedir /etc/mysql/conf.d/

 

docker-compose 실행

test@docker-test:~/web-service/www$ docker-compose up -d --build

 

컨테이너 확인

test@docker-test:~/web-service/www$ docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                    NAMES
130f3eb196e3        www_php               "docker-php-entrypoi…"   10 seconds ago      Up 9 seconds        9000/tcp                 php-www
563f8bbccd33        mariadb:10.3.1        "docker-entrypoint.s…"   10 seconds ago      Up 9 seconds        0.0.0.0:3306->3306/tcp   mariadb-www
677fc32c5a4b        nginx:latest          "nginx -g 'daemon of…"   10 seconds ago      Up 9 seconds        80/tcp                   nginx-www
5d75a1fe1bc0        wordpress:latest      "docker-entrypoint.s…"   About an hour ago   Up About an hour    80/tcp                   wp_blog2
c5a3310e88d8        mariadb               "docker-entrypoint.s…"   About an hour ago   Up About an hour    3306/tcp                 wp_blog_db2
9e7e6c795f52        wordpress:latest      "docker-entrypoint.s…"   About an hour ago   Up About an hour    80/tcp                   wp_blog
242f3c32f658        mariadb               "docker-entrypoint.s…"   About an hour ago   Up About an hour    3306/tcp                 wp_blog_db
fc8761f89097        jwilder/nginx-proxy   "/app/docker-entrypo…"   About an hour ago   Up About an hour    0.0.0.0:80->80/tcp       nginx-proxy
test@docker-test:~/web-service/www$

 

test.php 파일생성

test@docker-test:~/web-service/www$ vi www-data/test.php
<?php phpinfo(); ?>

 

web browser 확인

 

mariadb 테스트

테스트를 위하여 그누보드5 설치를 진행 했습니다.

주의 Host : localhost -> db컨테이너 이름으로 변경해 줘야 합니다.

(Docker 네트워크에 관해서는 차후 포스팅 하도록 하겠습니다.)

 

 

설치후 로그인

 

blog1.test.com / blog2.test.com / www.test.com

 

수고 하셨습니다. 🙂

 

Docker 를 사용하다 보면 실행중인 컨테이너 삭제 및

모든 컨테이너 삭제및 모든 이미지를 삭제할일이 종종 생기곤 합니다.

아래 방법을 통하여 모든 컨테이너 삭제및 모든 이미지를 한번에 삭제 할수 있습니다. 🙂

  • 실행중인 모든 컨테이너 삭제

test@ubuntu1604:~$ docker rm -f `docker ps -a -q`

  • 모든 이미지 일괄 삭제 

test@ubuntu1604:~$ docker rmi -f `docker images`

  • docker-compose 이미지 삭제 

test@ubuntu1604:~/web-server$ docker-compose down --rmi all

 

[GCP] Google cloud Docker-compose wordpress 구성

 

도메인만 있으면 1년간 무료로 쓸수 있는 Google cloud 를 이용하여 WordPress 를 구성하여 사용하는것도 좋을거 같습니다. 🙂

기존 생성했던 VM 을 사용 하기 때문에 최초로 만든 vm 이미지에서 수정을 합니다.

Compute Engine -> VM 인스턴스 -> 인스턴스 이름 클릭 후 수정을 클릭합니다.

 

초소형(공유vCPU 1개) -> 소형 (공유 vCPU 1개) 로 변경후 저장을 클릭합니다.

 

VM 인스턴스를 시행후 SSH로 접속을 합니다.

 

docker 설치

test@ubuntu-trusty-1:~$ curl -s https://get.docker.com/ | sudo sh
test@ubuntu-trusty-1:~$ sudo usermod -aG docker test

터미널을 재접속 합니다.

 

docker 설치 확인

test@ubuntu-trusty-1:~$ docker --version
Docker version 18.02.0-ce, build fc4de44
test@ubuntu-trusty-1:~$

 

docker-compose 설치

test@ubuntu-trusty-1:~$ sudo curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   617    0   617    0     0   2762      0 --:--:-- --:--:-- --:--:--  2766
100 8288k  100 8288k    0     0  7366k      0  0:00:01  0:00:01 --:--:-- 17.6M
test@ubuntu-trusty-1:~$ sudo chmod +x /usr/local/bin/docker-compose
test@ubuntu-trusty-1:~$ docker-compose --version
docker-compose version 1.19.0, build 9e633ef
test@ubuntu-trusty-1:~$

 

Nginx-proxy container

test@ubuntu-trusty-1:~$ mkdir -p web-service/nginx-proxy
test@ubuntu-trusty-1:~$ cd web-service/nginx-proxy/
test@ubuntu-trusty-1:~/web-service/nginx-proxy$ vi docker-compose.yml
version: "3"

services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    ports:
      - "80:80"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
    restart: always

networks:
  default:
    external:
      name: nginx-proxy

 

Nginx-proxy container 실행

test@ubuntu-trusty-1:~/web-service/nginx-proxy$ docker network create nginx-proxy
6e66bd966be8c43541585319e0516c3350d5b1d852789ca4efd93ee9ef446589
test@ubuntu-trusty-1:~/web-service/nginx-proxy$ docker-compose up -d --build
test@ubuntu-trusty-1:~/web-service/nginx-proxy$ docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                NAMES
b4bbe5ac5015        jwilder/nginx-proxy   "/app/docker-entrypo…"   4 seconds ago       Up 3 seconds        0.0.0.0:80->80/tcp   nginx-proxy
test@ubuntu-trusty-1:~/web-service/nginx-proxy$

 

 

WordPress container

blog docker-compose.yml 파일 생성

test@ubuntu-trusty-1:~$ mkdir -p web-service/blog
test@ubuntu-trusty-1:~$ cd web-service/blog/
test@ubuntu-trusty-1:~/web-service/blog$ mkdir web-data
test@ubuntu-trusty-1:~/web-service/blog$ mkdir db-data
test@ubuntu-trusty-1:~/web-service/blog$ vi docker-compose.yml
 version: "3"

services:
  db:
     image: mariadb
     volumes:
       - ./db-data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: test1234
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: test1234
     container_name: wp_blog_db

  wordpress:
     image: wordpress:latest
     expose:
       - 80
     restart: always
     volumes:
       - ./web-data:/var/www/html
     environment:
       VIRTUAL_HOST: blog.crois.net
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: test1234
     container_name: wp_blog

networks:
  default:
    external:
      name: nginx-proxy

 

WordPress container 실행

test@ubuntu-trusty-1:~$ cd web-service/blog/
test@ubuntu-trusty-1:~/web-service/blog$ docker-compose up -d --build
~중략
실행확인
test@ubuntu-trusty-1:~/web-service/blog$ docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS              PORTS                NAMES
7d728447bde6        mariadb               "docker-entrypoint.s…"   8 seconds ago        Up 7 seconds        3306/tcp             wp_blog_db
9415c6dd76e1        wordpress:latest      "docker-entrypoint.s…"   8 seconds ago        Up 7 seconds        80/tcp               wp_blog
b4bbe5ac5015        jwilder/nginx-proxy   "/app/docker-entrypo…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp   nginx-proxy
test@ubuntu-trusty-1:~/web-service/blog$

 

web browser 에서 http://blog.crois.net 을 연결 합니다.

수고 하셨습니다. 🙂

 

 

 

 

[GCP] Google cloud 외부 IP 주소 연결 (고정IP 설정)

 

VPC 네트워크 -> 외부 IP 주소 를 클릭합니다.

고정 주소 예약을 클릭합니다.

 

이름을 지정합니다. 지역에서 Zone 을 설정 할수 있습니다.

 

예약 버튼을 클릭합니다.

 

외부 IP 주소 연결이 생성 되었습니다.

 

Compute Engine -> VM 인스턴스 항목으로 이동 합니다.

vm 이름을 클릭 합니다. (ubuntu-trusty-1)

 

 

 

VM 인스턴스 세부정부 에서 네트워크 인터페이스 항목 nic0: default default 를 클릭합니다.

 

외부 IP 항목 에서 임시를 클릭한후 IP 주소만들기를 선택합니다.

 

새 고정 IP 주소 예약 에서 test01 을 입력합니다.

 

예약을 클릭합니다.

 

최하단으로 이동하여 저장을 클릭합니다.

 

ssh 연결 테스트를 진행 합니다.

[GCP] Google Cloud ssh-key 이용하여 접속

Linux 의 경우 ssh-keygen 명령어를 통하여 아래와 같이 RSA 키페어를 생성 하고,

Windows는 puttygen 을 이용하여 RSA 키페어를 생성 합니다.

Global 모든 Cloud 인스턴스에 접속시 메타데이터 ssh 키 부분에 설정 하시면 되며 단인 Cloud 인스턴스만 접속하기 위해선 Compute Engine -> VM 인스턴스 세부정보 부분의

SSH 키 부분에 등록 하시면 됩니다.

 

Linux 나 MacOS 이용시

RSA 키페어 생성

주의: 키페어 생성시 반드시 Password 를 입력해야 합니다.

엔터를 눌러 스킵시 정상적으로 접속할수 없습니다.

test@docker-test:~$ ssh-keygen -t rsa -C "test@google.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/test/.ssh/id_rsa):
Created directory '/home/test/.ssh'.
Enter passphrase (empty for no passphrase):       // Password 입력
Enter same passphrase again:                      // Password 입력
Your identification has been saved in /home/test/.ssh/id_rsa.
Your public key has been saved in /home/test/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:cJ23OKMOchEWj3oIpyMBKPvdDXlYoeChKovlBuIj1ok test@google.com
The key's randomart image is:
+---[RSA 2048]----+
|o   o . ..       |
|+  o o =.. .     |
|o.o o *+o o .    |
|.o + +++.  o .   |
|*.+.o.o+S + .    |
|=*+.o..... o     |
|+Eoo. o .        |
|o..  o o         |
|        .        |
+----[SHA256]-----+
test@docker-test:~$

키생성시 사용하는 암호를 통하여 ssh 로 접속을 하게 됩니다.

 

id_rsa.pub 퍼블릭키 위치

test@docker-test:~/.ssh$ pwd
/home/test/.ssh
test@docker-test:~/.ssh$ ls
id_rsa  id_rsa.pub
test@docker-test:~/.ssh$

해당 파일(id_rsa.pub) 을 scp 로 Copy 후 Google 클라우드에 등록 합니다.

 

퍼블릭 키 등록

compute engine -> 메타데이터 -> SSH키로 이동 합니다.

+항목추가를 클릭하여 ~/.ssh/id_rsa.pub 내용을 붙여 넣기 합니다.

메타데이터에 key를 추가 하게 되면 해당 키를 통하여 모든 인스턴스에 접속 가능합니다.

저장을 클릭합니다.

 

 ssh 접속

사용하고 있는 Linux 머신에서 접속시 아래와 같은 방법으로 접속하실수 있습니다.

test@docker-test:~/.ssh$ ssh -i id_test google_user@35.xx.xx.200
Warning: Identity file id_test.pub not accessible: No such file or directory.
The authenticity of host '35.xx.xx.200 (35.xx.xx.200)' can't be established.
ECDSA key fingerprint is SHA256:IEUCgjm+1KuzORwPmQH/Vo6SnCztScOWBehFCoSOveo.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '35.xx.xx.200' (ECDSA) to the list of known hosts.
Enter passphrase for key '/home/test/.ssh/id_rsa':
Welcome to Ubuntu 14.04.5 LTS (GNU/Linux 4.4.0-112-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Tue Feb 27 08:14:28 UTC 2018

  System load:  0.0               Processes:           80
  Usage of /:   12.3% of 9.81GB   Users logged in:     0
  Memory usage: 14%               IP address for eth0: xx.xx.0.2
  Swap usage:   0%

  Graph this data and manage this system at:
    https://landscape.canonical.com/

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.

New release '16.04.3 LTS' available.
Run 'do-release-upgrade' to upgrade to it.

Your Hardware Enablement Stack (HWE) is supported until April 2019.

Last login: Tue Feb 27 08:14:28 2018 from xx.xxx.xx.164
test@ubuntu-trusty-1:~$

 

 

 

Windows 이용시

puttygen 을 이용하여 RSA 키페어를 생성 합니다.

링크에서 iPutty  를 다운 받을수 있습니다.
https://github.com/iPuTTY/iPuTTY/releases

생성버튼 클릭

개인키 저장 버튼을 클릭 합니다.

 

개인키 instance_name.ppk 으로 저장합니다.

아래 부분을 복사 하여 퍼블릭키를 등록 합니다.

 

Google Cloud 에서 Compute Engine -> 메타데이타 -> SSH 키로 이동합니다.

저장을 클릭합니다.

 

ssh-client 를 실행합니다. (putty 이용)

 

Connection -> SSH -> Auth 로 이동후 Browse… 에서 저장한 키파일을 불러 옵니다.

Open 을 클릭 합니다. 

 

접속후 화면

 

단일 인스턴스 접속시 설정 방법

별도의 인스턴스 재시작이 필요하지 않으며 아래와 같은 방법으로 등록만 해주시면 됩니다.

Compute Engine -> VM 인스턴스

ssh key 를 추가할 인스턴스를 클릭합니다.

 

수정을 클릭합니다.

 

페이지 하단에 SSH 키 부분에 추가 하시면 됩니다.

 

페이지 하단의 저장을 클릭합니다.

 

접속시 위와 동일한 방법으로 접속 하시면 됩니다.

 

[GCP] Google Cloud 생성

https://console.cloud.google.com/?hl=ko

최초 사용시 12개월간 사용할수 있는 크레딧 $300 달러를 줍니다.

준비물 : Google 계정 , 신용카드

무료사용이 끝난후 사용료가 부과되지 않습니다 🙂

무료평가판 신청을 클릭 합니다.

사용자 등록정보 입력후 아래와 같은 화면을 볼수 있습니다.

My First Project 를 클릭합니다.

 

+버튼을 클릭하여 프로젝트를 생성합니다.

 

프로젝트 이름을 기입 합니다.

ex) docker-test

 

중간메뉴에 Cloud Launcher 를 클릭합니다.

 

Cloud Launcher 를 클릭하면 아래와 같은 화면을 볼수 있습니다.

운영체체 부분에 Ubuntu Trusty 를 클릭합니다.

 

 

 

COMPUTE ENGINE에서 실행을 클릭하여 VM 인스턴스를 생성합니다.

약 3~5분후 아래와 같은 화면을 볼수 있습니다.

vCPU 의 경우 사용량에 따라 선택 하시면 됩니다.

테스트로 만들기 위하여 초소형(공유 vCPU 1개) 0.6GB , f1-micro 를 선택 합니다.

영역에서 리전을 선택 할수 있습니다. asia-northeast1 도쿄 리전을 선택 합니다.

리전확인 참고: https://cloud.google.com/about/locations/?hl=ko

체크항목

모든 Cloud API에 대한 전체 액세스 허용

HTTP 트래픽 허용

HTTPS 트래픽 허용

관리, 디스크, 네트워킹, SSH 키 를 눌러 세부설정을 할수 있습니다.

만들기 버튼을 클릭합니다.

 

IP 부분의 경우 보안상 삭제 하였습니다. 

브라우저 창에서 열기를 클릭 합니다.

 

패키지 설치시 apt-get / apt 명령어를 사용하기 위하여 sudo passwrd 로 root 패스워드를 설정합니다.

test@ubuntu-trusty-1:~$ sudo passwd
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
test@ubuntu-trusty-1:~$

 

sudo apt update 를 테스트 합니다.

 

docker swarm mode 구성

description:

To use Docker in swarm mode, install Docker. See installation instructions for all operating systems and platforms.

Current versions of Docker include swarm mode for natively managing a cluster of Docker Engines called a swarm. Use the Docker CLI to create a swarm, deploy application services to a swarm, and manage swarm behavior.

If you are using a Docker version prior to 1.12.0, you can use standalone swarm, but we recommend updating.

official page: https://docs.docker.com/engine/swarm/

 

vm 준비

docker-manager 192.168.192.10

docker-worker01 192.168.192.20

docker-worker02 192.168.192.30

3대의 vm 에는 docker가 설치 되어 있습니다.

Docker-manager
test@docker-manager:~$ docker -v
Docker version 18.02.0-ce, build fc4de44
test@docker-manager:~$

Docker-worker01
test@docker-worker01:~$ docker -v
Docker version 18.02.0-ce, build fc4de44
test@docker-worker01:~$

Docker-worker02
test@docker-worker02:~$ docker -v
Docker version 18.02.0-ce, build fc4de44
test@docker-worker02:~$

 

1. Create Docker Swarm cluster

docker-manager 에서 작업

command : docker swarm init –advertise-addr $docker-manager ip

test@docker-manager:~$ docker swarm init --advertise-addr 192.168.192.10
Swarm initialized: current node (mzsiydsvbyhafre4cppmfupvb) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-5ar8gen44ij5gi7hlkmbbhdji2e06nvod2u86e5db7zwip9707-8f5nxu48rh841xdcj0na1vp0s 192.168.192.10:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

test@docker-manager:~$

 

docker manager node 확인

test@docker-manager:~$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
mzsiydsvbyhafre4cppmfupvb *   docker-manager      Ready               Active              Leader
test@docker-manager:~$

test@docker-manager:~$ docker info
Containers: 1
~중략
Swarm: active
 NodeID: mzsiydsvbyhafre4cppmfupvb
 Is Manager: true
 ClusterID: rnqp34pegl5rj9fqd1ex30x0h
 Managers: 1
 Nodes: 1
 Orchestration:
  Task History Retention Limit: 5
 Raft:
  Snapshot Interval: 10000
  Number of Old Snapshots to Retain: 0
  Heartbeat Tick: 1
  Election Tick: 3
 Dispatcher:
  Heartbeat Period: 5 seconds
 CA Configuration:
  Expiry Duration: 3 months
  Force Rotate: 0
 Autolock Managers: false
 Root Rotation In Progress: false
 Node Address: 192.168.192.10
 Manager Addresses:
  192.168.192.10:2377
~중략

join-token 생성

docker-manager host 에서 작업

test@docker-manager:~$ docker swarm join-token worker
To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-5ar8gen44ij5gi7hlkmbbhdji2e06nvod2u86e5db7zwip9707-8f5nxu48rh841xdcj0na1vp0s 192.168.192.10:2377

test@docker-manager:~$

 

 

docker-worker swarm 등록

docker-manager에서 생성한 join-token을 이용하여 worker node 를 등록 합니다.

docker-worker01 host 에서 작업

test@docker-worker01:~$ docker swarm join  --token SWMTKN-1-5ar8gen44ij5gi7hlkmbbhdji2e06nvod2u86e5db7zwip9707-8f5nxu48rh841xdcj0na1vp0s 192.168.192.10:2377
This node joined a swarm as a worker.
test@docker-worker01:~$ docker info |grep -i swarm
WARNING: No swap limit support
Swarm: active

 

docker-worker02 host 에서 작업

test@docker-worker02:~$ docker swarm join  --token SWMTKN-1-5ar8gen44ij5gi7hlkmbbhdji2e06nvod2u86e5db7zwip9707-8f5nxu48rh841xdcj0na1vp0s 192.168.192.10:2377
This node joined a swarm as a worker.
test@docker-worker02:~$ docker info |grep -i swarm
WARNING: No swap limit support
Swarm: active
test@docker-worker02:~$

 

docker-manager node 확인

test@docker-manager:~$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
mzsiydsvbyhafre4cppmfupvb *   docker-manager      Ready               Active              Leader
jvitfs6bmgr699p3nltzok0fw     docker-worker01     Ready               Active
hwkew1ktumxynqhqexjx5gn8l     docker-worker02     Ready               Active
test@docker-manager:~$

 

nginx test

docker run 의 경우 아래와 같이 사용하지만 docker swarm 의 경우 docker service create 명령어를 사용합니다.

docker run 실행시는 아래와 같이 사용 합니다. docker swarm 에서는 docker service create 명령어를 사용합니다. 🙂

test@docker-test:~$ docker run --name web-service -d -p 80:80 -p 443:443 nginx

 

docker service create 명령어

test@docker-manager:~$ docker service create --name web-service -p 80:80 -p 443:443 nginx
pgdc990uyesjmw399ayuraie9
overall progress: 1 out of 1 tasks
1/1: running   [==================================================>]
verify: Service converged
test@docker-manager:~$

 

!!! docker service create 명령어 사용시 –publish 옵션을 사용해야 합니다. 

test@docker-master:~$ docker service create --name web-service --publish 80:80 nginx
md8pzk0owb4s8ida55voqzlrb
overall progress: 1 out of 1 tasks
1/1: running   [==================================================>]
verify: Service converged
test@docker-master:~$

 

 

service 확인

test@docker-manager:~$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
pgdc990uyesj        web-service         replicated          1/1                 nginx:latest        *:80->80/tcp, *:443->443/tcp
test@docker-manager:~$ docker service ps web-service
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
wd1vyqp9eg2x        web-service.1       nginx:latest        docker-manager      Running             Running 29 seconds ago
test@docker-manager:~$

 

 

docker service scale 명령어를 사용하여 service 개수를 늘려 줍니다.

service 갯수를 줄일때도 동일하게 scale을 사용 합니다.

test@docker-manager:~$ docker service scale web-service=3
web-service scaled to 3
overall progress: 3 out of 3 tasks
1/3: running   [==================================================>]
2/3: running   [==================================================>]
3/3: running   [==================================================>]
verify: Service converged
test@docker-manager:~$


test@docker-manager:~$ docker service ps web-service
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
wd1vyqp9eg2x        web-service.1       nginx:latest        docker-manager      Running             Running 20 minutes ago
bezi55mn78lf        web-service.2       nginx:latest        docker-worker01     Running             Running 42 seconds ago
vwpxbid1ez53        web-service.3       nginx:latest        docker-worker02     Running             Running 42 seconds ago
test@docker-manager:~$

 

docker service rm 

swarm 에서 사용중인 컨테이너 삭제시는 docker servier rm $service_name 으로 삭제 할수 있습니다.

test@docker-manager:~$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
pgdc990uyesj        web-service         replicated          1/1                 nginx:latest        *:80->80/tcp, *:443->443/tcp
test@docker-manager:~$ docker service rm web-service
web-service
test@docker-manager:~$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
test@docker-manager:~$